標籤:

2017工作小感

從去年年初校招入職百度,到現在也有一年了。過去一年學習了很多,踩過一些坑,也成長了很多,非常感謝幫助過我的人,這篇主要分享下自己的一些思考和想法,也和大家共勉。

1. 保持持續學習

這一點永遠是老生常談的問題,任何行業任何職業都需要不斷學習,像迭代產品一樣進行自我迭代,這一點非常重要。而且好消息是,就我個人經驗而言,如果把獲得作為y軸,學習的付出作為x軸,這條曲線不是線性的,是一條斜率越來越大的曲線,也就是說已經跑起來的人會跑得越來越快。由於知識通常是有關聯的,並且具備遷移性(一個思想可以在多個問題里使用),所以在相同努力的情況下,你原本學得越多,那麼收穫會越大。這聽起來像投資,其實學習本身就是投資,可以形成利滾利。如何衡量學習的成果?讓自己的速度跟上摩爾定律,即每18個月自己的綜合能力需要翻倍。

2. 深入思考以及持續深入思考的能力

這個世界上有很多會深入思考的人,但能持續性地深入思考是一個非常稀缺的品質。我自己也在不斷地練習,我通常做法是自己和自己辯論,自己懟自己:這個設計/功能為什麼要這麼做?為什麼不那樣做?那樣做的話有什麼潛在問題,需要處理什麼tradeoff,這個做法是最好的了嗎,有沒有更好的?另外一個練習是我會在碎片時間把腦子裡queue裡面的問題拿出來思考。一個廣為流傳的「好做法」是用碎片時間來閱讀,但這個做法並不適合我,碎片時間根本讀不進書,讀書需要大片成段的專註時間,還需要做筆記,這還不是主要原因,更重要的是我需要大量的時間來把我之前的輸入內化成自己的東西,碎片時間剛好可以做這件事情,很多時候我在地鐵/健身/洗澡/散步的時候把某個問題想清楚了,這種體驗非常好。另外還有一點,做技術的同學通常都很認真敬業,同時也很容易沉浸於技術的海洋中,但這個世界是緊緊互相聯繫的,讀各種各樣的書,然後思考各種類型的問題能讓自己的思路開闊很多。對於一個問題自己心裡有了一個初步的想法,覺得暫時想不出什麼了的時候可以去干別的事了,下一次再想到這個問題的時候,可能就會有一個比較清晰的思路了。

3. 學會寫工業級代碼,即高質量的代碼設計和高性能高穩定的代碼實現

我從去年年初至今參與了brpc(百度內部的rpc框架,現已開源)的開發和維護工作,代碼實現和抽象能力進步了很多。一個self-contained例子是,有一次需要給brpc加QueryRemover的支持:給定一個QueryString,能通過迭代器的方式來遍歷key,然後決定是否刪除當前的key,遍歷完後返回修改後的QueryString。用naive的方式要實現這個功能其實很簡單,但這不是我們追求的,這裡要考慮的是:各種corner case/錯誤輸入的處理,內存分配做到最優,性能儘可能好,當什麼key都不刪除的情況下應該任何內存都不分配的。最後改了幾次以後代碼變成了這個樣子:github.com/brpc/brpc/bl。現在再回過頭來看這段代碼,腦子裡已經不再是當初naive的想法了,而是intuitively這應該就是這麼實現的。類似的例子還有很多,當自己已經盡全力寫好一段代碼但還是被code review打回,這是一件很好的事情,因為這說明要麼是自己,要麼是對方還有一些不知道自己不知道的東西存在,無論是哪種情況都會對一方產生正面的作用。看代碼也是一個很好的學習方式,就我個人經驗來說盲目地看代碼很容易堅持不下來。一種理想的方式是項目中用到了某種技術,正好需要用到/借鑒某個開源代碼,然後趁熱打鐵有目的地去學習源碼會容易很多。怎麼看代碼也是有技巧的,先在腦子裡想一下讓自己來實現會怎麼做,難點記下來,然後再去看代碼作者怎麼做。例如我前面提到的QueryRemover,有興趣的朋友可以想一下讓你來做會怎麼做,然後看一下我們的實現。目前brpc有許多known issues需要開發和解決,歡迎大家領一個走然後給我們提pr :)

4. 區分問題的表象和root cause

發現了一個bug,調試發現是某個模塊A報的錯,那這個bug的表象就是出在模塊A,但有些時候root cause可能不出在模塊A,真正的原因是模塊B中一個已經隱藏了很久的race condition,甚至可能是一個kernel bug。而如何提高這個區分能力,一方面在於經驗,更重要的一方面在於調試能力。調試其實是有一套固定流程/方法論的,首先分析現象(問題的表象),復現bug,如果是一個隨機出現的bug,那就加大壓力,給系統造成瓶頸,增加bug出現概率(減小工作線程數也可以給系統造成瓶頸,但不推薦這種做法,因為如果這是個多線程bug,那減少線程會降低bug出現的概率),竭盡所能以後如果還是無法復現,那就帶log去線上去復現,等復現的時候要抓住現場,然後解決問題,再次上線驗證,最後總結bug。每一次bug,特別是線上問題,都是一個很好的總結反思的機會,一定是流程上的某一環節出問題了。

5. 對問題/數字敏感,一個優秀的開發者一定是敏感的

我的工作導師 @戈君 曾經和我說,一個程序在control^C退出的時候只要卡了一下下,就一定是哪裡出問題了。還有類似的問題比如請求超時,很容易想到的解決方案是把超時時間調長,但某些情況下這只是掩蓋了問題,如果有些本來應該很快返回函數處理地慢了一些,必有貓膩。不要拖,立刻去找到root cause,否則就是為以後埋坑。

6. 鍛煉抽象代碼的能力,代碼要儘可能低耦合高內聚,易拓展易維護

如果來了一個超緊急功能,我更傾向於的做法是好好評估一下,加下班做好代碼抽象,而不是先粗糙實現然後加個TODO: refine this code,大部分情況下就漸漸就忘記了,變成以後的技術債了,更何況通常也不會有這種「今天開發明天上線」的需求。從軟體開發的一開始就要保證每一次代碼CheckIn都是高質量的,做好規範,一次寫爛了就會發生第二次,然後慢慢地整個項目里都是爛代碼,這就是破窗效應。在過去幾年我C++寫的比較多,以前有一段時間以為,功能本身的實現是需要關注的東西,而現在的觀點是功能本身實現是開發中最基礎最簡單的東西,難的是代碼抽象、性能壓榨和對象的生命周期管理。另外不能偷懶,該重構的地方就立刻去重構,目的是降低代碼的複雜度。讓代碼易維護的核心在於降低複雜度,這是一個很大的topic,推薦看《代碼大全2》,最好的一本講如何寫好代碼的書。

7. 對自己設置高標準

曾經看到一個說法,叫面向離職編程,不是讓你離職,意思就是說,你要把你的每一次代碼提交,文檔撰寫、團隊討論都要以像在交接工作的態度來完成。寫代碼是寫作的一個派生類,精神的傳遞是寫作的目的之一,所以寫代碼同樣也有這個目的,讓別人看到你的代碼能被驚艷到。能決定你能走多遠的下限靠兩樣東西,基礎和hardwork。當對自己設定了較高的標準,hardwork是一件為了達到標準而自然而然發生的事情,隨之而來的是慢慢擁有owner意識,之後就會主動去思考目前系統的問題,然後提出問題並去推動。自己給自己找需求,自己就是產品經理,開發者,測試。當擁有一些owner意識以後,就會去把玩目前的系統,corner case、壓力、異常、極限情況下的表現都會去嘗試測一下,沒準線上就會遇到類似的情況。對於一個系統,別人看來已經完美了,正常運行不會掛了,但真正對問題把控到位的人是不會這麼想的,他會感覺整個系統都是潛在問題,擔心晚上隨時會掛掉,第二天迫不及待起床要優化。

8. 隨時應對變化

不太喜歡打標籤,比如你是前端,他是後端,更喜歡的說法是,我是一名開發,目前正在做XXX相關的事情。話里的意思是,隨時準備好公司/環境/時代的改變,做技術轉型,不要抱著自己已有的東西死死不放,那會是優勢也是枷鎖,同時也要意識到有些東西是沉沒成本,一個理性人在考慮未來決策的時候不應該過多地考慮沉沒成本。另外我認為現在是一個最適合學機器學習的時間,它不會像之前的安卓ios大數據那樣成為一時的議論焦點,然後慢慢熱潮退去,對於這一點我的行動是從兩年前開始正經地系統學習,不算早但也不算太晚,就算以後不做這一行也要了解未來的趨勢。現在最缺的不是研究人員,去看看每年頂會的投稿量就知道了,太誇張了,而是能把技術落地的人。

9. 8/2法則

花20%的時間去了解一個領域80%,而不是花全部的時間去了解一個領域。你在一個領域花的時間越多,你的邊際收益會越小,當邊際成本大於邊際收益的時候,如果沒有特殊的理由,就該換一個領域去深入了,不同領域的思維碰撞沒準也會產生更有價值的想法。

10. 保持謙虛,保持開放的心態

從大了看,人類只是宇宙中的螻蟻,而從長遠看,人類的歷史相對宇宙而言只是曇花一現,更何況我們每個人只是生活在自己有限的圈子裡,沒有理由去驕傲自大,有太多未知的東西了,自己引以為傲的東西可能就是別人的習以為常。我們唯一能做得,就是找到厲害的人,向他們學習,了解他們的想法,思考過後形成融合,讓自己的想法和思路更加開闊,結果就是你會變得更厲害,然後會認識更多更厲害的人,形成良性循環。能看到和他人的差距然後去提升自己最後看到自己身上的成長,這件事本身就讓人激動。

最後一點,也是最重要的:

11. 自信自律,早早進行各方面的積累,形成馬太效應

自信是,一件事還沒有做呢,就知道自己可以做成。這和謙虛並不矛盾,謙虛的本質是保持開放和學習的心態。這裡有個問題,怎麼培養自己長期持續的自信?有一個小方法,建立一本自己的成功筆記本,把自己做成功的事記在裡面,多小的事都可以,每當受挫失落的時候都拿出來看一下,就會原地復活的。當自信慢慢培養起來後,就會慢慢出現一種解決問題的慣性思維,可以理解為強者思維。遇到一個問題,擁有強者思維的人不會找借口,會去找要解決問題所缺少的東西,比如他會想,只要搞定了xx、yy和zz,那麼這件事就搞定了。

未來的路還很長,認準的事不要過早放棄,2018希望各位朋友都順利,生活開心。


推薦閱讀:

那些科技部提到的變革性技術關鍵科學問題
中美兩位 AI 大師的「巔峰對話」:為何 NLP 領域難以出現「獨角獸」? | 獨家
ACL 2017:大牛教你Deadline前續命
物聯網技術中的「兩域、六層」

TAG:計算機科學 |