App下載

那些害死Haskell的,也會(huì)害死Rust

猿友 2020-09-19 16:47:57 瀏覽數(shù) (2770)
反饋

文章來(lái)源于公眾號(hào):架構(gòu)頭條
作者 | Alexander Granin
譯者 | 無(wú)明
策劃 | 小智

編者按

本文作者的中心思想不是唱衰 Rust 語(yǔ)言,正相反,他非??粗?Rust 語(yǔ)言。他回顧了 Haskell 語(yǔ)言從王者“淪落至此”的原因,希望這能給目前充滿朝氣的 Rust 社區(qū)敲響警鐘。以下為正文。

時(shí)間到了 2030 年,我在文件夾里發(fā)現(xiàn)了這篇文章。從我寫(xiě)這篇文章開(kāi)始,我就知道,我是對(duì)的。我覺(jué)得應(yīng)該把這篇文章發(fā)表出來(lái),因?yàn)樗o Rust 開(kāi)發(fā)者們敲響了警鐘:不要讓歷史重演!

那些殺死 Haskell 的,也會(huì)殺死 Rust。

為什么這個(gè)時(shí)候我會(huì)提到 Haskell?好吧,Haskell 和 Rust 有著千絲萬(wàn)縷的聯(lián)系??梢哉f(shuō),Rust 就是沒(méi)有高階類型(HKT)的 Hashkell。Rust 的很多風(fēng)格與 Haskell 很像。在某種程度上,可以說(shuō) Rust 就是 Haskell 的化身,只是它帶了那么一點(diǎn)點(diǎn) C 語(yǔ)言風(fēng)格的語(yǔ)法。

Haskell 死了嗎?

Haskell 曾經(jīng)也是一門人們想要關(guān)注的語(yǔ)言。從 2000 年到 2010 年間,Haskell 是每一個(gè)程序員都希望能用上的語(yǔ)言,但除了少數(shù)人,沒(méi)有人真的這么做。有一些令人印象深刻的項(xiàng)目是用 Haskell 開(kāi)發(fā)的,比如很多金融項(xiàng)目和薪資系統(tǒng)。但是,從一門純函數(shù)式編程語(yǔ)言的角度來(lái)看,Pandoc 才是真正稱得上具有 Haskell 內(nèi)核的項(xiàng)目。有人說(shuō)“Haskell 太慢”、“Haskell 干不了實(shí)事”,結(jié)果讓 Pandoc 給打了臉。

然而,Haskell 究竟發(fā)生了什么?為什么突然間止步不前了?現(xiàn)在沒(méi)有人用它來(lái)開(kāi)發(fā)重要項(xiàng)目。還有人在用 GHC Haskell 嗎?或許還有那么一兩個(gè)。GHC Haskell 已經(jīng)淪為一門學(xué)術(shù)性語(yǔ)言,沒(méi)有人真正關(guān)心它。

在 Haskell 時(shí)代,它處于函數(shù)式編程的最前沿,詮釋了函數(shù)式編程的真正含義。當(dāng)然,除了 Haskell,還有其他函數(shù)式編程語(yǔ)言,只不過(guò)它們沒(méi)有那么純粹,我說(shuō)的是 Scala 或 JavaScript。在 2000 年代中期,這兩門語(yǔ)言是 Haskell 最主要的競(jìng)爭(zhēng)者。Go 和 C++ 是跟隨者,Haskell 在引領(lǐng)著它們,它們從 Haskell 身上學(xué)到了很多。Scala 程序員都知道,for 循環(huán)語(yǔ)法和很多代碼庫(kù)的靈感都來(lái)自 Haskell。

Haskell 曾經(jīng)是王者。

那個(gè)時(shí)候,Haskell 獨(dú)占鰲頭的氣勢(shì)是其他語(yǔ)言所不具備的。它為程序員帶來(lái)的生產(chǎn)效率可以用因數(shù)“5”來(lái)衡量。一個(gè)開(kāi)發(fā)團(tuán)隊(duì)使用 Haskell 開(kāi)發(fā)并交付一個(gè)應(yīng)用程序的速度比 Scala 或 C++ 快 5 倍。因數(shù)“5”成了一個(gè)非常重要的指標(biāo)。

Haskell 的鋒芒漸漸顯露出來(lái)。有多少人在用 monad?我在 JavaScript 中用了,在 Rust 中也用了一些。在 Go 中,我可以用 monad 完成一些很有意思的事情。而這些,在 2000 年中期,都是 Haskell 程序員玩剩下的。當(dāng)大多數(shù)人開(kāi)始琢磨 monad,Haskell 早就有了 monad 和代數(shù)數(shù)據(jù)類型。

在很多方面,Haskell 是個(gè)王者,但還是死掉了。是什么殺死了它?

我想用一個(gè)詞來(lái)形容,但請(qǐng)你們不要誤解了這個(gè)詞。你可能認(rèn)為它是“邪惡(evil)”,或者是“無(wú)知(ignorant)”,但其實(shí)我想說(shuō)的是“自大(arrogance)”。

Haskell 社區(qū)里彌漫著一股傲慢的味道。不是那種邪惡的傲慢,而是那種讓他們覺(jué)得自己比別人更好的傲慢。他們使用的工具在某種程度上更好,他們做的事情在某種程度上更好,有些人甚至傲慢地認(rèn)為他們獲勝是不可避免的。這不是那種扇了你一巴掌然后說(shuō)“你這個(gè)愚蠢的 Go 程序員”那種傲慢,相反,這是一種力量的傲慢。Haskell 程序員寫(xiě)出了一種強(qiáng)大的代碼,一種強(qiáng)大的編譯器,一種強(qiáng)大的語(yǔ)言,他們知道他們可以創(chuàng)造奇跡。

這些還不夠。一些陰險(xiǎn)而微妙的事情發(fā)生了,導(dǎo)致他們將自己與行業(yè)的其他部分隔離開(kāi)來(lái)。社區(qū)外的程序員開(kāi)始注意到 Haskell 程序員在做什么:“Haskell 社區(qū)的人似乎不太喜歡我們,我想我們也不會(huì)喜歡他們的?!?/p>

有些人可能還記得 2000 年代中期 Reddit 論壇上的一些討論。有一群人在那里談?wù)摵芸岬臄?shù)學(xué)問(wèn)題。他們經(jīng)常竊笑其他語(yǔ)言,比如 Go。這不是什么大事情,也不是什么邪惡的事情,他們是這樣竊笑的:“主流的人們,哈!”那個(gè)時(shí)候我就是一個(gè)主流的 Go 用戶!但我不喜歡他們那樣。在接下來(lái)的幾年里,我參與了編程語(yǔ)言之爭(zhēng)。當(dāng)時(shí)我對(duì)他們說(shuō):“我們真的想要在 Reddit 上展開(kāi)編程語(yǔ)言之爭(zhēng)嗎?”有趣的不是他們?cè)诟`笑什么,因?yàn)樗麄冇袡?quán)那么做,有趣的是我的反應(yīng)。我的反應(yīng)帶有防御性:“好吧,繼續(xù)用你們的 Haskell 吧,但我們才是真正能解決問(wèn)題的人?!?/p>

這種對(duì)立在當(dāng)時(shí)非常有趣,而且相當(dāng)普遍。Haskell 社區(qū)出現(xiàn)了一種態(tài)度,但不是邪惡的那種,也不是出于惡意。但有一種態(tài)度是這樣的:“我們的工具很好,我們的語(yǔ)言很好,我們不需要遵守規(guī)則。我們可以做自己的事情,不需要和別人討論。我們不需要寫(xiě)其他類型的程序?!盚askell 程序員不想寫(xiě)常規(guī)的程序,不想處理與數(shù)據(jù)庫(kù)有關(guān)的問(wèn)題。他們不想面對(duì)已經(jīng)發(fā)展了 20 年的數(shù)據(jù)庫(kù)模式。這太令人討厭了。他們找到了替代方法,比如使用范疇理論和依賴類型。他們?cè)谧约褐車鹆艘欢聣Γ钤谝粋€(gè)技術(shù)泡泡里,把自己與外部世界的邪惡隔離了起來(lái)。

我要在這里定義一個(gè)詞。這個(gè)詞大家都知道,我的定義只是眾多定義中的一個(gè)。如果你喜歡,你也可以找到這個(gè)詞的其他定義。這個(gè)詞就是“專業(yè)”。我把它定義為"運(yùn)用力量的紀(jì)律"。我們的工具和語(yǔ)言為我們提供了一些力量,但我們需要一種紀(jì)律來(lái)運(yùn)用這些力量。這不僅僅是一種使用工具的紀(jì)律,更是一種社區(qū)紀(jì)律。這個(gè)紀(jì)律是這樣的:它是一個(gè)強(qiáng)大的工具,而工具越是強(qiáng)大,殺人就越快,所以我們要小心使用它。另外,我們不會(huì)詆毀那些不太愿意使用我們工具的人。

我們不妨把“進(jìn)步”重新定義為:“僅僅因?yàn)槲覀兡茏鲆患?,并不一定意味著我們必須去做那件事”?/p>

所以,殺死 Haskell 的是它的狹隘和無(wú)法滿足企業(yè)的需求。

Haskell 在某些受限的環(huán)境下表現(xiàn)出色,但它的力量很有限,或者說(shuō)無(wú)法滿足用戶想要解決企業(yè)問(wèn)題的愿望。這些人不愿意走到外面去,不愿意讓自己踏進(jìn)真正的土壤。他們表現(xiàn)出一種“對(duì)立”感,而站在另一邊的人能夠清楚地感覺(jué)到。這種狹隘主義就像是在屏幕上掛一個(gè)大橫幅,上面寫(xiě)著“我按我的方式做事,你們自己玩去吧”。這就好比是在說(shuō):“在我們自己的天地里,我們很偉大,讓其他人見(jiàn)鬼去吧”。

我想拯救什么?

我想拯救 Rust 和社區(qū)的工作成果,避免它們?cè)庥鐾瑯拥南聢?chǎng)。坦白說(shuō),我不認(rèn)為它會(huì)走上那條路。首先,我認(rèn)為 Rust 社區(qū)更有活力、更強(qiáng)大,我相信不再存在 Haskell 的那種對(duì)立局面。那些“強(qiáng)大的 C++ 激素程序員”已經(jīng)變溫和了。每個(gè)人都在想:“或許有一些東西會(huì)讓 Rust 變得不一樣”。那么它們是什么呢?有什么能防止 Rust 重蹈 Haskell 的覆轍呢?

我想說(shuō)三件事:

第一個(gè)是紀(jì)律。特別是在文檔方面的紀(jì)律,這可不是件容易的事。寫(xiě)完代碼,不要忘了那些該死的文檔。大家都知道,寫(xiě)出好的文檔,讓其他人都可以輕松地使用你的程序是一件多么困難的事情。

如果在專業(yè)的基礎(chǔ)上再加上謙遜,或許 Haskell 就不會(huì)死掉。對(duì)立的態(tài)度,以及我知道有一些有趣的廣告,比如“Mac 對(duì) PC”、“我是 Rails,我是 Java”之類的,我不認(rèn)為這有什么害處,問(wèn)題在于你是否把它們看得太重。除非你筑起高墻,或者,另一些人在另一面筑起高墻作為回應(yīng)。

最后一件事就是去解決“骯臟”的問(wèn)題。我們必須靜下心來(lái),說(shuō):“我們會(huì)處理的”。如果我們要生存下去,就必須想辦法解決所有的問(wèn)題。如果你不去解決,就會(huì)有其他人來(lái)解決。

記住這門在本世紀(jì)頭十年最具影響力的編程語(yǔ)言的命運(yùn)吧。它為純函數(shù)編程開(kāi)了一個(gè)頭,對(duì)我們現(xiàn)在所做的事情影響很大,但它幾乎要被遺忘了。而那些使用和喜愛(ài)它的人不得不為了生計(jì)轉(zhuǎn)向了 Scala,它幾乎要了他們的命。

Rust 非常強(qiáng)大,但要?dú)缢埠苋菀?,制造混亂、傲慢和忽視企業(yè)需求,這些都可能會(huì)殺了它。我希望我們不要重蹈覆轍。

英文原文:

gist.github.com/graninas/22ab535d2913311e47a742c70f1d2f2b

本篇文章在GitHub的評(píng)論區(qū)同樣十分精彩,推薦感興趣的讀者朋友做進(jìn)一步了解

以上就是W3Cschool編程獅關(guān)于那些害死Haskell的,也會(huì)害死Rust的相關(guān)介紹了,希望對(duì)大家有所幫助。

0 人點(diǎn)贊