如何學好Scala?請給出一條科學的時間線
寫scala約9個月,fork純java的開源框架一個並用scala擴展,並且基於該框架寫了大小5、6個項目。
項目中使用了akka、spray等純scala庫,讀懂這些庫的源碼並且在有必要的時候給出patch無壓力。自覺在scala入門上還是有點東西可以說的。首先,看twitter的scala課堂( http://twitter.github.io/scala_school/zh_cn/ ),以及國人的一個教程( http://zh.scala-tour.com/ )。
看這兩個入門教程的時候,遇到難點難以理解的時候需要祭出Martin Odersky寫的權威教程scala編程( http://book.douban.com/subject/5377415/ )。
兩邊參考下,很快就能對scala有基本的認識。接下來就是實操項目,或者去讀讀源碼,看到不明白的寫法就翻翻權威教程。
遇到完全出乎意料的寫法時不要灰心 ,一開始看不懂scala代碼是正常的。
scala本身核心理念很簡單,只是由於強大的設計,讓scala具備了寫出各種dsl的能力,而dsl的樣子差異很大,所以讓人覺得scala千變萬化。抓住參數類型、返回值類型,留意這些類型實現了什麼trait,是否有隱式轉換。就能逐漸摸通代碼的邏輯。
迷茫的時候,看看此blog或許會有收穫。 http://hongjiang.info/scala/又遇到了一個極好的問題!我在另一個問題的回答中提到過(Scala是JVM下的Haskell )所以諾鐵的回答,建議先學Haskell是有道理的,但作為一個程序員,作為一個離開大學(或者正在大學中繁忙)的程序員,估計是沒有時間繞遠路,先學Lisp(函數式語言的老始祖),又學Haskell,最後再來學Scala,這樣彷彿也把Scala捧得過分高大上了一樣,似乎要過三關斬六將,或者經歷七十二個劫難才能修成正果一般。語言學習豈可以如此誇張。
現在Scala雖然在國外已經不算一門非常新的語言(畢竟2003年就推出了第一個版本),但在國內還屬於較新。因為國內的本科計算機科學教育,一是傾向於底層化(與硬體結合),二是傾向於過程式語言C和C++,對其他語言的掌握或許不夠。在賓大(UPenn)有類似研討會一樣的小課,每學期學生都可以選,有各種類型,像是Ruby,Python,JavaScript,Haskell,Scala等等,由學生選擇。斯坦福也喜歡隔三差五的就把業界的Haskell牛人給請去,比如Bryan OSullivan,他之前被Facebook挖角去了,但一直在斯坦福教Haskell。我一直很喜歡他在YouTube上講創業經歷的視頻,沒怎麼談程序或Haskell,但講了很多他作為程序員的經歷:https://www.youtube.com/watch?v=ZR3Jirqk6W8
國內過於傾向C/C++,導致大部分人固定在了過程化編程的思維模式中。Scala是函數式編程,函數式(Functional)編程和命令式(Imperative)編程幾乎是對立的。如果你把函數式程序員和命令式程序員放在一個房間里,他們恐怕會直接打起來。在蒙特利爾舉辦的一次Scheme(這是Lisp的一門方言)大會上,曾經有個可憐傢伙提及SSA風格(SSA是將命令式語言編譯成中間語言的一種格式),奧林·希瓦斯在那個"A"字還沒說出來之前就衝上去質問一聲:「你是指CPS吧!?」(CPS是函數式語言編譯成中間語言時用的風格)台下一陣暗笑。這個故事的英文如下,翻譯略有紕漏請見諒:At the last Scheme workshop in Montreal, some poor fellow had the temerity to mention SAA on stage. (SSA is what the "machine tribe" uses as an intermediate langauge in their compilers.) I dont think the "A" was out of his mouth before Olin Shivers booming drawl started, "dyou mean CPS?" (CPS is what "we" use.) There were titters from the audience, myself included. 原文鏈接在此:static single assignment for functional programmers -- wingolog
所以我的建議是,不需要真正去學一門函數式語言,只要了解它就好了。知道這一派程序員的作風,慢慢喜歡上這樣一個程序世界的分支。很多函數式程序員都非常的屌,比如Wingolog,他一直作為函數式語言Scheme的支持者,參加過很多次重要的會議,他在一篇討論JavaScript V8引擎的博文內寫了這樣一句笑話:In the beginning was the lambda. God saw it, realized he didnt need anything else, and stopped there. (太初有拉姆達表達式。上帝看見了它,意識到他再也不需要其他任何東西,就停在那裡了。)——static single assignment for functional programmers -- wingolog 這篇博文的前半部分略微介紹了一下函數式編程文化,非常有趣。
凡是學過函數式語言的人都對其讚不絕口,再回到Java或是C++一類的語言,會覺得受到窒息束縛一般的厭惡。最重要的,是用函數式語言寫程序的人總會感受到快樂(Fun),所以學習函數式語言是非常值得的——雖然剛開始必定會有很多困難,但非常值得。
用中文學習Scala未嘗不可,但Scala在國外的書籍都不算特別多,翻譯到國內來的幾乎沒有(如果有的話請告知)。但儘管如此,還是有不少的博客學習資源。比如宏江的博客:scala | 在路上 如果仔細搜一下中文資源必定還是有很多的,還有這個github上的帶Scala在線編譯器的教程Scala Tour。如果英文水平很好,並且有比較好的Java,C/C++功底,大可以直接閱讀這本神作:Scla for the Impatient(給不耐煩的人寫的Scala),可以在這裡下載:http://download.csdn.net/download/debug_de_bug/7769733 。這本書看名字彷彿非常膚淺,但實際作者Cay Horstmann是拿著數學博士學位,正在大學教計算機的教授,英文用得親和易懂,非常便於閱讀。對比Martin Odersky寫的艱澀著作Programming in Scala要好上很多。
Scala是一門很深的語言,但開始上路並不需要太多艱深的知識。Martin Odersky 把Scala的知識分成了兩個部分,製作了這個表格:
使用者 庫開發者
A1
A2 L1
A3 L2
L3
其中A2對應L1,A3對應L2,L3獨樹一幟處於境界最高點。縱向的排名是難度排名。所以雖然Scala知識多,但並不必要一朝而就,全部學完了才開始編程,大可以從使用者的知識點開始學習,再慢慢過度成一位庫開發者。http://www.horstmann.com/scala/index.html 和 Scala levels: beginner to expert, application programmer to library designer 已經把Scala的知識點詳細的劃分到這幾個大類下了。
有些人還會建議去學馬丁·奧德斯基在Coursera上面那堂著名的Functional Programming課。我非常不推薦。馬丁·奧德斯基的英文並不好,而且又沒有激情,跟個機器人一樣(遠不如他在很多Scala大會上的表現)。那門課和Scala關係不大,和函數式編程關係略大一些,而且非常偏理論。對於新手其實並不友好。
學習一門語言,就算學Scala這樣高大上的語言,實踐總是最好的。為什麼PHP非常流行?因為它非常簡單,而且有很多關於「實踐」的教程,比如如何用PHP寫一個博客。人人都懂博客,人人都用博客,所以PHP很快就在實踐步伐中普及開了,JavaScript也是同一個道理。
用Scala來做項目,才是學習Scala的最好渠道。在這裡不得不推薦Scala的兩個做項目必備的套件:Play Framework(模仿Ruby on Rails的網路開發套件,官方宣傳語是「高速度針對Java和Scala的網路框架」—Play Framework)Play有非常好的教程,一邊學Scala的語言特性,一邊用Play來開發一個小博客或者小網站,豈不是非常好?
第二個是Slick,任何做網站的人都會用到ORM,Play框架也不例外。把Play和Slick這樣類似ORM的資料庫操作工具(Slick開發團隊拒絕被稱作ORM)放在一起使用,也是非常愜意的。Slick 團隊想將其稱為FRM(Functional Relational Mapping),其本身其實是一個Scala語言編譯器,將特定的Scala語言理解後編譯成對應的SQL語言,而不是簡單的ORM那樣,建立一個Car對象後就可以car.save()。
所以總結一下,先了解什麼是函數式語言,大致了解即可,主要知道圈內人的風格(非常屌),知道函數式語言與過程式語言的優劣區別,然後通過一些渠道了解Scala的基礎知識,最後用上Play框架,寫一個自己的博客吧!邊學邊用才是唯一的方法吶。
況且,也不是每個人都適合學Scala的,這篇博文很詳細的指出,至少50%的Java開發者都不適合學Scala。Post: Scala use is less good than Java use for at least half of all Java projects 這位DPP仁兄(CEO of Telegram),作為Scala教育的普及者和先行者說:對於50%的Java開發者,學習Scala的難度高於它帶來的便捷。他說如果把上面的句子換成:對於50%的PHP開發者,學習Java的難度高於它帶來的便捷,恐怕就沒有什麼人有異議了。
------------------------------
附錄:
如果想學Haskell,推薦這個網站Learn you a Haskell for Greater Good(為大義而學Haskell):Chapters - Learn You a Haskell for Great Good! 本身是一本書,但有一個配套網站,免費把書的內容公開出來了,畫了一堆可愛的小動物,很多人的Haskell起步都是從這裡開始的。
附錄2:
我之前給Scala寫了一個入門指南,直接用JS幻燈片的方式寫的,所以可以直接放到網站上。但一直沒有機會,也不知道以後有機會沒有。如果有的話,會在這裡更新一個網址的。但如果有興趣,可以看看github下的md:ScalaWebREPL/slides.md at master · windweller/ScalaWebREPL · GitHub (我的Github很混亂,遠不能和很多大神相比,所以請各種見諒)
感覺scala一直都很低調,因為spark這兩年的火爆,才越來越多的人開始關注scala,不過高效、簡潔的代碼確實惹人愛。今年初整理了一些scala教程,供各位參考。
1.首先是Scala基礎:Scala - Scala開發教程。教程來自技術博主引路蜂,實驗樓免費提供了在線實驗環境,覆蓋了Scala所有的基礎知識點,包括類和對象、基本數據類型及其操作、函數、Trait等。個人認為這門課比Twitter的Scala課堂更成體系,更適合國人的閱讀習慣。最重要的是你不用將精力花在怎麼配環境上,有一個瀏覽器就可以開始學習了,非常方便。2.學完基礎後,針對Scala的一些特性,可以通過專題課程來強化。Scala全部 - 課程例如:Case Class和模式匹配、隱式變換和隱式參數、抽象成員和Extractor等。這些專題課程對於幫助你深入理解Scala編程體系、提高實戰能力有一定幫助。更多的專題課程還在更新。3.在熟練掌握了Scala基礎後,可以來個項目練練手:Scala - Scala開發二十四點遊戲。在做這個項目時要注意,不僅要在程序邏輯上跑得通,更要注意一個遊戲的演算法是如何實現的。該項目還涉及到如何在Java中調用Scala函數,所以對於一些跨語言編程的實際項目也是有幫助的。
之後可以學習諸如Play Framework之類的框架作為投入實際應用前的準備,這方面的課程正在準備,很快就可以見到。掌握了Scala,學習Spark的門檻就低了許多。Spark可以用於大數據分析、並行任務處理等場景。如果想更系統地學習Spark,可以學習Hadoop - Spark 大數據動手實驗。15個spark實驗在線實操。剛學習了一段時間Scala,給出我自己的學習線路:
首先我看了《Scala編程(中文版)》的前九章,作為初學者還是可以看懂的,看到第十章的時候就雲里霧裡了,後面的沒有看。對於 Inside 同學回答中的 Scala Tour,當我看到借貸模式就完全看不懂了,所以完全沒有看這個。這時你就可以開始看 Scala 課堂了,這個課堂的內容還是比較全的,但是對於每個知識點都講的很少,不夠全面,當你看不懂的時候就藉助Google多搜索多看別人的帖子,你會發現很多寫的很好的文章。
看完這些之後相信你已經有一些基礎了,現在看看官方的 A Tour of Scala 鞏固一下吧,上面按照每個知識點進行了講解。
如果你喜歡看視頻,這兩個中文的視頻還不錯,有些東西我是看這個視頻看懂的:Scala深入淺出實戰初級入門經典視頻課程(共41課時),Scala深入淺出實戰中級進階經典視頻課程(共152課時)。你可以找自己需要看的內容看,因為內容比較多。
這個時候你就需要看看這個博客了:scala | 寫點什麼。我目前看了類型相關的部分,上面的內容寫的非常好。
補充一個最近看到的一個Tutorial:Scala Tutorial.
最後,在學習的過程中,Scala for the Impatient 和官方的 Scala By Example 是你很好的參考,有時候你還要查閱 Scala 的 api:Scala Standard Library 2.10.4 以及 Scala 2.10.4 源碼。並且後期的時候看看 Spark源碼 會有很大的幫助。
看書,看typesafe網站,看視頻,練習。 我也正在自學中:)
Scala for impatient (快學Scala)Programming Scala 2nd edition (2015年出版)Programming in Scala 2nd edition (Scala編程。 比較老,和上面是不同的兩本書,不同作者)Play 2.4 Framework; Slick 3.1 online help (我整理成PDF文件,可以直接從ScottHuangZL/LearningScala · GitHub 下載)Play for ScalaMastering Play Framework for Scala視頻:Building Reactive Apps with Play Framework, Akka, and Scala on VimeoEffective Scala on Vimeo
GeeCON 2012: Bruce EckelScalaz PresentationThinking Functionally on VimeoLive Coding ScalaJS, SF Scala 28 Feb 2014 on VimeoScala.js: Safety Sanity in the Wild West of the Web on VimeoHigh Wizardry in the Land of Scala on Vimeo我的建議一直是建議先學haskell, http://learnyouahaskell.com/chapters 學前六章。
這樣之後學scala會容易很多,當然也有可能就此陷進去出不來了。然後就捧著programming in scala英文第二版啃就是了。寫,玩,就這麼簡單,Coursera 課程(不是入門那個,是Reactive 那個,忘了註明)一百分那是入門。別急著看理論,那是巨坑。
scala編程兩年,我覺得可以從這幾點入手,希望對你有用:1先看下twitter的是scala school,網址:http://twitter.github.io/scala_school/zh_zn/index.html。2上手編程,找不到例子的話可以看看,Ninety-Nine Scala Problems,http://aperiodic.net/phil/scala/s-99,練習一段時間,就可以自己寫大點的應用了。3書還是要看的,推薦下《scala編程》,不用全看完,結合編程實踐看。4讀一些優秀開源項目的源碼,如spark。主要是實踐吧,多寫代碼,自然就會了。
自己琢磨個項目,拿scala寫出來,上線了,看到了用戶,就學會了
為了學習spark,我把scala for impatient中文版大概看一遍,然後看spark代碼,基本都能看懂,在看spark資料的過程中也加深對scala的掌握。 spark用scala實現的,基於spark用scala寫的worldcount程序比基於hadoop用java寫的wordcount程序簡單很多,比基於spark用java寫的也簡單一些。至少說明scala寫的程序十分精簡,精簡是程序員應該遵循的原則。
scala小紅書 functional programming in scala
Scala Exercises在線學習Scala基本知識點並做練習的網站(英文),誰用誰知道。
看到一篇其他人整理的關於scala的文章,因為與作者認識,所以轉載過來,或許對學習scala的人有所幫助:以下是文章內容:(原文地址:Scala學習資源整理)--------------------------Scala學習資源整理
前言:
最近正在接觸Scala,所以就順手整理了一份我看到的關於Scala的教程、文章等相關內容,不為別的,只為自己方便查找,當然如果能給正在學習Scala的小夥伴一些參考倒也是非常開心的。
1、Scala入門開發教程
該課程主要是帶我們入門學習Scala,比較詳細,適合初學者。其中最爽的地方就在於擁有在線的開發環境,不必本地搭建環境。2、Scala教程
這個教程呢,也是入門學習,比較系統,適合初學者。3、Scala專題教程
這個專題教程系列呢,每個專題講解一個重點知識點,非常適合新手學習,對scala有了基礎的了解之後,想深入了解某個知識點的話,可以學習這個專題教程。4、Scala開發二十四點遊戲
這是一個項目教程,教你製作24點遊戲,適合有scala基礎的學習者,想應用所學的基礎知識,動手開發小應用的學習者。5、Scala官網
不多說,英文,自己看。6、Scala課程
Scala課堂是Twitter啟動的一系列講座,用來幫助有經驗的工程師成為高效的Scala 程序員。7、51CTO上的Scala專題
通過各種文章,了解Scala相關技術以及目前的發展趨勢,適合拓展閱讀。8、知乎上的Scala話題
不用多說,如果你正在了解Scala的話,可以看看。9、Scala入門筆記
比較簡短的入門筆記,適合新手或者對Scala有一定了解的學習者。10、Scala 2.8+ Handbook
這也是一個學習者的學習筆記,相對於前面的學習筆記要長很多,同樣適合新手學習。11、scala 從入門到入門+
這是segmentfault上的一篇學習文章,還不錯。暫且就這麼多,以後再看到的話,會陸續添加進來~
我學習的過程:
《快學scala》不怎麼樣。這本書只教你怎麼做,不告訴你為什麼,偏膚淺,只讀了三分之一就看不下去了。
《scala編程》是scala聖經。作者告訴我們scala為什麼這樣處理, 這讓人容易理解接受。看完了前20章,我就著手把我們日誌採集系統由java改成scala。在工作中學習真的很棒。
有個線上教程 Scala 課堂 也很不錯,簡單實用。經常把上面的例子用鍵盤敲一敲,總能悟出新東西。
現在正學習akka的集群和streams,很酷,讓人迫不及待想用起來。
(本答案不對那個Spark標籤負責)時間充足的話,顯然是沿著Scheme/Racket (我讀的The Little Schemer和Simply Scheme)—&> Haskell/SML/OCaml (推薦Haskell Book,記得得花59刀)—&> Scala(Martin的書+紅皮書)的路徑走。基礎好的(我不屬於,以下都是經歷過之後回頭看),Scheme學3天(語法大約需要學5分鐘,再花一個小時適應,最後寫點練習),Haskell一到兩個月(不必學太多),就可以Scala了。你很有可能走完這個路徑就決定回去繼續學Haskell了??
堅持寫,堅持用,scala容易陷入的一個誤區是做一件事有數不清的方法,各種詭異的符號,你妄圖先把這些全都記住才開始寫。