Ruby 之父:不要違背開發人員的本能

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:Ruby 3.0 是一個大的發佈版本,其中包含了許多實驗、反饋、挑戰和特性。您最喜歡 Ruby 3.0 的哪個特性?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":我喜歡模式匹配,包括右側賦值。同時,我對 Ractor 和靜態類型檢查也很感興趣,因爲我認爲它將改變並增強 Ruby 編程的文化。"}]},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/8c\/8c47103ce27db8b7995677c1c597ba42.webp","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:是的,靜態類型檢查真的很棒。我很期待看到您是如何在標準庫和框架中實現添加類型的這個想法的。模式匹配也確實很棒。我很懷念 Python 中的這個特性,很高興能在 Ruby 中使用它。Ruby 3.0 是向後兼容的。這很好,因爲開發人員不喜歡破壞,他們喜歡不破壞向後兼容性的想法。你會把這種方法推薦給其他語言嗎?保持向後兼容性是個好主意嗎?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":是的。當我開始 Ruby 編程時,Ruby 社區還很小。因此,可以拋棄舊版本並打破當時的 Ruby 語言語法。但隨着時間的推移,Ruby 社區變得越來越大,世界各地有數百萬的 Ruby 程序員,現在即使是最微小的改變也能造成破壞。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們上次在 Ruby 1.9 中做了一個大的破壞,我們吸取了教訓,即大的破壞可以長期分裂社區。在 Ruby 1.9 後,我做了一個決定,即使是在主版本上,我們也不會做大的破壞。其他語言,如 Python 3 或 PHP 6,也有類似的問題,這讓我們認識到向後兼容的重要性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"語言設計師希望不斷進步,做出改變,改進語言。但如果要以兼容性爲代價,那就不好了。我們應儘量保持兼容性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"然而,另一方面,就像你說的,開發人員喜歡新的東西,所以我們必須添加新的特性,這有點矛盾。但我想我們已經盡力了,至少對於 Ruby 3.0 來說是這樣。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:是的。做得很好。我希望其他語言也能跟上你的步伐,保持向後兼容性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我記得,10 或 15 年前,所有這些悲劇都發生在 Python 從版本 2 過渡到版本 3 的過程中。這種情況持續了幾年,核心開發人員甚至不確定他們是否應該繼續開發 Python 3,或者乾脆退回到版本 2 會更好。同樣,PHP 也發生過類似的事情。我很高興,目前,我們正處於開發階段,我們可以在不讓數以百萬計的開發人員感到難過的情況下提供令人驚歎的特性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們來談談特性吧。編程語言都是彼此借鑑的。我們可以在 Ruby 中看到模式匹配,其他開發人員也可以在 Python、JavaScript 和現在的 Ruby 中使用 hash destructuring。也許右側賦值將來也會被 Python 或 JavaScript 借鑑。您對下一個版本有什麼計劃嘛?您有什麼瘋狂的想法,您想借鑑什麼,或者只是嘗試些什麼?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":這是個很好的問題!但是我們關注 Ruby 3 已經有很長一段時間了,而且它才發佈了一個月,所以我對未來還沒有那些瘋狂的想法。它可能是增強 Ruby 的 Ractor 和模塊(Module)系統。Java 和 Python 都有模塊系統。另外,提供一個結構化的打包(Packaging)系統可能也很有用。我有一些模糊的想法,但還不夠具體,所以無法透露太多。也許你得等一年左右的時間纔行。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:沒問題。我寫代碼已經有 20 年了,我也很樂意再寫 20 年。順便問一句,Ruby 的打包系統可能不像 Java 那麼全面,但是 Ruby 允許用戶安裝和使用同一依賴項的多個版本。這實際上很好,舉例來說,因爲 Python 只能使用一個版本的依賴,這會帶來很多問題。此外 JavaScript、Node.js 也只是將版本放在特定的目錄中。因此,Ruby 當前系統給人的感覺非常好,但是我們會一直期待新的改進。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":是的,我們可能會準備一些容器,以便不同版本的 Gem 可以存放在不同的容器中。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:是的,您有足夠的時間來對其進行測試。現在,出現了很多新的編程語言。您是如何看待它們的?您是否有一些 RSS 訂閱或者有開發人員來找您,向您介紹一些新特性?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":我的主要信息渠道是 Ruby Redmine。我們有收到來自社區的大量建議,這些建議激勵我設計新特性。我不得不拒絕其中的大多數,但是這些改進語言的想法啓發我去設計新的想法。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在疫情之前,我參加了許多會議,並與人們討論了 Ruby 和編程問題,這樣我就能看到語言和環境的障礙、煩惱或弊端,然後我嘗試改進它們。這些討論給了我很大的啓發。但在過去的一年半里,我再也無法進行這樣對話了,這是疫情的一大弊端。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"此外,我還上網衝浪,閱讀有關編程語言和 Ruby 的博客。這些文章也給了我啓發。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:所以,如果我們的讀者中有誰想給 Yukihiro 提供一些有趣的想法,都可以用 Ruby Redmine 來提建議!關於疫情這個問題,一切事情都要在家中完成,所有會議都是線上進行的,從您的角度來看,這對 Ruby 的開發、採用和社區有什麼影響?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":日常的開發並沒有太大的改變。我住在離東京很遠的地方,即使是疫情之前,我們開發人員的會議和溝通都是在線上進行的,所以這個過程並沒有變化。但正如我之前所說的,我們現在沒有實體會議了,所以這是一件壞事。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但是,另一方面,我不必經常出差了。我可以呆在家裏,有更多的時間呆在我的電腦前,花更多的時間在編程或 Ruby 身上。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:那太好了。順便說一下,在去年疫情期間,我們組織並參加了很多線上會議,您也是這樣。那您對線上會議有什麼看法呢?它們有用嗎?您能通過它們收集反饋並與其他 Ruby 開發人員交流嗎?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘:"},{"type":"text","text":"對於與會者來說,線上會議的價值仍然存在,但是以演示的形式存在的。但沒關係,與此同時,線下交流,一起喫晚飯或是傻乎乎的聊天,這些側面渠道都從線上會議中消失了,這是我非常懷念的事情。會議的價值在於這種交流。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:您用 Ruby 語言做了大量實驗。您可以添加特性來增強新版本,如果您和開發人員不喜歡,則可以刪除它們。我在其他語言中從未見過這樣的事情。這對 Ruby 來說有什麼獨特之處嗎?您在其他語言中看到過類似的東西嗎,還是您是唯一一個這樣做的人?這種方法的優缺點是什麼,您給成千上萬的開發人員提供了一些可以嘗試的東西,但是如果不成功,您就會收回嗎?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘:"},{"type":"text","text":"當 Ruby 社區還很小的時候,他們並不關心更改,一切都是實驗性的。如果無法解決問題,我們就會刪了它,沒有人關心兼容性。但是那些美好的時光已經一去不復返了,現在我們有了一個龐大的社區。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"因此,這類更改的成本每年都在增加。這意味着 Ruby 的設計決策無法逆轉。這意味着設計師不能犯錯。我只是個普通人,我承認我犯了很多錯誤。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"同時,雖然 Ruby 社區很龐大,但我們的 Ruby 核心開發人員團隊還不足以預測未來。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"如果我能提出一些建議,或者我們能在覈心社區內嘗試這些想法,那是沒問題的。但我們的核心社區還不夠大,無法在發佈之前對這些想法進行試驗。我們對 Ruby 特性所做的實驗是一種折衷,適合當前核心開發人員社區的規模。大型 Ruby 社區不允許我犯錯,但是核心開發人員社區的規模不允許我們在內部進行所有實驗。我們必須讓社區去嘗試一些東西。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一旦我們的核心社區足夠大,可以進行內部實驗,我們就不再需要公共實驗過程了。但是現在,這是一種妥協。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"其他語言也會這樣。Python 和 PHP 社區的規模足夠大,可以在覈心開發人員內部進行各種實驗。但是目前的 Ruby 社區規模不允許這樣的過程。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:我看到 Ruby 社區和語言採用正在增長。因此,我希望在未來的幾年中,它將有一個堅實的機會,將實驗限制在覈心開發人員內部,而世界各地的所有 Ruby 開發人員收到的是一個他們可以使用的最終版本。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":語言設計很有趣。語言實驗的一個非常大的好處是邀請用戶社區來幫助設計語言。即使我們有一個足夠大的核心開發人員社區,我們也可以邀請廣大的 Ruby 社區來參與一些語言實驗。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:是的,或者是那些想要參與語言開發的用戶。他們可以加入核心社區,證明自己有資格參與所有這些實驗。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":大多數 Ruby 用戶甚至都沒有考慮加入到設計過程的可能性!那會很有用。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:我有一個關於所有 Ractor 和異步 I\/O 纖程(Fibers)的棘手問題。我是並行和多任務併發的忠實擁護者。而現在在 Ruby 3 中,開發人員有了很大的選擇餘地。對於並行性,我們可以使用進程(Processes)或 Ractor,對於多任務,我們可以使用線程(Threads)或異步纖程(Fibers)。一個典型的 Ruby 開發人員如何在它們之間做選擇呢?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":對於 Web 應用程序,Web 開發人員無需關心併發性,因爲像 Unicon、Puma 和 Falcon 這樣的應用服務器會處理併發性。Unicorn 使用進程,Puma 使用線程,Falcon 使用 Fibers。應用服務器的選擇直接影響併發系統的選擇。也許將來我們會有一個基於 Ractor 的應用服務器。但目前還沒有,因此應用服務器的選擇會直接影響併發模型的選擇。因此,Web 開發人員不必關心併發性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"典型的開發人員在研究應用程序瓶頸時會進行併發性試驗。如果輸入 \/ 輸出是瓶頸,那麼明智的做法是選擇異步 Fibers。異步 Fibers 針對 I\/O 多路複用進行了優化。如果你的程序使用了大量的 I\/O 通信,則選擇異步纖程。如果你想試驗多核及 CPU 密集型任務,那麼選擇 Ractor。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這是基本的選擇,因爲當前 Ractor 實現是將一個 Ractor 與一個原生 OS 線程相匹配。現在還無法創建數百萬個 Ractor,因爲每個 Ractor 都會消耗幾兆字節的堆內存。這是巨大的。而 Fibers 只消耗幾千字節或更少的內存。因此,你不必擔心 Fibers 的內存成本,你可以創建任意數量的 Fibers。這是選擇的第二個標準。負責 Ractor 的 Koichi 正在努力改進這些。也許,在未來,Ractor 也不會再消耗那麼多內存了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"也許將來,我們能夠像在 Go 中使用 Goroutines 一樣使用 Ractors。但這是一個未來的故事。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"Grigory:是的,聽起來前途一片光明。到目前爲止,我真的很喜歡框架(Framework)作者的想法,將一些著名的 Ruby 約定置於配置之上,這樣 Ruby 開發人員可以使用框架作者預先選定的模型。然後,如果運行緩慢,Ruby 開發人員可以更深入地研究並將 Rails 切換到其他的併發原語上。能有選擇的餘地真是太好了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"還有一個關於速度的問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最近,我偶然發現了一篇由 David Heinemeier Hanson 撰寫的短文,他提到了一個有趣的發現:在他提供 Basecamp 和 Hey.com 電子郵件服務的所有服務器中,只有 15% 的 Basecamp 運維預算花在 Ruby 上。即使把 Ruby 的速度提高 10 倍也改變不了遊戲規則。"},{"type":"text","marks":[{"type":"strong"}],"text":"Ruby 的原始速度重要嗎?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":我有點百感交集。對於大多數 Web 應用程序而言,Ruby 和業務邏輯並不是瓶頸。大部分時間都是花在數據庫、網絡連接以及處理操作系統上。Shopify 和 GitHub 使用 Ruby,所以速度並沒有那麼重要。它們已經成長壯大了,是沒有任何問題的。如果我們關注程序員的生產力,那麼性能並不是最大的問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"很長一段時間,我都是這麼認爲的,直到幾年前,我意識到很多人都是基於微基準測試來做決定的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所有這些斐波納契(Fibonacci)數和 n-body 基準測試都有點愚,但這是開發人員的本能。幾年前,我放棄了讓開發人員違背本能的做法,開始改進 Ruby 的性能,甚至在微基準測試上也是如此。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"JIT 編譯器就是其中之一。JIT 編譯器目前並沒有提高 Rails 應用程序的性能,因爲應用程序將時間花在數據庫和網絡連接上了。但是 JIT 編譯器可以提高微基準測試的性能。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"但是目前,由於存在瓶頸,編譯器並沒有對 Rails 應用程序的性能提高多少。應用程序是在數據庫訪問或網絡實踐中設置的,但編譯器可以提高微基準測試的性能。我們在各個方面都正在改進 Ruby 的性能,包括微基準測試。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"幾年前,我就開始關注微基準測試的性能了。這有點傻,但這是 Web 開發人員的本能。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:是的,JIT 確實有幫助。上次我檢查人工微基準測試時,僅僅啓用了 Ruby 的 JIT,速度就快了十倍。所以這真的很有幫助。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":是的,我們不能與本能抗爭。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:最後一個技術問題是關於標準庫是否是即裝即用的。有兩種方法。第一種是 Python 聞名之處。包含一個巨大的標準庫,其中包括所有內容,如 FTP 客戶端、電子郵件客戶端和 zip 存檔。初學者都喜歡它,因爲他們可以使用教程,不必安裝依賴項就可以獲得一切。且一切都正常。核心開發人員就不太喜歡它了,因爲他們需要支持這個龐大的標準庫。他們無法做出重大的更改,因爲這會讓所有學習該語言的開發人員都感到沮喪。而這些庫,它們的老化速度又相當快。另一種方法是 Ruby 的基礎、低級的標準庫和生態系統,它們蓬勃發展併爲所有的東西提供了有競爭力的解決方案。這對開發人員的競爭是非常有利的,並且能夠推動創新。但是新開發人員會很驚訝,他們不知道該用什麼。因此,這有爭議。您是如何看待這一爭議的呢?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":是的,Ruby 1.8 採用了“胖標準庫”的方法,但是隨着時間的推移,有些庫沒有得到維護。我們改變了方法,把庫分成了多個 Gem。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"很少有人在 Ruby 1.9 時使用 RubyGems,但是在 Ruby 2.0 的時候,RubyGems 被設置成更具通用性的了。有了 Ruby 2.0,RubyGems 社區變得越來越大,每個人都在使用 RubyGems。所以,如果每個人都使用 Gem,我們就不需要打包所有東西。因此,我們逐漸將標準庫劃分成不同的 Gem,使標準發行版本更精簡且易於維護。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"請記住,我們的核心開發人員社區還不夠大,不足以成爲所有領域的專家。一般來說,我們的語言核心開發人員不是 Web 開發人員。我們不擅長維護基於 Web 的技術,比如 Webrick、HTTP 客戶端,甚至處理 XML。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"最好的辦法將這些難以維護的零件遠離標準發行版本,並使其成爲 Gem。現在,開發人員可以創建具有競爭力、更好維護的 Gem。自然競爭是一件好事!"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:那麼,對於那些 Ruby 的初學者,或者那些具有豐富經驗但只想溫習一下 Ruby 3 知識的開發人員,您有什麼建議呢?在 2021 年,您會推薦哪些書、博客或學習平臺?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":在 2021 年,railstutorial.org 以及 guides.rubyonrails.org 爲初學者提供了最佳的學習資料。Web 應用程序是編程的一個很好的示例,它接近於真實的產品。現在,運行腳手架並編寫幾行 Ruby 代碼就可以創建一個簡單的 Web 應用程序。您可以在幾秒內增強這些 Web 應用程序,並查看更新後改進了的 Web 應用程序。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"較短的開發週期鼓勵開發人員學習更多的知識。在開發人員學習了 Rails 或 Ruby 的內部架構之後,他們可以學習任何他們想要的東西:機器學習、嵌入式系統。對於初學者來說,Web 應用程序本身就是一個很好的起點。"}]},{"type":"heading","attrs":{"align":null,"level":5},"content":[{"type":"text","text":"Grigory:最後一個問題。最近我在日本看到了很多 Ruby 獎項,還有政府官員感謝開發者的照片等等。在其他國家或其他語言中,我從未見過這樣的情況。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"那麼,政府和所有官方所舉辦的活動對 Ruby 的這種讚賞是日本或日本文化所特有的嗎?或者這是 Ruby 所特有的,還是兩者都有?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"松本行弘"},{"type":"text","text":":無論是在日本還是日本以外的地方,比如俄羅斯、美國和歐洲,開發者社區都是非常相似的。但不同的是,Ruby 被認爲是在日本本土的,一些日本人希望鼓勵它,特別是當地政府部門。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我個人和一些城市的州長、市長的關係都很好。他們希望通過組織會議和頒獎來鼓勵 Ruby 社區。這是他們鼓勵一種被認爲是在日本誕生的技術社區的方式。從這個意義上說,這些地方政府項目是日本所特有的,但當地的開發人員社區與其他國家的是非常相似的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"視頻採訪連接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"https:\/\/youtu.be\/B-UFFo4M-04?fileGuid=jKdG9qXdRQ6q9t69"}]},{"type":"heading","attrs":{"align":null,"level":4},"content":[{"type":"text","text":"結論"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"通過對松本行弘先生的採訪,我們瞭解了更多關於 Ruby 的最新特性以及社區的發展是如何影響語言發展的。我們也對 Ruby 的未來有了一些深刻的瞭解。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"原文鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"https:\/\/evrone.com\/yukihiro-matsumoto-interview-2021?fileGuid=jKdG9qXdRQ6q9t69"}]}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章