天天看點

開發者棄TypeScript投Rust,重寫系統後痛批:這門語言爛透了!

作者:不秃頭程式員

在近幾年的 Stack Overflow 年度開發者調查報告中,有一門程式設計語言連續多年被評為“最受喜愛的程式設計語言”——那就是 Rust。

憑借其獨特的安全性和與 C++ 不逞多讓的性能,Rust 成為許多開發者想要嘗試的語言,本文作者正是其中一位。而他在用 Rust 重寫整個開源算法交易系統後,得出了一個不同于多數人的結論:Rust 這門語言,真的爛透了。

曾經,我是一個年輕而充滿希望的 Rust 狂熱者。因為我一直聽說,Rust 完美得像是上帝設計的程式設計語言:不僅很快,還是最安全的程式設計語言之一。

如果在網上查找有關 Rust 的資訊,你會發現認為 Rust 完美的人,遠不止我一個:Medium 上的每一篇指南、Reddit 上的每一篇文章、Stack Overflow 上的每一個答案……對 Rust 都是鋪天蓋地的正面評價。

有鑒于此,我決定放棄 TypeScript,用 Rust 來重寫我的開源算法交易系統 NextTrade。

開發者棄TypeScript投Rust,重寫系統後痛批:這門語言爛透了!

用 Rust 重寫的好處是有,但代價巨大

起初,NextTrade 是用 TypeScript 建構的,以注重可維護性、可讀性和可重用性。然而,當核心交易邏輯開始出現嚴重的性能問題時,為了建構一個可擴充至數萬使用者的紙面交易和回測平台,有必要進行全面重寫。于是,Rust 成為了最熱門的候選者,并在經過我的大量研究後最終勝出,成為進行全面重寫 NextTrade 的程式設計語言。

前後花了 18 個月,最後的重寫結果還不錯。由 Rust 重寫後的 NextTrade 變成了 NexusTrade,而 NexusTrade 在速度和可配置性方面明顯優于重寫之前:例如,在 NextTrade 上需要數秒才能完成的回溯測試,在 NexusTrade 上隻需幾百毫秒即可完成——這意味着性能提升了 1000 倍,平台也能支援更複雜的功能。

有這些好處固然很好,但我付出的巨大代價也不容忽視。

Rust 最大的優點,是完全消除了整類錯誤,而這同時也是它最大的弱點——借用檢查器讓這門語言變得異常困難,尤其是與 TypeScript 和 Go 這樣的語言相比,入門門檻相當高。我根本無法像以前學習一門新語言那樣邊學邊做,尤其是還要兼顧着一份全職工作:Rust 太難了!

說實話,如果 OpenAI 沒有推出 ChatGPT,我真的可能會轉而使用 Go。

所幸在 ChatGPT 的指導下,我克服了每一個障礙,深入了解了 Rust 的細微文法及其強大而複雜的類型系統。ChatGPT 就像一位經驗豐富的 Rust 開發者在我身邊,随時為我講解生命周期的複雜性或比對表達式的優雅性。

綜合以上,我當時對 Rust 的評價是中等,也沒有真正愛上這門語言,并基于以上經曆寫了一篇博文。沒想到這篇文章在 Reddit 上遭到了許多抨擊,其中還有一條高贊評論罵我用 ChatGPT 寫文章。

開發者棄TypeScript投Rust,重寫系統後痛批:這門語言爛透了!

看到這些評論後,我當時想着:可能是我還不夠了解 Rust,對它的判斷有失偏頗吧。

于是,在那之後我雖然沒有多喜歡 Rust,但我還是堅持使用了一段時間。如今 4 個月過去了,我終于可以自信地得出一個結論:Rust 這門語言,真的爛透了。

可怕、冗長、不直覺的文法和語義

開發者棄TypeScript投Rust,重寫系統後痛批:這門語言爛透了!

在我看來,所有說 Rust 沒有殘暴語義的人都是在撒謊。在某些情況下,如果你無法使用極其強大的大型語言模型,那麼編寫函數簡直就是不可能的事情。但我真的不想花 90 分鐘來弄清函數中的子句,我隻想寫出一個想寫的函數而已!

最後,我還不得不完全放棄輔助函數的想法,因為我真的無法讓代碼編譯成功。人們所說的 Rust 最大的優點(嚴格的編譯器可以消除錯誤),正是 Rust 最大的缺點之一。隻要給我一個垃圾回收器,讓我做我想做的事情就可以了!

相比之下,如果我用 Go 編寫這個完全相同的函數,它看起來會是這樣的:

開發者棄TypeScript投Rust,重寫系統後痛批:這門語言爛透了!

雖然功能的核心相對不變,但這樣你就不必翻來覆去地琢磨如何讓代碼正常運作了——它本身就能運作!

可怕的錯誤處理

Rust 确實能對錯誤進行很好的處理。隻要避免出現不安全的錯誤,就能確定代碼正常運作。NilPointerException 異常和未處理的錯誤再也不會發生了,對吧?

不對!因為當你的資料出錯或發生意外情況時,你會拼命去弄清楚到底發生了什麼。也許我是個白癡,不知道如何啟用堆棧跟蹤。但當我的應用程式出現一個錯誤時,我卻不知道為什麼!

開發者棄TypeScript投Rust,重寫系統後痛批:這門語言爛透了!

(我的堆棧跟蹤到底在哪裡?)

相比之下,在 Python 這樣的語言中,你會得到一些漂亮的、藝術般的堆棧跟蹤,告訴你發生了什麼,甚至精确到行号!即使在 Go 語言中,你也有 errors.Wrap(...) 這樣的工具,能夠讓你檢視整個應用程式的錯誤堆棧。或許我真是個笨蛋,隻要我在 Rust 中遇到錯誤時,我就會陷入茫然,完全搞不清發生了什麼。我需要在應用程式的各個地方都加上 eprintln!(...)。

事實上?不,我不是白癡。這就是一種有缺陷的語言設計。

Rust 社群

有一個熱評是:Rust 社群并不像他們假裝的那樣友好和冷靜。更具體來說,我認為他們是一群自戀的家夥,尤其讨厭别人說 Rust 有缺陷。

開發者棄TypeScript投Rust,重寫系統後痛批:這門語言爛透了!

(有個 Rust 社群成員對我的問題給出了一個“有益的”建議)

例如,我在 Rust 的 subreddit 上問了一個關于如何改進 MongoDB Rust crate 錯誤處理的問題,得到的回答包括:

  • 改用 Postgres。(笑死,難道我要因為一些糟糕的錯誤資訊就重新設計整個資料庫嗎?)
  • 你為什麼要用 MongoDB?(我喜歡,下一個問題?)
  • MongoDB 在 Go 和 Python 中也很糟糕。(我不知道,但它在 TypeScript 中很好。你轉移了話題并沒有回答我的問題)
  • 出現一個真正有用的改進錯誤資訊的建議。(非常罕見)

在我目前接觸的所有程式設計社群中,沒有一個像 Rust 這樣像個邪教。他們無視 Rust 的所有明顯缺陷,比如陡峭的學習曲線、冗長的代碼、可怕的錯誤資訊、複雜的文法和有争議的語言設計選擇——他們把這一切問題,都歸結于開發者自己的技能問題。在我看來,這簡直是瘋了!

總結

盡管如此,Rust 還是有一些優點的。它運作速度很快……嗯,這基本上就是它的主要優點了。

另外,它應該也很安全。如果我們把它和 C++ 比較,Rust 顯然是更好的語言。但與其他語言(比如 Go)相比,Rust 的“安全性”對我來說更像是一種拖累。如果能把開發時間減半,那我甯願應用程式的運作時間多加幾十毫秒。

好的一面是,如果我選擇用 Go 編寫應用程式,我可能也會有些後悔。我會想:“如果 Rust 能更快呢?” “又有一篇文章說 Rust 是最棒的語言。天啊,我是不是選錯了!”

至少,現在我學會了 Rust,我覺得自己可以學任何東西了。也許後面我會為了好玩去試試 OCaml,它總不會比 Rust 更難學吧?

參考連結:

https://medium.com/@austin-starks/i-spent-18-months-rebuilding-my-algorithmic-trading-in-rust-im-filled-with-regret-d300dcc147e0

https://medium.com/@austin-starks/i-built-an-algorithmic-trading-system-in-rust-heres-what-i-regret-a89f378b22c9

繼續閱讀