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