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