1. 程式人生 > >Go 語言的下一個大版本:Go 2.0 被安排上了!

Go 語言的下一個大版本:Go 2.0 被安排上了!

今年 8 月 Go 開發團隊公佈了 Go 2.0 的設計草案,包括錯誤處理和泛型這兩大主題。現在備受矚目的 Go 2.0 又有了新動向 —— 昨日 Go 開發團隊在其官方部落格表示,Go 2 已經被安排上了!目前 Go 2 已進入確定變更提案的階段,並公佈了提案評估流程。

廢話不多說,先來看看 Go 2.0 有哪些值得關注的內容:

1.最大程度保持對 1.x 的相容,以避免分裂 Go 語言生態系統
2.採用增量升級的方式,而非單獨釋出重大更新版本
3.實施新的提案評估流程,以評估尚未解決且被標記為提案的 issue
4.將會在 Go 1.13 版本中選擇 Go 2 部分的提案

背景

早在2017年的 GopherCon 大會上,Russ Cox(Go 核心開發團隊的技術 leader)就已經正式開始思考 Go 的下一個大版本(

相關文章)。當時官方非正式地將它稱為 Go 2,但我們知道,所謂的 Go 2.0 並非一個單獨的重大更新版本,而是通過“增量更新(incremental)”的方式以逐漸抵達 "Go 2.0"。所以本文對這個未來版本的稱號 —— 也暫且用 Go 2 來描述。

Go 1 和 Go 2 之間的主要區別在於主導權的不同。誰將影響設計,又該如何做出決策?我們都知道,Go 1 的誕生是小團隊努力的結果,受外部影響不大;而到了 Go 2,尤其是經過將近 10 年的發展後,Go 語言的生態已經十分龐大,因此它也更多地受到社群的驅動和影響。經歷了這些,Go 開發團隊也瞭解到了更多一開始不知道的與語言特性和庫相關的知識 —— 這些都來自於 Go 社群的反饋。

2015年,Go 開發團隊引入了提案流程,以收集特定型別的反饋:針對語言和庫變更方面的提案。由 Go 開發團隊高階成員組成的委員會定期審查、分類和決定社群提交的提案。這個流程十分有效,但作為該過程的一部分,他們忽略了所有不向後相容的提案,只是將其標記至 Go 2。到了2017年,Go 開發團隊也停止進行任何型別的向後相容的“增量”語言特性變更,因為他們認為無論變更多麼小,都要有更全面的支援計劃,並將 Go 2 考慮在內。

對於這些累積下來的提案,官方表示現在是時候採取行動了!

近況

本文釋出時,官方表示目前在 Go 2 的提案中,大約有 120 個尚未解決且被標記為提案的 issue。這些提案都涉及到重要的庫或語言特性變更,而它們通常不能與 Go 1 互相相容。Ian Lance Taylor 和 Robert Griesemer 一直在研究這些提案,並對它們進行了分類(Go2Cleanup, NeedsDecision 等),以理解這些提案背後的含義並使它們後續更易進行。此外,他們還合併了相似的提案,並關閉了那些看似明顯超出 Go 範圍的提案,或者其他方面無法實現的提案。

早期出現的兩個提案包括更好的錯誤處理和泛型,而它們的草案已在今年的 GopherCon 大會上釋出,等待更多的探索發展。至於剩餘的提案,官方提到,他們不希望過度影響數百萬 Go 開發者以及現在的 Go 程式碼,更不想冒著分裂生態系統的風險去改版 Go 2,因此 Go 2 無法做出太多變更,每一個變更都需要仔細選擇。為此,這些提案都將使用新的提案評估流程來決定去留與發展。

提案評估流程

提案評估流程旨在收集對少數選定提案的反饋意見,以作出最終決定。這個過程或多或少會與釋出週期並行進行,包括以下步驟:

  1. 提案選擇:Go 開發團隊選擇少量看起來值得考慮接受的 Go 2 提案,但尚未做出最終決定。

  2. 提案反饋:Go 開發團隊將釋出一份列出所選提案的公告,公告會向社群解釋提案的初衷並收集反饋意見。在這個步驟中,社群可提出建議。

  3. 實現:根據來自社群的反饋意見,提案開始實現。

  4. 針對所實現的提案的反饋:在開發週期中,Go 開發團隊和社群試用新功能並且收集進一步的反饋意見。

  5. 啟動決策:在三個月的開發週期結束時,根據在釋出週期中收集的經驗和反饋意見,Go 開發團隊會考慮變更的預期收益或產生的額外成本,從而最終決定是否釋出每個變更。一旦釋出,這些被髮布的提案就成為語言和庫的一部分。未被髮布的提案可能會重新起草,但也有可能會被永久拒絕。

可以看到,通過兩輪的反饋過程,可對提案進行有效的篩選,從而防止“功能蔓延(feature creep)”,有助於保持 Go 語言的簡潔。

提案選擇標準

一項提案至少要滿足以下這些條件:

  1. 解決大部分使用者覺得重要的問題

  2. 不會對其他使用者造成太大的影響

  3. 提供一個清晰且易於理解的解決方案

條件1確保提案所做的任何變更都可以幫助到儘可能多的 Go 開發者(使他們編寫的程式碼更健壯、正確性更高等),條件2則保證了變更將給使用者帶來的影響降到最低。

至於條件3,如果提案不能滿足該條件,它將不會被實現。即便這項提案能夠解決一個很重要的問題,思路也很好,但在沒有實現方案的情況下,它將會被拒絕,並需要重新起草。

下一步

在這篇文章釋出時,Go 開發團隊表示已經執行提案評估流程的第一步,並開始了流程的第二步,關於具體的提案可點此進行檢視

對於 Go 開發團隊已經明確並通過的提案,將會繼續實現(即評估流程的第3步)。開發團隊表示希望在下一個釋出週期的第一天(暫定於2019年2月1日)完成這些提案變更的實現,所以這次可能會在較早的時間開始進行,以留出兩個月的反饋時間(2018年12月至2019年1月)。

而在為期3個月的開發週期中(2019年2月至5月),被選擇的提案將會被實現,每位使用者都可以體驗新功能並進行反饋(評估流程的第4步)。

最後,在短暫的凍結期後(2019年5月1日),Go 開發團隊會最終決定是否永久保留新功能(並保證這些功能與 Go 1 相容),或是放棄這些功能(評估流程的最後一步)。

Go 開發團隊表示這是首次採用這一流程,因此在凍結階段將會是反思這個流程,並在必要時進行調整的好機會。我們也不妨拭目以待吧!