作者:一位脫坑十年的長者
在象棋的江湖殘局中,有一個名詞叫做“摘帽”烙样,用來表示先手一方破解了后手方的一步攻殺开仰,局勢趨于一種表面上的緩和。摘帽之后先手方雖然沒有燃眉之急颂郎,但如果殘局功力不足吼渡,仍然會一招不慎滿盤皆輸。
脫坑如摘帽乓序。脫坑只是真正職業(yè)生涯的開始寺酪,未來的發(fā)展仍然充滿著不確定性。我寫這篇短文主要目的是幫助已經(jīng)脫坑的朋友了解以下技術路線的前景——如果能幫助喜歡做技術的堅定信心替劈,不喜歡做技術的盡早找到合適自己的發(fā)展路線寄雀,轉轉PM和EM,那我大概也算是勝發(fā)半篇nature了陨献。
一盒犹、自學與科班
知乎上最近有個問題時不時就跳到我的時間線上對我大肆嘲諷:自學編程和計算機科班出身的差別在哪?-知乎
答案區(qū)基本已經(jīng)變成了轉行人士和科班人士的混戰(zhàn)眨业,看看熱鬧就好急膀。
我希望非科班出身的同學要正視這個問題——和自己比,科班出身永遠比非科班出身好龄捡;和別人比卓嫂,非科班出身不能成為水平不行的借口。
科班出身的人用這個來bully你聘殖,是ta的不成熟晨雳。但是我們作為一個技術人員,不會就斤,可以學悍募;沒接觸過,可以研究洋机;不懂坠宴,可以請教。借用公孫先生的一個句式:真正的猛士绷旗,敢于直面自己的不行喜鼓。個人感受副砍,人在放低姿態(tài)之后比較能夠輕松愉快地學習,如果一直打腫臉充胖子庄岖,公孫先生自己就是個挺好的榜樣豁翎。
扎實地掌握一個語言、幾個庫隅忿、幾個框架心剥,都是基礎,這些是作為合格程序員的基礎硬實力背桐,同時也是最可替代的能力优烧。「程序員是碗青春飯」這句話链峭,并不是完全沒有道理的——如果認為程序員要做的就是不停學新的框架然后用它們開發(fā)程序畦娄,那么三十五歲被退休大概也不能全部怪罪資本邪惡。
如果堅持走技術道路弊仪,你一定要逐漸習得進入下一個階段的能力:
二熙卡、在組件(component)層面獨立解決較為復雜技術問題的能力
系統(tǒng)的一個功能,一個接口励饵,或者一個簡單的微服務驳癌,我們大體上稱為一個組件。
在這個層面上役听,需求的定義相對明確喂柒,然而往往技術細節(jié)并不明朗,需要工程師自己去研究解決方案禾嫉,并且在必要的時候和其他服務灾杰、庫或系統(tǒng)進行集成。
在接觸軟件開發(fā)的最初幾年熙参,面對這樣的需求束手無策艳吠,或者需要很多老人的幫助和指導,是很正常的事情孽椰。但是隨著知識和解決問題經(jīng)驗的積累昭娩,你要學會:
1.面對定義相對良好的有一定規(guī)模的需求如何進行分解;
2.如何利用現(xiàn)存資源降低造輪子的成本黍匾;
3.如果重造輪子不可避免:
a.對于高科技輪子在何處獲取指導和資源
b.實現(xiàn)過程中如何保證質量和**可修改性** (以后單獨講)
4.開始關心系統(tǒng)的運維特性栏渺;
5.開始關心系統(tǒng)的非功能特性;
...
99.開始清楚地認識到自己是否適合一直走技術路線锐涯。
這個階段是程序員會接觸到很多細節(jié)的一個階段磕诊,也是從初級程序員向中級程序員轉變的一個重要階段。如果能夠survive這個階段,那么基本上可以被稱為一個合格的程序員了霎终。
運行在這個層面的程序員滞磺,在面對問題時大概是這樣工作的:
1.做出恰當?shù)姆纸夂凸烙嫞?/p>
2.分析各種技術的優(yōu)劣,理解需求并且能夠和PM莱褒、其他技術人員討論trade off击困,并在高級程序員的合作下選用合適的技術;
3.實現(xiàn)中仍然需要較好的文檔以及技術支持广凸,較快地獨立完成大部分開發(fā)工作阅茶,偶爾需要高級開發(fā)人員指導;
4.產品較為健壯谅海,運維壓力不大目派,并且能夠適應需求的變化。
然而到了這個層次我們就"安全"了嗎胁赢?我認為勤奮的程序員或早或晚都會到達這個程度,而這個世界上從來不缺少勤奮的程序員白筹。所以在此之上我們還要進一步發(fā)展自己的技術實力智末。
很多人都感覺到接下來要發(fā)展架構能力,然而其積累并非一朝一夕可以完成徒河,在那之前系馆,我們還有兩步要走:
三、磨練閱讀代碼的能力
閱讀代碼顽照,不是跟風式的一上來就去讀Hadoop由蘑,Cassandra等大型開源項目——除非是天選之人,否則這個階段也不太能看得懂——而是說在工作中能夠做到以下幾點:
1.在文檔不完整代兵、不精確或者不正確的情況下尼酿,通過閱讀代碼庫來對某個系統(tǒng)得到正確完整的理解;
2.在接手新的項目時能夠快速找出重點主干植影,在代碼為主裳擎,文檔為輔的幫助下理解其實現(xiàn)邏輯及風格/范式(paradigm);
3.在缺少他人解說的情況下(如原作者已經(jīng)離職)思币,能夠大致還原當初的開發(fā)場景鹿响,對一些看起笨拙的寫法能夠做出恰當?shù)慕忉專谥貥嬛心軌騾^(qū)分可以大刀闊斧修改的和需要小心謹慎修改的部分谷饿;
4.在debug過程中惶我,較少依賴debugger,較多通過閱讀代碼來定位問題博投。
代碼是程序行為的source of truth(說還有配置的杠精先一邊涼快去)绸贡,文檔因為代碼迭代太快,或者因為程序員太懶,往往無法起到精確指導實踐的作用恃轩。而閱讀代碼得到的知識结洼,則是最具時效性的和邏輯上正確的知識。
這種能力是長期大量積累代碼調試和閱讀經(jīng)驗之后叉跛,最終獲得的一種思維方式(大概可以稱為人肉debugger吧)松忍。其實這種能力人人都有,只是強弱懸殊筷厘,而且在水平達到一定閾值之前作用并不明顯鸣峭。
在獲得了這種能力之后,一般的不明真相的小朋友看你工作酥艳,經(jīng)常會覺得不可思議摊溶,比如說大家還在研究這個X系統(tǒng)的集成文檔,你陰搓搓已經(jīng)把prototype寫好充石;你問了隔壁組同事一個問題莫换,他說不明白,然后你很無奈去看了幾分鐘代碼骤铃,然后說啊我知道了原來是這么回事……
但是這種能力也沒什么可夸耀的拉岁,我認識的天資較好的朋友,科班出身惰爬,畢業(yè)一兩年讀代碼就已經(jīng)爐火純青喊暖。而我,從大三轉行開始花了大概七年時間才達到他當年的水平撕瞧。
稍微偏個題陵叽。如果看到這里你覺得這不是你要的未來,那么我強烈建議探索一下產品和管理方向——純技術有人喜歡有人不喜歡再正常不過丛版,程序員轉PM和EM也是正常操作巩掺。
在能夠閱讀大型代碼庫之后,很自然的页畦,我們要利用這種能力來進一步強化自己的技術能力——對很多人來說閱讀代碼能力的獲得是自然而然的锌半,如果不能再構筑一道壁壘,我們就只是和野蠻生長的聰明人差不多罷了寇漫。
我的一個建議是閱讀著名開源項目刊殉。個人對分布式系統(tǒng)有一點熱愛,可以保證Cassandra州胳,HDFS记焊,YARN,Redis和Mongo都是值得一讀的代碼栓撞。有朋友說Chromium是非常優(yōu)秀的客戶端代碼遍膜,我沒有親見碗硬,但是鑒于此人十分靠譜,在這里我也做一個推薦瓢颅。關于讀開源代碼的問題在這里不展開講了恩尾,后面有機會單獨說說體會吧。
四挽懦、知識的T字形積累
我們在軟件行業(yè)里面畢竟是后來者翰意,除了實踐中的學習以外,重新補充理論知識是必不可少的信柿。畢竟真的猛士是吧冀偶,得承認自己不行。
離散渔嚷,數(shù)據(jù)結構算法进鸠,操作系統(tǒng),編譯原理形病,數(shù)據(jù)庫客年,網(wǎng)絡之類的這些本科基礎課程就不說了,即使不能達到本科扎扎實實學一遍的水平漠吻,跟著在線公開課擼一遍總是沒錯的量瓜,長期來看很多知識在日常的開發(fā)中都會時不時地出現(xiàn)一下。
工程上侥猩,在自己專精的領域周圍,要有足夠的外延抵赢。如果是做后端欺劳,那么對于現(xiàn)在主流的各種工具如數(shù)據(jù)庫,流服務铅鲤,存儲划提,網(wǎng)絡,負載均衡邢享,工作流等等都要有大體的了解鹏往,明白它們的應用場景和局限性。AWS其實是一個特別好的后端技術索引骇塘,如果能把里面的各種服務都拿出來了解一下伊履,再稍微研究一下對應的開源技術,知識面上就已經(jīng)說得過去了款违。新手要注意的是不要拿個錘子就看什么都像釘子唐瀑,各種技術有其適用性和限制,choose your weapon wisely插爹。
擴展知識的廣度一則可以擴展工具箱哄辣,在設計系統(tǒng)的過程中少走彎路请梢,二則在對比各種不同系統(tǒng)的特性時,可以互相印證力穗,掌握一些一般性的規(guī)律毅弧。
而另一方面技術深度的重要性不用多說。要提醒的是当窗,技術的深度不僅僅是比別人多**知道**幾個技術細節(jié)够坐,比如ThreadPoolExecutor的默認策略有幾種,C++的虛基類內存如何布局超全;也不僅僅是背了幾章標準咆霜,讀了幾篇RFC——深度是從宏觀的需求、應用場景嘶朱,到架構和實現(xiàn)細節(jié)的全面掌握蛾坯。具體深入學習的手段無外乎讀好書,讀優(yōu)質paper疏遏,讀代碼脉课,理解架構,實踐——有條件的話财异,可以為開源項目做一些貢獻倘零。
在一點深入,同時在周邊兼顧展開戳寸,這就是所謂的T字形知識結構呈驶。
在此基礎之上,有意識地鍛煉自己在相應領域的架構能力疫鹊,假以時日袖瞻,能不能成大器不好說,成個技術專家大概問題不大拆吆。
五聋迎、理解架構過程,嘗試進行架構工作
我們日常做的設計和架構工作其實并不復雜枣耀,重點還是從需求出發(fā)霉晕,定義use case,轉化/分解成可行的軟件系統(tǒng)及其的設計捞奕,找到合適的工具和結構/算法來解決問題牺堰。
理解業(yè)務(business logic)、理解需求方?jīng)]有說出來的潛臺詞颅围,和所掌握的工具掛鉤萌焰、正確衡量軟件系統(tǒng)所需的特性、合理分解子系統(tǒng)谷浅,是做軟件架構的一些基本能力扒俯。
發(fā)展這方面能力主要就是多觀摩多思考奶卓,學習身邊的高級工程師是怎么分解和轉化問題的,主動積極參與到關于軟件設計的會議和討論中撼玄,對比自己和大牛思路上的差異夺姑,缺什么補什么。
更高級的工程師會以組織為整體考慮架構問題掌猛,和做具體架構的工程師討論調整解決方案盏浙,令其符合整個組織的技術圖景,個人感受荔茬,這些principal工程師務虛的事情會相對較多废膘。既然是討論純技術發(fā)展,我們就到此為止吧慕蔚。
----
希望這篇短文回答了一些朋友對于未來的疑惑丐黄,也回應了一些對技術人員職業(yè)發(fā)展的不實傳言。沒有對某些文章逐條地進行回應孔飒,是因為一旦開始爭論灌闺,就容易陷入細節(jié)而無法關注宏觀的大方向——不過也希望我講的不是大而無用的廢話。
時間所限坏瞄,只能寫到這個長度桂对,以后有機會我會挑幾個點展開來講。
最后鸠匀,本人脫坑十年整蕉斜,彎曲某司Senior Engineer,先匿了缀棍。