翻譯:顧遠(yuǎn)山
著作權(quán)歸作者所有山宾,轉(zhuǎn)載請(qǐng)標(biāo)明出處逞刷。
原文鏈接:Why F# is the best enterprise language
原文作者:Scott Wlaschin
此貼為《2018 F# Advent Calendar》其中的一篇纹冤,其他帖子請(qǐng)點(diǎn)擊鏈接圍觀傲醉,特別感謝Sergey Tihon大神組織了這次活動(dòng)坷牛。
“為什么說(shuō)F#是最好的企業(yè)(編程)語(yǔ)言”乌助,取這樣一個(gè)標(biāo)題溜在,并不是為了騙點(diǎn)擊率,而是發(fā)自我內(nèi)心的想法他托,我會(huì)嘗試通過(guò)此貼證明這一點(diǎn)掖肋,如果你能堅(jiān)持看完,我希望你也會(huì)同意我赏参,或者至少有那么一點(diǎn)點(diǎn)被說(shuō)服志笼。來(lái)吧沿盅!
需要明確的是,我只會(huì)討論所謂的“企業(yè)開(kāi)發(fā)”纫溃。我并沒(méi)有宣稱F#對(duì)系統(tǒng)編程腰涧、游戲開(kāi)發(fā)或興趣項(xiàng)目等都是最好的選擇。針對(duì)某種開(kāi)發(fā)目標(biāo)的方法也許不適用于另一種紊浩,正如彼之蜜糖,吾之毒藥窖铡。企業(yè)開(kāi)發(fā)有著自己特定的約束條件和訴求,所以我才覺(jué)得F#特別合適坊谁。
我得從一條重要的告誡開(kāi)始费彼,那就是——我不認(rèn)為某個(gè)項(xiàng)目的成敗取決于使用某種特定的編程語(yǔ)言,相比編程語(yǔ)言而言更重要的口芍,是諸如順暢的溝通箍铲、清晰的需求、重視用戶體驗(yàn)鬓椭、靠譜的期望等良好實(shí)踐颠猴。要是編程語(yǔ)言真有那么重要,那世界上就不會(huì)有靠PHP膘融、VB或JS成功的公司芙粱,所有的職位都只需要會(huì)Haskell和Lisp就可以了祭玉。
但我還是覺(jué)得編程語(yǔ)言的選擇可以影響生產(chǎn)效率氧映、可維護(hù)性和穩(wěn)定性,這正是這篇帖子接下來(lái)要談及的內(nèi)容脱货。其實(shí)要證明諸如“F#是最好的企業(yè)編程語(yǔ)言”這種斷言非常簡(jiǎn)單岛都,我要做的無(wú)非就從“企業(yè)軟件項(xiàng)目縱向研究之若干”* 中挑一個(gè),再不然就從眾多集結(jié)了大量老碼農(nóng)的受控試驗(yàn)中挑一個(gè)振峻。哈哈哈臼疫,當(dāng)然,沒(méi)這回事扣孟。對(duì)于一個(gè)動(dòng)輒萬(wàn)億美元級(jí)別的行業(yè)烫堤,我們通常只靠秘聞野史、老掉牙的神話和直覺(jué)來(lái)做決策凤价,要傳出去了會(huì)非常駭人聽(tīng)聞了鸽斟。** 所以我沒(méi)有任何實(shí)質(zhì)的證據(jù),哎利诺,但我會(huì)至少嘗試呈現(xiàn)一份有理?yè)?jù)的論證富蓄。你要是同意我的前提,我希望你至少也認(rèn)真對(duì)待我的推論慢逾。
**沒(méi)錯(cuò)立倍,我知道“不好使網(wǎng)站”和“爛證據(jù)網(wǎng)站”灭红,但我堅(jiān)持自己的觀點(diǎn)。
*譯者注:此處作者引用了Kevlin Henney的一條Twitter口注”淝埽“根據(jù)我的經(jīng)驗(yàn)…”可以翻譯為:基于一項(xiàng)縱向的、獨(dú)立觀察的寝志、沒(méi)有正式文檔記錄的赁项、樣本數(shù)量為1且不受控的研究…原文為 "In my experience..."Translation: Based on a longitudinal, self-observed, undocumented study with N=1 and without a control...
企業(yè)開(kāi)發(fā)的特征
那么“企業(yè)”開(kāi)發(fā)都有什么關(guān)鍵特征呢?
軟件開(kāi)發(fā)并非業(yè)務(wù)焦點(diǎn)
在本貼談?wù)摰摹捌髽I(yè)”里澈段,軟件通常被當(dāng)成工具對(duì)待悠菜,它是個(gè)成本中心而非利潤(rùn)中心,用最新的技術(shù)或者請(qǐng)最好的碼農(nóng)败富,或(難過(guò)地)投資員工技能培訓(xùn)悔醋,是沒(méi)有壓力的。這意味著這里提到的“企業(yè)”跟業(yè)務(wù)規(guī)模無(wú)關(guān)兽叮,根據(jù)我的定義芬骄,Google不做企業(yè)開(kāi)發(fā),而一家50人左右的規(guī)模的B2B公司很可能會(huì)做企業(yè)開(kāi)發(fā)鹦聪。這同樣意味著開(kāi)發(fā)內(nèi)部軟件去贏得競(jìng)爭(zhēng)優(yōu)勢(shì)的諸如FinTech等公司账阻,也不算在此貼所說(shuō)的“企業(yè)”的范圍內(nèi)。
項(xiàng)目以業(yè)務(wù)為中心而不是以技術(shù)為中心
企業(yè)開(kāi)發(fā)的目標(biāo)通常是支持業(yè)務(wù)流程而不是實(shí)現(xiàn)一套具體的技術(shù)需求泽本。最入門(mén)程度的典型企業(yè)軟件僅僅處理數(shù)據(jù)移動(dòng)和數(shù)據(jù)轉(zhuǎn)換淘太,這聽(tīng)起來(lái)很瑣碎,甚至經(jīng)常被人鄙視并非“真正意義上的編程”规丽。但業(yè)務(wù)流程有人介入蒲牧,而且隨時(shí)有人介入,這讓情況永遠(yuǎn)都很復(fù)雜赌莺。實(shí)現(xiàn)高效的映射歸約算法或優(yōu)化圖形著色器也許有點(diǎn)棘手冰抢,但很可能業(yè)務(wù)流程的處理也同樣棘手!這段30年前關(guān)于COBOL的引用就很好地概括了這一點(diǎn):
編程語(yǔ)言教科書(shū)中明確指出對(duì)問(wèn)題域的偏好艘狭,提到COBOL可以有做業(yè)務(wù)數(shù)據(jù)處理的方向…其中能被處理的問(wèn)題是…相對(duì)簡(jiǎn)單的算法外加大量的輸入輸出挎扰,如為大型組織計(jì)算工資單。
實(shí)際上任何一個(gè)寫(xiě)過(guò)正經(jīng)算工資單程序的同學(xué)都很難說(shuō)它“相對(duì)簡(jiǎn)單”巢音。我相信計(jì)算機(jī)科學(xué)家并不清楚太多業(yè)務(wù)數(shù)據(jù)處理任務(wù)的復(fù)雜性遵倦,也有可能他們發(fā)現(xiàn)很難為現(xiàn)實(shí)中數(shù)據(jù)處理應(yīng)用涉及的惱人卻普遍的復(fù)雜性提供優(yōu)雅的理論索性放棄了。
可悲的是港谊,企業(yè)開(kāi)發(fā)從來(lái)不曾性感過(guò)骇吭。
企業(yè)項(xiàng)目通常持續(xù)較長(zhǎng)時(shí)間
當(dāng)然這對(duì)企業(yè)開(kāi)發(fā)來(lái)說(shuō)并不獨(dú)特,但企業(yè)軟件項(xiàng)目能活很長(zhǎng)時(shí)間(如果他們有童年)倒是挺常見(jiàn)的歧寺。很多項(xiàng)目持續(xù)五年甚至更長(zhǎng)——我自己就熟悉一個(gè)上個(gè)世紀(jì)七十年代就開(kāi)始的項(xiàng)目——在項(xiàng)目整個(gè)生命期燥狰,會(huì)有很多碼農(nóng)參與其中棘脐。于是得出兩個(gè)推論:
項(xiàng)目生命周期的大都花在了所謂的“運(yùn)維”上×拢“運(yùn)維”是個(gè)誤導(dǎo)性的術(shù)語(yǔ)蛀缝,它主要指的是低速演進(jìn)(偶爾也會(huì)有高速恐慌)。
如果你是一位碼農(nóng)目代,負(fù)責(zé)某個(gè)已經(jīng)存活了很久的項(xiàng)目屈梁,那這個(gè)項(xiàng)目絕大部分代碼都不會(huì)是你寫(xiě)的,也不是你現(xiàn)在這個(gè)團(tuán)隊(duì)中任何一位同學(xué)的手筆榛了。
羅伯特斯莫夏爾曾經(jīng)有個(gè)非常有趣的演講在讶,當(dāng)中提到他模擬不同規(guī)模的團(tuán)隊(duì)在不同時(shí)期生成代碼的過(guò)程,比如當(dāng)前的團(tuán)隊(duì)在五年后普遍只會(huì)貢獻(xiàn)37%的代碼霜大。
團(tuán)隊(duì)越大构哺,項(xiàng)目持續(xù)時(shí)間越長(zhǎng),貢獻(xiàn)的代碼百分比可以降得更低战坤。
沒(méi)錯(cuò)曙强,這些都是模擬,但“根據(jù)我的經(jīng)驗(yàn)”途茫,它們是對(duì)的碟嘴。
企業(yè)項(xiàng)目經(jīng)理對(duì)風(fēng)險(xiǎn)容忍度較低
基于所有這些因素,項(xiàng)目經(jīng)理厭惡風(fēng)險(xiǎn)并鮮有嘗新——為什么要打破原有已經(jīng)用得很好的一套囊卜?俗話說(shuō)“過(guò)程就是組織的疤痕組織”娜扇,穩(wěn)定性遠(yuǎn)比效率重要。然而边败,新的環(huán)境條件偶爾出現(xiàn)袱衷,強(qiáng)行導(dǎo)致業(yè)務(wù)變化捎废,有些甚至發(fā)生在極其保守派的業(yè)務(wù)笑窜。比如上個(gè)世紀(jì)九十年代新興的“內(nèi)網(wǎng)”和“因特網(wǎng)”嚇壞了好多人,它們跟后來(lái)崛起的Java和VB/ActiveX息息相關(guān)登疗,以下是當(dāng)時(shí)媒體的一些炒作:
1996:由于網(wǎng)景和微軟在爭(zhēng)奪網(wǎng)絡(luò)霸權(quán)排截,所以Java和ActiveX都是董事會(huì)的關(guān)鍵部分。1997:Java之前世界上沒(méi)有互聯(lián)網(wǎng)編程語(yǔ)言辐益。
這些文章發(fā)布了不到十年断傲,主流企業(yè)編程語(yǔ)言的而且確變成了Java和C#。得益于移動(dòng)端應(yīng)用程序的廣泛應(yīng)用和云技術(shù)的崛起智政,我想大家已經(jīng)走到了另一個(gè)紀(jì)元∪险郑現(xiàn)在企業(yè)也愿意承擔(dān)風(fēng)險(xiǎn)嘗試新技術(shù)防止落伍,當(dāng)然挑戰(zhàn)在于采用新技術(shù)的同時(shí)不會(huì)產(chǎn)生大混亂续捂。
選擇一門(mén)企業(yè)編程語(yǔ)言時(shí)垦垂,有哪些重要的方面需要考慮宦搬?
從項(xiàng)目經(jīng)理的角度出發(fā),所有這些因素如何影響你對(duì)編程語(yǔ)言及其生態(tài)系統(tǒng)呢劫拗?
它應(yīng)當(dāng)對(duì)企業(yè)友好
項(xiàng)目經(jīng)理不僅需要選擇編程語(yǔ)言间校,他們還得保證周邊的生態(tài)系統(tǒng),以及對(duì)其進(jìn)行后續(xù)支持页慷。如上所述憔足,企業(yè)開(kāi)發(fā)所用的技術(shù)棧并不處于最前沿。相反酒繁,如果生態(tài)系統(tǒng)能得到企業(yè)友好型公司如微軟滓彰,甲骨文或谷歌等的支持,必將是一大優(yōu)勢(shì)州袒。
此外找蜜,從企業(yè)管理者的角度來(lái)看,編程語(yǔ)言及其生態(tài)系統(tǒng)對(duì)企業(yè)服務(wù)的深度支持是至關(guān)重要稳析,包括但不限于企業(yè)數(shù)據(jù)庫(kù)(Oracle洗做,Sql Server),企業(yè)Web服務(wù)器彰居,企業(yè)身份驗(yàn)證(AD诚纸,LDAP),企業(yè)數(shù)據(jù)格式(XML)等陈惰。對(duì)最新熱點(diǎn)的支持不大可能是他們最關(guān)心的問(wèn)題畦徘。
它應(yīng)當(dāng)面向未來(lái)
鑒于企業(yè)項(xiàng)目較長(zhǎng)的存活時(shí)間,我們希望確保生態(tài)系統(tǒng)和工具在未來(lái)仍然能到支持和支持抬闯,比如十年內(nèi)井辆。就算新平臺(tái)出現(xiàn),你也不必拋棄現(xiàn)有的全部代碼溶握。
它應(yīng)當(dāng)相對(duì)靈活
如果你打算為企業(yè)搭建一套生態(tài)系統(tǒng)杯缺,理想情況下,您希望在盡可能多的不同情況下使用它(例如桌面應(yīng)用程序睡榆,服務(wù)器應(yīng)用程序萍肆,Web應(yīng)用程序)和不同的目標(biāo)平臺(tái)(Windows,Mac胀屿,Linux塘揣,移動(dòng)設(shè)備等)。
它應(yīng)當(dāng)便于維護(hù)
由于團(tuán)隊(duì)成員很可能在項(xiàng)目的整個(gè)生命周期內(nèi)進(jìn)行輪換宿崭,并且大多數(shù)代碼都不會(huì)由當(dāng)前團(tuán)隊(duì)編寫(xiě)亲铡,因此主要需要關(guān)注的問(wèn)題包括:
理解難度:看懂上一個(gè)團(tuán)隊(duì)成員編寫(xiě)的代碼有多難?
生產(chǎn)效率:我們能否快速安全地添加新功能?
安全性:我們是否有信心做更改或重構(gòu)不會(huì)弄壞任何東西奖蔓?
選擇一門(mén)企業(yè)編程語(yǔ)言(之一)
有了這些要求琅摩,我們可以用它們對(duì)企業(yè)編程語(yǔ)言的選擇進(jìn)行精簡(jiǎn)。
為了易維護(hù)性和安全性锭硼,大多數(shù)人都同意你需要一門(mén)靜態(tài)類(lèi)型的語(yǔ)言房资。當(dāng)你有個(gè)幾十人到幾百人一同協(xié)作的大型代碼庫(kù)且要用上很多年的情況下,靜態(tài)類(lèi)型語(yǔ)言支持更好的重構(gòu)檀头,編譯時(shí)錯(cuò)誤可以幫助防止錯(cuò)誤的代碼投入生產(chǎn)轰异。所以,PHP暑始,Python搭独,JavaScript和Clojure,你只能對(duì)它們說(shuō)抱歉了廊镜!以下是約翰卡馬克關(guān)于此話題的說(shuō)法:
最佳實(shí)踐只是美好的理想牙肝,現(xiàn)實(shí)操作起來(lái)它們并不管用。有些東西如果在語(yǔ)法上可以被輸錯(cuò)嗤朴,那么它最終就會(huì)被輸錯(cuò)配椭。這是我非常重視靜態(tài)分析的原因之一,我希望能夠啟用更嚴(yán)格的語(yǔ)言子集來(lái)限制碼農(nóng)雹姊,因?yàn)槲覀兘?jīng)常犯錯(cuò)股缸。
軟件開(kāi)發(fā)不是業(yè)務(wù)的重點(diǎn),言下之意重點(diǎn)是穩(wěn)定性和生產(chǎn)效率吱雏,而不是性能敦姻。這意味著企業(yè)編程語(yǔ)言不應(yīng)允許具有潛在危險(xiǎn)的操作,諸如控制內(nèi)存和指針運(yùn)算歧杏。即使它可以被安全地進(jìn)行镰惦,如在Rust和現(xiàn)代C++中,付出的代價(jià)太大犬绒,和擠出來(lái)有限的額外性能相比旺入,并不值得。與其這樣懂更,不如讓垃圾收集器處理所有事情眨业,還能節(jié)省時(shí)間專(zhuān)注于其他事情。
它應(yīng)當(dāng)對(duì)企業(yè)友好沮协,所以無(wú)疑大家最喜歡的是:
? ? Java(和JVM上可以搭載Java生態(tài)系統(tǒng)的語(yǔ)言)。
? ? C#(和.NET生態(tài)系統(tǒng)中的其他語(yǔ)言)卓嫂。
? ? Go在這里也獲得了一些分?jǐn)?shù)慷暂,得益于Google的支持,你可以相信那些關(guān)鍵的企業(yè)庫(kù)還是可用的。
所以行瑞,沒(méi)有什么驚喜奸腺,意料之中的結(jié)果,Java和C#血久。
如果這是2008年突照,我們就到此結(jié)束了。但今年不是2008年氧吐,我們也不是2008年的我們讹蘑。在過(guò)去十年中,世界上涌現(xiàn)了大量新編程語(yǔ)言筑舅,相比C#和Java座慰,其中有些語(yǔ)言是企業(yè)編程語(yǔ)言更有力的競(jìng)爭(zhēng)者。我們來(lái)看看原因是什么翠拣。
函數(shù)式編程的興起
函數(shù)式編程現(xiàn)在是新熱點(diǎn)版仔,但無(wú)論炒作如何,大多數(shù)現(xiàn)代編程語(yǔ)言都引入了對(duì)函數(shù)式編程友好的功能误墓,而這些功能為軟件質(zhì)量帶來(lái)了很大的變化:
高階函數(shù)在很多情況下取代了重量級(jí)接口(沒(méi)有高階函數(shù)蛮粮,C#的LINQ和Java的Streams庫(kù)都不可能存在了)。
不同的默認(rèn)值谜慌,例如默認(rèn)的不可變性和默認(rèn)的非空值蝉揍,有了這些,運(yùn)維和代碼理解容易多了畦娄,因?yàn)樵诖a一旦與默認(rèn)值存在偏差差又沾,碼農(nóng)們會(huì)被明確地告知。
顯化副作用 一直被函數(shù)式編程社區(qū)所強(qiáng)調(diào)熙卡,包括諸如顯式錯(cuò)誤處理的結(jié)果類(lèi)型杖刷、把輸入輸出及其他非純粹性源放到應(yīng)用的邊緣(常見(jiàn)于核心功能/命令式操作和洋蔥架構(gòu)方法)。***
***譯者注:在函數(shù)式編程中兩種代碼:一種是純函數(shù)式代碼驳癌,一般用于純計(jì)算滑燃;另一種是副作用代碼,用于與外部的交互如磁盤(pán)IO颓鲜、網(wǎng)絡(luò)訪問(wèn)表窘、屏幕顯示等。
最后甜滨,最重要的是乐严,受FP影響的語(yǔ)言具有代數(shù)化的數(shù)據(jù)類(lèi)型。 也就是說(shuō)衣摩,不僅是記錄/結(jié)構(gòu)體昂验,還有“選擇”類(lèi)型(即總和類(lèi)型或可區(qū)分聯(lián)合)。 在我看來(lái),這些對(duì)高效的領(lǐng)域建模至關(guān)重要既琴。 我必須這么說(shuō)占婉,因?yàn)槲覍?xiě)了一本關(guān)于這個(gè)主題的書(shū),但有這看法的不止我一個(gè)人甫恩。
如果我們看一下支持這些功能的語(yǔ)言逆济,最終得到的有主流的靜態(tài)類(lèi)型函數(shù)式編程語(yǔ)言(Haskell,F(xiàn)#磺箕,OCaml)和更現(xiàn)代的受函數(shù)式編程影響的語(yǔ)言:Swift奖慌,Scala,Kotlin滞磺,Rust升薯,TypeScript等。
正如我上面所說(shuō)击困,如果諸如無(wú)服務(wù)器等新技術(shù)能提供競(jìng)爭(zhēng)優(yōu)勢(shì)(我認(rèn)為它們可以)涎劈,再加上新舊技術(shù)切換時(shí)能做到最少的混亂(取決于語(yǔ)言的選擇),那這些新技術(shù)的興起意味著企業(yè)愿意轉(zhuǎn)向這些受函數(shù)式編程影響的語(yǔ)言阅茶。
抽象過(guò)多的危險(xiǎn)
有些FP語(yǔ)言(特別是Haskell和Scala)支持一些允許高級(jí)抽象的功能蛛枚。有些人喜歡在這里引用Dijkstra:
“抽象的目的不是模糊,而是創(chuàng)造一個(gè)新的語(yǔ)義層面脸哀,其中一個(gè)可以絕對(duì)精確”
- E.W. Dijkstra
這很贊蹦浦,但我相信在企業(yè)開(kāi)發(fā)的特定環(huán)境中,過(guò)多的抽象可能會(huì)導(dǎo)致問(wèn)題撞蜂。如果使用抽象過(guò)于自由盲镶,則需要項(xiàng)目里所有的碼農(nóng)對(duì)“新語(yǔ)義級(jí)別”有相同的理解,這對(duì)培訓(xùn)和就業(yè)能力是種負(fù)擔(dān)蝌诡。最后變成只是某一個(gè)人在編碼過(guò)程中用范疇論獲得過(guò)多樂(lè)趣溉贿,但代碼對(duì)于其他人卻不可維護(hù)。
誠(chéng)然你可以用低級(jí)功能把事情搞砸浦旱,也可以用高級(jí)功能把事情搞砸宇色。對(duì)于一門(mén)企業(yè)編程語(yǔ)言,我們需要對(duì)編程語(yǔ)言的能力掐頭去尾颁湖,再盡可能鼓勵(lì)碼農(nóng)用“唯一的方法搞定”宣蠕。**
因此,我在這里要處罰Haskell和Scala甥捺,因?yàn)樗菀诪E用抢蚀。
**人們喜歡用Go或Elm作為編程語(yǔ)言的原因之一,是因?yàn)樗鼈兪窍拗菩缘南延馈S靡环N標(biāo)準(zhǔn)的方式做事思币,反過(guò)來(lái)就意味著閱讀和維護(hù)別人的代碼是非常直觀的鹿响。
但是多少的抽象算過(guò)多羡微?
泛型是否太先進(jìn)了谷饿?十五年前或許是的,但今天明顯它已是主流特性了妈倔。(Golang設(shè)計(jì)師不同意2┩丁)但是Lambda怎樣?Monads又怎樣盯蝴?我認(rèn)為大多數(shù)函數(shù)式編程的概念現(xiàn)在都處于主流的邊緣毅哗,并且十年后時(shí)間將被普遍接受,因此擁有一種支持它們的語(yǔ)言并非沒(méi)有道理捧挺。
對(duì)我而言虑绵,在2018年,“恰到好處”的抽象層次是在諸如OCaml和F#等ML語(yǔ)言中找到的闽烙。 在接下來(lái)的10年時(shí)間里翅睛,情況的發(fā)展也許會(huì)有所不同,我們沒(méi)準(zhǔn)能夠向上調(diào)整一下可接受的抽象層次黑竞。然而捕发,由于員工技能的差異,我不信更抽象的數(shù)學(xué)風(fēng)格編程(諸如Idris很魂,Coq)在企業(yè)中將是常見(jiàn)的扎酷。沒(méi)錯(cuò),這可以通過(guò)更好的培訓(xùn)或經(jīng)過(guò)認(rèn)證的軟件工程師資格來(lái)解決遏匆,目測(cè)我等不到這一天了法挨。
選擇一門(mén)企業(yè)編程語(yǔ)言(之二)
如果我們按照上面的“企業(yè)”標(biāo)準(zhǔn)過(guò)濾這些較新的語(yǔ)言,我們最終會(huì)得到支持.NET和JVM的受FP影響的語(yǔ)言幅聘,即:
.NET上的F#凡纳;
JVM上的Kotlin;
我也將添加TypeScript喊暖,因?yàn)樗芎玫刂С植⒎稀捌髽I(yè)”標(biāo)準(zhǔn)惫企。
再來(lái)總結(jié)一下“為什么不是X語(yǔ)言”我所持的反對(duì)理由:
C#和Java? - 這兩個(gè)沒(méi)問(wèn)題,但F#和Kotlin支持更好的默認(rèn)值(不可變性)陵叽、更好的副作用以及代數(shù)式的數(shù)據(jù)類(lèi)型狞尔。
Swift - 它在Apple生態(tài)系統(tǒng)中得到了很好的支持,但沒(méi)有任何跡象表明它一般火到企業(yè)中巩掺。
Ceylon - Kotlin有更多的動(dòng)力偏序。
Haskell - 是的,Haskell確實(shí)嚴(yán)格執(zhí)行純度胖替,這很贊研儒,但這不是編程的唯一組成部分豫缨。更重要的是,沒(méi)有逐漸遷移到Haskell的路徑 - 你直接就被拋到了深處端朵。這可能對(duì)學(xué)習(xí)函數(shù)式編程很有用好芭,但不適合企業(yè),在我看來(lái)冲呢。
Scala - 我恐怕可以用太多不同的方式做事是劣勢(shì)舍败。 Kotlin更加企業(yè)友好。
OCaml - 如果你不需要企業(yè)支持敬拓,那么OCaml是一個(gè)很好的選擇邻薯。否則F#會(huì)更適用。
Go - 非常適合某些事情但不建議企業(yè)使用乘凸,因?yàn)閷?duì)類(lèi)型的域建模的支持很弱厕诡。
Elm/ Purescript - 目前只支持前端。
Reason ML - 目前只支持前端营勤。另外灵嫌,為什么不使用OCaml?
C ++ / Rust - 如果你不需要性能,GC系語(yǔ)言更容易使用冀偶。
Erlang / Elixir - 非常適合高并發(fā)醒第,但不適合企業(yè)。
PHP / Python / Ruby / etc - 我非常喜歡Python进鸠,但是當(dāng)你有超過(guò)10K的LoC時(shí)稠曼,可維護(hù)性就會(huì)消失。如上所述客年,靜態(tài)類(lèi)型語(yǔ)言是大型項(xiàng)目的唯一途徑霞幅。
高等級(jí)類(lèi)型呢?類(lèi)型類(lèi)呢量瓜?GADT呢司恳?
哦親愛(ài)的,三位決賽選手中沒(méi)有一位現(xiàn)在能支持這些绍傲,我會(huì)讓你判斷這些是否真的是企業(yè)發(fā)展的突破口扔傅。
挑選一個(gè)喜歡的
剩下的三種語(yǔ)言(F#,Kotlin和TypeScript)都是不錯(cuò)的選擇烫饼,它們都是開(kāi)源猎塞,跨平臺(tái)和企業(yè)友好的。如果您已經(jīng)在使用JVM杠纵,那么顯然Kotlin提供了最佳的遷移路徑荠耽。類(lèi)似地,如果你在后端使用Node比藻,那么TypeScript是好的(雖然信任npm包可能是個(gè)問(wèn)題)铝量。但是如果你正在進(jìn)行綠地開(kāi)發(fā)(或者如果你已經(jīng)在.NET上)倘屹,我相信F#有優(yōu)勢(shì)(可能是我有點(diǎn)偏見(jiàn)…)
它對(duì)非正式領(lǐng)域建模有出色的支持。
它是函數(shù)優(yōu)先的慢叨,使用函數(shù)極其組合作為主要的開(kāi)發(fā)方法纽匙。
不可變性真的無(wú)處不在 - 代數(shù)式數(shù)據(jù)類(lèi)型和集合的默認(rèn)就是不可變的。
它具有廣泛的功能插爹。例如:
? ? 你可以構(gòu)建支持?jǐn)?shù)百萬(wàn)客戶的微服務(wù)哄辣。參考jet.com如何做到的请梢。
? ? 你可以使用Fable在F#中編寫(xiě)JavaScript赠尾。例如VS Code的F#插件名為Ionide,是用F#構(gòu)建的毅弧,并以這種方式轉(zhuǎn)換為JS气嫁。
? ? 你可以使用SAFE Stack或WebSharper開(kāi)發(fā)全棧式Web應(yīng)用程序(在前端和后端之間共享代碼)。
? ? 你可以使用類(lèi)似Elm的方法使用Fabulous庫(kù)構(gòu)建移動(dòng)應(yīng)用程序够坐。
? ? 你可以使用Avalonia構(gòu)建XAML或WinForms桌面應(yīng)用程序寸宵。
? ? 你可以創(chuàng)建輕量級(jí)腳本,例如構(gòu)建和部署管道元咙。該視頻展示了使用自己的腳本編寫(xiě)的好處梯影,而不是像VSTS/Octopus那樣被鎖定在供應(yīng)商的工具中。
? ? 腳本的另一個(gè)不錯(cuò)的用途是瀏覽器UI測(cè)試庶香。
? ? 當(dāng)然你也可以做數(shù)據(jù)科學(xué)甲棍。
當(dāng)然Kotlin可以做上述其中一些而TypeScript可以做上述其中另一些,但我認(rèn)為F#總體上用途最廣泛赶掖。
至此感猛,這便是我的結(jié)論!請(qǐng)隨意在評(píng)論區(qū)表達(dá)不同意奢赂!
順便說(shuō)一下陪白,如果你有興趣了解更多關(guān)于F#的信息,請(qǐng)查看2018 F# Advent Calendar的其余部分膳灶,如果你喜歡看視頻博助,這里有一些很好的例子棉安,足以證明F#的多功能性:
Domain Modeling Made Functional
Build your own Excel 365 in an hour with F#
Exploring StackOverflow Data with F#
Live programming of the SAFE F# web stack
如果你對(duì)通過(guò)函數(shù)式方法進(jìn)行領(lǐng)域建模和設(shè)計(jì),這里有我寫(xiě)的一本書(shū),《函數(shù)式實(shí)現(xiàn)領(lǐng)域建幕绰撸》。這是一本初學(xué)者友好的入門(mén)書(shū)飞涂,涵蓋了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)恩沛,類(lèi)型建模和函數(shù)式編程。
作者:Scott.W霉晕; 發(fā)現(xiàn)有錯(cuò)庭再?請(qǐng)報(bào)錯(cuò)捞奕;關(guān)注作者的Twitter。
譯者后記:這是我正經(jīng)翻譯的第一篇文章拄轻,花了大約十個(gè)小時(shí)颅围。盡管本人一直從事企業(yè)系統(tǒng)項(xiàng)目工作,使用函數(shù)式編程也超過(guò)十年恨搓,但原文作者功力深厚院促,用詞隨心,翻譯時(shí)還是盡可能多參考資料斧抱,唯恐錯(cuò)漏常拓。如有不當(dāng)?shù)牡胤剑€望大家多多指正辉浦,共同進(jìn)步弄抬。