很多技術(shù)同學(xué)都關(guān)注自身成長的問題坟岔,比如如何成長為牛人谒兄、如何獲得晉升、如何在繁忙的工作中持續(xù)學(xué)習(xí)等社付,甚至因為這些問題變得焦慮承疲。其實這是每一位同學(xué)成長過程中的必經(jīng)之路邻耕,對于焦慮,要做的是接納而不是過度擔(dān)憂燕鸽,并積極尋找問題的答案兄世。每一個技術(shù)人,都應(yīng)該立志成為技術(shù)大牛啊研,持續(xù)學(xué)習(xí)和成長御滩。
近日,公眾號“再成長一次”(ID:Read_Enjoy)整理了資深技術(shù) leader 曹樂寫給團(tuán)隊的一封信《如何成為技術(shù)大诺吃叮》削解,信中提到兩個方法,其一是尋找范式沟娱、刻意練習(xí)氛驮、及時反饋;其二是垂直打透济似、橫向遷移矫废、深度復(fù)盤。以下為原文內(nèi)容砰蠢。
學(xué)習(xí)其實是有方法論的磷脯,那就是刻意練習(xí)。
所謂的 10000 小時成為大牛的理論是片面的娩脾,如果只是簡單重復(fù) 10000 小時,是不可能成為大牛的打毛∈辽蓿刻意練習(xí)包含三個步驟:第一,找到你要學(xué)習(xí)的領(lǐng)域體系的范式(pattern)幻枉;第二碰声,針對每個范式刻意地反復(fù)學(xué)習(xí)和練習(xí);第三熬甫,及時反饋胰挑。
我們在過往的工作和學(xué)習(xí)生活中,或多或少都在實踐著刻意練習(xí)椿肩。拿面臨高考的中學(xué)生舉例子:好的學(xué)生通常是把一門功課拆成了很多知識點(尋找范式)瞻颂,接著針對知識點以及它們的排列組合,有針對性地反復(fù)做各種難度的題(刻意練習(xí))郑象,每次做完題都對照答案看看正確與否贡这,如果錯了就思考、記錄厂榛、復(fù)盤(持續(xù)及時反饋)盖矫。這樣的學(xué)習(xí)方法就是事半功倍的丽惭。
而事倍功半的學(xué)習(xí)方法,就是不分青紅皂白拿起一本習(xí)題或卷子拼命做辈双。這就是為什么有的同學(xué)非常勤奮责掏,成績卻不好的原因。
正確的學(xué)習(xí)方法應(yīng)該是快速梳理該領(lǐng)域的知識點湃望,形成框架體系换衬,方法可以參考以下三點。
尋找范式喜爷∪叽看一些該領(lǐng)域綜述性或開創(chuàng)性的文章,比如論文檩帐。也可以看該領(lǐng)域綜述性教科書的目錄术幔,因為一本好書的目錄往往就是該領(lǐng)域的知識框架,內(nèi)容倒不一定非要看下去湃密。
刻意練習(xí)诅挑。針對每個知識點,找到書中的相關(guān)章節(jié)泛源,并深入學(xué)習(xí)拔妥,建立起自己對該知識點的理解。
及時反饋达箍。把知識點和現(xiàn)實的工作情況進(jìn)行對照没龙,從而建立起對一個知識點的深度理解,最后融會貫通缎玫,進(jìn)而形成對一個領(lǐng)域的理解硬纤。
這樣說可能有點抽象,拿我當(dāng)年學(xué)習(xí)分布式存儲的過程為例赃磨。
首先筝家,我結(jié)合自己的工作內(nèi)容梳理出需要深入了解的知識點,如元信息組織邻辉、副本組織和管理溪王、單機(jī)存儲引擎、糾刪碼值骇、一致性等等莹菱。同時,我看了很多綜述性的材料吱瘩,梳理出分布式存儲的知識點芒珠,并不斷迭代構(gòu)建這些知識點。這是一個尋找范式的過程搅裙,也是最難的一個過程皱卓。
其次裹芝,我針對每一個知識點,找相關(guān)材料進(jìn)行深度學(xué)習(xí)娜汁。例如嫂易,對于分布式一致性,需要閱讀 CAP 理論掐禁、Paxos 的論文怜械、Raft 的論文以及其他的相關(guān)材料。這是刻意練習(xí)的過程傅事。
最后缕允,我找到各種系統(tǒng)實現(xiàn)的論文和文章,比如 GFS蹭越、Dynamo障本、Spanner 等等,對比它們在一致性問題上是如何考慮和取舍的响鹃,當(dāng)然驾霜,最重要的是結(jié)合自己工作中的反復(fù)實踐和所學(xué)知識點進(jìn)行比對。這就是一個及時反饋的過程买置。
以上三個階段并不是割裂的粪糙,而是周而復(fù)始的。我們經(jīng)常會在刻意練習(xí)和及時反饋的學(xué)習(xí)過程中忿项,發(fā)現(xiàn)自己遺漏的知識點蓉冈,或者發(fā)現(xiàn)自己梳理的兩個知識點其實是重合的。通過這種交叉比對轩触,以及在實踐中不斷檢驗的方式而建立起來的知識點是非橙鞑粒可落地的。
對于學(xué)習(xí)怕膛,你可能會有一個疑問,就是工作本身已經(jīng)如此繁忙了秦踪,哪里能抽出足夠多的時間去學(xué)習(xí)褐捻?
其實工作和學(xué)習(xí)本身,是不應(yīng)該被割裂的椅邓。工作本就應(yīng)該是學(xué)習(xí)的一部分柠逞,是學(xué)習(xí)中的實踐和及時反饋的部分。學(xué)習(xí)如果脫離了工作的實踐景馁,其實是非常低效的板壮。因此每個同學(xué)應(yīng)該對自己工作所在的技術(shù)和業(yè)務(wù)領(lǐng)域進(jìn)行系統(tǒng)性的學(xué)習(xí),并在工作中反復(fù)實踐和驗證合住。
不同的領(lǐng)域之間其實是融匯貫通的绰精,當(dāng)你對一個領(lǐng)域精通并總結(jié)出方法論以后撒璧,很容易就能上手別的領(lǐng)域。因此花幾年時間徹底研究透一個領(lǐng)域笨使,對于剛工作幾年的同學(xué)來說卿樱,是非常重要,甚至是必須的硫椰。也只有在一個領(lǐng)域垂直打透之后才談得上跨領(lǐng)域遷移繁调,去拓展自己的知識面。
但這里有一個常見的問題是靶草,學(xué)習(xí)的內(nèi)容和工作的領(lǐng)域沒有太多直接的關(guān)系蹄胰,不便于垂直打透。
例如奕翔,曾經(jīng)有兩年我用所有的空余時間去讀 Linux 內(nèi)核的源代碼以及相關(guān)知識裕寨,而這些知識在我那兩年的工作中,幾乎沒有用處糠悯,最多只是一些“啟發(fā)”帮坚,所以后來也忘得差不多了。
軟件工程是一門實踐科學(xué)互艾,從書本上得到的知識如果沒有在實踐中應(yīng)用和檢驗试和,基本上是沒有用處的。
這時候纫普,你可能會有另一個疑問阅悍,感覺日常工作非常瑣碎昨稼,學(xué)不到什么東西节视,怎么辦?
如果把學(xué)習(xí)分成從書本中學(xué)假栓,和從工作中學(xué)這兩種的話寻行,那毫無疑問,工作中的“知識密度”比起書本的“知識密度”匾荆,肯定是要低很多拌蜘。因為書本里的知識,都是從工作中抽象總結(jié)出來的牙丽。工作中每個點滴的瑣事與平凡简卧,都是可以抽象總結(jié)成為方法論的,更別說工作所在領(lǐng)域的博大精深了烤芦。如何從日常工作中學(xué)習(xí)呢举娩?秘訣就是“從行動中思考”。
對于每一個軟件工程師,最重要的兩個能力铜涉,是寫代碼的能力和解決問題(Trouble Shooting)的能力智玻。并且,要成為優(yōu)秀的架構(gòu)師骄噪,出色的開發(fā)能力和追查問題的能力是一切的基礎(chǔ)尚困。提高寫代碼能力的關(guān)鍵,首先在于堅持不斷地寫链蕊,但更重要的事甜,在于每天、每周持續(xù)不斷的 review 自己之前的代碼滔韵。其次逻谦,要多 review 牛人寫的代碼。一旦覺得自己之前的代碼不夠好陪蜻,就立刻復(fù)盤邦马、立刻重構(gòu)。更重要的是宴卖,多思考壞代碼和好代碼之間的區(qū)別及區(qū)別背后的原因滋将。
特別要說明的是,除了要知道代碼規(guī)范是什么以外症昏,還要重視思考每一個代碼規(guī)范背后的原理随闽。
而要提高解決問題的能力,關(guān)鍵在于深度復(fù)盤自己遇到的每一個問題肝谭,尋找每個問題掘宪、每次事故背后的根本原因,并且思考后續(xù)如何避免同類問題攘烛、如何更快的發(fā)現(xiàn)同類問題魏滚。
此外,要對團(tuán)隊內(nèi)外遇到的所有問題都保持好奇心坟漱。提高解決問題的能力是幾乎無法從書本上獲得的鼠次,其完全來源于對每一個問題的深度思考,以及對問題的廣泛積累芋齿。
對于技術(shù)牛人來講腥寇,除了需要更加優(yōu)秀的代碼能力和發(fā)現(xiàn)問題、解決問題的能力外沟突,還需要對當(dāng)前技術(shù)領(lǐng)域有相對完整的知識體系、體系化的思維能力和對業(yè)務(wù)的深入理解捕传。
對于完整的知識體系可以通過尋找范式惠拭、刻意練習(xí)、及時反饋來構(gòu)建,方法參照上一篇文章的內(nèi)容职辅。
對于體系化的思維能力棒呛,其來源于兩個方面。一方面是在日常工作中域携,對每一個接口設(shè)計簇秒、子系統(tǒng)的拆分和組織方式、需求的技術(shù)方案秀鞭、系統(tǒng)的頂層設(shè)計趋观,都要反復(fù)思考和推敲,不斷的復(fù)盤锋边。另一方面皱坛,需要廣泛學(xué)習(xí)行業(yè)內(nèi)相似系統(tǒng)的架構(gòu)設(shè)計。
而對業(yè)務(wù)的理解能力豆巨,也非常重要剩辟。深入了解業(yè)務(wù)并不難,你要深入思考每個需求背后的原因以及該需求能解決什么業(yè)務(wù)問題往扔,有沒有更好的方案等等贩猎,遇到不明白的問題多和周邊技術(shù)同學(xué)、產(chǎn)品萍膛、運營同學(xué)請教吭服。