反駁:Rust 是 Go 應(yīng)該成為的樣子?
作為兩門服務(wù)端的新語(yǔ)言,這些年受到越來越多的關(guān)注。有人調(diào)侃說,關(guān)注 Rust 的人中,很大一部分是從 Go 過來的。經(jīng)常有人因?yàn)?Go 的一些設(shè)計(jì)和特質(zhì)而質(zhì)疑它,同時(shí),Rust 常被譽(yù)為解決 Go 問題的幾乎完美設(shè)計(jì)的替代方案。但實(shí)際上,這兩門語(yǔ)言并不是直接競(jìng)爭(zhēng)關(guān)系,不能直接互換,更多是互補(bǔ)。本文就帶著大家看看兩者的不同。
有一篇文章 《I want off Mr. Golang's Wild Ride》:https://fasterthanli.me/articles/i-want-off-mr-golangs-wild-ride,以及圍繞它的激烈討論,不止一次遇到過諸如“Rust 是 Go 應(yīng)該成為的樣子”之類的陳述。這些討論中觀點(diǎn),顯然是由那篇文章推動(dòng)的,似乎反應(yīng)出 Go 有太多有問題的特性,而另一方面,Rust 是一個(gè)精心設(shè)計(jì)的 Go 替代品。
在我看來,這篇文章的討論揭示了對(duì)這兩種語(yǔ)言、它們解決的問題以及它們所針對(duì)的軟件開發(fā)范式的嚴(yán)重誤解。
01 文章對(duì) Go 的批評(píng)
這篇文章主要批評(píng) Go 的簡(jiǎn)單是一個(gè)謊言:標(biāo)準(zhǔn)庫(kù)中的 API 向用戶隱藏了復(fù)雜性,而沒有真正解決它,這在極端情況下會(huì)產(chǎn)生完全錯(cuò)誤的結(jié)果。以 Go 的 filepath.Ext
函數(shù)為例:它在某些情況下會(huì)產(chǎn)生不準(zhǔn)確的結(jié)果。作為反例,這篇文章提到了 Rust std::path::extension
是產(chǎn)生完全正確結(jié)果的函數(shù)。
這種對(duì) Go 在邊緣情況下不準(zhǔn)確的不滿似乎是可以理解的。我們都知道,在編程中,只有正確和不正確,沒有其他結(jié)果。因此,由于 Rust 提供了正確的結(jié)果,它顯然是更好的語(yǔ)言。但事情真的這么簡(jiǎn)單嗎?難道谷歌不能聘請(qǐng)高手來解決這個(gè)問題嗎?
02 追根溯源
Go 和 Rust 被頻繁地比較,因?yàn)樗鼈兌急恍麄鳛橄到y(tǒng)編程語(yǔ)言,而且它們都是現(xiàn)代的編程語(yǔ)言,發(fā)布時(shí)間接近。但是,一旦你內(nèi)化了它們的來源以及它們的設(shè)計(jì)目的,你很快就會(huì)發(fā)現(xiàn)它們是兩種完全不同的語(yǔ)言。
Go 是一個(gè) Google 項(xiàng)目,主要設(shè)計(jì)用于后端和網(wǎng)絡(luò)服務(wù)。這些服務(wù)在可預(yù)測(cè)的、同質(zhì)的、Unix 等基礎(chǔ)設(shè)施中運(yùn)行。谷歌完全控制著他們的基礎(chǔ)設(shè)施,潛在的性能瓶頸可以通過在問題上投入更多的服務(wù)器來解決。
另一方面,Rust 是由 Mozilla 在非常不同的情況下啟動(dòng)的。Firefox 和 Servo 等項(xiàng)目是非常長(zhǎng)壽的軟件產(chǎn)品,必須在各種系統(tǒng)上運(yùn)行。他們必須在不均勻、未知且可能充滿惡意的環(huán)境中工作。因此,在每個(gè)系統(tǒng)上產(chǎn)生完全相同的結(jié)果對(duì)于這些應(yīng)用程序至關(guān)重要。
03 不同的問題,不同的語(yǔ)言
谷歌和許多其他維護(hù)類似基礎(chǔ)設(shè)施的公司通常必須應(yīng)對(duì)以下挑戰(zhàn)——雖然我對(duì)谷歌沒有深入的了解,但其中一些可能被其龐大的規(guī)模放大了:
-
開發(fā)人員流動(dòng)率高。
-
短迭代中的快節(jié)奏開發(fā)。
-
快節(jié)奏的組織擴(kuò)展。
-
高度動(dòng)態(tài)的基礎(chǔ)設(shè)施和環(huán)境。
-
短期和可替換的服務(wù)。
Google 需要一種完全針對(duì)這些挑戰(zhàn)量身定制的語(yǔ)言,并且不可避免地會(huì)設(shè)計(jì)出與滿足 Mozilla 需求的語(yǔ)言不同的語(yǔ)言。
04 另一種范式
Go 和 Rust 不僅有不同的語(yǔ)言設(shè)計(jì),它們還包含一種相反的軟件開發(fā)方法。Rust 專注于高效率并為問題找到最漂亮的實(shí)現(xiàn)。為了實(shí)現(xiàn)這一點(diǎn),與其他語(yǔ)言相比,它有著更陡峭的學(xué)習(xí)曲線。
相比之下——這就是大部分行業(yè)的現(xiàn)實(shí)——谷歌和許多其他公司不希望他們的開發(fā)人員在他們能夠高效工作之前花 3 個(gè)月時(shí)間學(xué)習(xí)一門新語(yǔ)言。因此,Go 被有意設(shè)計(jì)為一種快速學(xué)習(xí)和使用的語(yǔ)言。它不一定是最有效或最漂亮的解決方案。它甚至不必在公司不使用的系統(tǒng)上工作。它只需要工作得足夠好。
為什么?因?yàn)檫\(yùn)行動(dòng)態(tài)基礎(chǔ)設(shè)施需要高度的自動(dòng)化、標(biāo)準(zhǔn)化、監(jiān)控、可觀察性、彈性、可擴(kuò)展性和安全性。對(duì)于不在這樣的環(huán)境中工作的開發(fā)人員來說,這聽起來可能很奇怪,但在日常業(yè)務(wù)中,重點(diǎn)往往是這些高級(jí)需求而不是代碼本身。
05 底線
盡管乍一看 Go 和 Rust 似乎為類似場(chǎng)景提供了類似的好處,但它們是針對(duì)不同問題而設(shè)計(jì)的專業(yè)工具。就像大多數(shù)其他工具一樣,一個(gè)并非比另一個(gè)“更好”。在尋找適合自己需求的新語(yǔ)言時(shí),Google 和 Mozilla 都沒有采取有偏見的方法。他們只是努力尋找最適合他們的解決方案——你也應(yīng)該如此。