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

編者按

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

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

以下爲正文。


時間到了 2030 年,我在文件夾裏發現了這篇文章。從我寫這篇文章開始,我就知道,我是對的。我覺得應該把這篇文章發表出來,因爲它給 Rust 開發者們敲響了警鐘:不要讓歷史重演! 那些殺死 Haskell 的,也會殺死 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 非常強大,但要毀滅它也很容易,製造混亂、傲慢和忽視企業需求,這些都可能會殺了它。我希望我們不要重蹈覆轍。

英文原文

What killed Haskell could kill Rust

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章