如何學習新技術
我總是感覺自己在盲目的學習一些看上去很火熱的技術。比如 React Native,Flutter 等等。我家裡堆了各種程式語言的入門書籍,有 Go 的,有 Erlang 的,有 c++ 的,還有 JavaScript 和 CSS。
我到現在都搞不懂這個事情。我連主流的 Python 語言都沒有掌握清楚為什麼要去看這麼多語言的入門書呢?我在工作和生活中根本就用不到他們。只是因為在某一篇文章中看到 Go 語言是趨勢,Erlang 的穩定性無人能敵,c++ 你永遠都讓不開等等。這些東西我都研究過,可是到現在為止還沒有用他們寫過一行有用的程式碼。
相信很多童鞋都有類似的情況。程式設計師學習新技術的想法是件大好事,總比不思進取的思想狀態要好,可結果卻並不一定比原地踏步強,因為不一定有用,會造成技術浪費。
浪費的事情我們生活中做得很多。我們想要買更貴的手機,因為 cpu 更強,可是很多人並不一定需要那麼強的 cpu。本來只需要買個上網本看看電視卻要買個工作站。我們的理由自然也很充足:萬一有一天要用到呢?萬一有一天我需要玩遊戲呢?萬一有一天我要 3D 渲染呢?追求新技術的理由也同樣:萬一以後它火了,我就走在了時代的前面。
這種情況確實有可能發生,前提是你能將這門新技術研究得很透徹,比別人更懂,否則那些基礎更強的能用很短的時間就能超越你。
我想在學習新技術之前應該做幾件事情:
先了解自己的需求是什麼?在未來 3-5 年內的主要工作是 python 開發,那就應該圍繞這個需求來學習。首先是 Python 的高階特性和工程設計思想,這些都落實在具體的實踐上,需要積累大量專案經驗,可以自己選擇一些 side project 練習。自己做的時候還應該參考優秀的開源框架,看看別人的設計思路和實現方式。
需要了解 web 原理。像 HTTP 協議、TCP/IP 協議都需要精通,這樣才能站在更基礎的層面來進行開發,不是在網上找幾套解決方案就能做出一套好的系統。看完基本經典書籍以後,要學會用抓包工具來分析流量走向,定位問題的能力。
需要效能優化。要熟練掌握各種演算法和資料結構,知道常用演算法的應用場景和複雜度。學好演算法基礎就要去看 python 的各種內建函式實現他們的效能如何,你寫出來的程式碼效能如何。
效能還需要涉獵併發和非同步知識。這些東西往往是操作層面的,可以先熟悉多程序、多執行緒和協程等在 python 的應用,訊息佇列等各種非同步操作的實現,但是遲早還是要深入研究作業系統是怎麼去進行資源排程的,《深入理解計算機系統》就該去看一看了。
在這個過程中,還應該看一看《重構》《程式設計師修煉之道》這樣的方法論書籍,爭取能形成一套自己的編碼和改進體系。
在工作中應該儘量避免的問題是原地踏步、google 程式設計,這次搜尋完一套方案下次還是不知道,幾年做的都是重複的事情。盲目追求新技術,拼命加班改 bug 都是技術領域盡力要避免的陷阱,看起來非常努力,實際上是在原地不動。
學習應該是有目的的,不是看著哪個火就去學哪個。小時候都學過撿了芝麻丟了西瓜的課文,現在正是不停的在重蹈覆轍,學這個,學那個,最後自己的真正專業都沒有做好了。一門技術的探究最終都會落到基礎知識上,編譯原理、作業系統、演算法和資料結構。如果學好了一門技術真正落實到了基礎上,去學另一門技術不應該是很難的事情。
在確定了方向以後把重心放在自己的方向上,平時可以花少量的時間來關注新技術,看看他們的應用領域和簡單實現。喜歡玩手機並不代表每個品牌的手機都要買回來天天使用,那是職業測評師乾的事,我們的思路是買一個牌子的當主力機,一個當備用機,其他的偶爾去專賣店感受一下就可以了。
在專案的技術選型上也應該遵循以需求為重心的原則。如果不是高併發的專案為什麼要使用熱門語言 Go 呢?用 python 快速實現行不行?現在的技術團隊有幾個人懂這門語言,外面招人好招嗎?現有人員培訓需要多久呢?一定要用微服務嗎?一定要用docker嗎?很多都沒有必要的!只是自己給自己挖的一個一個陷阱,把整個團隊推進去。
接下來是怎麼實現的問題。如果要突然去學非常枯燥和底層的作業系統原理,肯定會兩眼一抹黑。突然從 windows 系統換到 linux 系統也會讓人手足無措。一個可行性很高的方案就是漸進式改變。和菜頭在一篇文章中寫道:如果一家餐廳幾十年的口味都不變,那肯定逃不過關門的命運。那些說自己堅持不變的人或者產品往往在發生悄無聲息的改變,他們的變化如此微小,以至於你根本察覺不到,多少年以來,微信添加了多少微小的功能,很多都隱藏在 UI 之下,我們像尋寶一樣一點點的發現,用習慣了以後就感覺它們從一開始就被設計出來了一樣。
要學好作業系統不一定要全心全意去攻克每一個知識點,在工作中接觸到了多執行緒,先看看執行緒消耗,鎖機制和訊號量行不行?一點一點來,每天進步一點。人往往會高估短期能力而低估長期能力,這是思維和眼光的侷限性導致的。
學習是個非常講究方法論的事情,盲目的學習是不行的。都是參加高考,為什麼那些看上去努力的學生大多成績平平,天天打籃球、約會的就考上清華北大呢?智商是一方面,不過我到現在都不相信高考能到達人類平均智商的極限,估計方法是更加重要的一面。
萬維鋼關於學習的話題我覺得是很有意思的,概括幾個要點是:循序漸進、逃離舒適區、重複的基礎訓練。最重要的是要形成整個體系和思維,不然學到的知識都不是自己的。