作為一名工程師,應(yīng)該如何學(xué)習(xí)?
只要一日自詡工程師,就沒有辦法放棄學(xué)習(xí)。本文不算是技術(shù)文,只是介紹一些個人的學(xué)習(xí)方法和經(jīng)驗(yàn)。如果很多點(diǎn)你已經(jīng)做到并且做好,一笑了之便可。
一、閱讀書籍
對于工程師來說,從書籍得來的知識是必不可少的。現(xiàn)在很多年輕的程序員會從網(wǎng)絡(luò)博客來學(xué)習(xí)技術(shù),但博客內(nèi)容大多缺乏體系(主要說總結(jié)性質(zhì)的博客內(nèi)容),不系統(tǒng)。很多博主為了掩飾自己的未知,遇到不知道的關(guān)鍵點(diǎn)就一筆帶過,進(jìn)而導(dǎo)致缺失。即使原作者非常努力,內(nèi)容上沒有缺失,你能從中獲取的也只是別人總結(jié)好的知識,沒有自己的主動思考,這中間便缺少過程式的沉淀,一味地滿足于背誦別人總結(jié)好的知識,最后也只不過淪為他人的復(fù)讀機(jī)而已。
對于工程師來說,書籍依然是最重要的知識獲取媒介。即使只是通過目錄概覽,也能獲取某個領(lǐng)域的大致藍(lán)圖。
目前大部分優(yōu)秀的技術(shù)書籍依然以英文為主,能夠讀懂英文技術(shù)書籍是工程師的硬實(shí)力。英語閱讀能力怎么訓(xùn)練呢?如果不是為了應(yīng)試,可以嘗試逼迫自己去翻譯一些英文文檔/文章來進(jìn)行專門訓(xùn)練。舉個例子,為了學(xué)習(xí) Go,筆者曾經(jīng)和社區(qū)的小伙伴合作翻譯過 《The Go Programming Language》 [1] ,后來為了深入學(xué)習(xí) es,參與了社區(qū)的 《es 權(quán)威指南》 [2] 的翻譯和校對工作。如果某篇技術(shù)文檔你從生理上很厭惡它,但是又覺得內(nèi)容不得不學(xué)習(xí)的話,那你就逼迫自己去翻譯它。千字以內(nèi)的文檔,周末抽一個下午就可以搞定。這里已經(jīng)說是逼迫了,自然可以想見這個過程并不像打游戲那么輕松愉快,但只要熬過了這個階段,閱讀技術(shù)相關(guān)的英文文檔可以顯著提升速度。
具備一定的英語能力之后,接下來就是從什么渠道去獲取內(nèi)容。如果對電子書不排斥的話,目前比較經(jīng)濟(jì)的選擇是申請一個國內(nèi)的 ACM 會員,并且用該會員去注冊 oreily 在線書店 [3] 。一年大概 20 美元,可以及時地閱讀到大部分出版社的技術(shù)出版物。因?yàn)楝F(xiàn)在出版社的網(wǎng)站大多還支持 early preview,所以你甚至可以在書籍還沒有上市之前就預(yù)先學(xué)習(xí)內(nèi)容,第一時間獲取整個業(yè)界的一線情報(bào),能夠幫助你站在時代的潮頭。等兩年后同事拿到翻譯生澀的中文版的時候,你已經(jīng)可以從容地 diss 他在信息源上落后了自己整整兩年。(當(dāng)然,如果你有興趣,國內(nèi)的出版社一般在英文新書出版的時候會招募翻譯志愿者,如果你對一個領(lǐng)域特別感興趣,關(guān)注出版社的這些招募消息也可以去參與。這里要指出,不要對做翻譯這件事情抱太高期望,重在提升自己的能力。想賺錢的話就算了。)
如果喜歡一邊閱讀一邊在頁邊寫寫畫畫,電子書還是稍微困難點(diǎn),當(dāng)然這個問題你也可以用 ipad pro + apple pencil 來解決。但有些人比較喜歡實(shí)體書捧在手上的實(shí)感,國外有些書甚至是個人出版物,例如筆者之前購入的《timeless law of software development》,這些書在互聯(lián)網(wǎng)上正盜均無,只能考慮通過海淘渠道入手。前些年淘寶的海淘服務(wù)也可以用來淘書,書籍大多比較重,運(yùn)費(fèi)不菲。有些老書運(yùn)費(fèi)可能會到書費(fèi)的一半讓人格外肉疼。又因?yàn)閲鴥?nèi)對出版物管制比較嚴(yán)格,所以為了避險(xiǎn),這兩年這些海淘服務(wù)商基本上都不幫忙代購出版物了。對于個人用戶來說,也就只剩下了直郵和轉(zhuǎn)運(yùn)兩種選擇。直郵雖然比較便宜,但是萬國聯(lián)盟的 EMS 一走到中國可能就上了牛車,速度慢到突破極限?;灸X子稍微正常的都會選擇轉(zhuǎn)運(yùn)。除了速度之外,有些出版社的書籍是只在美帝本土銷售的,不支持 global delivery。
走轉(zhuǎn)運(yùn)的話,需要辦一張 visa 或者 mastercard 的多幣種信用卡,這樣才能在海外網(wǎng)站進(jìn)行支付 。
上面這些問題都解決了以后,書籍的獲取就不再是問題。
二、信息源
雖然文章開頭對于傳統(tǒng)的書籍大贊特贊,但書籍的缺點(diǎn)也是顯而易見的。在技術(shù)領(lǐng)域,這個缺點(diǎn)就尤為明顯:時效問題。如果我們所學(xué)習(xí)的是相對比較老的領(lǐng)域知識,那只要讀書基本上就夠了。
但技術(shù)的發(fā)展日新月異,如果你想要成為知曉領(lǐng)域內(nèi)所有新技術(shù)的那個人。你還是需要關(guān)注一些書籍以外的新聞源,下面是一些例子:
1. Github Trending
Github Trending 代表的是一種風(fēng)向,一般一個項(xiàng)目能上 trending 的話,可能是作者自己去 hacker news、reddit 做了宣傳,也可能是被某個業(yè)界大佬帶了流量。因?yàn)楝F(xiàn)在 Github 上的國人越來越多,很多國人學(xué)習(xí)技術(shù)比較顯著的訴求其實(shí)只是面試(汗,一旦什么 xx interview/xx road to 架構(gòu)師之類的倉庫開了就會吸引一大批國人點(diǎn)星,近兩年 trending 的質(zhì)量有下跌趨勢。
不過最近 Github Trending 增加了按照 Spoken Language 篩選功能,所以你可以過濾特定的語言,相對比之前還是好多了。
Github 的 trending 一般按照語言區(qū)分,如果你想要成為某門語言的專家,那這種語言每天世界各地的人又造了什么新輪子上榜了總還是需要知道的。星星特別多的 Repo 去讀讀源代碼也是一種樂趣。
除了按照時間和星星來進(jìn)行聚合,Github 上也有人開了各種 awesome-xxx 的總結(jié)頁,這種倉庫對于學(xué)習(xí)語言或者特定領(lǐng)域的技術(shù)來說也是很實(shí)用的。如果你恰巧又發(fā)現(xiàn)了領(lǐng)域的空白,拿自己的業(yè)余時間去造個輪子,也可以提 PR 進(jìn)行收錄。因?yàn)?awesome-xxx 大多是個人項(xiàng)目,因此作者一般還是比較友好的。不過現(xiàn)在 awesome-xxx 的項(xiàng)目越來越多,就有人會想去做一些 awesome 倉庫的匯總。然后這些 awesome 的匯總又越來越多,就會有人繼續(xù)向上進(jìn)行匯總。所以就陸續(xù)有了 awesome-xxx,awesome-awesome,awesome-awesome-awesome。。。真是工程師們的黑色幽默。
2. follow 優(yōu)秀的工程師
在世界各地有很多杰出的工程師,每天每月每年活躍在 Github 上。我們總是希望自己能在技術(shù)上做到一直精進(jìn),同時隨著年齡和工齡的增長又會時不時陷入迷茫,這時候去看看同齡的優(yōu)秀工程師,年紀(jì)更大的優(yōu)秀工程師在這個時間段在寫什么代碼,在寫什么博客,可能對于解決自己特定時期的迷茫有益?;蛟S就發(fā)現(xiàn)了一個新的領(lǐng)域值得自己去奉獻(xiàn)青春。
在起步階段你可能不知道該從哪里去找這些優(yōu)秀的工程師,也有幾個源頭,如果你閱讀到了精辟的代碼,覺得作者水平拔群,那么馬上去 Github 找到這個項(xiàng)目,并 follow 作者就是一個比較好的選擇。如果你在某個地方聽人說起了一個傳奇的程序員,比如 geohot?那么在 Github 就趕緊 follow 他。如果你發(fā)現(xiàn)自己 follow 的人又 follow 了別人,那么也可以對這些延伸關(guān)系鏈上的人進(jìn)行考察,如果很對自己胃口的話,同樣可以考慮。
在 follow 了足夠的人之后,你的 Github 首頁就能看到這些人每天的動作了。又是一個新的新聞源。
3. reddit 相關(guān)社區(qū)
很多火起來的語言、技術(shù)領(lǐng)域社區(qū)在國內(nèi)其實(shí)都有點(diǎn)分裂,大家都想要占個山頭當(dāng)大佬。而每個社區(qū)也都零零碎碎地匯集了一些好的內(nèi)容。但因?yàn)檎l也不服誰,國內(nèi)的社區(qū)生態(tài)被人為地割裂了。我們沒有辦法在同一個社區(qū)獲取或者搜索到所有我們想要知道的技術(shù)文章、問題、思考、總結(jié)。所以我建議還是去關(guān)注國外的社區(qū)吧。
reddit 是一個不錯的選擇。當(dāng)然,因?yàn)槊舾性~的關(guān)系,這個社區(qū)本身是被強(qiáng)了的。這里需要考察到你的越墻技能。
reddit 的 rust 社區(qū) [4] 。
4. The Morning Paper
除了工程以外,在某個領(lǐng)域做得稍深之后,我們就需要去關(guān)注更前沿的理論部分了。作為一個工作了的碼農(nóng),想要研習(xí)理論需要去閱讀一些每年新發(fā)表的論文。在學(xué)校里讀過一點(diǎn)論文的基本都知道,再好的文章因?yàn)橐恍┗奶频睦碛桑紩в写罅康膹U話。
The Morning Paper 是一個國外某企業(yè)的 CTO(CTO 還天天讀論文,神奇)創(chuàng)建的個人 blog,其中會幫助我們?nèi)ソ庾x很多新論文,省去了我們?nèi)ラ喿x大量廢話以及對于工業(yè)界人來說不那么重要的公式的時間。只當(dāng)了解的話,是個非常不錯的渠道。
5. 技術(shù)會議和公開課
除了閱讀文字,閱覽視頻和與人面對面交流在有些時候也是必不可少的。有些自己冥思苦想而不得解的問題,在牛人的點(diǎn)播下片刻茅塞頓開。這也是所謂聽君一席話勝讀十年書的充分體現(xiàn)。比我們工作時間長,且經(jīng)常總結(jié)的人經(jīng)常能夠給后入行的人帶來廣闊的視野和沖擊性的理論,這些是文字所不能帶給我們的。
當(dāng)然,在技術(shù)會議上聽分享也要保持自己的頭腦清醒,不要被那些天花亂墜的概念所嚇退。有些人的分享很功利,其實(shí)只是一些舊概念的包裝。而這些人出現(xiàn)在現(xiàn)場的目的也可能重在宣傳自己方便跳槽,不要被騙了。在聽主題的時候稍微有一些選擇性,盡量避開這種天花亂墜的忽悠選手。
除了技術(shù)會議,ytb 上有很多優(yōu)秀的公開課。從現(xiàn)在往前推十年的話,很多人抱怨因?yàn)榻?jīng)濟(jì)、家庭原因,沒有機(jī)會出國深造,接受世界一流大學(xué)的計(jì)算機(jī)教育。而公開課的出現(xiàn)已經(jīng)使財(cái)務(wù)、距離對我們的限制消失了。在學(xué)校里學(xué)習(xí)的時候,一門課程也就 36-48 個課時,外加上思考、作業(yè)的時間,就算是 72-96 個小時。對于已經(jīng)工作的社畜來說,一個月的周末有 8 天,稍微努努力,基本上一個月就可以學(xué)完一門公開課了。這既可以彌補(bǔ)你學(xué)生時代的遺憾,同時也可以填補(bǔ)某些人嘴里所謂的虛無縹緲的“基礎(chǔ)不行”。吊打某些自視甚高的老油條。國外的計(jì)算機(jī)課程往往會隨著工業(yè)界的發(fā)展而隨時更新,例如早期 Sony 的 Playstation 3 上市后,便有學(xué)校的體系架構(gòu)課專門講解 IBM Cell 處理器的架構(gòu)設(shè)計(jì),前年或更早的時候,已經(jīng)有學(xué)校向?qū)W生講解 Intel i7 處理器中的一些更現(xiàn)代的設(shè)計(jì)理念。這可比一些工作十年但從來不關(guān)注新技術(shù)的人所告訴你的結(jié)論強(qiáng)太多了。
二、多做開源
有些同學(xué),在閱讀了大量的代碼、設(shè)計(jì)方法論之后,可能依然在工作時陷入焦慮。為什么我們在企業(yè)內(nèi)維護(hù)的代碼都是一坨屎,為什么我每天寫的東西就是在屎山上堆屎?
大多數(shù)公司的軟件生命周期其實(shí)很短,開源界沒有靠譜的解決方案時,為了解決一些臨時問題,企業(yè)傾向于以最小資源獲取最大收益,即使是純技術(shù)項(xiàng)目,我們在做的也都是一些丑陋的臨時解決方案。甚至有些 MVP 版本產(chǎn)品的代碼能活過一個星期就不錯了。有些企業(yè)的內(nèi)部技術(shù)工具雖然從性質(zhì)上可以開源,但為什么開不了?還不是因?yàn)闅v史包袱重,代碼寫的屎。有些時候不是工程師不追求優(yōu)秀的代碼,工期緊張的情況下寫著寫著就變形了。
好在業(yè)余時間是屬于我們自己的,我們可以用最嚴(yán)格的標(biāo)準(zhǔn)來要求自己編寫自己的開源項(xiàng)目。并且以產(chǎn)品的方式來對這些項(xiàng)目進(jìn)行運(yùn)營,這不僅能提升我們的技術(shù)能力,同時也會給我們帶來更多的機(jī)會。如果自己的開源項(xiàng)目成功的話,同時可以給自己帶來更大的業(yè)界影響力,何樂而不為?
三、多做總結(jié)
在有了足夠的信息獲取渠道,和個人能力提升手段之后,還應(yīng)該多進(jìn)行總結(jié)。對于工作 3 年以上的工程師,總結(jié)并不只是為了面試。一個人的工作內(nèi)容一定會隨著時間的推進(jìn)而不斷變化,工作領(lǐng)域也可能在跳槽之后發(fā)生變化,怎么讓自己的歷史積累不成為時代的眼淚?就是要做總結(jié)。
比較好的總結(jié)手段有:
1. 建立自己的測試代碼庫
這一點(diǎn)我認(rèn)為做的最好的是, learn [5] ,這是一個韓國裔的工程師。如果從大學(xué)開始就建立這樣的習(xí)慣的,在技術(shù)上走過的所有的路都可以清晰可見。
如果自己的總結(jié)能夠讓別人看上去也賞心悅目,那還是比較成功的。即使做不到這種程度,我們建立自己的代碼庫之后,想要搜索一些拿來演示的代碼片段也會方便不少。
2. 建立自己的 blog
博客是個人思考的軌跡,我們的工作并不是簡單的完成任務(wù)。在完成任務(wù)的同時應(yīng)提煉自己的方法論,逐漸形成自己看待技術(shù)問題,看待業(yè)務(wù),看待公司,看待業(yè)界乃至看待整個世界的觀點(diǎn)。獨(dú)立思考是一個人最重要的品質(zhì)。
從進(jìn)入滴滴開始,我寫個人 blog 也大概有 4 年有余,即使初始只能寫一些簡單的內(nèi)容,到現(xiàn)在我已經(jīng)可以從任意我想要的角度切入進(jìn)行較為完備的分析和觀點(diǎn)總結(jié)。
對于工程師來說,除了代碼能力之外,文字能力也是需要進(jìn)行訓(xùn)練的。能夠把事情做好,還要能在必要的時候,通過文章來把自己的工作宣傳出去。建立自己的個人品牌。
3. 建立自己的筆記庫
除了完整的博客輸出,有一些零散的知識不好組織,便可以放在自己的筆記里,這些可以是別人的分享的備份,也可能只是記錄一些簡單的命令。記錄筆記是很好的習(xí)慣,因?yàn)橐粋€人不可能永遠(yuǎn)記得所有工具的使用方法。必要的時候通過查閱筆記快速地回憶起來就已經(jīng)足夠了。
四、鍛煉演技
因?yàn)楣こ處煿ぷ?80% 的時間都是在和技術(shù)、代碼打交道,所以也比較容易忽視一些軟技能的訓(xùn)練,這里不說一些敏感的內(nèi)容,只說說口才。據(jù)我觀察,大多數(shù)的工程師其實(shí)并沒有意識到這是一個問題。即使在純技術(shù)人員交流的場合也會發(fā)現(xiàn)有些人的表達(dá)能力著實(shí)一般,其它技術(shù)人員理解起來都費(fèi)勁,何況去和非技術(shù)人員交流。
人這一輩子,最重要的是能把路越走越寬。對于工程師來說,能夠鍛煉軟技能的場合其實(shí)不是很多,但也不代表完全沒有。即使沒有也可以自己創(chuàng)造機(jī)會,例如組內(nèi)、組間、部門內(nèi)的技術(shù)分享都是不錯的機(jī)會。
更大規(guī)模的技術(shù)分享可能因?yàn)橹鬓k方“勢力眼”,在你級別不高或者影響力不大的時候,不提供給你這樣的機(jī)會,但是作為一個向上的人,遲早會有走到這一步的一天。你所要做的是提前做好準(zhǔn)備,在那一天到來的時候,在聚光燈下旁征博引,談笑風(fēng)生。
祝大家都能成為更好的自己!