學習的藝術——如何學好一門技術、語言
還在繼續開發Growth(Github: https://github.com/phodal/growth )的路上,很多功能似乎已經趨于完善,有些功能也讓我百玩不厭——如最近添加的規則引擎。接著我開始陸陸續續地添加了這么多功能。直接今天我想我需要一篇文章放在最前面來告訴用戶,你需要怎樣去學習?因此,也就有了此文。
我不是一個學霸,大學掛了六科。也沒有受過非常好的教育,上大的大學是二本倒數的。好在計算機學得比較早,也可以混點自學能力,也算混得還行。一直想著做一些有意義的事,并且可以獲得更多的用戶反饋。想法一直有的,直到有一天在整理資料的時候才想起來可以整理出一個APP。
盡管之前已經有技能樹、成長書單和Web Developer 成長路線圖的經驗,說到底這也是很大的挑戰。
一次語言學習體驗
在我們開始學習一門語言或者技術的時候,我們可能會從一門hello,world開始。
好了,現在我是Scala語言的初學者,接著我用搜索引擎去搜索『Scala』來看看『Scala』是什么鬼:
> Scala 是一門類Java 的編程語言,它結合了面向對象編程和函數式編程。
接著又開始看『Scala 'hello,world'』,然后找到了這樣的一個示例:
object HelloWorld { def main(args: Array[String]): Unit = { println("Hello, world!") } }
GET到了5%的知識。
看上去這門語言相比于Java語言來說還行。然后我找到了一本名為『Scala 指南』的電子書,有這樣的一本目錄:
- 表達式和值
- 函數是一等公民
- 借貸模式
- 按名稱傳遞參數
- 定義類
- 鴨子類型
- 柯里化
- 范型
- Traits
- ...
看上去還行, 又GET到了5%的知識點。接著,依照上面的代碼和搭建指南在自己的電腦上安裝了Scala的環境:
brew install scala
Windows用戶可以用:
choco install scala
然后開始寫一個又一個的Demo,感覺自己GET到了很多特別的知識點。
到了第二天忘了!

接著,你又重新把昨天的知識過了一遍,還是沒有多大的作用。突然間,你聽到別人在討論什么是 這個世界上最好的語言 ——你開始加入討論了。
于是,你說出了Scala這門語言可以:
- 支持高階函數。lambda,閉包...
- 支持偏函數。 match..
- mixin,依賴注入..
- 等等
雖然隔壁的Python小哥贏得了這次辯論,然而你發現你又回想起了Scala的很多特性。
你發現隔壁的Python小哥之所以贏得了這場辯論是因為他把Python語言用到了各個地方——機器學習、人工智能、硬件、Web開發、移動應用等。而,你還沒有用Scala寫過一個真正的應用。
讓我想想我來能做什么?我有一個博客。對,我有一個博客,我可以用Scala把我的博客重寫一遍:
- 先找一Scala的Web框架,Play看上去很不錯,就這個了。這是一個MVC框架,原來用的Express也是一個MVC框架。Router寫這里,Controller類似這個,就是這樣的。
- 既然已經有PyJS,也會有Scala-js,前端就用這個了。
好了,博客重寫了一遍了。
感覺還挺不錯的,我決定向隔壁的Java小弟推銷這門語言,以解救他于火海之中。
『讓我想想我有什么殺手锏?』
『這里的知識好像還缺了一點,這個是什么?』
好了,你已經GET到了90%了。如下圖所示:
希望你能從這張圖上GET到很多點。
輸出是最好的輸入
上面那張圖『學習金字塔』就是在說明——輸出是最好的輸入。
如果你不試著去寫點博客、整理資料、準備分享,那么你可能并沒有意識到你缺少了多少東西。雖然你已經有了很多的實踐,然并卵。
因為你一直在完成功能、完成工作,你總會有意、無意地漏掉一些知識,而你也沒有意識到這些知識的重要性。
從我有限的(500+)博客寫作經驗里,我發現多數時候我需要更多地的參考資料才能更好也向人們展示這個過程。為了輸出我們需要更多的輸入,進而加速這個過程。
而如果是寫書的時候則是一個更高水平的學習,你需要發現別人在他們的書中欠缺的一些知識點。并且你還要展示一些在別的書中沒有,而這本書會展現這個點的知識,這意味著你需要挖掘得更深。
所以,如果下次有人問你如果學一門新語言、技術,那么答案就是寫一本書。
如何應用一門新的技術
對于多數人來說,寫書不是一件容易的事,而應用新的技術則是一件迫在眉睫的事。
通常來說,技術出自于對現有的技術的改進。這就意味著,在掌握現有技術的情況下,我們只需要做一些小小的改動就更可以實現技術升級。
而學習一門新的技術的最好實踐就是用這門技術對現有的系統行重寫。
第一個系統(v1):Spring MVC+Bootstrap+jQuery
那么在那個合適的年代里, 我們需要單頁面應用,就使用了Backbone。然后,我們就可以用Mustache + HTML來替換掉JSP。
第二個系統(v2):Spring MVC+Backbone+Mustache
在這時我們已經實現了前后端分離了,這時候系統實現上變成了這樣。
第二個系統(v2.2):RESTful Services+Backbone+Mustache
或者
第二個系統(v2.2):RESTful Services+Angular.js 1.x
Spring只是一個RESTful服務,我們還需要一些問題,比如DOM的渲染速度太慢了。
第三個系統(v3):RESTful Services+React
系統就是這樣一步步演進過來的。
盡管在最后系統的架構已經不是當初的架構,而系統本身的業務邏輯變化并沒有發生太大的變化。
特別是對于如博客這一類的系統來說,他的一些技術實現已經趨于穩定,而且是你經常使用的東西。所以,下次試試用新的技術的時候,可以先從對你的博客的重寫開始。
</div>來自: http://www.phodal.com/blog/how-to-learn-language-technology/