工作五年以上的程序員,應該幹些什麼?


面試了成百上千人,其中不乏五年以上工作經驗的人,我常常會問面試者,你日常如何構建自己的技術知識體系,如何讓自己更高更快更強?多數人並沒有深入地思考過這個問題,基本上是零敲碎打,隨機性大,俗話說腳踩西瓜皮滑到哪裡算哪裡。

我會建議他們,都已經coding了這麼多年了,你不妨按我講的這個體系練練:

第一階段 認真構建完整的知識體系

十幾年前我投身軟體行業的時候,光是講解資料庫原理、操作系統、TCP/IP、組網、演算法等等基礎知識的英文原版書摞起來就等身,認認真真看完,各種上手實踐,入行後,讀遍 C++ 各種經典著作,讀遍各種協議原文,認認真真打基礎。
很多工程師都說自己平常就是在某些 IT 門戶上看看推薦的博文或新聞,我說這屬於典型的零敲碎打,不夠刺激。
聊到這時,我會舉一個例子,為什麼要閱讀長篇小說,因為中短篇小說就像用針扎你,而長篇小說就像把你裝進一個沙袋裡吊起來,從四面八方用狼牙棒打你,酣暢淋漓。構建可用的知識體系,就得讀書,書是有體系結構的,你關心不關心,現階段你用到用不到,它都講到了,從頭到尾看幾遍,針扎得透透的。

何謂知識體系?
幾年前,前支付寶架構師姚建東曾經在我們公司做過技術人員如何規劃自己的分享講座,他是這麼論述的:
技術與技巧包括:

  • 計算機基礎理論
    • 計算機模型:內存/IO/時鐘/CPU……
    • 演算法
    • 專項技術領域:
      • 數據挖掘
      • 數據管理
      • 智能推薦
      • 搜索
      • ……
  • 語言與工具
    • 語言與相關體系
    • 開發工具,分析工具,代碼管理工具
    • HTML/CSS/JS/Ajax
    • 常用框架與第三方類庫
  • 調試與測試
    • 調試方法和哲學
    • 定位問題
    • BUG管理工具
    • 單元測試
    • 集成測試
    • 性能測試
    • 安全測試
    • 兼容性測試與方法
    • JS/Ajax測試與方法
    • 服務層測試
    • Web層測試
  • 網路與系統
    • TCP/IP協議與模型,HTTP/SMTP等協議
    • Linux系統,網路分析工具,系統分析工具
    • 容量,流量與負載均衡
    • 應用部署、規範、規劃
    • 安全
    • 監控與故障分析
    • 磁碟與存儲
    • Shell
    • DNS與域名
    • 緩存,反向代理
    • 圖片伺服器(海量小文件)
  • 需求挖掘與分析
    • 需求文檔格式
    • 需求訪談
    • 需求分析方法,需求分析工具
    • 領域知識與經驗
  • 系統分析與設計
    • UML語言與模型
    • 分析模式
    • 設計模式,領域驅動
    • 系統分析文檔格式
    • 系統設計文檔格式
    • 功能性需求與非功能性需求
  • 數據與系統
    • 資料庫
    • 可伸縮策略,擴展策略,備份,容災,性能,安全,高可用……
    • 數據設計與範式,SQL/NoSQL,Cache,分散式文件
  • 架構設計
    • 架構模式,典型互聯網公司架構演進歷史
    • 架構原則,常用策略
    • 架構設計方法
    • 非功能性理解
      • 擴展性
      • 伸縮性
      • 穩定性
      • 一致性
      • 性能
      • 吞吐量
    • 容量預測與規劃
    • 架構體系與相關技術
  • 過程與管理
    • 分析過程
    • 研發過程
    • 評審過程
    • 測試過程
    • 發布過程
    • 回滾過程
    • 文檔管理
    • 知識管理
    • 項目管理

以上其實就是一份從業基礎知識清單,你可以按圖索驥,閱讀相關書籍。

第二階段 順著一個Topic鑽進去,鍛煉自己的預研能力

無論公司業務還是自己喜歡做的事,都可以抽象出通用性課題,然後以做論文的方式殺進去。這個事情得反覆操練,有意識操練。
做事方式為:

  1. 抽象出 Topic——如分散式鎖,分散式並行計算引擎,防CSRF的FormToken自動生成框架,定時任務管理與調度平台,分散式跟蹤,等等
  2. 向功課好的學生學習——有針對性地深入了解業界其他公司是如何分析問題和解決問題的,匯總各種方案,站在巨人的肩膀上
  3. 分析特定應用場景,技術選型
  4. 兼顧高可用性和可伸縮,做設計評審
  5. 做測試自證靠譜,梳理知識點,開技術分享會
  6. 上線商用,總結經驗教訓,開經驗分享會

其中一個重點是匯總和分享。05年時,應電信級統一消息業務需要,我去研究了 SIP 協議,做了各種試驗,分析報文,寫了一系列的幻燈片,做了公開分享,一時間還頗受歡迎:

  1. SIP_to_Freshman_by_zhengyun.ppt
  2. SIP之穿越NAT_by_zhengyun.ppt
  3. SIP體系架構講義及消息交互演示_by_zhengyun.ppt
  4. SIP多方會話消息之實例講解_by_zhengyun.ppt
  5. SIP安全框架之認證[NTLM和Kerberos]_by_zhengyun.ppt
  6. SIP消息之逐項講解_by_zhengyun.ppt

為什麼要寫出來、講出來呢?
因為有一個學習金字塔理論,如下圖所示:

我們讀過的事情能夠記住學習內容的10%,
我們聽過的事情能夠記住20%,
我們看過的事情能夠記住30%,
我們聽過和看過的事情能夠記住50%——如看影像/看展覽/看演示/現場觀摩,
我們說過的事情能夠記住70%——如參與討論/發言,
我們說過和做過的事情能夠記住90%——如做報告,給別人講,親身體驗,動手做。
這也就是我在《窩窩研發過去幾年做對了哪些事》中闡述的管理方法:我們從入職之後就有意識地訓練大家,讓大家能夠公開陳述、清晰表達。所以,試用期內,新人必須做一次技術分享和一次技術評審,面對各方的 challenge;預研的中間和結尾都要有分享會;平時也要定期組織技術講座。

第三階段 瘋狂回答技術問題

知識體系慢慢構建,與業務相關的抽象 Topic 也在探索中。
但這還不夠。
因為你親身接觸到的世界太小,可能不足以構成挑戰,你可能意識不到自己缺多少知識和技能,不利於你分析問題、提出問題和解決問題的能力培養。
所以,要主動出擊:
瘋狂回答問題

我曾經在入行的頭幾年裡幾乎把我關注的垂直領域(包括語言領域和業務領域)里的所有問題都回答了一遍。我對外宣揚知無不言言無不盡,放出郵件地址和 MSN(那時候 MSN 很高大上),很多網友都會發郵件或者加我好友,問各種開發疑難問題,平均每天都有幾個,然後我把解決問題的過程寫成微軟 KB(KnowledgeBase) 文體發表在我的博客上。
你想想看,工作中的問題你平均每隔幾天才能遇到一個,而這麼做,每天你都會遇到幾個乃至於十幾個,第一讓你腦力激蕩,第二接觸到更多新知。

05年到06年期間,我因工作需要學習了 JavaME(或古老的稱呼 J2ME),早年間 Symbian 手機上的客戶端開發。那段時間我天天掃中文論壇的帖子,力求回答所有問題,尤其是那些 BUG 或故障。對於那些暫時沒有人解決的,如流媒體實時播放,如仿 OperaMini 二級菜單界面,都上下求索,最後放出思路以及源碼。
同時,我經常整理常見問題,梳理成冊並發布。譬如我整理過的 J2ME 疑難問題:

  1. [J2ME QA]真機報告MontyThread -n的錯誤之解釋
  2. [J2MEQA]WTK初始化WMAClient報錯XXX has no IP address的解釋
  3. [J2ME QA]untrusted domain is not configured問題回應
  4. [J2ME]「Cannot open socket for LIME events」錯誤解決

幾個月後,我成為 J2ME 中文論壇超級版主。通過這個歷程,我想告訴大家,回答網友問題,技巧得當的話,比如別老是重複回答新手問題,試著攻克那些疑難問題,或者離奇故障,絕對不會浪費你的時間。
為什麼?
因為你要信奉:
你學過的每一樣東西,你遭受的每一次苦難,都會在你一生中的某個時候派上用場。
——佩內洛普·菲茲傑拉德 《離岸》

Everything that you"ve learnt and all the hardships you"ve suffered will all come in handy at some point in your life.

第四階段 RCA/總結

現在是你把經驗教訓變為財富的時刻了。
什麼是好的技術 Leader?
隨便一個業務需求或業務場景講出來,你立刻把它抽象為幾個模塊/系統/Topic,然後侃侃而談,業界都是怎麼解決的,我們以前又是怎麼分析怎麼解決的,現在咱們這種情況下應該如何設計,可能會遇到什麼問題,我們應該做哪些預防設計,blabla。

怎麼做到這一點?
第一,寫 RCA 報告。
我以前說過,『窩窩從 2011 年開始,一直堅持每錯必查、錯了又錯就整改、每錯必寫,用身體力行告訴每一個新員工直面錯誤、公開技術細節、分享給所有人,長此以往,每一次事故和線上漏測都會變為我們的財富。這就是我們的 RCA(Root Cause Analysis)制度,截止到目前已經收集整理了近兩百個詳盡的 RCA 報告。』
RCA 報告格式為:

  1. 背景知識(Optional)
  2. 問題現象
  3. 影響範圍
  4. 問題原因
  5. 問題分析過程(Optional)
  6. 解決辦法
  7. 後續處理措施:如線上臟數據如何修復,如對用戶造成的影響如何彌補等(Optional)
  8. 經驗教訓
  9. RCA類型:如代碼問題、實施問題、配置問題、設計問題、測試問題

這樣,作為一名合格的老兵,你見過了足夠多的血,並且把它們變成了你的人生財富。
第二,寫總結。
話說,要經常拉清單。
侃侃而談得有資料,這些都得是你自己寫才能印象深刻,關鍵時刻想得起來。

本文出自《技術高手如何煉成 - 旁觀者 - 知乎專欄》。


第一名的答案完全是胡扯。
我們不去談他那些高大上的東西到底哪裡胡扯了,
我在這裡就有一個問題,照著他的練,練歪了,誰給你娶媳婦買房子買車子生猴子呢?
他鄭某能替你包辦嗎?

題主問的是五年的程序員應該做什麼,
不是問的怎麼去提升技術含量做個全能的工作機器人。

來來,應該做什麼來跟我念:
1. 準時下班,健康工作
2. 娶妻生子,健康生活
3. 運動遊戲,健康娛樂
4. 音樂美術,健康欣賞
5. 自我提升,健康成長

做到這些了,你再去考慮怎麼提升你的碼農技術不遲,
如果那個時候,你還覺得你的興趣愛好就是提升自己的編碼水平的話。

天天鼓吹讓人做技術達人能顯得你高大上是嗎?
你的人生,除了什麼狗屁的知識體系,還值得更多。
千萬不要和這些當了ceo沒事寫個代碼的人天天吹你應該怎麼給他們賣命,
那是嫌日子太好過了,他們的屁股和我們是對立的!

你賠掉的人生,都給他們賺走了。


我做開發十幾年了,說說我的理解。工作五年以上的程序員,應該在這些方面多多精進:

  1. 在某一領域,建立自己的知識體系,形成頂端優勢。因為只有你形成了知識體系,才會更有價值,才能更好的解決問題。
  2. 培養自己的通用能力,比如溝通、演講、管理、寫作、講授、組織、輔導等。這些通用能力,能讓你更好的與人協作,也能讓你獲得更好更多的做事機會,能夠更好的成長。
  3. 學會思考,建立思考的習慣。正確的思考,能夠讓我們少走很多彎路。要多想,想明白再去實現,至少,也要想明白當下要做的這一步再行動。要規劃思考時間、要經常琢磨一些根本性的問題,比如你為什麼要做軟體開發,比如這個產品到底有什麼用能給用戶帶來什麼價值,比如怎樣才能做得更好,比如我能通過軟體開發得到什麼,比如五年之後我在哪裡……
  4. 建立自己的影響力。在一個團隊之中具備影響力的表現是:經常有人來問你的意見,經常有人向你請教問題,很多事情或者問題依賴你。只有你具備影響力了,才能夠做更重要的事情,擔任更重要的角色。
  5. 建立個人品牌和辨識度。你在一家公司工作,離開時,別人會因為你是某某公司的開發工程師而記得你,還是會因為你是機器學習方面的專家而記住你,這非常不同。所以,要竭盡全力,在公司的平台上成就自己,建立個人的品牌,讓別人因為你本身的特質而記住你,而不是因為你曾在哪裡待過。

從投入成本到收益來說,五年左右的時間還不足於建立有效的知識體系,
但五年足以在某個領域成為熟手,能解決日常工作中遇到的大部分問題。
現在技術越來越簡單,差不多3年也夠了。三歲看老,到這時,是混混還是人才,基本也算確定了。
所以3~5年的工作年限是一個技術人員經驗和能力都開始成熟,自我感覺最好,最不知道天高地厚,對僱主來說最有性價比的階段。

至於幹什麼:
生活上,大學畢業工作5年左右,差不多虛歲三十歲了,最迫切的應該是找個妹子準備結婚。
工作上,主要是一個深度和廣度的平衡。廣度:打個最最簡單的比方,工作需要你劃條線,你起碼要額外知道怎麼畫曲線,畫圓,畫橢圓,畫弦等等。當然知道如何取捨精華還是雞肋也是技術思想上的成熟標誌。
深度:起碼要對某個方向上有自己獨特的見解。起碼要有這種自信把能力和經驗展示給僱主。

反正以上基本都不太好評估,最簡單粗暴的標準 就是看跳槽後的薪資有沒超過你的同學(或差不多起點的同事)。


既然一路點技術技能樹,不屑於將來要轉職忽悠路線的話,
一項專精遠比知道一大堆花架子靠譜。
Talk is cheap,show me the code.

一般真正做事情的僱主要的是能把某個活干好的人。
中高層基本都是內部培養的多,空降還是比較少的。


new了這麼多年的對象,是時候找個對象了.......


切記面向工資編程


1.繼續走技術路線

編了五年代碼,應該很熟悉自己的工作領域了,甚至已經建立了知識體系,技術和能力相對成熟。如果你工作的時候,還是覺得自己在做喜歡的事情,還是有慾望去學習,去探索,去創新,那麼,可以考慮向專業級別的工程師進發了,拿更好的薪資,追求更大的成就感。

一般,工作五年之後確定繼續要走技術路線的程序員不會太過糾結,因為熱情,他們只需在這條路上繼續學習,努力將自己的水平提高到專家級。建議多接觸新興事物,互聯網行業,一年兩年里,感受不到自己和時代的差距,但是過個五年十年,一些習以為常的東西已經和時代脫節了。

而且,因為工作了五年,在人際關係方面,積累了一定的人脈,應該已經贏得客戶、同行和管理者的尊重。不管是對學習還是發展,這都是一個很好的環境。建議利用這些積累,把握機會,提升自己,為自己未來的發展鋪路。

2.走管理路線

大多數技術崗轉管理層的理由是,覺得自己不會在技術崗有太多的發展空間,退出一線做管理也不失為一個好方法。

當管理還是和計算機相關,也不意味著不需要掌握編程技能;管理還是要跟蹤最新技術的動向,只是不需要深究技術細節了,工作重心從編程改為管理,工作對象從計算機改為人。

注意的是,技術崗轉管理很容易,如果想從管理轉技術崗就比較困難了。一旦走上管理崗位,就意味著需要處理很多與人相關的事情,比如:上級對項目不滿時,你需要向上級說明;分配任務;處理矛盾等。了解差異後,慎重選擇。

3.自己創業

很多人嚮往著有一天可以自己創業,程序員也是如此,希望創造自己的產品,建立自己的品牌,獲得大家的認可。

程序員想要創業,光有程序員的思維是不夠的。要創業,專業技術要紮實;有產品思維,對科技發展有一定的預見性;對壓力有足夠的承受能力,知識面廣,溝通能力等。而且,就算有了以上具備創業的條件,時機和機遇等其他因素也是能否成功的重要因素。

周鴻禕老師說,中國程序員創業的成功率相對較低,對程序員來說,要創業需要大量的實踐,要慢慢培養對產品,對商業的感覺。做好規劃、組建團隊,說不定創業夢想就實現了呢。

4.從事別的行業

如果在這五年的工作中,發現自己不喜歡/不擅長程序員這個工作,且管理也不是自己想要的方向,可以考慮轉行。

建議還是找與IT行業相關的職業,比如:測試、做工程等。這樣比零基礎轉崗容易一點。零基礎轉崗還是慎重,除非本身實力較強或者清晰自己的轉崗目標。

歡迎關注我的微信公眾號:九章演算法(ninechapter),幫助你了解IT技術前沿,通過面試、拿到offer、找到好工作!


題主是想問職業規劃吧?生活當然比工作重要,但貌似並不是題主想問的。

工作5年,做編碼工作應該已經輕車熟路了吧。這時候你可能面臨走管理線還是走技術線的選擇。

請優先選管理線!

很多人不明白,所謂技術線其實是給做不成管理的人找的退路!項目leader只能選一個,同期進公司的其他人有情緒怎麼辦?安排個技術職位,美其名曰系統工程師,架構師,表示一下對技術的尊重,省的鬧事。
另外,做了系統工程師架構師一樣要和人打交道,除了你管不了人以外,其他該做的事一樣不少。


@javaliker 說的很對,首先是要明確自己的職業發展目標。
也就是你得想想在下一個五年到來時,你希望自己正在幹什麼,能幹什麼?想要什麼?
至於技術線,管理線,只是其中的一些主流選擇罷了,你還可以去創業,甚至去賣水果。
人生苦短,何妨一試?

如果還想深入擼Android,關注我的公眾號吧 :)


5年的程序員,如果之前的5年都在做程序的話,應該到了一個職業拐點:大部分應該是個人所接觸的項目需求,經歷了或廣或深的各種系統,但對某些側面、深入專業需要體系化、專業化的時候。
這個時候需要考慮職業的專業性,選擇一個專業領域,在這個領域裡找到一個合適的公司和崗位,比如搜索專家、架構師、DBA專家、運維、UI體驗、自動化測試、產品專家等等,獵聘網上有很多中高端的職位。在這個領域裡需要對專業知識、軟技能進行有意識的學習、訓練。我們知道有一個3萬小時定律,你需要在這個專業領域摸爬滾打3萬小時,就會對該領域各個側面的問題都成為專家。並加強與外界同行業專家的交流,自己的專業中又做出超出行業水準的作品,進而能夠走到行業裡面去。職業就上到另外一個台階了。
另外很多人會喜歡選擇管理,其實在互聯網技術行業,重要的是有想法、能幹事,純管理其實是比較務虛的。只有具備專業領域知識,管理和不管理其實已經沒有什麼區別,而這時最重要的其實還是專業知識。


5年的話,當個項目主程序或技術骨幹應差不多,能力強的或運氣好的能找個小公司當個技術總監或負責人。這個時候,是該考慮下後面的規划了,繼續做技術或者轉管理崗,做技術的話,一方面在原方向深入研究,一方面開始擴展知識面,無論業務層面還是其他語言,都該慢慢了解一些了,另外,努力提高一下自己的情商,很可能再進一步,就進入最令人討人厭的站隊撕逼層了~~
另外,諸位自黑的差不多得了,30歲沒對象的程序沒多少~~


我也不知道工作五年的時候應該幹些什麼。
反正我工作五年的時候厭倦了寫代碼,然後轉行去做市場了。轉了一年,啥都沒做成,然後換了個行業,換了個城市,又回來繼續做程序了。


專精一門,哪怕是偏門冷門


工作六年,我的感受是打通全身經脈。從前到後,再到最底層,有清晰的結構體系認識。


真心希望4年後的我不會問這問題……


我個人認為應該有一個完全屬於你自己,能夠代表你的最高技術水平的作品
你開始動手就會發現,之前做的東西,大多數是不系統不全面的,只有自己動手作為一個「你心目中的好作品」
才能看清
1自己的眼光
2自己能力的極限
3你的抽象的能力的具象化產物別人怎麼看
之後你要做的東西是這個的2.0版本,3.0版本,乃至無窮
這也是我正在做的事情。。。雖然有一點晚

所以從現在開始動手吧


找女盆友!真的!別再擼了!


找個女朋友


這個問題的答案取決於你的另外一個問題的答案:

如果是在北上廣是否已經搞定了房子?

如果答案是否,那麼該想想怎麼賺錢,是不是拓展一些投資渠道,請不要再埋頭在電腦前寫代碼了。

工作5年的程序員,工資應該達到了一個瓶頸,寫代碼的邊際收益已經很低了,需要擴展能力圈,社交圈了,好好愛惜身體,多陪陪家人。


有心無力,則繼續磨練
有力無心,則想辦法轉行
有心有力,則趕緊創業
無心無力,廢物點心一個,你問我,我問誰去?


推薦閱讀:

如何在debug的同時保持溫柔屬性?
程序員的優越感從何而來?
IT 工程師被叫「碼農」時是否會不舒服?
如果男性程序員為降低bug 率可穿女裝,那女性程序員應穿什麼?
為什麼程序員無論到哪兒都喜歡背電腦包,哪怕裡面沒有裝電腦?

TAG:程序員 | 職業規劃 |