最近幫了一個朋友的朋友做了下職業規劃,結合之前在微博上的一些問答,覺得不少應屆生同學對求職有蠻多誤解的,所以這裡分享下我的一點經驗吧。雖然本文題為指北,但只是一個面向對行業、對業界技術不熟悉的同學的操作手冊。各位技術大牛可能覺得粗淺,請見諒。
本文略長,會談及以下問題。
- 職業規劃越早越好
- 一定要珍惜校招的機會視窗
- 應屆生的求職策略
- 技術職位的選擇
- 語言和技術棧的選擇
- 技術棧的優化
- 簡歷的書寫
下邊我們一點一點來講。
本文作者 @Easy ( weibo.com/easy ),方糖全棧課( quanzhanke.com )主講人,有多年大規模網站、雲平臺開發經驗、曾運營過使用者數十萬的程式設計師拍賣平臺,為上千名程式設計師找過工作。轉載請保留以上作者資訊和連結,謝謝。
內容更新通知
可微信掃碼(未關注直接關注)訂閱本指北更新。
職業規劃越早越好
職業是一個非常特殊的東西,它有兩點很特別,一個是「不可重來」,另一個是「驗證耗時」。之前和一個老友聊天,他感嘆說,回過頭看看,自己的整個職業過得亂七八糟。等到現在明白這點的時候,已經來不及了。因為一般一段職業經歷短則一到兩年,長則三到五年。換兩家公司,十年一晃就過去了。如果你在這十年中沒有很好的成長,又不幸身在某些公司,那三十多歲可能就面臨被清退的處境了。
我一般不屑於去和別人分享什麼人生經驗,畢竟有些坑不自己跳下去是不會牢記在心的。但職業的坑不一樣,等你發現在坑裡時,可能已經晚了。所以我花了蠻多時間來研究這個。有興趣的同學可以去讀讀我的《程式設計師跳槽全攻略》,專門講職業規劃的。( 在我的個人網站上可以免費讀 方糖氣球?|程式設計師跳槽全攻略 )
一定要珍惜校招的機會視窗
我大學的語文老師曾告誡我們說,人生就像四季一樣,春天該播種,你去播種,秋天該收穫,你去收穫,這樣是最省力的。你非要倒過來呢,也不是不行,但就是會很累,會付出更多的精力和代價。
校招也類似,它是社會和企業為從未步入職場的同學特意準備的一個綠色通道。在這個通道里,我們將候選人當做一張白紙,可以沒有經驗、沒有行業常識,只要對工作充滿熱情、有還算聰明的頭腦,基本都算是合格的。企業會為這些同學準備培訓,並留足適應期,有的甚至還會安排一對一的老員工來帶。
但是,一旦你錯過了它,那一切都不一樣了,因為你進入了名為「社招」的紅海。在這裡,所有已經畢業的人變成了你的競爭對手,不但要面對和你一樣工作年限的人競爭,還要面對其他工作時間更長、經驗更豐富的同行跳槽帶來的競爭。甚至經常發生因為招到了一箇中級崗位的候選人,取消掉兩個初級崗位的情況。
所以校招非常重要,一定不要錯過。
應屆生的求職策略
既然校招這麼重要,那麼我們怎麼才能在其中佔據優勢呢?記住兩個詞「擇優錄取」和「跑贏同學」。
擇優錄取
在微博上經常可以看到這樣的問題:「我這個也會、那個也合格,憑什麼他們就不招我呢?」這是典型的沒有明白招聘本質的表現。要明白,求職不是「會考」而是「高考」,不是什麼產品的出廠合格校驗,而是一場中國這個資源緊缺型國家裡的又一場優質資源爭奪戰。
那些薪水高、發展空間好的知名企業(後文簡稱大廠),每年招聘的人數是一定的。極端點說,如果現在所有候選人的水平都下調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 就是更高一級的職位了。
以上的職位分類我們參考了招聘網站的分類,不一定準確,可能會有很多崗位沒覆蓋到,不少公司也會有自己獨特的崗位設定。
職位的選擇
如果能選擇的話,不建議一開始就選運維或者測試。原因有兩個:第一,因為它們雖然很重要,但不是軟體開發的核心崗位。第二,從開發崗往這兩個職位轉非常容易,反之卻非常難。
之前在給掘金寫《程式設計師職業小白書》的時候,我做過一個郵件訪談,以問題的形式採訪了多位在不同階段、不同崗位、不同城市的程式設計師的日常。大家可以讀一讀,瞭解下。程式設計師們的日常是怎樣的 (雖然這個小冊是收費的,但訪談這一章卻是可以免費讀的,不需要購買哈)
語言和技術棧的選擇
語言概況
雖然出於某種政治正確,我們一般都會說,語言不重要。但語言真的不重要麼?並不是這樣的,每種語言都有自己的優缺點和適用範圍。
像日語和英語一樣,一個是看動畫玩遊戲用的,一個是看資料寫程式碼用的。(誤) 下邊簡單介紹下我眼中的各個語言。
C/C++ :
系統語言,用來寫底層作業系統、高效能中介軟體和嵌入式開發。
Python:人工智慧的好選擇
舉例來說,如果你想做人工智慧方向的話,Python語言就是非常不錯的選擇。因為它在各個大學和研究機構用的非常多,有成熟好用的數學庫,適合於科學計算。在深度學習等熱門方向上,有大量用 Python 開發的框架,新出的 Paper 也能很快在 GitHub 上找到 Python 的程式碼實現,可以說是不二選擇了。
JavaScript:前端和全端
如果你想做前端,那麼目前來看,除了 JavaScript 還真沒有別的選擇,因為現在能在瀏覽器裡邊跑起來,也就是它了。過兩年等 wasm 成熟可能會有其他選擇,但現在,是真沒有。
而相應的,如果你學會了 JavaScript ,想在這個基礎上再把後端給做了,那麼 Node.JS 就是非常好的選擇。因為它使用的就是 JavaScript 的直譯器,按 JavaScript 寫就好了。從學習成本上來講,它是非常低的,可以通過很低的投入,就進入了伺服器端的領域。
PHP:依然是網站首選
如果你要做網站,那麼 PHP 就是首選了。一方面是有大量的可用程式碼,世界上超過80%的網站都用的 PHP,基本上你能想到的網站功能,都有能找到的實現,懸念只是有沒有免費的;另一方面,PHP7 的效能提升了很多,用來寫 API 也非常好。
另外一點,就是目前使用 PHP 的團隊非常多,即使在二三線城市也比較容易找到工作,當然,組建團隊也同樣相對容易。
Java:大資料分析
如果你要做大資料分析,那麼可能就離不開 Java 了。 從 Hadoop 開始一系列的 Google Big Table 的開源實現都是 Java 的,用於海量資料搜尋的 Elastic Stack 也是 Java 的。
Go:雲端計算和容器管理
如果你現在要想去做雲端計算,那 Go 就是一個非常好的選擇。
因為它就是為了大規模計算設計的,併發管理和效能都非常不錯。而且有很多雲端計算的軟體,它就是 Go 寫的,如果你要去修改它,調整裡邊的實現邏輯的話,不會 Go 可能很麻煩。當然,理論上講,你也可以通過容器和微服務的方式來搞定,但肯定比直接改程式碼麻煩。
另外區塊鏈的大熱平臺以太坊的官方(最具潛力)實現,也是Go做的。錢途大大的。
語言的選擇
興趣優先
在語言的選擇上,尤其是第一門語言的選擇上,我一直推薦興趣優先的原則。因為對初學者而言,當你遇到困難堅持不下去時,興趣會幫你一把。中學時為了改仙劍,我連彙編都試著學了個入門 ?
市場其次
但其實對絕大部分應屆生而言,對各種語言並沒有特別的偏好。而且「找到工作」這件事是非常重要的。所以與其盲目的選擇語言學習不如來看看各個語言在招聘市場的表現。
我之前寫過一個指令碼,可以抓取幾個網際網路招聘大站的招聘啟事,並按職位對薪資進行統計。下邊是最近一週的統計結果。
先來說說這些資料怎麼看。
職位熱度類似於招聘職位數,和其他語言對比就能看出差距。平均薪資之所有有兩個值,是因為我們一般招聘時會給出薪資的上限和下限。嚴格的講,這並不是當前某個語言的程式設計師們的薪資,而是他們下一次跳槽時的可能薪資。另外,部分企業喜歡在上限值上邊虛高,所以把上限乘80%可能更合理。而下限一般比較真實,更具備對比價值。
然後我們來看看能發現什麼。
Java 的資料非常牛
首先我們會發現,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,那麼趕緊學學吧,這可是程式設計師的必備(交友)工具哦。