近年來,有些讀者會問我一些形形色色的問題,讓我很難去回答,甚至給不出建設性的意見。前端
舉個例子:面試
衆所周知,這問題就像你問學霸說你這麼厲害同樣讓人難以回答。我做爲一個雙非軟工本科學生,通過大學本身摸索和不斷試錯,畢業開始在百度從事研發工做。其實,我當時也有不少的疑惑,在這裏給你們講講個人踩坑歷程。redis
記憶中,我當年逛知乎、求助高人、甚至個人導師,都沒法給出一個可操做的建議。除此以外,在我那種二本學校,知名企業都不會去咱學校校招,我和學長們對春秋招的概念微乎其微,進大廠是件很困難的事情,機率與踩狗屎不相上下。算法
做爲探路者,求助知乎和論壇,給出的結論幾乎都是好好學習數據結構/算法、如今大數據很火你應該學學Hadoop/Spark、你要是會微服務、docker、k8s必定會很加分。spring
讓我想起了我當年問學霸題目如何解?學霸說:這個題目是來源於第X章第X例題,你這樣解,答案就出來了,很容易的。至於爲何他能想到,鬼也不知道。docker
當時,我真的是花裏胡哨的啥都學,啥都去倒騰,不知道是否是梁靜茹給個人勇氣。前端、後端技術棧、Hadoop/Spark、docker/k8s這些幾乎都實操過,只是不少只是入門並無深刻研究,效果天然也十分有限。數據庫
這些概念,對於小白或者在校生來講,這彷彿在對說你不用學了,除非你天生技術慾望特別強烈。這對於大多數普通人來講,明顯是勸退的節奏,可操行十分有限,幾乎沒有參考價值,不知道從何下手。編程
其實,道理是沒有錯的,多研究底層和熱門技術棧是有益的。可是,脫離實際狀況談技術就是扯犢子,就像讓中國男足拿世界盃冠軍顯然不符合實際,更應該是根據實際狀況,作產出最大的事情,不然會信心全無。json
接下來,我係統性拆分問題,在不一樣階段應該「學什麼」、「如何學」、「學到什麼程度」,重點講我當時遇到的問題,還有我是如何去思考的,最終如何解決的,思路比結論重要。後端
根據問題歸類來看,主要在我本身的角度談談普通本科如何實現進入Top級互聯網工做?
首先,說說在大廠工做都是些什麼樣的人,他們當年都是揹着什麼光環混進去的?
通過個人調研和分析,重點說一下在校招中面試官看中和考察的東西。
大概思路就是,要麼你證實你使人信服的天賦如邏輯系統思惟、聰明,讓人以爲你能夠被快速培養;要麼你有豐富的工程實戰經驗,證實你具有優秀工程師的潛質。
固然,你可能會說這麼多要求,恐怕神仙也作不到啊,簡單太苛刻了。在這裏,並非上述要點所有知足,只是知足其中兩項證實你的實力便可,畢竟面試時間十分有限必須有點讓人信服的東西啊。
舉個例子:
一、假設你是上海交大、華中科大大學畢業的學生,你可能只須要重點複習數據結構/算法等專業知識,輔之把學校的科研經歷說一下。可能進入什麼阿里華爲百度問題都不是很大,專業知識對於大家來講本身再也不話下,畢竟考理論就是大家的特長。
二、假如你是雙非大學畢業的學生,那麼你必須用國家級大賽、開源項目、互聯網公司經歷證實本身。總之,多作項目,專一於技術自己,讓本身更早具有職業軟件工程師的實戰技能。
簡而言之,你沒有光環,那就比別人多努力點,提早作好職業規劃,把時間投入技術自己不要投機取巧。
鑑於上述分析,知道需求是什麼?對於咱們來講,主要把精力投入在技術自己。
接下來,咱們將面臨一系列問題。
不一樣方向,意味着不一樣領域不一樣,學習的知識和實戰項目有共性也有差別。在這裏,我主要講一下通用的思路。重點拿我擅長方向舉例,其餘方向可按照一樣思路觸類旁通。
根據個人經驗,可將內容分爲原理、應用、擅長方向三個緯度。原理和應用緯度必須學習,方向緯度根據本身擅長方向深刻學習。
原理:計算機網絡、操做系統、數據結構/算法,這些東西都是專業課好好學便可,數據結構/算法能夠偶爾刷題。校招的時候再重點複習,初級階段沒必要花太多時間深究。
應用:它是最基礎的內容,無論你從事什麼領域都將離不開它們。這也是小白入門重點花費時間的地方,你將在這裏不斷與程序鬥爭如調試、驗證、異常、解決。
方向:不一樣方向本質上就是在基礎應用上擴充,發揮它們擅長領域和特性去解決特定問題。在這裏,簡單列一下涉及的技術棧。
基於上述分析,主要講了總體思路,你們可能會以爲有點不太好理解。接下來,拿我當時遭遇的處境進行舉例闡述,這樣讓不一樣水平或時期的同窗有不同的體會。
假若有時光機讓時間日後倒退3年,時間來到我剛上大二的時候,做爲一枚小萌新開始學習JAVA走上後端開發之路。
對於我來講,操做系統原理、計算機網絡先戰略性放棄,畢竟剛接觸編程,看高大上的原理,每次上課都想睡覺。固然,數據結構/算法我還能好好聽聽,畢竟我數學功底還行讓我不排斥。
爲何不先學習基礎性原理?
舉例:假設你學騎自行車,你是直接上去就蹬?仍是先把輪子拆下來研究清楚原理再去學習怎麼蹬?
重點:根據個人經歷,在新手階段無論是接觸新的語言,仍是新的方向。最快的方式就是先把自行車蹬起來,等你蹬熟練了再去研究輪子是怎麼造出來的。
根據上述策略,刨除我踩的一些坑,我把學習征途劃分四個階段,實現學習效率的最優解。
第一階段:新手入門
在我入門的時候,我遇到的最大困難是代碼不會寫,DEBUG不會作,程序報錯不會看毫無頭緒,甚至你們常說的百度一下的關鍵字我也不知道搜。
這時候,最大的目標就是根據百度/查文檔/看視頻,把程序調試出預期結果,甚至你抄代碼都行,不少時候抄代碼你都不必定能DEBUG出預期結果。這就是現實,主要就是要把對編程的排斥消磨殆盡。
這個階段,不須要太關注底層實現原理,最重要的工做就是把應用層面的技術,不斷練習直到熟練掌握上面提到的應用緯度「 編程語言、Linux、數據庫、HTTP網絡協議 」。
對於現已從事計算機行業的同窗,其實這部份內容很是簡單,可能按照正常水平少則幾天,多則不超過一週就能開發出簡單模塊。簡單說,它頂可能是普通本科畢設設計水準,主要是讓新手在感官上體驗軟件產品。本質上,在計算機世界裏,抽象來看就是數據的計算、傳輸、存儲。隨着你的經驗增多,你會發現不少技術都是誕生或優化性能都是在解決計算、存儲、傳輸的問題。
在這裏,主要讓你們在系統的角度感覺最簡單、最初級的技術模型。
第二階段:項目練習
經過第一個階段學習,你對編程從一無所知到有所斬獲,對計算機世界充滿了好奇,甚至有所開心。這時候,你最應該作的就是去知足你裝逼的夢想。
假設你是爬蟲方向,你應該去爬表情包、爬知乎數據、自動搶票,去知足你無數個裝逼夢想。
假設你是算法方向,你能夠去研究推薦算法、圖像識別模型,去作個商品推薦、人臉識秀一秀。
假設你是後端方向,你能夠去研究下網絡編程/網站開發開發個仿微信聊天應用,體驗下lowB版微信。
畫外音:多作項目,坑是一步一步踩出來的。
做爲大學生,實驗室、軟件設計比賽、開源社區都是你發揮現象力的天堂,這些倒騰的經歷將是你畢業時最寶貴的經歷。
第三階段:強化理論
通過前兩個階段實踐,時間來到大三,這時候基本的軟件開發已入門差很少達到普通培訓班畢業水平。同時,專業課如數據結構/操做系統/計算機網絡也上的差很少了,對概念多多少少有初步瞭解。
這時候,你會發現不少原理你不懂,將很難更上一層樓。
你將處於寫代碼一時爽,一直寫一直爽,遇到性能問題直接土崩瓦解。因此,你不得不去學習理論知識讓你走得更遠。
問題:爲何在這個階段強化理論知識?
在新手階段去強化理論知識,會讓你興趣驟減且產生學了有何用的錯覺。同時,這是最好的時機,學校專業課學完你有基礎概念,你有實際軟件應用場景,這些東西讓你深挖理論的時候會快速給你構建起基礎圖譜,讓你興趣激增不斷體驗學會的東西,將戳痛你最痛的神經,瞬間把你之前遇到的問題有新的認知,這就是答案。簡單說,面向問題,解決問題,讓你實實在在感覺到成長,這就是成就感的力量。
問題:如何高效的學習理論?
其實,編程語言和計算機基礎都是相通的,只要你學透一門編程語言剩下的就大同小異。固然,計算機基礎畢竟是枯燥無味的,學習畢竟是有方法的。
舉個例子:
站在編程語言的角度,你用心去總結,你會發現無論什麼編程語言,變來變去都是換了個花樣在談如下內容。
無論在面試仍是技術探討,重點考察的都是集合、網絡通訊、線程/線程池。源自於它跟計算機基礎有緊密結合,你要優化它們你必須具有紮實基本功。
基於個人研究經驗,我建議你們在學習計算機基礎的時候,不要由於理論而理論。你應該去經過編程語言源碼去學習計算機基礎,只學你當前認爲最重要的。
舉個例子:
當我去學習數據結構/算法的時候,我會一邊學習源碼一邊思考數據結構,這樣就讓我有實際應用場景不會由於理論而理論。我學習list、set源碼的時候,我就學會鏈表、棧。我學習map的時候,我就學會了紅黑樹、散列表。
當我去學習計算機網絡的時候,我會一邊學習socket的用法,學習Linux網絡通訊模型epoll,這樣就重點把網絡協議學會了。同時,不少應用場景極少的理論知識,我就粗略記憶或者跳過,這樣就節約了不少時間。
當我去學習線程/線程池的時候,我會學習鎖機制、生產者/消費者模型這些操做系統原理的重要知識,跟編程語言中關聯不大的我就粗略記憶。
第四階段:深究專長
通過前面三個階段的學習,你已經具有紮實基本功和項目實戰經驗。接下來,你須要作的就是更加的專業化,研究一些有生產意義的東西。若是你一直寫學生管理系統,這些沒有價值沒有意義的東西,那麼毫無心義。
這時候,你應該去互聯網公司驗證你學習的技能。除此以外,你能夠去學習額外的成熟先進技術棧。這樣,你就有實際業務經驗,就有技術的寬度,同時又有深度,這就是你核心優點,畢竟算法/數據結構這些東西在競爭的時候你們都會。
畫外音:去實習,最好去大廠實習,接受互聯網軟件開發的挑戰。要是不能,那麼去研究實際企業技術棧的應用與底層研究。
舉個例子:
假設你是後端開發,你就能夠去學習微服務的技術棧,springboot、dubbo、docker、hadoop均可以去學習。除此以外,設計模式,redis原理均可以去學習研究,只有這樣當你去面試的時候,你有不少話題和故事講給別人聽,你的專長研究既可讓你說業務場景,你又能夠講底層原理,對答如流。
通過上面的訓練,已經具有了解決問題、快速學習、編寫代碼能力,也就是具有軟件工程師的職業素養和紮實基本功。
這時候,進入互聯網公司開啓職業道路,你將會很快有產出,不會陷入徘徊自閉的狀態。更況且,你的職業素養已經可以讓你遇到問題,能快速的學習克服困難。可是,要是讓你去參加面試可不必定能獨善其身,畢竟工做擰螺絲,面試造火箭可不能疏忽大意。
接下來,重點講一下如何應對面試?
面試也就是把本身賣出去,讓別人以爲你值。簡歷是相當重要的環節,全部的知識和技能全都是圍繞它展開,不然毫無心義。由於在面試中,面試官關心你有什麼,也就是面試徹底圍繞着你會的東西展開提問,因此你就把你的優點發揮到極致就行。
環節一:準備簡歷
簡歷必定要認真對待,必定要簡介精煉,儘量把內容壓縮到一頁,畢竟簡歷篩選就30秒不到。這時候,簡歷排版、簡歷字體、簡歷模板都有講究,細節決定成敗。
在寫簡歷的時候,主要分爲我的資料、實習經歷、項目經歷、專業技能。其實,沒什麼技巧,參考STAR原則,重點體現你在項目中的價值和思考。
假設有讀者須要簡歷模板,可關注提供給你們。
環節二:梳理知識體系和刷面經
之前,學習知識是零散的,學習策略更可能是面向解決問題,以致於知識不繫統,表達邏輯層次有限。面試官邏輯思惟強,因此你必須作好充足準備才能脫穎而出。
最好的策略就是梳理知識體系和準備面經,咱們都知道要是你面試官問的問題是你恰好熟悉的問題,你豈不是輕鬆闖關成功?因此,準備考綱、梳理知識體系、瘋狂刷題這就是最好的策略。
按照互聯網面試流程大多數分爲三輪面。
一輪面試:主要是考察計算機基礎知識和擅長語言基礎知識,重點考察數據結構/算法、網絡編程、擅長語言基礎。可是,絕對不是死記硬背的東西,必定是深度和廣度緊密結合,環環相扣直到把你肚子裏的東西所有挖出來。
舉個例子:
你會發現每一個問題都是環環相扣,從簡單到難,目的就是挖掘出你的極限。大多數狀況都是,從數據結構/算法入手,擴展到編程語言特性,再擴展到併發/網絡編程不斷進行深挖。當直接問實際用法應試者答不出來的時候,就會再次引入到計算機基礎知識,這樣不斷反覆調度試探應試者的是深度和廣度。
二輪面試:這輪考察實習/項目經歷,重點考察你的面試儲備。衆所周知,大部分應屆生項目經驗十分有限,大多數是圖書館管理系統、電商系統這樣。重點說一下應對策略,能夠去網上找你作的項目可能遇到的領域難題,去找解決辦法,最終擴展補充到你的項目中。
三輪面試:這輪面試更可能是經理考察應試者的基礎能力。也就是邏輯思惟、抗壓、時間管理等基礎能力,看下是否能融入團隊,畢竟適合團隊的纔是最好的。
這裏主要講了思路和應對策略,至於篇幅有限,面試題只能讀者本身梳理,假設有須要後續再聊。大致的思路:
總之,做爲普通學校的同窗,你只有花更加多的時間在項目實戰中,實習/打比賽/逛開源社區,這些時間讓你更快接近成爲職業軟件工程師。當機會來臨的時候,你抓住機會就踏入大廠的大門了,幸運永遠不會平白無故眷顧你。