為什么大家都覺得函數(shù)式編程將會流行?
原創(chuàng)【51CTO精選譯文】這幾年來,函數(shù)式編程似乎忽然紅火了起來,但事實(shí)上,函數(shù)式編程卻是個(gè)已經(jīng)存在了四十余年但長期只活躍于學(xué)術(shù)領(lǐng)域而非商業(yè)開發(fā)領(lǐng)域的一個(gè)編程方式。那么,為什么大家會認(rèn)為函數(shù)式編程將流行?有一位從事電子商務(wù)Web應(yīng)用開發(fā)的程序員在stackoverflow上提出了自己的疑問,而這個(gè)疑問也普遍存在于很多程序員的腦中。讓我們先看看這位程序員是怎樣說的:
51CTO編輯推薦:Scala編程語言專題
jjnguy:
不管什么時(shí)候去 stackoverflow 或 reddit 這樣的網(wǎng)站,總會遇到一群 Haskell / Scala / F# 語言的粉絲,頑固地堅(jiān)持函數(shù)式編程將是下一個(gè)“大事件”。不可否認(rèn),有一些問題的確適合使用函數(shù)式編程的方式來解決,但是我過往的經(jīng)驗(yàn)告訴我: ◆普通的公司程序員,比如和我一起工作的大多數(shù)同事,并不懂函數(shù)式編程,并且多數(shù)工作環(huán)境也不會讓你使用它來編程。 ◆實(shí)際上,大學(xué)不教函數(shù)式編程這門課(或者現(xiàn)在大學(xué)有這門課?) ◆大多數(shù)應(yīng)用程序足夠簡單,使用普通的面向?qū)ο蠓绞骄涂梢越鉀Q。 函數(shù)式編程真的有必要嗎?或者只不過是一個(gè)很酷的玩具?我不是想要貶低它,我只是真的不確定:如果在我的日常工作(編寫電子商務(wù) web 應(yīng)用程序)中使用函數(shù)式編程的幾率接近零,我是否還應(yīng)該去學(xué)習(xí)這種編程? |
而對函數(shù)式編程充滿信心的程序員們往往不會默默認(rèn)同這樣的觀點(diǎn),而他們大多數(shù)也不是第一次遇到這樣的疑問。51CTO編者選取了以下幾個(gè)比較有代表性的回答進(jìn)行了編譯:
#t#joel.neely:
我覺得,對于函數(shù)式編程會流行這一話題沒有任何疑問,因?yàn)樽鳛橐环N編程方式,它都用了大約四十年了。面向?qū)ο蟮某绦騿T,每當(dāng)為了編寫干凈簡潔的代碼而使用了不可變對象時(shí)(immutable object),這都是借用了函數(shù)式編程的概念。
不過,強(qiáng)制性的函數(shù)式編程語言最近這些日子里的確獲得了很多文章的關(guān)注,而這些語言是否將主宰未來的編程語言還是一個(gè)懸而未決的問題。我自己的推測是,那種混合型、多范式的語言,比如 Scala 或 OCaml ,很可能會超過那些“純正的”函數(shù)式語言,正如純正的面向?qū)ο笳Z言(Smalltalk、Beta 等):他們影響了主流編程但并未最終成為使用最多的語言。
最后,我要實(shí)在忍無可忍地指出,你那些有關(guān)函數(shù)式編程的評論和不久前我從過程式編程程序員聽到的論述高度相似:
◆“傳說中的”“普通”程序員不懂它。
◆沒有大范圍內(nèi)教授這種語言。
◆用它編寫的任何程序都可以使用當(dāng)前的技術(shù)完成。
圖像用戶界面和“作為商業(yè)模型的代碼”這些概念讓面向?qū)ο笫艿礁嗪迷u,同樣,我相信對不可變性的使用逐步增加以及更為簡單的(大規(guī)模)并行操作將讓更多程序員看到函數(shù)式編程所具有的優(yōu)點(diǎn)。雖然在過去 50 年左右的時(shí)間里(這個(gè)時(shí)間構(gòu)成了數(shù)字化計(jì)算機(jī)編程的整個(gè)歷史)我們經(jīng)歷了很多,但我認(rèn)為仍然有很多東西需要學(xué)習(xí)。
從今日起,二十年后,程序員回頭再看,看到我們當(dāng)下所用的那些工具是如此原始,其中包括現(xiàn)在流行的面向?qū)ο蠛秃瘮?shù)式編程語言,他們將會大吃一驚。
Greg Hewgill:
對我來說,主要的加分處在于它固有的并行操作性,尤其是現(xiàn)在更高頻率的CPU正在轉(zhuǎn)變?yōu)楦鄡?nèi)核。
我認(rèn)為,函數(shù)式編程不會成為下一個(gè)編程范式并完全替代面向?qū)ο箢愋偷姆绞?。但我的確認(rèn)為,如下說法非常正點(diǎn):我們或者需要使用函數(shù)式語言編寫某些代碼,或者那些通用的語言將逐漸包含更多函數(shù)式構(gòu)造。
stbuton:
即使你在工作中從不會用到函數(shù)式語言,理解函數(shù)式編程將能夠讓你成為一個(gè)更優(yōu)秀的開發(fā)人員??偟膩碇v,對于代碼和編程,它將給予你一個(gè)新的視角。
讓我說,沒有理由不去學(xué)它。
我認(rèn)為,那些能夠?qū)⒑瘮?shù)式和命令式這兩種風(fēng)格很好地混合在一起的語言將是最有趣的,并且最可能獲得成功。
Norman Ramsey:
我可以告訴你人們?yōu)槭裁匆蚝瘮?shù)式編程而興奮:很多很多程序員在使用函數(shù)式編程時(shí)都有一種“信仰改變”的體驗(yàn):生產(chǎn)力提升了一倍(或者十倍),而產(chǎn)出的代碼更加容易改寫,bug也更加的少。這些人把函數(shù)式編程看作是秘密武器。一個(gè)很好的例子是Paul Graham的《Beating the Averages》(擊敗平均值)。而你知道他的應(yīng)用是什么?電子商務(wù)Web應(yīng)用。
========
我們來總結(jié)一下上面這些答案。綜上所述,函數(shù)式編程的優(yōu)勢主要針對兩點(diǎn):
1. 不可變性(immutability)
2. 并行操作性(parallelism)
這兩個(gè)概念其實(shí)與編程范式或編程語言無關(guān)。比如,Java也有不可變對象,只是需要通過自己編寫實(shí)現(xiàn)方法來實(shí)現(xiàn);而并行編程,近日在TechED大會上頻頻露臉的Visual Studio 2010就以并行編程為一大亮點(diǎn)。對于函數(shù)式編程在這兩個(gè)方面的優(yōu)勢,我們有現(xiàn)成的論據(jù)可以引用。先看看這篇Scala語言的簡介(這篇文章來自《Scala編程》一書,而這本書的聯(lián)合作者之一就是Scala創(chuàng)始人)。文中有這樣的一句話:“不可變數(shù)據(jù)結(jié)構(gòu)是函數(shù)式語言的一塊基石。”而這篇《哪種語言將統(tǒng)治多核時(shí)代 再看函數(shù)式語言特性》一文中,則十分詳細(xì)的描述了函數(shù)式語言天生的并行操作性:“函數(shù)式語言已經(jīng)在簡化并行開發(fā)中證明了它的作用, 這得益于它既不用共享內(nèi)存,也不會產(chǎn)生副作用(side effect)的函數(shù)?!笨梢哉f,函數(shù)式編程在這兩個(gè)方面上的優(yōu)勢是毫無疑問的。
事實(shí)上,這兩個(gè)優(yōu)勢是同進(jìn)同退的,因?yàn)榱己玫牟豢勺冃缘氖褂貌拍艽_保不會成為并行操作時(shí)性能的瓶頸。而這個(gè)優(yōu)勢的重要性,前面的答案中已經(jīng)很明顯的給出來了:如今的CPU在增高頻率上已經(jīng)遇到了瓶頸,多核CPU成為趨勢,因此能夠充分發(fā)揮多核性能的應(yīng)用程序?qū)⒃絹碓街匾?/P>
技術(shù)領(lǐng)域的改變是極快的,因此,“大多數(shù)程序員不了解它”或者“沒有大范圍教授這種語言”都是十分無力的論證(比如說,OO編程并非從一開始就流行)。種種發(fā)展趨勢都指向了函數(shù)式編程,而那些在編程范式上“兼容”的多范式編程(如Scala語言同時(shí)支持函數(shù)式和命令式的風(fēng)格,雖然它的使用者很可能最終會傾心于函數(shù)式)將必然會流行。
編者一直在推薦Scala編程語言,因?yàn)檫@個(gè)基于JVM的多范式編程語言無論怎么看都有很好的發(fā)展前景。如果你有Java開發(fā)的經(jīng)驗(yàn),那么51CTO的Scala編程語言專題中收集的一系列針對Java程序員的教程文章相信一定會對你有所助益。
做為程序員,沒有理由不去學(xué)習(xí)任何一門編程相關(guān)的技術(shù),更不用說那些很可能會影響到自己未來幾年飯碗的技術(shù)。編者一直相信對于一位程序員,沒有“與我無關(guān)的語言”或者“與我無關(guān)的編程方法”,因?yàn)榫幊逃兄餐ǖ恼軐W(xué)。沒有哪個(gè)優(yōu)秀的程序員會自稱“Java程序員”,“.NET程序員”,“PHP程序員”。他們的唯一稱呼就是“程序員”。因此,如果你還沒有開始學(xué)習(xí)函數(shù)式編程,那么現(xiàn)在就開始吧。