2014年12月14日 星期日

秘訣:[edX] FP101x Introduction to Functional Programming

圖為開課教師 Erik Meijer 正在講解手中的量子電腦(無誤)


一分鐘看懂真正的 Syllabus


  • 八週精心設計的課程  (幫助你白數根頭髮)
  • 以 Haskell 為主的 FP Introduction (少數實驗可以用其他語言寫)
  • 需要有 1 年以上程式經驗(以便上課時自行對照 FP 與 imperative 的差異)
  • workload 4 -6 小時 (除非你說英語 + 數學好,不然請 * 2)



誰不該修這門課

  • 平常工作下班超過晚上九點的人 (別再進修折磨自己了,不如換工作先?)
  • 初踏入社會做未滿一年的資訊人 (你還有很多要學,這個技能點數可以晚一點再點)
  • 想學一個好上手的 FP ,且要馬上拿來用的人 (請跳過 Haskell)
  • 排斥閱讀英文課外素材的人 (這門課需要看很多資料)
  • 閒暇時間不多的人 (建議有花掉 100 ~ 150 小時的心理準備)



誰適合修這門課

  • 閒暇時間夠多的人(學生、魯蛇、放長假者、正常上下班且想進修者 ...)
  • 數學強的人(不是算數強的人)
  • 有認真寫過 javascript, python, perl, php, ruby 之一的人(學習的門檻較底)
  • 想拿 PhD 但是沒有題目的人 (無誤)



案例

某魯對 FP 一直很有興趣,據說去年的新年新希望是學 scala  ... (而且還沒達成)
今年心想放長假卻不學一門 FP 實在太遜惹
男子漢要學就學「純」的,而且越難越好(誤)

最後該魯花了 150+ 小時修課跟閱讀課外資料
而且到現在還是不會寫 Haskell
但是對 FP 倒是真的有初步認識 ...

#備註:該魯旁聽最後 92 分 pass



歷程

開課的學校是荷蘭的代爾夫特理工大學,世界排名在 100 附近
授課老師是強者 Erik Meijer,之前在微軟
他說話略有口音,但速度不快,很容易跟上
為了讓課程有趣,老師正式上課前常常會安排有趣的橋段
用以譬喻或銜接的課程內容,會使人莞爾一笑(或是覺得他很煩  XD)

這門課的影片時間不算長,一個子單元大約只有 30~40 分鐘的影片
一週最多兩個子單元,共有 14 個子單元

我的經驗是前四週,每週大約花費 12 hours 完成課程
之所以多花了一點時間,是因為我盡可能維持作業的正確性、並且嘗試玩玩各種 lab
由於有 Python 的使用經驗及或多或少有看過別人介紹 FP
我在前四週的學習算是非常順利
也不太需要閱讀課外素材

But 就是這個 but
咻~滑進去課程後,會遇到很大的一個坑 - Monad
在第五週,我花費了 40+ hours 才結束該週的課程
這門課設計得很巧妙,老師沒有正式教 Monad
而是介紹完了 Functional Parsers 以後才告訴你這是 Monad
要不要深入探討則是課後閱讀及學生自己的事

老實講,就算不花這麼多時間去理解 Monad ...
也是可以繼續進行之後的課程
不過,我想既然跳坑了,就學多一點吧!
胡亂看了些 google  到的補充素材,盡力去理解課後閱讀的資料 ...
最後我才知道對我來講這個坑真的無窮大,設個停損點後就繼續修課 XDDD


課程的後半段,影片難度比前半段僅略高一點
難度提升最多的地方是作業與 lab
有時候看到 2x 題的作業或是 lab 就覺得好累
以困難度來講,請留意 Poor Man's Concurrency Monad 這個 lab ... Orz
真的會讓人回憶到小時候寫程式作業去捶打棉被的過去



秘訣

0. 你想知道 Python 與 Haskell 有什麼關係?
https://wiki.python.org/moin/PythonVsHaskell


1. 如果你只想咬一口看看 Haskell 在幹嘛,恭喜!
剛好良葛格正在 CodeData 撰寫一系列的 文章
都是中文且淺顯易懂,推!


2. 沒錢買課本 or 不想買太硬的課本,這裡!
來讀 Haskell 趣學指南吧!圖文並茂且中入淺出 ...
Learn you a Haskell for Great Good
# 有中文版,但是建議閱讀英文版
# 強烈建議在 Functional Parser 子單元進行前讀過 本章
# 覺得這本書太棒了?那就買一本吧 : )


3. 到底什麼是 Monad?
搞不懂的話先來聽聽 stackoverflow 上的兩個回答 A B
需要圖解的話,這邊有 懶人包
有了基本概念後,再來繼續 fp101x 課程提供的閱讀素材吧!
http://www.cs.nott.ac.uk/~gmh/monads


4. 倒數第二個 Lab:Poor Man's Concurrency Monad 超難?
真的超難,建議(如果寫得出來的話)寫一題就去回答題目
以取得 feedback ,才知道自己寫的對不對
需要特別留意的是,題目測試的覆蓋度不足
所以有可能寫錯答案,可是前面的測試會對,回答最後面的整合性考題會錯 ... Orz
如何推理出 bind   題目出自這篇 paper



心得

透過 MOOC 自主學習,在本質上是最容易打破學習界線的
本課程的設計深入淺出,儘管在少數章節銜接處有小 gap 需要自行補上
但是透過兩個月能夠習得的知識量及老師的看法是非常有價值的

我個人認為,這門課讓我大大打開眼界,亦「升級了腦袋」。







沒有留言:

張貼留言