職業是一個非常特殊的東西,它有兩點很特別,一個是「不可重來」,另一個是「驗證耗時」。之前和一個老友聊天,他感嘆說,回過頭看看,自己的整個職業過得亂七八糟。等到現在明白這點的時候,已經來不及了。因為一般一段職業經歷短則一到兩年,長則三到五年。換兩家公司,十年一晃就過去了。如果你在這十年中沒有很好的成長,又不幸身在某些公司,那三十多歲可能就面臨被清退的處境了。
我一般不屑于去和別人分享什么人生經驗,畢竟有些坑不自己跳下去是不會牢記在心的。但職業的坑不一樣,等你發現在坑里時,可能已經晚了。所以我花了蠻多時間來研究這個。有興趣的同學可以去讀讀我的《程序員跳槽全攻略》,專門講職業規劃的。(
我大學的語文老師曾告誡我們說,人生就像四季一樣,春天該播種,你去播種,秋天該收獲,你去收獲,這樣是最省力的。你非要倒過來呢,也不是不行,但就是會很累,會付出更多的精力和代價。
校招也類似,它是社會和企業為從未步入職場的同學特意準備的一個綠色通道。在這個通道里,我們將候選人當做一張白紙,可以沒有經驗、沒有行業常識,只要對工作充滿熱情、有還算聰明的頭腦,基本都算是合格的。企業會為這些同學準備培訓,并留足適應期,有的甚至還會安排一對一的老員工來帶。
但是,一旦你錯過了它,那一切都不一樣了,因為你進入了名為「社招」的紅海。在這里,所有已經畢業的人變成了你的競爭對手,不但要面對和你一樣工作年限的人競爭,還要面對其他工作時間更長、經驗更豐富的同行跳槽帶來的競爭。甚至經常發生因為招到了一個中級崗位的候選人,取消掉兩個初級崗位的情況。
所以校招非常重要,一定不要錯過。
既然校招這么重要,那么我們怎么才能在其中占據優勢呢?記住兩個詞「擇優錄取」和「跑贏同學」。
在微博上經常可以看到這樣的問題:「我這個也會、那個也合格,憑什么他們就不招我呢?」這是典型的沒有明白招聘本質的表現。要明白,求職不是「會考」而是「高考」,不是什么產品的出廠合格校驗,而是一場中國這個資源緊缺型國家里的又一場優質資源爭奪戰。
那些薪水高、發展空間好的知名企業(后文簡稱大廠),每年招聘的人數是一定的。極端點說,如果現在所有候選人的水平都下調20%,他們依然要招人的,不然沒法發展(嚴格講會有一些調整空間,但也扛不了多久)。
所以,尤其是在校招里邊,「絕對能力」并不重要,「相對能力」才是最重要的。
我來講一個很老的童話,聽過的同學請裝作沒聽過。兩個人在森林里邊遇到了熊??,kuma 看見他們就嗷嗷的追了過來。一個同學轉身就跑,另一個問他說,我們怎么跑也跑不過熊的,那跑有什么用呢?這個同學回答說,我只要跑贏你就好了呀。
那其實校招也是一樣的。它不是說你的能力要有多少,其實再牛的應屆生的水平放到行業里邊,都是不入流的,因為很多水平是靠海量的用戶壓出來的,你沒有遇到過這些場景,怎么可能知道怎么去應對。
所以應屆生和那些社招的候選人比,通常都是沒啥勝算的,但幸運的是,我們和他們是不同的賽道。要跑贏一個在大廠核心崗位工作了一兩年的人不容易,但要跑贏那些和你一樣在大學只學了一堆理論基礎,甚至理論課都沒好好學天天在寢室吃雞的同學,就容易很多了。
要承認,即使這樣,要跑贏某些天資聰穎、能力拔群的學霸還是有難度的。但這場比賽是不公平的,因為它沒規定每個人必須同時開始跑。魯迅說得好,笨鳥先飛。(魯迅:我沒有說過)如果我們能更早的認識到這點,花更多時間去準備,那么贏的概率就會成倍提升。
我本身就是一個非常好的例子。嚴格的講,我的能力算是平庸偏上一點點的,雖然在當時無論如何我都不會承認。當我在大一下半期認識到這一點時,就開始自學 PHP,大二的時候寫了一堆沒人用的開源項目,大三上半期找了家公司做兼職,已經能把學費掙回來了。當大三下半期開始找實習時,我的簡歷已經可以秒殺同校同學,小小PK 一流高校的同學了。
所以你以為校招比的是能力,其實對于執行力中等的同學來講,校招比的其實是認知。越早認識到本質的人,就越容易在這場游戲里邊勝出。從這個角度講,堅持讀到這里的你,甚至可能已經贏了一半了。所以記得要把這篇文章分享給你的好朋友,然后千萬別讓你不喜歡的同學知道。
技術崗位的大體分布如圖:
現在幾乎所有的軟件都已經互聯網化了,就算沒有互聯網化的,它以后也會互聯網化,所以我們就不單純地去說軟件開發這個行業了。
首先就是開發崗,這個就包括了前端開發、后端開發和移動開發。
前端開發和后端開發,主要是 B/S 結構里的。B/S 結構就是 Browser-Server 結構。而前端指的就是瀏覽器這個端;后端指的就是服務器這個端。
前端主要做的事情,就是把從服務器端讀取到的數據展現給用戶,然后通過各種 UI 控件和用戶互動,再將新的數據送回服務器端。具體的技術包括 HTML、CSS、JavaScript,還可能有一些嵌入瀏覽器運行的組件,比如 Flash 、 WebGL 。
后端則主要送數據給前端,一般有兩種方式,以前用的比較多的是,將數據在服務器端先渲染完,然后將輸出的結果發送給前端;現在用的比較多的方式是將純數據通過 Json 或者 xml 等格式發送給前端,在瀏覽器中通過 JS 來進行渲染。
所以以前很多后端的工程師往往也懂一些前端的知識,比如我認識的很多 PHP 程序員,他們不但懂 MySQL 和 Apache,還懂 HTML 、 CSS 、 JS 和 PS。這種前后端都懂的工程師,也叫全棧工程師。
后端可以用各種語言開發,國內用的比較多的包括 Java、PHP ,還有相對小眾一些的 Python 、 Ruby 、 Go。其實 C 也是可以寫后端的,不過現在已經很少有公司直接用它寫了。
后來有了 NodeJS ,JavaScript 也能跑到后端了,所以很多前端工程師也有了后端開發的能力,他們也占了全棧工程師的很大一部分。
相對于 B/S 結構,還有 C/S 結構,就是 Client-Server 。C/S 結構下不用瀏覽器來展現數據和交互,而是用客戶端,一般是 Mac/Win/Linux 三大平臺。
手機大潮起來以后,不管是 B/S 結構還是 C/S 結構,全部移動化了。B/S 結構對應的就是適配手機瀏覽器的移動網頁、以及嵌入在微信、微博里邊的 H5 頁面; C/S 結構就是 APP ,一般覆蓋 iOS 和 Android 兩個主流平臺。
除了這些標準開發崗,而還有一些新興或者相對小眾的開發方向,比如人工智能/算法工程師、做智能硬件的硬件開發工程師、給企業做解決方案的企業軟件工程師。
軟件并不是開發出來就完了的,在上線或者發布之前,我們還需要「測試工程師」來進行測試;而上線以后,還需要「運維工程師」來管理和優化服務器集群。現在服務器都虛擬化和容器化了,運維工程師中也出現了懂開發的分支,叫做 DevOps。
不管是開發崗還是測試、運維崗,都有其對應的中高級崗位。開發一般是技術經理;運維一般是架構師;測試一般是測試總監。技術總監、CTO 就是更高一級的職位了。
以上的職位分類我們參考了招聘網站的分類,不一定準確,可能會有很多崗位沒覆蓋到,不少公司也會有自己獨特的崗位設置。
如果能選擇的話,不建議一開始就選運維或者測試。原因有兩個:第一,因為它們雖然很重要,但不是軟件開發的核心崗位。第二,從開發崗往這兩個職位轉非常容易,反之卻非常難。
之前在給掘金寫《程序員職業小白書》的時候,我做過一個郵件訪談,以問題的形式采訪了多位在不同階段、不同崗位、不同城市的程序員的日常。大家可以讀一讀,了解下。程序員們的日常是怎樣的 (雖然這個小冊是收費的,但訪談這一章卻是可以免費讀的,不需要購買哈)
雖然出于某種政治正確,我們一般都會說,語言不重要。但語言真的不重要么?并不是這樣的,每種語言都有自己的優缺點和適用范圍。
像日語和英語一樣,一個是看動畫玩游戲用的,一個是看資料寫代碼用的。(誤)下邊簡單介紹下我眼中的各個語言。
系統語言,用來寫底層操作系統、高性能中間件和嵌入式開發。
舉例來說,如果你想做人工智能方向的話,Python語言就是非常不錯的選擇。因為它在各個大學和研究機構用的非常多,有成熟好用的數學庫,適合于科學計算。在深度學習等熱門方向上,有大量用 Python 開發的框架,新出的 Paper 也能很快在 GitHub 上找到 Python 的代碼實現,可以說是不二選擇了。
如果你想做前端,那么目前來看,除了 JavaScript 還真沒有別的選擇,因為現在能在瀏覽器里邊跑起來,也就是它了。過兩年等 wasm 成熟可能會有其他選擇,但現在,是真沒有。
而相應的,如果你學會了 JavaScript ,想在這個基礎上再把后端給做了,那么 Node.JS 就是非常好的選擇。因為它使用的就是 JavaScript 的解釋器,按 JavaScript 寫就好了。從學習成本上來講,它是非常低的,可以通過很低的投入,就進入了服務器端的領域。
如果你要做網站,那么 PHP 就是首選了。一方面是有大量的可用代碼,世界上超過80%的網站都用的 PHP,基本上你能想到的網站功能,都有能找到的實現,懸念只是有沒有免費的;另一方面,PHP7 的性能提升了很多,用來寫 API 也非常好。
另外一點,就是目前使用 PHP 的團隊非常多,即使在二三線城市也比較容易找到工作,當然,組建團隊也同樣相對容易。
如果你要做大數據分析,那么可能就離不開 Java 了。從 Hadoop 開始一系列的 Google Big Table 的開源實現都是 Java 的,用于海量數據搜索的 Elastic Stack 也是 Java 的。
如果你現在要想去做云計算,那 Go 就是一個非常好的選擇。
因為它就是為了大規模計算設計的,并發管理和性能都非常不錯。而且有很多云計算的軟件,它就是 Go 寫的,如果你要去修改它,調整里邊的實現邏輯的話,不會 Go 可能很麻煩。當然,理論上講,你也可以通過容器和微服務的方式來搞定,但肯定比直接改代碼麻煩。
另外區塊鏈的大熱平臺以太坊的官方(最具潛力)實現,也是Go做的。錢途大大的。
在語言的選擇上,尤其是第一門語言的選擇上,我一直推薦興趣優先的原則。因為對初學者而言,當你遇到困難堅持不下去時,興趣會幫你一把。中學時為了改仙劍,我連匯編都試著學了個入門 ??
但其實對絕大部分應屆生而言,對各種語言并沒有特別的偏好。而且「找到工作」這件事是非常重要的。所以與其盲目的選擇語言學習不如來看看各個語言在招聘市場的表現。
我之前寫過一個腳本,可以抓取幾個互聯網招聘大站的招聘啟事,并按職位對薪資進行統計。下邊是最近一周的統計結果。
先來說說這些數據怎么看。
職位熱度類似于招聘職位數,和其他語言對比就能看出差距。平均薪資之所有有兩個值,是因為我們一般招聘時會給出薪資的上限和下限。嚴格的講,這并不是當前某個語言的程序員們的薪資,而是他們下一次跳槽時的可能薪資。另外,部分企業喜歡在上限值上邊虛高,所以把上限乘80%可能更合理。而下限一般比較真實,更具備對比價值。
然后我們來看看能發現什么。
首先我們會發現,Java 的職位熱度非常高,幾乎在所有城市里邊都是排名第一的。這里有一個特殊原因,就是 Android 職位基本也是使用 Java 語言進行開發的,所以這兩個職位有一些重疊。也就是說,學好 Java 其實可以同時應聘 Java工程師 和 Android 工程師(可能需要額外在學一點點應用開發的知識),這非常劃算。而從薪資方面看,Java 也是數一數二的。
緊隨其后的是前端職位。前端是個非常有意思的特點,那就是——幾乎所有的公司都會招前端。對比 Java 而言,可能有很多大廠的后端用的不是 Java ,那他們就不需要招聘 Java 工程師。如果你非常想去這家公司,但你會的語言是 Java ,那么就可能和機會擦肩而過。而前端崗位的話,機會就可能大得多。這有點像血型里邊的O型血,怎么地方都能用。就算是自以為站在食物鏈頂端鄙視「古典互聯網」的區塊鏈公司也不得不招前端呢,也是一個非常好的選擇。
除了看熱度,我們也要考慮到競爭,比如 Java 是一個「傳統」崗,很多軟件行業的工程師也是會 Java 的。而「前端」是一個新興的互聯網崗,專業前端還不算太多(和 Java 比啦),所以入職難度說不定反而低一些。
其他語言在各個城市的數據各不相同,大家可以挑自己感興趣的看。比如 Go 語言在北京比其他城市熱幾倍;區塊鏈雖然看起來很火,但其實職位數也就比 PHP 的一半多點;Ruby 雖然薪資不錯,但崗位非常少…
總之語言的選擇因人而異因時而異,請綜合各種視角去選擇一個適合自己的。
在選擇好職位和語言后,就要尋找對應的學習路線圖進行學習了。這里推薦這個 Star 數量超過4萬的路線圖(的中文版):GitHub - goodjack/developer-roadmap-chinese: 2018 年成為 Web 開發人員的路線圖
雖然不是很全,但細節不錯。
之前我們在分析 Java 數據的時候,發現一個有意思的問題,那就是 Java 的技術棧可以同時覆蓋兩個熱門職位 —— Java 和 Android,這讓我們的求職競爭力一下翻了一倍。那么在其他的語言和崗位上還存不存在類似的情況呢?
其實是有的,比如前端崗位就是一個非常有潛力的例子,它的后端解決方案 NodeJS 正在日益流行 。在我寫這篇文章的時候,互聯網招聘大站 拉勾網 上北京的 NodeJS 職位數是 181,上海是 114,深圳是 65 。所以學完前端知識再補一下 NodeJS 的收益是不錯的。
但這個技術棧其實還可以進一步優化,因為一個偶然的原因,我統計了一下 PHP 崗位和前端崗位招聘啟事里邊出現的技術關鍵詞,發現其重合度竟然高于60%。具體的技術關鍵詞和熱度見這里 《PHP&前端崗(1~3年)核心技術點分析報告》
回頭一想其實也很好理解,畢竟招 PHP 是來做網站的,HTML CSS JS 總得會一些才行。這意味著PHP的同學只需要補上部分前端知識,比如主流框架 React / Vue / Angular 和 SPA 開發就可以同時應聘 PHP 和 前端 職位。
這會有多大的競爭力呢?前端招聘啟事里邊,有超過十分之一的企業提及了PHP。這還沒完,React 有一個混合應用解決方案,叫做 React Native,可以直接用 React 棧來開發手機APP。這個技術的需求如何呢?現在拉勾網上北京的 React Native 相關職位數有 84 。
于是呢,我們可以選擇 PHP + React + React Native 的技術棧,僅僅多學習一點知識,可以投遞的崗位就從原來的 364 變成了 364 + 373 + 84 。
這就是技術棧優化的策略。關于這個技術棧的優化結構,可以看這里 《方糖全棧學習路線圖》,這個棧還順便把區塊鏈應用開發也覆蓋了。大家可以舉一反三,去優化自己選中的技術棧。
不要最后找工作的時候再來寫簡歷。現在就開始寫,即使你什么都不會。這樣你才會真切的感受到,自己的缺點和劣勢。然后通過不斷的學習,往簡歷上追加新的內容,直到你自己看起來覺得有競爭力了,簡歷才算階段性完成了。
關于簡歷的寫作技巧和工具,我之前寫過一篇文章詳細說明,可以點這里閱讀 《如何寫出一份專業的技術簡歷》 (這篇文章本身依然是免費的,不用購買小冊就能讀)
不知不覺已經寫了這么多了,其實還有一些內容想說,但暫時就不寫到這里了。等以后有空我再整理一個小冊子吧。我把文章也同時發布到了 GitHub,以后的更新會通過 GitHub 進行,歡迎 watch 和 star 。https://github.com/easychen/career-guide-for-cs-graduate
PS:如果你還不知道怎么用 GitHub,那么趕緊學學吧,這可是程序員的必備(交友)工具哦。