C 語言工程師轉做 Scala 需要補充哪些知識?

題主華五小本,現在做嵌入式C開發半年,偶然看過幾篇Scala的軟文,感覺比較有意思就深入了解了一下。由於已經厭倦了C在底層無窮無盡的糾纏,了解Scala語法部分時寫小程序的時候是很爽的,於是乾脆一鼓作氣啃完了Martin的《Programming in Scala》(略過了actor部分,因為Scala的actor庫已經被廢棄了),啃完之後對Scala的基礎語法比較熟悉了。

現在想進階,發現不管學akka去搞後端,還是去做Spark相關,現在業餘時間看書都已經不夠了,而且,之前本科階段的數據結構和演算法基礎在函數式編程領域幾乎也豪無用處(存疑?),要學的東西很多。同時,學完了Martin的大部頭也想去做點點東西出來,因此換個工作似乎是比較好的選擇。

現在題主的知識結構大致如下:熟悉指令式語言的基本數據結構與演算法,了解編譯原理前端、網路協議、操作系統原理、SQL基礎,JVM基本特性。

題主準備在年後春招時搏一搏,那麼各位前輩大咖學長,你們覺得現階段我現在的知識結構,要勝任你們的崗位要求的話,有哪些預設,需要補強到什麼程度?這裡重點放在工作前就必須打下的基礎,可以在工作中補強請放在稍後註明。我大致想到的有:函數式語言的數據結構與演算法,Akka的actor基礎特性,如果你們覺得二者不重要也請說明。

最後也歡迎大家分享你們所知道的國內在用Scala的公司,我現在已經知道的有豈凡,19樓,看處方,喬布堂。謝謝大家。


首先從題主找工作的目標出發,目光不需要放在以Scala為主要編程語言的公司。國內所有應用Spark、Play、Spray等以Scala為主要開發語言的開源系統的公司都需要Scala人才。應用大型開源軟體時,勢必需要足夠的人才儲備去理解相關軟體架構以便進行調優、調試、改造、修復。以Spark為例,BAT三家、Intel、MSRA、亞信、華為、愛奇藝等等目前應該都有相關需求。

其次從長期的學習路線出發說一說。我一直認為Scala是一門以FP為目的、以OOP為手段誘騙Java程序員上FP賊船的過渡型語言 :-)

很多人都知道Martin Odersky是Java標準委員會的成員,是Java泛型的作者,有第一手的工業經驗;但他的另一個身份卻並不廣泛為人所知:Martin Odersky也是程序語言大神、Pascal作者、圖靈獎獲得者Niklaus Wirth的嫡傳弟子。可以說Martin是業內罕有的工業學術兩手抓,兩手都很硬的人物。一方面他相信在現在分散式、並行、並發橫行的時代,FP必然是未來的大趨勢,另一方面他也深知當前的工業界仍然被命令式OOP語言所壟斷。再加上在Java標準委員會的時候他就對Java的設計非常不爽,於是才有了Scala這門Java done right的FP、OOP融合型語言。

對於初學Scala的Java程序員來說,Scala首先是一個簡潔版的Java(無論是語法層面還是語言標準文檔長度方面)。前幾天看到一個對比Swift和Object-C的笑話,放在這裡也適用:在Java里你要說「I am laughing out loudly」,在Scala里你只需要說「LOL」。但等你上鉤之後就會發現,雖然Java里的各種OOP手法在Scala里都能用,而且更簡潔,但Scala的各種標準庫和最佳實踐統統走的都是FP路線,於是你自然而然地開始學習FP的知識。當然也有很多人到了這一步就放棄了。

再接下來,就會有人產生「Scala是少數複雜性堪比C++的語言」的想法。這裡我要從兩點做辯護。第一,Scala的複雜性是正交特性乘積的結果,而C++的複雜性是各種ad-hoc補丁累加的結果。其直接表現便是兩門語言specification的長度——Scala 2.9 191頁,手頭一份C++ 11的working draft則足足有1328頁。第二,JVM並不是為函數式語言設計的,雖然近年來為函數式語言作出了一些改進,但還是有很多局限。為了彌合JVM與上層函數式語言之間的差異,Scala在設計上可謂戴著枷鎖跳舞,做出了諸多妥協。例如利用ClassTag提供運行時類型、REPL中十分怪異地將每行代碼單獨編譯成一個object(2.11中可以編譯為class)等等。同時,為了融合FP和OOP,Scala也為OOP做出了一定的犧牲,例如類型推導無法覆蓋函數參數類型等等。這就造成了一個問題:對於熟悉ML、Haskell、OCaml等函數式語言的人來說,Scala看上去十分熟悉,很多語言特性都可以簡單地映射到現有函數式語言上去(例如implicit與type class,case class與代數類型),上手十分容易;另一方面,對於沒有接觸過FP的初學者來說,這些噪音使得用Scala學習FP可能還不如清空腦袋中的OOP知識,直接學習ML來得輕鬆愉快。但是不得不說,Martin雖然戴著枷鎖,Scala這套舞仍然跳得十分出色,雖然不得不引入一些噪音,但已經極力將之控制到最小範圍了。

所以從長期來看,個人認為學習一門正宗的靜態強類型函數式語言(比如ML)可以更容易地將Scala中為適配JVM而變形的FP語言特性還原到其原初的樸素形態,從而大大加快、加深對Scala的理解。在此推薦Coursera上的Programming Languages課程,該課程以Standard ML、Racket(一種Scheme方言)、Ruby為例探討了不同編程範式的程序語言的種種。我從SML的那部分課程收穫頗豐。


謝邀,其實沒什麼要準備了

如果你在面試的時候能把你對scala的這種熱情表現出來,而且對Martin的《Programming in Scala》掌握的比較紮實的話,招scala程序員的公司應該都會願意給你機會的。

關於用scala的公司,thoughtworks也有scala項目,但不能確保你來了就一定做scala項目。


之前本科階段的數據結構和演算法基礎在函數式編程領域幾乎也豪無用處 —— 非常錯誤。

既然你能把 「 Programming in Scala」 啃下來,說明你智力條件還是相當好的。

就我有限的體會而言,Scala 是一門外觀漂亮,上手容易而又極度複雜的語言,初級階段對實踐的要求遠重於理論。

基本語法和編程習慣的熟悉,可以做一些小練習或者刷些題。如果對初等數論兼有興趣,就更好了,可以做 https://projecteuler.net/ .

如果是 Web 後端方向,Scala 框架上應該至少熟悉 Spray / Play 2 其中之一,最低最低的要求,也要能用 Scala 給自己寫一個能用的 Blog(這也是非常有效而快捷的學習手段). 對於非 Web 程序員,這裡至少能了解 Http Request, DB(SQL/NoSQL), Web API, User Authentication 此類基礎知識。

Akka Actor 用來構建高並發的基礎架構非常有效,所以...

對一般初學者而言,直接去做 Spark 相關的難度會顯著大於 Web 後端。因此不建議正常人直接跳入這個坑。

總之一句話,最重要的不是掌握多少,而是能做出什麼東西出來,切忌流於理論空想而疏於實踐。

以上,一家之言,僅供參考。


最好先學點C++,學會忍耐它的編譯速度,這樣Scala用起來就沒有什麼不適了。


推薦閱讀:

scala語法問題: range的向上向下轉型?
在Haskell里,每個類型都可以構造出來一個此類型的表達式嗎?
React 0.14:揭秘局部組件狀態陷阱
Lens: 從入門到再次入門
Lazy computation 在實際應用中有什麼妙用?

TAG:Scala | 函數式編程 |