2017年6月28日 星期三

程式修練的秘訣

在一本暢銷書「萬萬沒想到」裡提到了學習的四個秘訣:

  1. 只在「學習區」練習;
  2. 把要訓練的內容分成有針對性的小塊,對每一個小塊進行重複練習;
  3. 在整個練習過程中,隨時能會得有效反饋;
  4. 練習時注意力必須高度集中。
1 的意思是指要練習自己不擅長、常做錯的部份。冰雪聰明的本站讀者我想應該不用特別解釋 3 跟 4。

有問題的是 2,什麼重複練習才是有效的?

這部份作者也沒有多做說明,好在另外一本書給出了明確的套路。

雖然這本書主要是教導你如何學習數理知識,但學習程式跟學習數理其實非常相像(再說資訊界非常多專家都來自數理界),筆者認為也可以應用在練習程式上,這個套路就是:
  1. 從頭到尾做完一道重要題目(比方說 LeetCode 上的考古題)
  2. 接著再做一遍
  3. 休息,打工,或者去運動
  4. 睡覺前再做一遍
  5. 隔天找機會再做一遍,或是完成另一道類似的題目
  6. 加一道新題目,重複 1-5
  7. 在搭公車或去圖書館的途中,回想解題中的重要步驟
1-5 算起來需要做 4 遍,很累人嗎?有人說要考上國立大學課本要唸 7 遍,這比起來算輕鬆了。

個人覺得可以做第五遍,用不同的程式語言解同一題,或是把迴圈改用遞迴解解看,用不同的方式理解問題往往會收到奇效。

知名網紅邏輯思維頻道主持人羅胖講過一個很有啟發性的概念,他說如果煙花在一個聾人的手中爆開,他可能不知道發生了什麼事、為何發生,少了一個維度的資訊對事情的理解會差這麼多!

另外在「為什麼你沒看見大猩猩」這本書裡提到了一則很珍貴的資訊,2008 TopCoder 冠軍 Tim Roberts 與其他參賽者不同的是:他用了一個小時研究問題,對問題設計者問了至少 30 個問題。

所以在進行步驟 1 時,必須徹底了解問題、驅策自己把問題區分成更多小問題,確認這些小問題都有解、彼此正交沒有重複時可能答案就一目了然了。

即時反饋很多人可能想到的是電腦的 output,不過書上的建議是老師是很好的反饋,但對於社會人士來說可能有困難,好在 fb 上有些解題社團可以參加,不過之前試著參加的結果...被打槍了,也不知道為何解個 LeetCode 要搞的這麼神秘(事實上 LeetCode  強國已經做出解答放在 github 上),或者是該社團原本就是不給不認識的人參加吧?

耳聞強國還會在週末組班一起討論算法,也許您也可以找三五好友一起組班討論,如果找不到人可以留言找筆者過去充充場面 XDD

後記

萬萬沒想到在台灣有點評價不一,首先有些人一看到作者是強國人就嗤之以鼻,外加推薦人在圈子內也算爭議人物。筆者不禁想起巴菲特的左右手查理蒙格(Charlie Munger)的建言:

避免極端的意識型態

因人廢言或因言廢人恐怕不是好事,筆者建議採用「拿來主義」哲學,有用的就學起來,再說即便是皇太極與日本也鑽研過三國演義耶

萬萬沒想到強調「刻意學習」這個觀念,而這個觀念的原創中譯本(刻意練習:原創者全面解析,比天賦更關鍵的學習法)剛上市,有興趣的朋友可以不用再看二手資訊了。

祝大家找到理想的工作!

4 則留言:

  1. 個人是先分析我為何沒有別人學得快。結論是要先擴充資訊輸入頻寛的限制。花了一些時間去學速讀。會了之後,開始重學C,在三個月內,將"Pointer on C"看了七遍,之後C語言就不再是問題了。

    回覆刪除
    回覆
    1. 如果現在有人想出如何教學「速讀原始碼」,我想應該會大發利市

      個人沒有學過速讀,我的作法算是笨讀,我會找一堆同類型的書來參考,親自動手實驗,反芻出心得寫成 blog。

      如果要精通 C 語言我手邊到是有一本 C Puzzle Book 大家參考看看
      https://www.amazon.com/Puzzle-Book-Alan-R-Feuer/dp/0201604612

      刪除
  2. 記得在很久很久以前,那是S3C2410的時代,是一個cross compile還在2.95的時代,我看了歐萊禮的Building Embedded Linux Systems,也自己用新版的gcc,與2.6的kernel,編出了個可以run的kernel,自己覺得很炫。
    回頭想想,太鑽研於這些底層技術的細部,對於進度似乎沒有什麼重大的幫助?但,這也或許就是我還是一個工程師的原因吧?

    回覆刪除
    回覆
    1. 忘了在哪邊看過,學習任何一種技能帶來的效益成長就像拋物線,過了峰頂就會開始下降了...

      就算不信這個,外面卡內基、心戰、權謀...這些課程要價可是什麼程式設計的好幾倍(還年年上漲),技術只剩站長這種冥頑不靈的傻B在鑽研了

      刪除