雙生說:曹樂是典型學(xué)霸,清華本碩,多年互聯(lián)網(wǎng)大廠研發(fā)經(jīng)驗,所以“資深”。我剛到新部門的時候,約各位合作部門的Leader請教,也算幫我做新崗位入職的“平穩(wěn)降落”。印象最深的,就是作為技術(shù)Leader的曹樂,一點都不像技術(shù)——他和我談對業(yè)務(wù)的理解,各個維度的見解與想法,讓人印象深刻。然后,他很熱情的幫我安排了他團隊幾個同學(xué)的1-1,幫助我了解了更多從技術(shù)視角對業(yè)務(wù)與技術(shù)團隊協(xié)同、共創(chuàng)的思考。后來,開始深入合作,發(fā)現(xiàn)合作的技術(shù)同學(xué),不僅僅技術(shù)上追求精進,而且是真正的也能夠跳出來去看業(yè)務(wù)全局。能跳出來,能跳進去。
這封信,是曹樂寫給團隊的。如何成為技術(shù)大牛(來自另一學(xué)霸同事的評論,感謝):尋找范式、刻意練習(xí)、及時反饋;垂直打透、橫向遷移、深度復(fù)盤;聰明人要下笨功夫。
Enjoy~
很多同學(xué)都有關(guān)于工程師該如何成長的問題,大家普遍對如何成長為牛人,如何獲得晉升,如何在繁忙的工作中持續(xù)學(xué)習(xí)充滿了困惑,這其實是每一位同學(xué)成長過程中必經(jīng)之路。最近幾次1-1也和同學(xué)聊過這方面的問題。在這里也想跟大家分享一下我的一些心得。
同學(xué)們普遍對成長充滿了焦慮感。工作太忙沒時間學(xué)習(xí),需求太多太瑣碎感覺自己沒什么進步,做技術(shù)是不是做到35歲以后就沒人要了,等等,都是對成長焦慮的體現(xiàn)。在這里我想說的是,這種焦慮是正常的,所有的渴望,在內(nèi)心的投射其實都是焦慮。任何一個渴望成長的人,不管處于什么階段,一線工程師,架構(gòu)師,還是總監(jiān),副總裁,其實內(nèi)心中都是充滿了焦慮的,無一例外。對于這種焦慮,我們所要做的是接納,而不需要過度擔(dān)憂。這種焦慮并不是說,想明白如何成長了就會沒有了,到了某個階段就會沒有了的。成長的腳步和期待一刻不止,內(nèi)心的焦慮也一刻不會停歇。正是這種焦慮感,驅(qū)使你寫代碼追查問題到星夜,驅(qū)使你犧牲休息娛樂的時間和一本本厚厚枯燥的書作伴,驅(qū)使你不斷努力向前,不舍晝夜。相反的,如果內(nèi)心中沒有這種焦慮,反而是值得擔(dān)憂的。這可能說明已經(jīng)習(xí)慣呆在自己的舒適區(qū)了。在現(xiàn)在這樣一個高速發(fā)展的社會,以及我們這樣一個高速發(fā)展和變化的行業(yè),失去對成長的渴望和焦慮反而是一個非常危險的信號。
所謂的程序員35歲危機,其實背后的根本原因是,有太多太多人在工作幾年以后,就覺得自己什么都會了,之后的十幾年工作只不過是頭2-3年的簡單重復(fù)而已。在我們這樣一個行業(yè)里,在招聘的時候,如果擺在管理面前的兩個人,一個是初出茅廬或剛工作2-3年,充滿了對成長的渴望;另一個工作十多年了但水平和工作2-3年的人差不多,只是更熟練一些,不過在舒適區(qū)已經(jīng)躺了十年了。如果負(fù)責(zé)招聘的是你,你會做出什么樣的選擇?
而另一方面,其實是高端人才在行業(yè)內(nèi)的極度極度稀缺。大家可以想一想,我們部門上一次招聘到D10及以上的同學(xué)是什么時候?從業(yè)務(wù)平臺部2016年中成立到現(xiàn)在,一個都沒有過。D9同學(xué)也是鳳毛麟角,一年能招到1-2個就足夠可以偷著樂了。面試碰到牛人的時候,就如同相親碰到女神一樣激動。這其實在行業(yè)內(nèi)是非常普遍的現(xiàn)象,真正的大牛太稀缺了。在這樣一個行業(yè)里,如果一個人能夠持續(xù)成長,能力和工作年限成正比的持續(xù)提升,這樣的人,任何時候在行業(yè)里都是被瘋搶,怎么可能會遇到任何年齡的危機呢?
每一個業(yè)務(wù)平臺技術(shù)部的同學(xué),都應(yīng)該立志成為這樣的大牛,持續(xù)學(xué)習(xí)和成長。
如何學(xué)習(xí),其實是有方法論的,那就是刻意練習(xí)。所謂的10000小時成為大牛的理論是片面的,如果只是簡單重復(fù)10000小時,是不可能成為大牛的??桃饩毩?xí)包含了三個步驟。第一,找到你要學(xué)習(xí)的這個領(lǐng)域體系的范式(pattern);第二,針對每個范式刻意的反復(fù)學(xué)習(xí)和練習(xí);第三,及時反饋。
大家在過往的工作和學(xué)習(xí)生活中,或多或少都在實踐著刻意練習(xí)。拿面臨高考的中學(xué)生舉例子,好的學(xué)生通常是把一門功課拆成了很多知識點(尋找pattern),然后針對知識點以及他們的排列組合,有針對性的反復(fù)做各種難度的題(刻意練習(xí)),每次做完題都對一下答案看看正確與否,如果錯了就思考,記錄,復(fù)盤(持續(xù)及時反饋)。這樣的學(xué)習(xí)方法就是事半功倍的。而事倍功半的學(xué)習(xí)方法,就是不分青紅皂白拿起一本習(xí)題或卷子就拼命做,我上學(xué)的時候身邊不少同學(xué)非常勤奮但成績并不好,多半都是這個原因。再舉一個我最近在學(xué)打羽毛球的例子,正確的學(xué)習(xí)方法是把打羽毛球拆解成步法和手上動作,小碎步,米字步,正反手挑球,放網(wǎng),正手和頭頂高遠(yuǎn)球吊球殺球等(尋找pattern),然后針對每一個動作反復(fù)練習(xí)(刻意練習(xí)),然后請教練或者錄下來看視頻糾正自己的動作(及時反饋);而錯誤的學(xué)習(xí)方法是,上來就盲目找人打比賽,以賽代練,這樣的進步是很慢的,而且錯誤的動作形成習(xí)慣以后未來反而很難糾正。
當(dāng)學(xué)習(xí)方法不正確的時候,刻苦的學(xué)習(xí)常常只是看起來很勤奮,并沒有應(yīng)有的效果。當(dāng)接觸一個陌生領(lǐng)域的時候,錯誤的學(xué)習(xí)方法是不帶目的性,上來就找一堆相關(guān)的大部頭開始啃。而正確的學(xué)習(xí)方法應(yīng)該是快速梳理該領(lǐng)域的知識點,形成框架體系(尋找pattern),這里有些小竅門可以快速構(gòu)建起一個領(lǐng)域的知識點體系,例如看一些該領(lǐng)域的綜述性或開創(chuàng)性的文章(看論文,別瞎看網(wǎng)上的文章),或者找本該領(lǐng)域綜述性的教科書看它的目錄(注意,好的教科書的目錄往往就是這個領(lǐng)域的知識框架,內(nèi)容倒不一定非要看下去)。然后,針對每個知識點,找書里的相關(guān)章節(jié),該領(lǐng)域相關(guān)paper里的相關(guān)section深入學(xué)習(xí),建立起自己對這個知識點的理解(刻意練習(xí))。最后,再把知識點和現(xiàn)實工作中的情況(自己工作,或其他公司相關(guān)的工作)進行對照(及時反饋),從而建立對一個知識點的深度理解,最后融會貫通建立對一個領(lǐng)域的理解。這樣說可能有點抽象,拿我當(dāng)年學(xué)習(xí)分布式存儲的過程為例子,先結(jié)合自己的工作內(nèi)容梳理出需要深入了解的知識點(例如,元信息組織,Meta Server設(shè)計和HA,副本組織和管理,Recovery,Rebalance,單機存儲引擎,數(shù)據(jù)/元信息流,糾刪碼,一致性,多租戶,存儲介質(zhì),網(wǎng)絡(luò)環(huán)境和IDC等等),同時看很多綜述性的材料,梳理分布式存儲的知識點(有網(wǎng)上各種整理的比較好的文章,也有從各種系統(tǒng)實現(xiàn)的paper里抽出),不斷迭代構(gòu)建分布式存儲領(lǐng)域的知識點(尋找pattern,這是最難的一個過程);然后針對每一個知識點,找相關(guān)材料進行深度學(xué)習(xí),例如,對于分布式一致性,需要閱讀CAP理論,Paxos的論文,Raft的論文等等以及周邊的很多材料(刻意練習(xí));然后找各種系統(tǒng)實現(xiàn)的論文或文章,比如GFS,Dynamo,Aurora,OceanBase,Ceph,Spanner等等,看看和對比它們在一致性上是如何考慮和取舍的,當(dāng)然,最重要的是結(jié)合自己工作中的反復(fù)實踐和所學(xué)知識點進行比對(及時反饋)。這三個階段并不是割裂的,而是周而復(fù)始的,經(jīng)常會在刻意練習(xí)和及時反饋的學(xué)習(xí)過程中,發(fā)現(xiàn)自己遺漏的知識點,或者發(fā)現(xiàn)自己梳理的兩個知識點其實是重合的。通過這種交叉比對,以及在實踐中不斷檢驗的方式建立的知識點是非??陕涞氐?,而不會看了幾篇論文以后就人云亦云。拿分布式存儲的一致性舉例子,如果不是反復(fù)對比、思考和反復(fù)實踐,你不會發(fā)現(xiàn)GFS論文里最難的一段,多個Writer對一個文件進行append的邏輯,在實踐中根本沒用;你也不會發(fā)現(xiàn)看起來優(yōu)雅而學(xué)術(shù)的CAP三選二的理論,實踐中壓根不是這么完美,很多時候只能三選一;你也不會發(fā)現(xiàn)Dynamo論文里的Vector Clock,網(wǎng)上有無數(shù)文章?lián)u頭晃腦的解讀,但在Amazon的應(yīng)用場景里是個典型的over design,Cassandra在這點就務(wù)實很多。
這時候大家可能會有個疑問,工作本身就如此繁忙了,哪里能抽出足夠多的時間去學(xué)習(xí)?
其實工作和學(xué)習(xí)本身,是不應(yīng)該被割裂的。工作本來就應(yīng)該是學(xué)習(xí)的一部分,是學(xué)習(xí)中的實踐和及時反饋的部分。學(xué)習(xí)如果脫離工作的實踐,其實是非常低效的。因此每個同學(xué)應(yīng)該對自己工作所在的這個技術(shù)和業(yè)務(wù)領(lǐng)域進行系統(tǒng)性的學(xué)習(xí),并在工作中反復(fù)實踐和驗證。不同的領(lǐng)域之間其實是融匯貫通的,當(dāng)你對一個領(lǐng)域精通并總結(jié)出方法論以后,很容易就能上手別的領(lǐng)域。因此花幾年實踐徹底研究透一個領(lǐng)域,對于剛工作幾年的同學(xué)來說,是非常重要,甚至是必須的,也只有在一個領(lǐng)域打透之后才談得上跨領(lǐng)域遷移,去拓展自己的知識面。更直接的說,對于一個領(lǐng)域還未完全掌握的同學(xué),深度是最重要的,不用想廣度的事情,等掌握了一個領(lǐng)域之后,再去拓展廣度就變得很容易了。這里一個常見的誤區(qū)是,學(xué)習(xí)的內(nèi)容和工作的領(lǐng)域沒有太多直接的關(guān)系。例如,我以前曾經(jīng)花了非常大的功夫去讀Linux內(nèi)核的源代碼以及很多相關(guān)的大部頭,幾乎花掉了我將近兩年的所有空閑時間,然而在我這些年的工作里,幾乎是沒有用處的,最多就是有一些“啟發(fā)”,ROI實在是太低了,現(xiàn)在也忘得差不多了。更重要的,軟件工程是一門實踐科學(xué),從書本上得到的知識如果沒有在實踐中應(yīng)用和檢驗,基本上是沒有用處的。舉一個例子,很多優(yōu)秀的架構(gòu)師,盡管日常工作中可能反復(fù)在用,但未必說得出開閉原則,里氏替換原則,迪米特法則等等,反過來,對面向?qū)ο笤O(shè)計這7大原則出口成章的人,很多其實離真正的架構(gòu)師還遠(yuǎn)得很,有些甚至只是博客架構(gòu)師而已。實踐遠(yuǎn)遠(yuǎn)比看書,看文章重要得多,上文所述的我構(gòu)建自己分布式存儲知識體系的過程,看起來好像都是看材料,看論文,而實際上80%的收獲都來源于帶著理論的實踐,和從實踐中總結(jié)沉淀的理論。因此,徹底搞明白自己工作所在的技術(shù)和業(yè)務(wù)領(lǐng)域,是最務(wù)實高效的做法,工作和學(xué)習(xí)割裂,會導(dǎo)致工作和學(xué)習(xí)都沒做好。
這時候大家可能會有另一個疑問,感覺日常工作非?,嵥?,學(xué)不到什么東西,怎么辦?
如果把學(xué)習(xí)分成從書本中學(xué),和從工作中學(xué)這兩種的話,那毫無疑問,工作中的“知識密度”,比起書本的“知識密度”,肯定是要低很多的,因為書本里的知識,那都是人家從他們的工作中抽象總結(jié)出來的。這也是為什么大家普遍覺得日常工作“瑣碎”。然而工作中每個點滴的瑣事與平凡,都是可以抽象總結(jié)成為方法論的,更別說工作所在的領(lǐng)域自身的博大精深了。從日常工作中學(xué)習(xí)的秘訣,就是“行動中思考”。
對于每一個軟件工程師,最重要的兩個能力,是寫代碼的能力和trouble shooting的能力。并且,要成為優(yōu)秀的架構(gòu)師,出色的開發(fā)能力和追查問題的能力是一切的基礎(chǔ)。提高寫代碼的能力的核心,首先在于堅持不斷的寫,但更重要的,在于每天,每周,持續(xù)不斷的review自己之前的代碼;同時,多review牛人寫的代碼,比如是團隊里你覺得代碼寫的比你好的同事,比如社區(qū)里以代碼漂亮著稱的開源代碼(作為一個C++程序員,當(dāng)年我的榜樣之一是boost庫)。一旦覺得自己之前的代碼不夠好,就立刻復(fù)盤,立刻重構(gòu)。更重要的是,多思考自己代碼和好的代碼之間不同之處背后的為什么,通常這就是為什么這些代碼更好的背后的秘密。特別要說明的是,代碼規(guī)范除了知道是什么外,要格外重視思考每一個代碼規(guī)范背后的為什么。代碼規(guī)范的每一句話,背后無一例外都是一片江湖上的血淚史。要提高trouble shooting的能力,關(guān)鍵在于要深度復(fù)盤自己遇到的每一個問題,包括線上的,包括測試發(fā)現(xiàn)的,尋找每一個問題,每一次事故背后的root cause,并且思考后續(xù)如何避免同類問題,如何更快的發(fā)現(xiàn)同類問題。要對團隊內(nèi)外遇到的所有問題都要保持好奇心,關(guān)注一下周邊的事故、問題背后的root cause。Trouble shooting能力的提高是幾乎無法從書本上得到的,完全來源于對每一個問題的深度思考,以及廣泛積累每一個問題。對于架構(gòu)師而言,可能未必在一線寫代碼了,但看團隊中一個架構(gòu)師是否真正牛逼的一個很重要標(biāo)準(zhǔn),就是看他是否能夠追查出團隊其他同學(xué)查不出來的問題。我見過的一個真正牛逼的架構(gòu)師,對于系統(tǒng)中疑難雜癥,通常問幾個問題,就能大致猜出是哪里出的問題,以及可能的原因是什么,準(zhǔn)確程度如同算命,屢試不爽,令人嘆為觀止。
對于一個架構(gòu)師,除了更加優(yōu)秀的代碼能力和trouble shooting能力外,需要構(gòu)建相對完整的當(dāng)前技術(shù)領(lǐng)域的知識體系,需要有體系化的思維能力,需要對技術(shù)所服務(wù)的業(yè)務(wù)要有非常深入的了解。體系化的思維能力,來源于兩個方面。一方面是在日常工作中,對每一個接口設(shè)計,每一個邏輯,每一個模塊,子系統(tǒng)的拆分和組織方式,每一個需求的技術(shù)方案,每一個系統(tǒng)的頂層設(shè)計,都要反復(fù)思考和推敲,不斷的復(fù)盤。另一方面,需要大量廣泛的學(xué)習(xí)行業(yè)內(nèi)相似系統(tǒng)的架構(gòu)設(shè)計,這其實就是開天眼,只是技術(shù)相對來說,行業(yè)內(nèi)的交流更加頻繁,淘寶、美團、百度、Google、Facebook、Amazon等各個公司介紹系統(tǒng)架構(gòu)的論文和PPT鋪天蓋地,需要帶著問題持續(xù)學(xué)習(xí)。除了技術(shù)領(lǐng)域本身外,架構(gòu)師需要非常了解業(yè)務(wù)上是如何使用我們的系統(tǒng)的,否則非常容易over design,陷入技術(shù)的自嗨中,這也是為什么我說Amazon Dynamo論文里講的Vector Clock是個over design的原因。另一方面,很多時候技術(shù)上繞不過去的坎,可能非常復(fù)雜的實現(xiàn),往往只需要上層業(yè)務(wù)稍微變通一下,就完全可以繞過去,這也是為什么我說GFS論文里,多個Writer同時Append同一個文件是個根本沒用的設(shè)計(實際上Google內(nèi)部也把這個功能去掉了)。這也是為什么我在咱們部門內(nèi)反復(fù)強調(diào)大家需要深入了解業(yè)務(wù),因為達(dá)到同樣的業(yè)務(wù)目標(biāo),可能稍微改一下產(chǎn)品方案就可以讓需求的技術(shù)實現(xiàn)變得無比簡單。只有真正知道上層業(yè)務(wù)是如何使用系統(tǒng)的,才可能真正做好架構(gòu)。 深入了解業(yè)務(wù)并不難,對于每個同學(xué),只要對于每一個接到的需求,對于每一個需求評審中的需求,對于周邊同學(xué)或團隊要做的需求,都深入思考為什么業(yè)務(wù)要提出這個需求,這個需求解決了業(yè)務(wù)的什么問題,有沒有更好的方案。遇到不明白的多和周邊同學(xué)、產(chǎn)品、運營同學(xué)請教。最怕的是自己把自己限定為純粹的研發(fā),接到需求就無腦做,這等于放棄了主動思考。衡量一個人是不是好的架構(gòu)師,也有一個方法。對于一個需求,如果他給出了好幾個可行的方案,說這些方案也可以,那些方案也可以,往往說明他在架構(gòu)師的路上還沒有完全入門。架構(gòu)師的難點不在于給出方案,而在于找到唯一的那一個最簡單優(yōu)雅的方案。
總結(jié)起來看,行動中思考,就是始終保持好奇,不斷從工作中發(fā)現(xiàn)問題,不斷帶著問題回到工作中去;不斷思考,不斷在工作中驗證思考;不斷從工作中總結(jié)抽象,不斷對工作進行復(fù)盤,持續(xù)不斷把工作內(nèi)容和全領(lǐng)域的知識交叉驗證,反復(fù)實踐的過程。
在工作所在的技術(shù)和業(yè)務(wù)領(lǐng)域中刻意練習(xí),加上行動中思考,就是成為技術(shù)大牛的秘訣。
看起來方法也不復(fù)雜,為什么大牛還是非常稀少?
盡管我們通篇都在講方法,但其實在成為技術(shù)大牛的路上,方法反而是沒那么重要的。真正困難的,在于數(shù)年,數(shù)十年如一日的堅持。太多人遇到挫折,遇到瓶頸,就覺得手頭的事情太乏味枯燥,就想要換一個方向,換一個領(lǐng)域,去學(xué)新的技術(shù),新的東西。而真正能夠成為大牛的,必須是能夠青燈古佛,熬得住突破瓶頸前長時間的寂寞的,必須是肯下笨功夫的聰明人。因此,和堅持相比,方法其實并沒有那么重要。
和大家共勉。
(完)
<img src="https://img2018.cnblogs.com/blog/852983/201905/852983-20190524141346744-1122517577.jpg" width = "50%" height = "50%" align=center />