我的 Scala 學習之路

我的 Scala 學習之路

來自專欄 Cuoco 的小馬甲叔叔

本文同步發表在本人博客 我的 Scala 學習之路

本文是我對過去一年學習 Scala 的總結,既是總結經驗教訓,也希望對初學者有所幫助。

初次接觸

說來有趣,大約一年以前,我轉到一個新的項目組,晨會上了解到有同事正在調研 Scala,每天該同事都彙報調研進度(雖然一般是還沒開始、下周開始云云),我那時候剛轉正,想著既然以後可能用到,那我得提前學習,畢竟機遇總是留給有準備的人,於是我開始在業餘時間學習 Scala。

難以入門

當時在知乎搜索了很多如何學習 Scala 的文章,看到很多人推薦《Scala 函數式編程》(著名的小紅書),我當然知道這書很難,但當時蜜汁自信,認為看書就要看最經典、最難的,雖然進度慢,但收穫也大不是嗎?

開始看書以後,我發現除了第一章讀起來比較順暢,從第二章開始就很吃力了。苦苦掙扎了幾個周,加上上半年加班非常多,導致學習效果很不好。

而此時同事對 Scala 的調研早已結束,連個結論都沒給出,Scala 畢竟偏向後端,讓前端同事去調研,結果可想而知。

這段時間的學習讓我熟悉了很多函數式編程的術語,自己對函數式編程也越來越好奇,遺憾的是 Scala 始終沒有入門,而且 Scala 給我留下了難以學習的印象。

初窺門徑

時間一晃到了去年的 7 月份,這時項目加班終於少了一些,而我按捺不住對 Scala 的好奇心,又一次嘗試學習,這次我決定從知乎神課 Programming Languanges 入門,關於該課程的評價建議可參考很多知乎回答,一句話總結:函數式編程入門不二之選,對學習 Scala 也大有裨益。

不得不說,這門課真的是物超所值,我那段時間只跟了 Part A,使用 Standard ML 講述函數式編程的基本概念,例如:

  • list 組合子(map, filter, fold 等)
  • first-class function, high order function, closure, currying, partially applied function ...

這些概念今天來看非常基礎,但對毫無函數式編程基礎的同學來說卻並不容易,非常建議大家學習下這門課,對於入門 Scala 非常有用,因為 Scala 的函數式編程與 Standard ML 非常類似(當然與 Haskell 更類似),公開課最大的優點是有練習題目,有實際編程機會,這對初學者幫助很大。

後來我又跟了 Scala 之父 Martin Odersky 的一門課:Functional Programming Principles in Scala,這門課主要講述 Scala 的函數式編程,對面向對象幾乎隻字未提,習題稍微有點難度。

實事求是的講,這門課比 Programming Languages 還是略遜一籌,課程內容不是很連貫,我認為最好先學下 Programming Languages Part A,然後在跟這門課,事半功倍。

跟完這兩門公開課我對 Scala,或更廣義的函數式編程基本入門了,接下來需要實踐。

漸入佳境

前面說過,項目組對 Scala 的調研虎頭蛇尾,不了了之,公司里沒有實踐機會了。那時的我手握鎚子,到處找釘子,嘗試過寫自己的業餘項目,但苦於沒有好點子,只能作罷。

沒有實際項目做那就繼續學習唄,於是我開始重新學習 《Scala 函數式編程》。

有了公開課打下的基礎,這本書也沒有那麼難理解了,我一口氣讀完了 1-6 章,這幾章都是基礎,主要講了函數式數據結構(list/tree)、函數式 error-handling、stream、純函數式狀態等,其中很多內容在公開課中已經接觸過,例如:

  • list 在 Programming Languages Part A 中講過
  • stream 則在 Programming Languages Par B 中講過
  • 純函數式狀態在 Martin Odersky 的課中講過

公開課的優點是容易入門,缺點是不夠深入,小紅書完美補足了公開課的缺點,足夠深入,而且最贊的是小紅書有大量的練習題目,引導讀者實現了很多 Scala 標準庫以及 Cats 中的數據結構,非常過癮。

我把小紅書的練習代碼放在了 github 上,大家可以參考下。

學習過程中我得到一個教訓:如果某本書、某個知識點你完全不懂,那麼你肯定缺少相關基礎,此時不要繼續死磕,應該換個思路,去補下基礎,基礎補完後再重新回來。

讀到第 7 章的時候我又幾乎不懂了,哈哈,但有了前面的教訓,我沒有繼續死磕第 7 章,我明白應該暫時放下書,在合適的時候再重新開始。

我那時認為自己已經有足夠的 Scala 知識,是時候做點真實的項目了,我決定參與開源社區。

其實早在學校的時候,我就想參與開源,但一直苦於沒有機會,於是暗下決心,這次一定要破門而入。我在知乎搜索了很多 Scala 相關的問題,不誇張的說,95% 的相關內容我都看過,我總結了 Scala 的主要項目有:

  • Spark/Flink 等大數據相關應用;
  • Akka/Akka HTTP
  • Twitter 開源的很多框架
  • Cats/Scalaz
  • Kafka

最後我選擇了 Akka/Akka HTTP,因為它們主要涉及分散式應用開發,而且有很多先進理念(例如反應式編程),更重要的是社區非常活躍,對新人非常友好。

要貢獻代碼,首先要閱讀 CONTRIBUTING.md,巧的是閱讀過程中就發現了一個小問題,趕緊提 PR,Akka 團隊響應非常快,馬上就合入了。

這個小小的 PR 給了我很大鼓勵,原來開源社區並非高不可攀,於是周末在家也有事情幹了,從 2017 9 2 日到今天,Akka/Akka HTTP 一共接受了我 19 個PR:

Akka

Akka HTTP

雖然貢獻的代碼不多,但收穫卻不少,實踐出真知的確並非虛言,有高手 review 你的代碼,確實成長的更快。

期間我把小紅書第 7-12 章讀完了,中間還讀了兩本書,是 typelevel 的 Essential Scala 和 Scala with Cats,讀完這些書後,我對 type class 有了基本理解。

我也發現實際項目中 Cats/Scalaz 使用確實不多,畢竟並非每個人都是 Scala 函數式編程熟手,芸芸眾生才是主體。當然如果組內同事都是 fp 粉,用下也未嘗不可。

Scala 是一門很難精通的語言,知識點很多,但按我的理解,要享受 Scala 帶來的方便之處,並不需要精通語言的方方面面,而是需要取捨,選擇最合適的語言特性,至於如何取捨則需要高手把關。

展望未來

到目前為止,我對 Scala 也只是堪堪入門,但已經足夠我寫一些有趣的項目了,總體來說,學習 Scala 是很開心的,寫 Scala 代碼也是很開心的,希望未來能繼續堅持下去,至於能不能用 Scala 吃飯並不重要。

總結

總結一些對 Scala 學習有用的資料:

  • 公開課
    • Programming Languanges
    • Functional Programming Principles in Scala
    • Programming in Scala, Third Edition
    • Scala 函數式編程
    • Essential Scala
    • Scala with Cats
  • 網路資料
    • Twitter Scala School
    • 王宏江博客

前面沒有提 Programming in Scala 和 Twitter Scala School,並非它們不夠好,而是因為每個 Scala 學習者都應該讀過它們 :)


推薦閱讀:

lambda 重點高級知識講解3 - 表達式裡面的this
第四屆函數式編程分享會
用 Swift 寫個`函數式`的解釋器(1)
我願意在她手掌之中(一):範式

TAG:Scala | 函數式編程 | Akka |