我的學習方法論
我曾在多篇文章中強調過「終身學習觀」的這個理念,在確定這個理念的前提下,如何具體落實就顯得至關重要。這個世界上「口嗨」是最容易的,最難的就是「實事求是」。「實事求是」是什麼意思?引用毛概的話:
教員思想,有三個基本面,分別為實事求是、群眾路線、獨立自主(這些至今仍有重要借鑒意義),「實事求是」是教員思想的精髓,而其中的」實事求是「的具體含義就是一切從客觀實際出發,理論聯繫實際,堅持在實踐中檢驗真理和發展真理。教員指出:「『實事』就是客觀存在著的一切事物,『是』就是客觀事物的內部聯繫,即規律性,『求』就是我們去研究。」
- 1.簡單學習法。
- 2.崗位招聘學習法。
- 3.工作學習法。
- 4.自我刻意練習學習法。
- 5.分享學習法。
- 6.復盤學習法。
一、簡單學習法
所謂簡單學習法最主要的特點就簡單且易落地。
簡單學習法的表現形式如下所示:
- 1.編寫一個「Hello World」的示例運行起來;
- 2.將程式語言或框架的所有示例跑起來。
簡單學習法的應用場景如下所示:
- 1.學習新的一門程式語言,掌握一些基本的語法;
- 2.學習程式語言中所包含的應用技術框架,掌握一些簡單應用範式。
簡單學習法有一個大的前提就是,動手寫,拒絕複製黏貼。
也許有朋友覺得有現成的IDE,複製黏貼不挺好的,何必做這樣的簡單重複性勞動呢?
在我看來,這樣的簡單重複是有必要的,特別是對你尚不熟悉的程式語言或技術框架而言。動手寫和複製黏貼完全是不一樣的,動手寫往往會加深你的印象,起到練習的作用,而複製黏貼並不能體現,大家可以回顧自己的程式語言或電腦課程的學習生涯很容易就明白這個道理。包括為了進大廠刷一些LeetCode演算法題,關於那些演算法題,網上都有各種各樣的解答,但你可以借鑒不能完全抄襲,借鑒的前提就是自己要真正地去動手寫去感受。如果全靠記憶力去記題目的答案,在我看來是沒有意義的,因為這樣只是單單得其表象,而根本沒有理解實質。*編程的本質是為了解決問題,解決問題的前提是要明確真正的問題,通過不斷試驗和提問找到真正的問題,再找到真正的問題之後,結合具體的方案去解決它,具體的方案通常是有步驟的,而這些步驟具有邏輯性,由此我們看,編程本質的特點即邏輯性。
二、崗位招聘學習法
崗位招聘學習法,顧名思義,就是面向對應的崗位要求進行針對性學習。
基於該崗位要求,有一些我們不太熟悉的技術棧可以提前了解學習。
例如熟悉jvm運作原理以及常用的GC演算法、熟練使用SpringBoot框架進行開發、熟悉Linux作業系統、SQL常用的優化操作、Redis、MongoDB、Memcache等都是可以通過花一些時間學習並掌握的,從而不管你是在職或者跳槽,這樣做,都能使你更具有競爭力。特別是針對一些朋友不知道學習什麼好,這時給自己定一個目標,例如你是中級開發工程師,你的目標可以是高級開發工程師,從網上找一找相關的崗位要求然後進行針對性學習。這種崗位學習法的應用場景通常有這麼幾個?
- 第一、有助於促進你的職業生涯發展,你不知道你的目標是什麼,你可以自己去尋找目標。
- 第二、在職如果太安逸,通過崗位招聘學習法,促使自己把時間利用起來,用於提高自己。
- 第三、如果不滿足於現有公司的待遇,打算跳槽,可通過崗位招聘學習法找到意向公司進行刻意學習,從而增加面試成功的把握。
三、工作學習法
工作學習法,非常簡單易懂,意思是從工作中學習。從工作中學習這一點,很多人都並不陌生。我曾寫過一篇文章叫做論員工與公司關係裡面提到了一點,公司能夠為我做什麼,我列舉了如下幾點:
- 1.提供平台;
- 2.實踐機會;
- 3.歷練場所;
- 4.經濟基礎;
- 5.合作習慣。
而工作學習法充分地體現了上面五點。工作學習法對於我最初的兩到三年幫助非常大,特別是我來北京以後,能力上得到很大的提升,技術視野的廣度以及動手能力的提高等。工作學習法的可持續性與公司平台發展有很大關係,當公司平台規模擴大時,架構通常就需要適配公司平台業務的擴展,這時很多應用場景就來了,而解決這些應用場景的問題,通常能夠使你的能力提高很多。而這些能力往往很值錢。
但工作學習法也有一定的局限性,那就是受公司本身業務發展的制約,發展得不好,很多場景都沒有,這就需要你自己能夠模擬創造這樣的場景,後面會提到如何模擬創造場景。
補充說明一點:
工作學習法還有一個注意事項,那就是需要刻意去記錄一些報錯,有些時候面對一些報錯,我們憑經驗以及搜索引擎去解決,問題得到了解決,然後就不去深究了,接著,下一次還是一樣的問題,仍然重複經驗論和搜索引擎這樣的套路。這樣是不行的,要知道,每一次錯誤,都是一次成長的機會,這樣的錯誤既有程式上,也有業務上,它們的價值都很大,千萬不要忽略。
四、自我刻意練習學習法
我在2020年的一些思考和總結這篇文章中的我對學習的思考提到過「刻意練習過於簡單」。面對職業生涯乃至人生這個維度,要想不斷超越現有的自己,使自己變得強大,就得增加刻意練習的難度,換言之,以玩遊戲為例,簡單關卡誰都能通過,但難得關卡則需要很高的技術和技巧,這就很好地體現了初級遊戲者、中級遊戲者、高級遊戲者他們之間的區別。對應到軟體開發,初級開發者、中級開發者、高級開發者他們之間的區別很大,初級開發者做一些簡單的工作,中級開發者通常能獨立負責一個模組的開發和設計,高級開發者除了具備中級開發者的能力之外,還具有良好的溝通能力與團隊協作能力,換言之高級開發者不僅僅能力獨立負責某個模組的設計和開發,同時還具備管理的能力。
同時,自我刻意練習學習法還有一個重要的目的,那就是脫離舒適圈,關於舒適圈的危害我就不多說了。通常脫離舒適圈能夠使自己不斷成長,因為你不會滿足於現有的一些成就,也不會因為現在的成就而驕傲自滿。
以前面的崗位招聘學習法為例,如果你沒有分散式系統研發經驗該怎麼辦?
- 1.閱讀分散式系統相關書籍,確保對此有一個大致的了解;
- 2.找到相應的分散式開源項目,將其跑起來;
- 3.嘗試在對應的分散式開源項目的基礎上,增加新的功能;
- 4.將其部署到伺服器上;
- 5.上述四步每一步都必須要有產出,沒有產出就沒有有意義。
有人擔心運行分散式開源項目的伺服器通常配置比較高?
在我看來,不必擔心,有很多辦法解決。
例如,你不想花錢可以自己安裝Vmware並在此基礎上安裝對應的Linux作業系統。
例如,你覺得自己安裝Vmware搭建太麻煩,可以通過上雲伺服器,雲伺服器有按月續費、按年續費、按小時續費,你可以結合自己的需求進行購買。
記住一點,學習上的花費都是有意義有價值的。這是我五年職業生涯中的深刻感受之一。
有朋友擔心萬一沒效果怎麼辦?
在我看來,一定會有效果,前提是你一定要執行。
- 1.閱讀分散式系統相關書籍,你一定要記錄筆記,可以通過Hexo自建自己的部落格系統進行記錄,也可以通過現有的有道雲筆記、語雀、飛書、石墨筆記等工具進行記錄。這是衡量你產出的關鍵指標。
- 2.找到相應的分散式開源項目,將其跑起來。通過在Github上找對應的分散式開源項目,然後將其運行起來,運行起來的過程中,你需要仔細閱讀開源項目的文檔,同樣你需要解決分散式開源項目在你本機跑起來可能出現的問題,你需要將問題的解決過程記錄下來,最終的衡量指標有兩個,第一個是記錄項目跑起來的過程中你解決了那些問題以及問題的原因是什麼,第二個是項目運行起來,能夠在裡面操作相應的功能,完成對應的業務流程。
- 3.嘗試在該分散式開源項目中增加新的功能,考驗你是否真正讀了文檔以及在2的流程中你有沒有認真去解決問題記錄問題以及正常運行以後你有沒有體驗該系統的完整流程,只有你做到了2中,增加新的功能對於你並不難,而且在增加新功能的過程中,你還有可能會遇到問題,不怕遇到問題,就怕不出現任何問題,因為遇到問題並解決問題就是一次成長的機會。最終的衡量指標還是兩個,第一個記錄問題是如何解決的,第二個就是在該系統中能夠看到你所增加的新功能並能實際操作。
- 4.將其部署到伺服器上,你需要具備一些常用的Linux基礎知識以及掌握一些常用的命令,如果不具備沒關係,你可以學習,這些東西都是可以通過前面提到的簡單學習法就能掌握的。在部署伺服器的過程中,首先要把運行環境搭建好,然後就是一些資料庫表的初始化,然後就是在本地配置好相應的配置資訊,然後打包將其部署到伺服器上面去。這個過程一定會遇到問題的。最終的衡量指標就是,通過瀏覽器輸入對應的IP地址或域名就能操作該開源項目(記住,不是開源項目的演示地址,而是你自己改造開源項目以後自己搭建伺服器部署以後的地址)
當你完完整整地執行了上面四步,你基本上就具備了開發分散式系統的能力。然後為了進一步提高,你可以隨時提高刻意練習的難度。就好比玩遊戲打怪,一關比一關難,但闖過以後,你一次比一次厲害。當然了,我個人不建議過於沉迷於遊戲,但遊戲中的一些好的理念是可以促進我們自身能力的提高。
五、分享學習法
我的導師Z大師常說,當你把自己所學的知識或技能分享給他人,他人能夠聽懂,就說明你真正搞懂了。
後來讀了一些書,了解了一種學習法叫費曼學習法,費曼學習法的主要內容有如下:
- 1.選擇你想要學習的知識或技能;
- 2.教給他人;
- 3.教的過程中卡殼了,回過頭繼續學習,直到讓他人真正地明白。
分享學習法是一種進階學習法,它區別於簡單學習法和刻意練習學習法以及工作學習法與崗位招聘學習法。前四種學習法主要針對自己,而這一種學習法既有針對自己,也有針對他人。針對自己是因為自己是學習的主題,針對他人是因為需要藉助他人來試驗自己是否真正搞懂。
而在分享的過程中,如果是專業人群還好,如果是非專業人群你需要將其簡化為通俗易懂,而簡化整理為通俗易懂的過程中,你需要花費大量的精力去思考去實踐,而這個過程會促使你自己不斷地閱讀以及不斷地向他人請教,正所謂「術業有專攻是也」,每個人的擅長領域不一樣,需要「不恥下問」,拒絕「不懂裝懂」。作為分享者而言,分享知識的過程中,既是檢驗你有沒有真正地搞懂,同樣也考驗你知識的分析、簡化、整理等能力。
其實做開源項目也是一種分享學習法,開源項目的貢獻者相當於分享者,開源項目的使用者相當於聽眾。開源項目使用過程中有任何問題,使用者通過issues的形式進行回饋,開源項目的貢獻者則跟進使用者的回饋進行優化和完善,優化和完善的過程貢獻者也不斷成長著。
六、復盤學習法
復盤這個概念從2020年就知道了,但操作的頻率不太高。今年讀了一本書叫《復盤》,作者是虛舟。這本書再次深化了我對復盤的理解以及復盤的具體操作方法。
引用該書的一些話:
1.個人復盤的通用套路是「復盤三角」,包括三個步驟:記錄、反思、提煉。
2.復盤和反思,本質上來說,就是一種自我審視和自我觀察。
3.復盤相當於一個觀察者,它不斷的從這個推進流程中跳出來,看每一步是否存在問題,並及時進行回饋和調整。
4.反觀、反思、反省者三個層次,構成一個好復盤的三個標準,一個好的復盤必須做到能反觀、會反思、有反省。
5.經驗+反思,是最重要的知識。
6.復盤是向過去學習、向生活學習,從過去的經驗教訓當中獲取生活的智慧。
7.復盤六字訣:慢、寫、真、問、離、行。
8.任何不以改善行動為目的的復盤都是偽復盤。
由此,我們可得出復盤的目的以及意義是什麼。核心一句話:一句話來概括,避免「秦人不暇自哀,而後人哀之;後人哀之而不鑒之,亦使後人而復哀後人也」的場景再度發生,吸取歷史經驗教訓,指導當下生產經營發展。
之前我寫過一些復盤,文章如下:
資料庫被刪之反思
一次失敗的股票投機
基於報告之復盤
Gateway Timeout 504問題復盤
Linux設備上沒有空間之復盤
ssh問題之復盤
雖然這些復盤寫的不那麼好,但我覺得復盤可以分兩方面:
- 第一、對內;
- 第二、對外。
對內,主要偏於對自己的解剖,這些解剖,沒必要對外,可以自己私有不必公開。
對外,適用於技術與一些管理層面,包含對自己的可公開反思,也包含對整個流程以及宏觀與微觀層面的一些不足等。
就目前而言,我覺得比較通用的復盤策略三部曲就是:回顧、反思、提煉。這三部曲我個人覺得也最簡單也最易落地。
也許會有朋友疑問,復盤的頻率應該是怎樣的呢?
我個人認為分情況來看:
如果是問題復盤,在發生這個問題並解決這個問題,找個時間馬上做復盤。例如第一天發生這個問題解決了,如果當天自己的精神狀態還可以的話,建議當天就做。
如果是你覺得很長時間沒有成長,你可以基於自己的情況做日復盤、周復盤、月復盤甚至季復盤、年度復盤等。無論是日復盤、周復盤、月復盤還是季復盤、年度復盤等,均適用於上面的三部曲。但不同的是數據維度不一樣。周復盤的數據來源是日復盤,月復盤的數據來源是周復盤,季復盤的數據來源是月復盤,年度復盤的數據來源是季復盤或月復盤。
七、總結
今天主要介紹的六種學習方法論,希望能夠對諸位讀者朋友有幫助。這六種方法論均可共存以及組成不同的搭配,目的只有一個,那就是促使自己的能力不斷提高,促使終身學習觀更好的落地。