身為開發者,在程式開發的生涯裡,基本上,不會只學習一種語言,有時是為了工作的需要,可能是因為好奇,或者是想從中學習到某些觀念、思想、典範或設計的方式,如果你曾經學習多種語言,當中有哪些是對你後續影響特別重大的?

我本身學過多種語言,理由也是各式各樣,有些語言在學習後,確實對後續的我有著重大影響,不過,在談到是哪些語言之前,我必須先聲明:這只是我個人的順序,每個人接觸語言的順序畢竟各不相同,就我而言,可能是接觸了A語言後感覺衝擊,後續接觸B語言,因為已經熟知相關概念,衝擊性就沒那麼大了,而對於其他人而言,可能是先B後A,相對地,B語言對他的重要性就會比較大一些。

Java

對我而言,第一個覺得影響重大的語言是Java,在接觸Java的那個時間點,Java正是聲勢上揚之際,充滿著大量的學習資源,這包含了大量的實體書。可以從大量實體書裡系統化學習,為日後的我奠定了重要的基礎,即便至今日,許多的文件資源,都可以從網路上搜尋而得,我依舊覺得實體書是系統化學習的重要媒介。

那個年代也正是網際網路興起的年代,Java對我而言重大的另一原因,就是社群討論,一群人聚集在JavaWorld[@]TW,發問、回答、吵架、寫文件、打屁聊天,過程中累積起來了許多知識,那也是段快樂的時光,當時凝聚出來的向心力,甚至會讓人在JavaWorld[@]TW偶而掛點、無法上論壇時,就會覺得渾身不對勁,那種論壇參與感,在至今各式各樣討論區裡,都未曾再感受到。

當年也是百花齊放的年代,有著各種開放原始碼的程式庫與框架,程式庫與框架本身就代表著某種經驗或設計概念,就算過去未曾接觸過相關開發,單是從程式庫、框架學習,就能獲益良多,由於是開放原始碼,必要時還能直接從原始碼一窺細節。

Scala

對我而言,第二個覺得重要的語言是Scala,當時接觸的動機是好奇,想知道作為一門可運行在JVM、可與Java互操作的Java.next語言是怎麼一回事,然而,我從中受到的衝擊,是首次接觸到函數式程式設計典範。

回顧過去,我是從《Programming in Scala》系統化地學習Scala,從中初次感受到函數式的衝擊,儘管就現今來看那時留下的筆記文件,當初體會到的函數式思想也只是一知半解,然而,Scala為我開啟了函數式程式設計大門的事實,卻是不變的。

作為一門Java.next,Scala試圖融合物件導向與函數式程式設計,雖然Scala沒能成為Java.next,然而,它帶給Java的影響重大,就現今的Java來看,確實有著不少Scala的元素,像是Lambda、record class、sealed class、模式比對等。

JavaScript

開發者如果學習過靜態定型語言,接觸動態定型語言也會是另一個必要的功課,反之亦然,畢竟動態定型與靜態定型間的設計方式有時截然不同,特別是在思考物件的行為,而不是型態這方面。

我接觸過幾門動態定型語言,其中對我影響比較大的是JavaScript,理由有幾個,首先它是基於原型的(prototype-based)物件導向,這讓熟悉基於類別的我花了不少時間,思考兩者設計方式之不同,而不是一味地想以原型的概念模擬類別。

另一個理由是一級函式,雖然Scala也有一級函式的概念,我卻是在JavaScript裡,看到了各種神乎奇技的應用,因為我接觸時的JavaScript並不成熟(ES3),然而正因為不成熟,而發展出許多奇技淫巧,其中多半就是基於原型與一級函式的應用。

另一方面,也因為這些奇技淫巧,稍微讓我看到一些程式語言的底層,具體來說就是meta程式設計的概念,而這些底層概念,在後來我試著〈打造玩具語言〉時,其中一些語法樹的實現,就是受到了JavaScript的影響。

Haskell

由於JavaScript具有一級函式的概念,不少人會用它來談函數式程式設計,由於從Scala、JavaScript看函數式,對我來說,總是有種隔著薄紗的朦朧感,於是,我決定學習一門真正的函數式程式設計語言,也就是Haskell。

Haskell對我影響深遠,特別是在代數資料型態的部分,因為代數資料型態是基於資料的結構來構成型態,新型態的構成來自於型態與型態的結合,具體而言,就是Sum型態與Product型態,也正因為代數資料型態,我真正看清了map/filter/fold等真正的意義,也才知道原來模式比對是這麼一回事。

作為純函數式語言,Haskell對一級函式的支援是相當徹底的,Closure、Curried函式等,在Haskell是極為自然的存在,也因此才能進一步發展出函式合成,從而構成Functor、Applicative、Monad等高階抽象,這些高階抽象在Haskell裡相當自然,然而,在命令式語言裡試圖模仿卻顯得複雜。

對於開發者,特別是從命令式語言接觸到函數式元素開發者,我總是會建議:有機會的話,應該學習一門純函數式語言,這會讓你在命令式語言使用函數式元素時,更得心應手,也能在傳達函數式概念時,不致於出現一些似是而非的觀念。

OpenSCAD

近期影響我最多的語言是OpenSCAD,一開始對它只是玩票性質,想知道使用程式語言來建模,可以做到什麼樣的3D模型效果,然而,OpenSCAD卻成為我進入數學、幾何領域的重要語言,也接觸了許多過去想都沒想過的演算法。

OpenSCAD的變數特性,令程式在撰寫時,必須使用變數不可變的方式,使得OpenSCAD被視為具有函數式程式設計典範的語言,嚴格來說,它在其他函數式方面的支援並不齊全。然而,其實基於不可變撰寫程式,是許多開發者進入函數式的門檻之一,因為撰寫過大量的OpenSCAD程式碼,使得我在處理不可變方面的經驗豐富起來,連帶也提升了函數式方面的能力。

雖然我建議開發者認識純函數式語言,不過,我本身並沒有使用Haskell做過任何的東西,學習Haskell目的在於啟發;然而,使用OpenSCAD的時間久了,也讓我逐漸建立起自己的開放原始碼程式庫dotSCAD,並成為官方推薦的程式庫之一。

語言的學習路徑

再次強調,我列出的語言順序並不重要,沒列出的語言,也不代表它不重要,純粹只是我本身接觸語言的順序罷了;然而,像這樣回顧為何某個語言對我重要,也間接呈現出一種語言學習的路徑。

例如,對於初學者而言,應該選擇學習資源豐富、社群熱絡的語言,這可以讓你快速成長;後續可以選擇具有不同設計概念、典範的語言,認識不同的開發方式;如果對某個典範看不清,最好選擇一個純粹支援該典範的語言;如果語言著重在某個領域,或許也值得學習,它可能成為你入門某個領域的基礎;然後,最重要的是,無論哪個語言,大量地撰寫程式碼,可以實現出自己的作品。

你是不是也學習過多個語言?有哪些語言對你而言是影響重大的呢?試著回顧看看吧!或許可以發現自己與眾不同的語言學習路徑呢!

專欄作者

熱門新聞

Advertisement