專訪鄧草原:從對象和函數式到現實世界的項目
原創【51CTO獨家特稿】在09年7月,51CTO開發頻道的一篇譯文中,一位名叫Neil的美國開發者向我們廢了半天的口舌說明一個好的入門編程語言應該要盡可能的鼓勵學生發展天生的好奇心,最好是像Python一樣簡單,而千萬不要用Scheme這種可能是“最好”的學習編程的方式去扼殺了大多數年輕人的熱情。當然無論Neil持怎樣的觀點,事實上Scheme在美國的很多著名大學中都被列入第一年的計算機課程,而Neil也并不否認Scheme能夠為今后的編程學習打下簡單而堅實的基礎,并認為教授Scheme的學校很可能都是一流的。那么,這個Scheme是個什么樣的語言呢?
“Scheme是Lisp語言的一個分支,它是現今仍然在使用的最古老的編程語言之一。它提供了最少的語法和極少幾個操作符。同樣重要的是,Scheme支持函數式編程范式,這意味著它可以用數學函數表達式來編程。”
今天這篇文章的主角不是Scheme——這個古老的語言在國內幾乎可以說是鮮為人知。不過,這個語言跟我們今天要討論的話題有很深的關系:為什么我們要開始關注和學習函數式語言。在剛剛結束不久的QCon 2010大會上,51CTO開發頻道有幸面對面的采訪到了NetBeans上的Erlang和Scala插件的作者鄧草原先生,對函數式語言在最近幾年的普及進行了探討。(值得一提的是,草原最初接觸的函數式語言正是Scheme和Lisp。)
鄧草原,宏爵財經資訊技術主管。除了NetBeans Erlang和Scala插件項目之外,他也是開源軟件AIOTrade項目的主創者,以及NetBeans夢之隊成員。在2009年11月,51CTO開發頻道曾經就Scala IDE的開發情況對草原做過一次郵件訪談,感興趣的讀者們可以參考這篇文章。
本次采訪的內容主要從兩個角度探討了函數式語言的普及:開發者的角度,以及項目的角度。從市場而言,這是一個供需的關系:因為項目需要這種特點的編程語言,所以需要招聘掌握此種語言的開發者,所以開發者需要開始學習。軟件領域是一個日新月異的產業,雖然說函數式語言是一個計算機界的老古董,但這個埋了許久的金子在近幾年來開始發光了起來。也許是時候開始仔細考慮這樣一個選擇,迎著風險前進了。
以下是訪談實錄。
項目的角度:為什么要考慮函數式語言?
函數式語言近年來開始流行,原因何在?
草原:一個是我們現在的程序員適應變化,開發的周期比以前要加快了。以前一個程序寫出來,可能一年去開發,然后兩三年間只需要小的修修補補就可以了。但是現在一個很明顯的特點就是,很多程序都是要求你去非??斓?,根據需求的變動,根據系統的壓力,不斷地做一些滾動的開發。這個時候,對于一個語言的抽象能力就會有些新的要求。比如在Java里頭,我們可能會用到很多事件處理,內部類,匿名類這些東西,但是Java在語言的簡潔性方面,可以說一直到Java 6以來都沒有考慮的太遠。從這個角度來講,函數式編程它首先在語言的簡潔性方面帶來很多新的機制;或者說,函數式語言它提供了另外一種抽象的能力,可以讓你的代碼更加簡潔。
另外,有些問題本來就是適合用函數式來處理的。原來我們沒有這種手段的時候,這些問題可能要寫一堆命令式的代碼;那么現在有這種手段之后,我們就可以很快的跟實際問題通過函數的方式把它對上,代碼本身的質量也會得到很大的提高。
當然還有一個原因就是現在多核時代,并發和并行計算的要求。并發和并行,尤其是并行,相對而言是希望能夠把一個任務分配到多個CPU上去運行。因為相對來說,函數式語言強調的是引用透明,就是說,一個函數只要你給我一個相同的輸入,那么按理來說我會給出一個相同的輸出。像這種應用就是一個很好的并行計算的基本顆粒,這些顆粒可以簡單的把它分配到不同的CPU上面或者不同的節點上面去運行。這個是函數式語言現在受到更多關注的一個重要原因。
在項目中應用函數式語言,主要面對哪些障礙?
草原:我一直有這樣一個觀點:我們的語言是為了解決現實世界中的問題,而現實世界應該從對象和函數兩個角度去看?;蛘邞撨@樣說,現實世界既是函數,又是對象。所以從這個角度來看,如果我們用一個純函數式的語言去解決我們現實問題的時候,而不是為了解決一個學術問題或是做一些計算,那么做這些工作的時候就會發現,純函數語言只發揮了語言抽象能力的一面而已。所以我認為,如果讓函數式語言能夠得到更好的發展,最好的途徑是像Scala這樣:它是一個融合了OO和FP(函數式風格)的,而且融合的相當好的語言。我覺得更多的人以后會發現,從函數的角度去抽象,Scala會幫助他們漸進的了解這一點。
使用函數式語言與其他語言進行多語言混合編程的效果如何?
草原:從多語言混合編程的角度來看,它們之間交互的關鍵我覺得還不是在它們是函數式或者是OO。因為現在,比如說Ruby,Erlang,還有Scala,Java,它們之間的互操作一般都是會通過一些特定的協議。只要這個協議得到保證,那么不管你之前在某個部件上面,或者是應用的某一塊上使用了Ruby或者Erlang,實際上都沒有關系。所以從這個角度而言,當你在一個項目中使用不同語言的時候,你重點考慮的可能是,我現在所要解決的這一塊是不是這個語言所適合的。
比如說我們以前有一個例子,是我們做過的一個銀行的項目,就是一個非常典型的混合語言的項目。這是個兩三年前的項目,那時候,銀行的業務系統是用Java編寫的,中間有一個Erlang的程式來把手機發過來的信息轉換成后臺的業務系統需要的協議,并且從后臺業務系統返回來的數據再轉換成手機上需要的協議。這個轉換過程是用Erlang來做的。但是在轉換過程中,我們用到了大量的XML文件的解析,這個解析本身,說實話,Erlang它并不擅長做這種字符串或是文本的處理,所以這一塊我們是用Scala寫的。Scala它包裝了一個XML的庫,這個時候,Scala就可以發揮它在JVM上運算的效率優勢。Erlang和Scala之間的通訊使用的是Erlang的那套IPC通訊機制。然后在我們的前端還有個Web應用,這個Web應用在那時是用Ruby寫的。所以這是一個非常典型的混合語言的應用,試圖發揮不同的語言在做不同事情時的優點。
但說實話,我本人是希望能找到一種更一般化的語言,能夠同時具有不同的抽象能力,它能同時在不同的領域用不同的方式去解決不同的問題。如果現在我再設計這套系統的話,可能里面就只剩Scala了。
#p#
開發者的角度:如何學習函數式語言?
51CTO:您是如何開始了解函數式語言的?
草原:我本身對函數式語言了解的話,可能是源于大學里頭了。大學里頭對于Lisp或是Scheme有過一些了解,只是那時候的了解還不夠深入,大概有個概念。真正把它應用到自己的實際項目當中應該是從Erlang開始的。這個大概是在三、四年前。那時候開始認真的去考慮,一個純函數式的語言,能夠在應用中能帶來哪些新的,或者說,抽象的手段,還有處理問題的手段。
51CTO:您覺得學習函數式語言的難點都有哪些?
草原:掌握函數式語言,我覺得相對來說,數學的基礎要扎實一些。如果實在是覺得自己在這方面有所欠缺的話,沒有關系,你可以把過去的很多算法啊,數學方面的這些東西都拿回來看一看。然后你再回頭去看函數式編程,那個時侯你可能會理解的更深一點。
另外呢,還要多做練習。因為如果你長久以來都是在做OO的開發,忽然轉到函數式風格的編程,可能是需要一個適應的過程。這個時候,一些教程和練習就能起很大的作用。
51CTO:函數式編程的技術門檻會比較高嗎?
草原:以Scala為例,如果我從Java轉過去使用Scala的話,這個過渡實際上是比較循序漸進的。我可以按照傳統的風格寫很多命令式的代碼,但是在寫的過程中你會發現,Scala提供了非常多的能夠以函數式風格處理的API,你可能慢慢的就會熟悉這種API。熟悉了API之后,可能就會慢慢有了函數式編程的習慣。我覺得這是最切實可行的轉變的一種手段,這也是為什么我比較看好Scala的原因。
【相關閱讀】
這篇可以算是是Artima總編Bill Venners的一個函數式語言初步體驗感言。在學習Scala的過程中,Bill總結道:“函數化的編程風格強調不可變對象、變量可被初始化但不能重新賦值(Java中的最終變量)、數據結構轉換,以及方法和控制的構造,最終產生一個沒有副作用的結果。這個領域的另一端是命令式的風格,以可變對象、變量可被重新賦值(Java里的正常變量)、在數據結構中索引、以及帶副作用的方法和控制構造為特征。”
51CTO在08年對國內Erlang陣營的兩位先驅者,趙東煒和成立濤兩人的訪談。云計算的背景和多核的需求使函數式語言開始復蘇,但Erlang的學習的確有很大難度:“它主要是把一個程序拆成各個不同的任務,在并行上面跑,這其實不是很徹底的、完全新的東西,比如說我們從Google的地圖里面可以看到這個思想,但這就是并發的思想。它對我們大家目前所熟悉的語言會造成沖擊,這個思維模式會是一個難點,除此之外語言的語法是一個難點。”
這是一個系列文章,適合剛剛開始起步學習F#的開發者。F#是微軟.NET開發平臺的一門編程語言,其最大的特點是對函數式編程(FP,Functional Programming)的引入;F#對面向對象(OOP)編程的支持也很出色,使用F#語言,開發人員可以自由選擇函數式編程或面向對象編程來實現他們的項目。此外,F#還可以與.NET平臺上C#、VB等其他編程語言緊密結合。
兩個相關技術專題:Scala編程語言 | F#函數式編程語言
51CTO專訪鄧草原視頻請見下一頁
#p#
視頻采訪實錄