或許你還不知道:到底該如何學習一門新技術?

韓楠發表於2022-08-19

作為一個  終身學習 [1] 的實踐者,我經常有學習一些新技術的需求。如何學習這些新技術不同人有不同的做法,早前我也寫過一篇  如何快速學習一項新技能? [2] 的文章分享我學習的理論框架,但這篇文章我會以我學習 WebRTC 這個技術為例分享我在學習新技術時用的一些方法。

如何學習某個知識,在我看來,主要矛盾在於解決這三個問題。

要學否

在學習一門新技術前需要解決的第一個問題是 要不要投資時間去學這門技術。就像買書最大的成本並不是買書的價格,而是看書的時間。花費大量的時間去看一本沒有價值的書,無異於浪費生命。正是方向搞錯了,越努力越尷尬。

怎麼確定一門技術的價值,可以從以下兩個方面來考慮:

從知識體系出發:某門技術經常不是孤立存在的,而是一個積木般搭建的大廈的一部分。要學習頂部的技術,就需要掌握一定的底部技術。如果一個技術很基礎很底層,被很多高層的技術所依賴,那學習這門技術就很有價值。 從應用前景出發:如果一門技術很有市場“錢景”,或者有潛在的市場需求,那學習這門技術就很有價值。畢竟我們學習目的很大的一部分在於賺錢解決自己的生活問題。

不過這裡的難點在於從我們已知的資訊來分析,很難判斷某門技術的市場前景。如果分析判斷錯誤,很可能會導致我們學習這門技術的時間被浪費。那最佳的選擇的就是儘可能讓自己所學的技術都滿足這兩點,哪怕最後沒有市場前景,但如能成為我們知識體系的基礎,也值得投入時間去學習。

基於這兩方面的考慮,我開始學習了分散式系統的一些底層知識 [3]

之後透過搜尋間接找到了基於 WebRTC 技術的語音聊天網站  speakrandom [4],在分析這個網站技術棧的時候找到了  pion/webrtc [5] 這個框架,最終決定從這個框架入手開始學習 WebRTC。

怎麼學

在制定了學習目標之後,剩下的問題是怎麼怎麼學?學習方法千萬條,重要的是找到適合自己的學習方法。

我的方法是 善用搜尋,找到對的資料和對的人。學習本身不應是一件複雜的事情,因為它不是做研究,不是探索未知的東西,只是站在巨人的肩膀上把已經被解決的問題學習一遍。

但這裡的難點在於資料千萬份,一不小心就找到錯誤的資料,讓本來簡單的學習變得複雜,這就像天龍八部鳩摩智學了段譽給的錯誤的六脈神劍劍訣,很容易學的走火入魔。

主動搜尋

主動獲取資料 [6] 方式的要點在於從錯誤少的資訊庫篩選、交叉對比選擇要看的資料。由於很多技術資料都是用英文寫的,用 Google 英文搜尋更容易獲取高質量的資料。另外使用 Google 圖片關鍵詞搜尋可以快速獲得架構方面的資料,方便從高層次理解這個技術。

一般我會從 Google、YouTube 和 GitHub 上搜尋某個技術相關的資料、影片教程和開源庫。以搜尋切入,找到合適的開源專案或者技術標準,然後制定學習計劃。很容易透過  webrtc 關鍵詞在這些平臺上搜尋得到這些資料和教程:

       •GitHub

YouTube

WebRTC Crash Course [7]

Google

Build the backend services needed for a WebRTC app: STUN, TURN, and signaling - HTML5 Rocks [8]

從 pion/webrtc 這個庫上了解到作者是  @Sean DuBois [9],GitHub 關注一波然後去 YouTube 搜尋下他的演講,又收穫了一波高質量的教程:

技術標準

另外一個高質量的資料是協議標準,比如 IETF RFC 文件。搜尋一番後找到 WebRTC 相關的標準:

從這個 W3C 制定的標準裡又可以看到很多 IETF RFC 的資料。瞭解這些技術標準有助於我從高層次理解這個技術的一些特性。當然這些標準的細節我暫時不會去看,等到需要了解細節的時候再去看。

另外還可以從標準中梳理出這個技術的一些歷史背景知識。

技術歷史

複雜的技術不是橫空出世的,而是從簡單的技術逐漸根據需求而演變來的。很多時候一個技術的複雜是因為其有很多歷史性而導致的,比如 Java 的範型之所以使用複雜並具備很多限制性是因為其為相容老的庫而妥協設計出的產物。瞭解這個技術的歷史背景有助於降低理解這個技術的複雜度。

做好筆記

搜尋而來的資料如果不做整理和記錄的話,時間久了就全忘了。我把這些資料整理到了  Logseq [10] 這個雙鏈筆記中。

從下面這個筆記拓撲圖中可以看出我記錄的分散式知識(Distributed System)和 WebRTC 間的關聯關係。眾所周知,學習在大腦的體現就是神經元突觸之間建立新的連線,筆記間的知識透過這種方式也能幫助我們快速建立知識間的聯絡。

學習計劃

記錄完筆記後,我要做的就是規劃時間把整理得來的資料學習消化。在這個環節可用  時間管理 [11] 的方法制定該項技術的學習計劃。

學習技巧

學習技巧千萬條,但有一條是我覺得很重要的,那就是把你所學的 說給別人聽,從別人的反饋中瞭解自己對該知識掌握薄弱的點。很多時候大腦在學習的過程中會有很多模糊不清的點,如果不說出來的話,這些不清楚的點會被忽略掉,但如果要讓別人聽得懂,那需要我們懂的更多才行。

寫文章其實也是說給別人聽,只不過比單純的說要更為系統。所以我一般在學習某個技術的時候會去寫文章分享。一方面讓自己的知識梳理的更清晰,另外一方面可以與讀者交流,掌握更多的知識,這也可以解決掉那個經典的 我不知道我不知道的知識,當我寫出來時,會有看到的人幫我發現我不知道的知識。

當然也可以在社交網站上分享一些學習中梳理的知識點,之後方便整合成文章:

尋求幫助

找對的人解決學習中的困惑無異於能加速整個學習過程。這方面很多開源專案都有自己的討論區,比如我在理解 WebRTC SFU 的過程中就有很多困惑甚至錯誤的理解,在社群中與作者溝通後才得到了正確的答案:

當然我們還可以在論壇、GitHub Issue、郵件組或交流群等地方中尋求幫助。

心理建設

學習裡的一大難點可能是不好意思說出自己不懂的點,尤其是工作多年後,要承認自己不懂是件困難的事情。但如果你以終身學習為目標,那麼這方面就沒什麼障礙。不懂就去學,不懂就去問。無知並不可怕,年齡大不懂也不可怕,可怕的是不懂卻隱藏這一點。

怎麼用

在掌握了技術的理論後,可以透過技術的實踐來提高自己的技術水平,比如做一個開源專案。對技術的應用有兩種方式:

從零開始,一步步實現自己的系統。這種方式的問題在於,剛開始我們對技術的應用不是很熟悉,完全自己做可能無法應用一些最佳實踐,摸著石頭過河的成本比較高。 從現有的應用中改造。開源專案有很多好的應用,可以直接用來學習並改造。一方面可以加速應用的開發,另外還可以學習別人成熟的經驗。

透過一番搜尋,我找到了兩個不錯的學習專案:

webtrc-voice-chat [12] kraken [13]

這兩個都是基於 pion/webrtc 庫開發的語音聊天網站。基於這兩個開源專案,我可以逐漸學習並開發自己的開源專案。

在學習完這兩個開源專案(讀完原始碼)後,我制定了基於 WebRTC 的應用開發目標:做一個隱私與本地優先的語音聊天的網站  Free for Chat [14]

這個目標有點大,我會把這個業餘專案作為技術試驗田,把需要學習應用的技術都應用到這裡。

學以致用,是學習的最終目的。只有真正去用這個技術,才能真正掌握它。否則花費時間去學習,不用的話很快就忘了。

最後,能看到這裡的話,希望這篇文章裡提到的一些方法能讓你更快速的學習某個領域的技術。

References

 [1]  終身學習:  /self/build-personal-knowledge-system/
 [2]  如何快速學習一項新技能?:  /self/learn-skill/
 [3]   連結:

[4] speakrandom: 
[5] pion/webrtc: 
[6] 主動獲取資料:  /self/my-info-input-channel/#主動方式
[7] WebRTC Crash Course: 
[8] Build the backend services needed for a WebRTC app: STUN, TURN, and signaling - HTML5 Rocks: 
[9] @Sean DuBois: 
[10] Logseq:  /self/okr-gtd-note-logseq/
[11] 時間管理:  /tags/時間管理/
[12] webtrc-voice-chat: 
[13] kraken: 
[14] Free for Chat: 


來自 “ improve365 ”, 原文作者:Dawei Ma;原文連結:https://mp.weixin.qq.com/s/ctS9X2gE12sJJl4ekNNrbQ,如有侵權,請聯絡管理員刪除。

相關文章