?作者 | 云昭
2022,越來越多的開發者會發現,組長開始讓自己組用 Rust 來重構項目了,即便是組長不 Push,身邊的同事好像也在悄咪咪地練習“borrow checker”,有時還會看見同事對著屏幕發飆:什么玩意兒,不倒騰了!
網友戲稱:只需要十行 Rust 代碼,就能讓你果斷放棄!
學 Rust 難,已經是一個共識。然而,那些吐槽難的同學,往往會過一段時間重新操練起來,屢戰屢敗,屢敗屢戰。曾有一位資深的技術大牛吐槽:我放棄 Rust 已經四次了!
Rust 讓人既愛又恨,恨得腦袋火冒三丈,直噴這代碼連鍵盤都不夠敲了,但又每次看到 Github 上的項目運行得如此高效優雅,讓人卻之不恭。
來源:知乎
1、Rust 魅力所在
企業對于 Rust 的吹捧已非一時興起。
以近日電商行業軟件開發商 Shopify 宣布擁抱 Rust 為例,Shopify 從一致性、性能、社區、生產力、安全等 5 個方面闡述了 Rust 對于其業務的吸引力和評估考量。
業務需求一致對口,性能高效,入門雖然難但開發還挺高效,社區驅動的開源項目,內存安全。可以說 Shopify 已經把 Rust 的每個好處都說了個遍。
一致性:Shopify 的系統編程需要覆蓋多個領域,而且隨著時間的推移,這個數字可能會增加。它們包括高性能服務器、提高性能或連接到其他庫的 Ruby 擴展,以及編譯到 Web Assembly。Shopify 訴求是對單一語言進行投資,并將其應用到眾多領域,這意味著要確定一種可以非常靈活使用的語言。
性能:Shopify 需要能夠高效、可持續地擴展,以支持全球商業。Rust 為我們提供了可預測的本機代碼性能,包括對內存使用的精細控制,這使得它適合于我們堆棧的最低級別。當然,Rust 并不是唯一能夠提供或近似這種性能的語言。在此基礎上,還可以考慮使用現代 C++,如果垃圾收集器的分配行為和性能可以接受,則可以使用 Go。
社區:Rust 語言和生態系統由一個健康的社區驅動,Shopify 計劃像 Ruby、Rails、React Native 和其他開源項目一樣參與這個社區。Rust 的 RFC 過程和治理結構為包容性、深思熟慮的討論提供了強大的基礎,以推動語言和工具的未來。我們的貢獻不僅有望使 Rust 在 Shopify 的使用中更加高效,而且還將改善所有 Rust 開發人員的工作。這也是 Shopify 加入 Rust 基金會的原因。我們希望支持 Rust 優秀的治理模式和“Rust commons”的維護,并將 Shopify 的知識和觀點帶入更大的 Rust 對話中。
生產力:在某些圈子里,Rust 以難以學習和使用而聞名,但 Shopify 內部和外部的開發人員發現,在最初的學習期之后,他們使用 Rust 構建起來非常高效和舒適。Rust 還有一個強大的庫生態系統(“crates”)和良好的 IDE 集成工具,當然還有非常好的編譯器錯誤消息。類型和宏系統的強大功能允許非常有表現力的 API 和語法,將開發人員的精力集中在表達他們的意思上,而不是在頭腦中玩弄大量的狀態和不變量。Go 在這里也有很好的聲譽,C 和 C++ 就不那么好了。
安全:Rust 提供了許多讓編譯器幫助確保程序正確的工具,包括它們安全地管理內存,并且可以“無畏地并行”。隨著 Shopify 對 Rust 的使用越來越復雜,將找到更多的方法來使用 Rust 的類型系統和安全規則來保持系統中的不變量。從我們最初的項目中,我們發現與我們評估的其他語言相比,Rust 在編譯時而不是運行時暴露更多的錯誤。Rust 開發者經常說“部署沒問題”,原因就在于此。
2、背后推手
Rust 在編程語言界內算是年輕一輩,但能在 Stack Overflow 開發者調查的“最受喜愛編程語言”評選項目中連續七年摘下桂冠,足以說明背后實力不俗。
這種實力,除了 Rust 本身的特質,更多的則來自于多家頂級大型公司或者名人的背書。
外界耳熟能詳的可能要首屬微軟。2019 年 2 月發布報告稱 70% 的安全問題為內存安全問題,為了解決安全問題,開始嘗試使用 Rust 來代替 C/C++ 重寫 Windows 組件;微軟的 DeisLabs 團隊也選擇 Rust 來構建 Kubernetes 工具 Krustlet,并稱 Rust 比 Go 更適合 Kubernetes 的開發 。
再比如 Facebook: 從 2016 年開始使用 Rust,當時啟動了一個名為 Mononoke 的重寫項目;有 Mononoke 項目作為 Rust 語言是可行的,2019 年內部 Rust 開發團隊達到了 100 人,并開始應用于 Diem 區塊鏈項目;2020 年在內部成立了 Rust 開發者體驗團隊,繼續為 Rust 社區做貢獻,并支持內部 Rust 項目開發 。
還有谷歌:2016 年開始開發的 Fuchsia 操作系統,在 2020 年 12 月首次亮相于 google open source,其中 22% 的代碼為 Rust 編寫 。
值得一提的是,安全的語言特性與區塊鏈的特性天生有重合性,因此區塊鏈也成為較早引入 Rust 語言的領域之一。Gavin Wood 博士開發的 Parity 客戶端應該是首個使用 Rust 的區塊鏈項目,于 2015 年推出,Parity Technologies 的產品還包括 Polkadot、substrate 等 。Parity 一經發布在當時引起了不小的轟動。
對了,Mozilla 作為 Rust 項目的孵化起源地,FireFox 瀏覽器原本計劃全部用 Rust 重寫,但事與愿違,最后只完成了不到 10% 的比例,整個 Rust 項目就被砍掉了!不過正是因為被砍,才讓 Rust 得以有了今天遍地開花的局面。
許多技術圈內的大佬對 Rust 也是推崇備至,Linux 便是其中之一。
由 Linux 基金會主辦的 2022 開源峰會上,Linus 宣布:Linux 開始擁抱 Rust!
不久,Azure CTO Mark Russinovich 甚至在 9 月呼吁停用 C/C++,建議使用 Rust,一時引起網友熱議。
而時任微軟首席工程師的 Nick Cameron 在個人博客經常看到 Rust 的字眼,并給出了許多中肯的 Rust 發展建議。
甚至 Python 的創始人 Guido van Rossum,不惜自損 Python 4.0 也要夸一夸 Rust。Guido 表示 Python 4.0 很難看到曙光,并認為 Rust 是一種迷人的語言,幾乎可以完美地處理內存管理問題。
視線拉回國內,華為、阿里、百度、字節等企業都已經入局了 Rust。華為作為國內唯一 Rust 基金會創始成員,可以說在 Rust 社區相當活躍,比如開發了代發度量工具 Tokei、Cargo-Geiger ,同時嘗試將 Rust 應用于開源項目:StratoVirt 是 openEuler 上的企業級虛擬化平臺,面向云數據中心,實現了一套架構統一支持虛擬機、容器、Serverless 三種場景。此外,華為還發起了 Rusted AI 的非商業組織,推動 Rust 在 AI 領域的應用落地 。
而字節跳動飛書團隊則從 2017 年開始引入 Rust,飛書客戶端非 UI 部分是由 Rust 跨平臺實現 ;2021 年 5 月開源了 rsmpeg 項目(一個 FFmpeg 的庫),也是采用 Rust 作為主要語言。
阿里則在云原生方面加碼了 Rust 的投入,比如 11 月,Nacos 多語言體系中迎來了 Rust 版本。
3、2023,Rust 值得再次拾起嗎?
值得,當然值得。不管是趨勢還是現實,Rust 的價值已經十分清晰。
首先從流行度上而言,Stack Overflow開發者調查以及 Rust 的年度調查都在表明使用 Rust 作為工作語言的占比正在持續提高,這種慣性一旦養成,就會成為當年 Java 風靡全球之勢。
此外還是 Rust 基金會的助力,這種趨勢會越來越快。據悉,Rust 基金會的創始成員承諾在 2 年內,提供每年超過一百萬美元的預算,用于 Rust 項目的維護、開發和推廣。
其次,Rust 代表著一種“前衛”的編程理念。軟件性能的提升總是滯后于硬件性能的提升。Rust 這種基于多核編程的理念,將對性能的低級(low-level)控制與現代語言功能結合在一起,語法上類似于 C++,但是又可以保證內存安全,足以讓它在未來編程界站穩腳跟。
并且,Rust 陸續提出了“沒有數據爭用的并發性”、“沒有垃圾回收的內存安全性” 和 “無懼駭客” 等引人矚目的概念,將無數極客大牛吸引聚攏在其項目中,不斷演進,呈現出越來越開放和健康的社區生態。
此外,Rust 還代表了一種新的、開源項目的協作方式:Rust 項目中的決策權是唯一委派和分配的,核心團隊擁有更多特權。
最后,需求就在那里,如果說以前,領導讓做 Rust 重構是為了講故事,自己學 Rust 是為了耍酷,但現如今的 Rust 的應用場景愈發明晰:區塊鏈開發、嵌入式開發、分布式、云原生、WASL、GUI 等等已經到處可以看到它的身影。
之前一種語言單挑多個領域的夢想,Java 嘗試過,但夢碎了,Rust 卻成為了新的希望,Shopify 等為代表的公司評估它與自身的業務十分契合,就是一個例子。
正如一位開發者所評論的:
Rust 在大型企業環境中的一大優勢是它真的非常通用,能夠用一種語言替換多種語言。Rust 真的可以做到 C/C++ 所能做到的一切,Java 所能做的一切,大部分 JavaScript 所能做到(隨著 WASM 情況的改善)。這個一站式編程語言商店是 Java 的夢想,但嵌入式 Java 的失敗和 Java 小程序的失敗扼殺了這個夢想。Rust 有希望復活它。
4、難學:門檻如何降低
Rust 初學者經常寫到一半,腦海中會出現一種聲音:何苦為難自己呢?比如下面這位朋友——
本來想拿 Rust 寫一個集成業務邏輯的 API gateway,結果被 future 的那些個 error 轉來轉去搞得煩不勝煩,想一想發現這玩意兒又沒狀態我折騰它有個屁用,所以拿 node 隨便搞了搞就上線了。
Rust 學習曲線陡峭得厲害是公認的。每每一到挫敗之時,Go、C#、Crystal、Dart 就成了它的替代品。許多開發者甚至學習了N個月也搞不明白借用檢查器。
因此,即使 Rust 能產生十分高效的代碼,公司也會對他們的開發者使用它的生產力持懷疑態度。
最大的問題是,Rust 是否會被技術水平較低的程序員接受,特別是在其復雜性不斷增加的情況下。Rust 的教學和培訓將是關鍵。
習慣是需要培養的,就像垃圾收集、運行時異常、函數式編程這些陌生的概念一樣,是一個不斷磨合與適應的過程。
我們可以看到 Rust 方面一直在推廣在學習方面不遺余力,從社區的活躍度,教程的補充等等。此外,Linux 基金會也在如何用 Rust 編寫內核模塊方面發布了教程。
近期,一位有心之人就利用 OpenAI ChatGPT 學習 Rust 。有位作者嘗試和它做一些有關 Rust 方面的交流,回答的可以說相當可以了。比如:
- 編寫一個讀取文件內容的程序并為每一行添加詳細的注釋
- 給它源碼和編譯器報的錯誤,他給了更清晰的解釋并幫忙修復了
- 問了一個rust-anlyzer filed to discover workspace 這樣的問題,ChatGPT給予了詳細的解決辦法。后面甚至讓ChatGPT幫忙寫了一個完整的命令行程序
人之為學有難易乎?學之,則難者亦易矣;不學,則易者亦難矣。Rust 虐我千百遍,我待 Rust 如初戀!共勉!?