Categories
程式開發

那些害死Haskell的,也會害死Rust


編者按

本文作者的中心思想不是唱衰Rust 語言,正相反,他非常看重Rust 語言。 他回顧了Haskell 語言從王者“淪落至此”的原因,希望這能給目前充滿朝氣的Rust 社區敲響警鐘。

本篇文章在GitHub的評論區同樣十分精彩,推薦感興趣的讀者朋友閱讀完後點擊原文做進一步了解。

以下為正文。


時間到了2030 年,我在文件夾裡發現了這篇文章。 從我寫這篇文章開始,我就知道,我是對的。 我覺得應該把這篇文章發表出來,因為它給Rust 開發者們敲響了警鐘:不要讓歷史重演! 那些殺死 哈斯克爾 的,也會殺死

為什麼這個時候我會提到Haskell? 好吧,Haskell 和Rust 有著千絲萬縷的聯繫。 可以說,Rust 就是沒有高階類型(HKT)的Hashkell。 Rust 的很多風格與Haskell 很像。 在某種程度上,可以說Rust 就是Haskell 的化身,只是它帶了那麼一點點C 語言風格的語法。

Haskell 死了嗎?

Haskell 曾經也是一門人們想要關注的語言。 從2000 年到2010 年間,Haskell 是每一個程序員都希望能用上的語言,但除了少數人,沒有人真的這麼做。 有一些令人印象深刻的項目是用Haskell 開發的,比如很多金融項目和薪資系統。 但是,從一門純函數式編程語言的角度來看,Pandoc 才是真正稱得上具有Haskell 內核的項目。 有人說“Haskell 太慢”、“Haskell 幹不了實事”,結果讓Pandoc 給打了臉。

然而,Haskell 究竟發生了什麼? 為什麼突然間止步不前了? 現在沒有人用它來開發重要項目。 還有人在用GHC Haskell 嗎? 或許還有那麼一兩個。 GHC Haskell 已經淪為一門學術性語言,沒有人真正關心它。

在Haskell 時代,它處於函數式編程的最前沿,詮釋了函數式編程的真正含義。 當然,除了Haskell,還有其他函數式編程語言,只不過它們沒有那麼純粹,我說的是Scala 或JavaScript。 在2000 年代中期,這兩門語言是Haskell 最主要的競爭者。 Go 和C++ 是跟隨者,Haskell 在引領著它們,它們從Haskell 身上學到了很多。 Scala 程序員都知道,for 循環語法和很多代碼庫的靈感都來自Haskell。

Haskell 曾經是王者。

那個時候,Haskell 獨占鰲頭的氣勢是其他語言所不具備的。 它為程序員帶來的生產效率可以用因數“5”來衡量。 一個開發團隊使用Haskell 開發並交付一個應用程序的速度比Scala 或C++ 快5 倍。 因數“5”成了一個非常重要的指標。

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

在很多方面,Haskell 是個王者,但還是死掉了。 是什麼殺死了它?

我想用一個詞來形容,但請你們不要誤解了這個詞。 你可能認為它是“邪惡(evil)”,或者是“無知(ignorant)”,但其實我想說的是“自大(arrogance)”。

Haskell 社區裡瀰漫著一股傲慢的味道。 不是那種邪惡的傲慢,而是那種讓他們覺得自己比別人更好的傲慢。 他們使用的工具在某種程度上更好,他們做的事情在某種程度上更好,有些人甚至傲慢地認為他們獲勝是不可避免的。 這不是那種扇了你一巴掌然後說“你這個愚蠢的Go 程序員”那種傲慢,相反,這是一種力量的傲慢。 Haskell 程序員寫出了一種強大的代碼,一種強大的編譯器,一種強大的語言,他們知道他們可以創造奇蹟。

這些還不夠。 一些陰險而微妙的事情發生了,導致他們將自己與行業的其他部分隔離開來。 社區外的程序員開始注意到Haskell 程序員在做什麼:“Haskell 社區的人似乎不太喜歡我們,我想我們也不會喜歡他們的。”

有些人可能還記得2000 年代中期Reddit 論壇上的一些討論。 有一群人在那裡談論很酷的數學問題。 他們經常竊笑其他語言,比如Go。 這不是什麼大事情,也不是什麼邪惡的事情,他們是這樣竊笑的:“主流的人們,哈!”那個時候我就是一個主流的Go 用戶! 但我不喜歡他們那樣。 在接下來的幾年裡,我參與了編程語言之爭。 當時我對他們說:“我們真的想要在Reddit 上展開編程語言之爭嗎?”有趣的不是他們在竊笑什麼,因為他們有權那麼做,有趣的是我的反應。 我的反應帶有防禦性:“好吧,繼續用你們的Haskell 吧,但我們才是真正能解決問題的人。”

這種對立在當時非常有趣,而且相當普遍。 Haskell 社區出現了一種態度,但不是邪惡的那種,也不是出於惡意。 但有一種態度是這樣的:“我們的工具很好,我們的語言很好,我們不需要遵守規則。我們可以做自己的事情,不需要和別人討論。我們不需要寫其他類型的程序。” Haskell 程序員不想寫常規的程序,不想處理與數據庫有關的問題。 他們不想面對已經發展了20 年的數據庫模式。 這太令人討厭了。 他們找到了替代方法,比如使用範疇理論和依賴類型。 他們在自己周圍築起了一堵牆,生活在一個技術泡泡裡,把自己與外部世界的邪惡隔離了起來。

我要在這裡定義一個詞。 這個詞大家都知道,我的定義只是眾多定義中的一個。 如果你喜歡,你也可以找到這個詞的其他定義。 這個詞就是“專業”。 我把它定義為”運用力量的紀律”。 我們的工具和語言為我們提供了一些力量,但我們需要一種紀律來運用這些力量。 這不僅僅是一種使用工具的紀律,更是一種社區紀律。 這個紀律是這樣的:它是一個強大的工具,而工具越是強大,殺人就越快,所以我們要小心使用它。 另外,我們不會詆毀那些不太願意使用我們工具的人。

我們不妨把“進步”重新定義為:“僅僅因為我們能做一件事,並不一定意味著我們必須去做那件事”。

所以,殺死Haskell 的是它的狹隘和無法滿足企業的需求。

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

我想拯救什麼?

我想拯救Rust 和社區的工作成果,避免它們遭遇同樣的下場。 坦白說,我不認為它會走上那條路。 首先,我認為Rust 社區更有活力、更強大,我相信不再存在Haskell 的那種對立局面。 那些“強大的C++ 激素程序員”已經變溫和了。 每個人都在想:“或許有一些東西會讓Rust 變得不一樣”。 那麼它們是什麼呢? 有什麼能防止Rust 重蹈Haskell 的覆轍呢?

我想說三件事:

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

如果在專業的基礎上再加上謙遜,或許Haskell 就不會死掉。 對立的態度,以及我知道有一些有趣的廣告,比如“Mac 對PC”、“我是Rails,我是Java”之類的,我不認為這有什麼害處,問題在於你是否把它們看得太重。 除非你築起高牆,或者,另一些人在另一面築起高牆作為回應。

最後一件事就是去解決“骯髒”的問題。 我們必須靜下心來,說:“我們會處理的”。 如果我們要生存下去,就必須想辦法解決所有的問題。 如果你不去解決,就會有其他人來解決。

記住這門在本世紀頭十年最具影響力的編程語言的命運吧。 它為純函數編程開了一個頭,對我們現在所做的事情影響很大,但它幾乎要被遺忘了。 而那些使用和喜愛它的人不得不為了生計轉向了Scala,它幾乎要了他們的命。

Rust 非常強大,但要毀滅它也很容易,製造混亂、傲慢和忽視企業需求,這些都可能會殺了它。 我希望我們不要重蹈覆轍。

英文原版

殺死Haskell的東西可以殺死Rust