如何高效的學習掌握新技術

寶玉的blog發表於2015-09-18

  最近一段時間,把React學習實踐了一把,算是又多掌握了一門新技術,雖然學習過程比較辛苦曲折,但熟練掌握後感覺還是很好的,以後又多了一種選擇,在技術思路上也開闊了很多。

  回想程式設計生涯這些年,2001年開始學習Asp,2002年學習Javascript,2003年學習Asp.Net/C#,2009年學習Objective-C,2013年又跳到前端這個大坑,從NodejsjQueryAngularjs到現在的React。這一路學來,走過一些彎路,也積累了不少學習的經驗。

 積極開放的心態最重要

  學習新技術,就如探索一片新的領域,一般在心態上來說,都會有兩種典型的心態,一種是恐慌和抗拒的,一種是積極和開放的,不同的心態會造成不同的結果。比如對我自己來說,對於程式設計技術,一直是我所喜歡的,所以程式設計的新技術,總是能積極的去學習,並且能很快掌握。而對於英語和寫作,從上學開始,就一直是我所不喜歡不擅長的領域,所以即使學了很多年,也並沒有什麼明顯的進步。直到後來工作後,逐步意識到英語和寫作的重要性,在心態上作出了調整,積極的去面對,到現在總算是改善了很多。

  學習新技術的另一個障礙來源於已經熟練的技術。當好不容易把一門技術掌握的很熟練後,雖然這在將來學習新東西時,會幫助少走很多彎路,但同時可能也會變成一種障礙。

  我曾對幾門語言掌握的相當熟練,甚至有些曾以為自己精通了。比如當年對於asp,可以熟練的完成在當年技術條件下的複雜BS系統,雖然按現在標準來看,也無非是用vbs對資料庫增刪改查,那時候互動並不複雜,還能配合寫一些簡單的javascript,讓體驗更好一些。那時候覺得會了Asp,可以搞定所有的BS系統開發了。後來Asp.Net出來了,心理很複雜,一方面覺得我用Asp已經啥都可以搞定了,為什麼要學Asp.Net?另一方面覺得這個是未來發展的趨勢,還是應該學習掌握,不然以後可能跟不上時代發展。結果還是硬著頭皮去學。只是每次遇到困難挫折的時候,就會有放棄回去寫Asp的念頭,覺得這要是我用Asp來寫,早搞定了,何必這麼苦逼學新技術呢?

  當我終於有一天,對Asp.Net熟練掌握後,才發現自己原來的淺薄無知,以前Asp也就是停留在指令碼程式設計,到了Asp.Net,已經可以用物件導向的思想去設計架構,甚至於出了網頁,還可以去開發後臺服務。這對於我來說,相當於又開啟了一扇新的大門,可以從更寬廣的角度來看待問題。

  從心理學的角度來說,我們對於外部世界的認識可分為三個區域:舒適區,學習區,和恐慌區。我們所熟悉的技術領域就是舒適區,而新技術是處於學習區或恐慌區。隨著對新技術的掌握,新技術會進入舒適區,但是總還會有更新的技術在學習區甚至恐懼區,等著去學習掌握。

  如果想高效的學習掌握新技術,在心態上一定得是開放和積極的。

 做中學(Learning By Doing)

  如果沒有@鄒欣老師的《構建之法》,我可能沒法這麼精準的去概括這種邊做邊學的方法,對於軟體技術的學習,最高效的辦法應該就是“做中學”。

  如何通過“做中學”去學習掌握新技術,我一般分成這樣幾個步驟:

  1. 整體概覽
  2. 明確階段性目標,選擇實踐專案
  3. 蒐集整理相關文章和開源專案,模仿借鑑

  整體概覽

  所謂磨刀不誤砍柴工,在動手去做前有必要先做一些準備工作。在開始學習一門新技術的時候,先對新技術整體有個瞭解是很有必要的,需要知道它能做什麼,有哪些關鍵的知識點。接下來的步驟,也都依賴於對技術整體的掌握和了解。

  這個工作,如果有條件,可以買一本薄一點的,淺顯易懂的書,整體翻一翻,基本就能有個瞭解。但不建議買大塊頭的書,一般大塊頭的書適合當詞典來查。但現在新技術推出速度太快,往往要等書出來往往是幾個月之後的事情了,所以絕大部分時候,還是得到其官方網站去查相關技術文件。就像這次學React,確實難找到本合適的書,所以我直接去它的官方網站(http://facebook.github.io/react/) ,把Getting Started裡面的文章快速的瀏覽了一遍,基本上算是有了個大概的瞭解。而且現在網路上相關文章也比較多,通過搜尋,也能找到很多相關的文章和資料。

  明確階段性目標,選擇實踐專案

  一般一門新技術所涉及的面比較廣,如果一開始就想全面掌握並不現實,但如果從一個個點去突破,相對要簡單很多。所以一般我會通過一個或多個專案實踐的形式,分成幾個階段,逐步去掌握各個知識點,最終整體去學習掌握技術。

  例如我以前學習一些服務端語言,都會嘗試通過寫一個留言板或者部落格系統來學習,而這次學習React,主要就是通過用React重構我以前用Angularjs寫過的一個聊天室應用,來學習掌握React。通過前面對React的概覽性學習,結合自身情況,我對於這個專案實踐,簡單分成了幾個階段:

1. 用React搭建基礎框架
React的應用是基於Flux架構,而Flux架構並沒有統一的標準,需要選擇使用一種Flux架構實現,並基於它搭建基礎框架。

2. 實現介面基礎元件
React是基於元件的方式來程式設計執行的,所以需要將整個應用拆分成若干基礎元件,這個階段主要就是把介面的元素和互動拆分成若干基礎元件

3. 和伺服器進行通訊
一個完善的程式,離不開和服務端的互動,對於一個React程式,其和服務端互動的方式,和傳統應用程式,並不全相同,並且對於和伺服器通訊的結果資料,還要和介面整合

4. 釋出測試完善
對於做好的作品,釋出給自己和其他人進行測試,然後繼續完善,在這個過程中去進一步學習掌握技術細節

  當明確了實踐的專案和各個階段的目標,後面就是如何去達到這個目標了,在實踐中學習。

  蒐集整理相關文章和開源專案,模仿借鑑

  書本或文件上一個個知識點的說明,和最終的專案產品,還是有很大差距,專案最終是需要充分運用各個知識點,合理組合,才能寫出高質量程式碼,而對於新技術,一開始很難掌握這些細節,盲目依賴以往經驗,很可能就是照貓畫虎,最終做出來的東西不倫不類。

  在初學習實踐新技術時,模仿借鑑很重要,就像小孩子學說話,都是從模仿開始。好在現在通過github這種開源專案託管服務,利用搜尋,可以找到非常多的優秀開源專案。

  早些年學習Asp.Net的時候,我有過很長一段時間對開源專案AspNetForums的二次開發經歷,從中受益良多。以我當時的水平來說,是不可能設計開發出來那樣的高質量產品,甚至於看懂都有些吃力,但正是通過對它的二次開發,不僅讓我快速的學習掌握了很多Asp.Net開發的知識點和細節,也養成了很多良好的編碼習慣。在後面在做其他專案,可以模仿和應用它很多設計實現。

  有些程式設計師寫了很多年程式,程式碼質量不高,一個原因就是因為看的太少,很少去參考學習那些優秀的開源專案。沒有見過好的程式碼是什麼樣的,自然很難寫出來高質量的程式碼。

  在我這次開始動手實踐React專案前,也嘗試找了很多開源專案,由於React技術較新,還沒有可以直接完整參考的專案,所以只能是多個專案參考對照。以下就是部分我學習和參考過的專案列表:

  在前期搭建基礎框架的時候,就是直接借用的前兩個專案的框架,這樣很快就能讓程式跑起來,然後在後面的基礎元件設計的時候,更多的就是參考hipchat的元件設計。

  做中學(Learning By Doing)

  在看書看資料的時候,一個個知識點看起來並不複雜,但是當真正去動手實踐的時候,會遇到各種各樣的問題(坑),而這些問題只有反覆的思考、查資料、問人才能最終解決。

  在做中學,聽起來很酷,但這個過程總是艱辛曲折的!學習往往就是這樣的,只有經歷各種各樣的磨練,才能真正的去掌握這些知識,把這些知識轉變成自身的能力。

  我這次用React重構聊天室的經歷,如同我以往學習其他新技術的經歷一樣,充滿了艱難險阻,兩個月來付出良多。但最終完成的時候,卻是成就感滿滿,感覺到對於新技術終於算是基本掌握了,雖然還有一些知識點沒有應用到,也不過是時間問題罷了,再回頭看以前的一些程式設計,又有了很多新的思路。

 經驗教訓

  以下是總結的一些經驗教訓

  貪多嚼不爛

  雖然現在新技術推出很快,但很多技術本質並沒有變,在有其他技術“良好基礎”的前提下,掌握一門新技術並不需要花太長時間,但“良好基礎”就如學習武功的內功,才是真正需要多花時間去培養的。

  所以去學習新技術之前,先看看手頭的技術是不是掌握好了,如果沒掌握好,不妨先學好再說,不然每門技術都淺嘗則止,反而是難有成就。

  目標不宜太大,要有階段性成就正向激勵自己

  人的學習熱情都是有周期性的,最開始激情滿滿,一段時間後就會激情逝去,很容易就半途而廢放棄了。

  所以在設定階段性目標時,最好能目標小一點,現實一點,能多一些正向的反饋,這樣能讓自己走的遠一點。

  舉例來說,寫程式可以優先寫單元測試和介面部分,這樣很快就有明確的反饋,比如當你看到單元測試全部通過了,能看到介面了。

  學習不會白費

  有時候辛辛苦苦學的新技術,可能不久後就會過時,這時候難免會有是不是白學的想法,但實際上學習從來不會白費的,看過一句話我覺得很有道理:

你所學習的一切都在幫助構建你頭腦中的神經元網路,會幫你建立某種聯絡使你在後續學習其他東西時更加容易,瞭解一種知識能夠使你跟其他知識進行比較和對比。因此,學習總是有用的,無論學什麼。

出處:如何克服 JavaScript 框架疲勞?

  就像十幾年前我把Javascript學的很熟練了,那時候覺得沒什麼卵用,現在看來卻是大有用途:)

相關文章