原文:https://blog.golang.org/go2-here-we-come
背景
在2017年的GopherCon上,Russ Cox正式開始關(guān)于Go的下一個大版本的思考過程,他的演講是The Future of Go (博客文章)。我們已經(jīng)非正式地將這種未來語言稱為Go 2,即使我們現(xiàn)在明白它將以漸進的步驟到達,而不是通過大爆炸和單個主要版本。盡管如此,Go 2仍然是一個有用的綽號,如果只是想談談未來的語言,那么讓我們繼續(xù)使用它。
Go 1和Go 2的主要區(qū)別在于誰將影響設計以及如何做出決策。Go 1是一個小團隊的努力,外部影響不大; Go 2將更加受社區(qū)驅(qū)動。經(jīng)過近10年的曝光,我們學到了很多關(guān)于我們一開始就不知道的語言和圖書館的知識,而這只能通過Go社區(qū)的反饋來實現(xiàn)。
2015年,我們介紹了提案流程, 以收集特定類型的反饋:語言和圖書館變更提案。由Go高級團隊成員組成的委員會一直在定期審查,分類和決定提交的提案。這非常有效,但作為該過程的一部分,我們忽略了所有不向后兼容的提案,只需將它們標記為Go 2。2017年,我們也停止進行任何類型的漸進式向后兼容語言更改,無論多么小,都支持更全面的計劃,將Go 2的大局考慮在內(nèi)。
現(xiàn)在是采取行動2提案的時候了,但要做到這一點,我們首先需要一個計劃。
狀態(tài)
在撰寫本文時,大約有120個 標記為Go 2提案的未決問題。它們中的每一個都提出了重要的庫或語言更改,通常是不滿足現(xiàn)有 Go 1兼容性保證的庫。伊恩蘭斯泰勒和我一直在研究這些建議并對它們進行分類(Go2Cleanup, NeedsDecision等)以了解它們的含義并使其更容易進行。我們還合并了相關(guān)的提案,并關(guān)閉了那些看似明顯超出Go范圍的提案,或者其他方面無法實現(xiàn)的提案。
其余提案中的想法可能會影響Go 2的圖書館和語言。早期出現(xiàn)了兩個主要主題:支持更好的錯誤處理和泛型。這兩個領(lǐng)域的設計草案已在今年的GopherCon上發(fā)布,需要進行更多的探索。
但其余的呢?我們 現(xiàn)在擁有數(shù)以百萬計的Go程序員和大量的Go代碼,我們受到限制,我們需要將其全部帶入,以免冒險分裂生態(tài)系統(tǒng)。這意味著我們不能做出很多改變,我們要做的改變需要仔細選擇。為了取得進展,我們正在為這些重大的潛在變化實施新的提案評估流程。
提案評估流程
提案評估過程的目的是收集關(guān)于少數(shù)選定提案的反饋,以便做出最終決定。該過程或多或少地與發(fā)布周期并行運行,并包含以下步驟:
提案選擇。Go團隊選擇了少量 似乎值得考慮接受的 Go 2提案,而沒有做出最終決定。有關(guān)選擇標準的更多信息,請參見下文。
提案反饋。Go團隊發(fā)出一份列出所選提案的公告。該公告向社群解釋了推進所選提案的初步意圖,并收集了每個提案的反饋意見。這使社區(qū)有機會提出建議并表達關(guān)切。
實施。根據(jù)這些反饋,提案得以實施。這些重要語言和庫更改的目標是讓它們準備好在即將發(fā)布的發(fā)布周期的第1天提交。
實施反饋。在開發(fā)周期中,Go團隊和社區(qū)有機會嘗試新功能并收集進一步的反饋。
啟動決定。在三個月開發(fā)周期結(jié)束 時(只是在發(fā)布之前開始三個月的回購凍結(jié)),并根據(jù)在發(fā)布周期中收集的經(jīng)驗和反饋,Go團隊做出關(guān)于是否發(fā)送每個更改的最終決定。這提供了一個機會來考慮變更是否已實現(xiàn)預期收益或產(chǎn)生任何意外成本。發(fā)布后,更改將成為語言和庫的一部分。被排除的提案可能會回到繪圖板或可能會被拒絕。
通過兩輪反饋,這個過程傾向于拒絕提議,這有望防止功能蔓延,并有助于保持語言小而干凈。
對于每個開放的Go 2提案,我們都無法完成這個過程,其中有太多。這就是選擇標準發(fā)揮作用的地方。
提案選擇標準
提案必須至少:
為許多人解決一個重要問題,
對別人的影響微乎其微,并
提供一個清晰且易于理解的解決方案。
要求1確保我們所做的任何更改都能幫助盡可能多的Go開發(fā)人員(使他們的代碼更健壯,更容易編寫,更可能是正確的等等),而需求2確保我們小心謹慎可能,無論是通過打破他們的程序或?qū)е缕渌魇А8鶕?jù)經(jīng)驗,我們的目標應該是幫助至少十倍于開發(fā)人員,因為我們在給定的變化時會受到傷害。不影響真實Go使用的變化是針對重大實施成本的凈零利益,應該避免。
如果沒有要求3,我們就沒有提案的實施。例如,我們認為某種形式的通用性可能會為很多人解決一個重要問題,但我們還沒有一個明確且易于理解的解決方案。這沒關(guān)系,只是意味著提案需要在可以考慮之前回到繪圖板。
建議
我們認為這是一個很好的計劃,應該很好地為我們服務,但重要的是要明白這只是一個起點。在使用該過程時,我們將發(fā)現(xiàn)它無法正常工作的方式,我們將根據(jù)需要對其進行優(yōu)化。關(guān)鍵部分是,在我們實際使用它之前,我們不知道如何改進它。
一個安全的起點是使用少量向后兼容的語言提議。我們很長一段時間沒有進行語言更改,所以這讓我們回到了那種模式。此外,這些變化不需要我們擔心破壞現(xiàn)有代碼,因此它們可以作為一個完美的試驗氣球。
盡管如此,我們建議為Go 1.13版本(提案評估過程中的第1步)選擇Go 2提案:
#20706 基于 Unicode TR31的通用Unicode標識符:這解決了使用非西方字母表的Go程序員的一個重要問題,并且對其他任何人都應該沒什么影響。我們需要回答歸一化問題以及社區(qū)反饋意義重要,但在此之后,實施路徑得到了充分理解。請注意,標識符導出規(guī)則不受此影響。
#19308,#28493 二進制整數(shù)文字和對數(shù)字文字的支持:這些是相對較小的變化,在許多程序員中似乎非常受歡迎。他們可能還沒有達到解決“重要問題”的門檻(到目前為止,十六進制數(shù)字運行良好),但是在這方面,它們使Go與大多數(shù)其他語言相提并論,并減輕了一些程序員的痛點。它們對不關(guān)心二進制整數(shù)文字或數(shù)字格式的其他人的影響很小,并且實現(xiàn)很好理解。
#19113 允許有符號整數(shù)作為移位計數(shù):估計所有非常數(shù)移位中有38%需要(人工)uint轉(zhuǎn)換(請參閱問題以獲得更詳細的細分)。這個提議將清理很多代碼,使得表達式表達式更好地與索引表達式和內(nèi)置函數(shù)cap和len同步。它將主要對代碼產(chǎn)生積極影響。實施很好理解。
下一步
通過這篇博客文章,我們執(zhí)行了第一步,并開始了提案評估流程的第二步?,F(xiàn)在,由Go社區(qū)提供有關(guān)上述問題的反饋。
對于我們已經(jīng)明確并批準反饋的每個提案,我們將繼續(xù)實施(流程中的第3步)。因為我們希望在下一個發(fā)布周期的第一天(暫定于2019年2月1日)實施更改,所以我們可能會在這個時間稍早開始實施,以留出兩個月的反饋時間(2018年12月,2019年1月) )。
對于為期3個月的開發(fā)周期(2019年2月至5月),所選功能已經(jīng)實施并在小費處可用,每個人都有機會收集它們的經(jīng)驗。這為反饋提供了另一個機會(過程中的第4步)。
最后,在回購凍結(jié)后不久(2019年5月1日),Go團隊最終決定是否保持新功能(并將其包含在Go 1兼容性保證中),或者是否放棄它們(最后一步)過程)。
(因為在我們凍結(jié)回購時很可能需要刪除某個功能,所以實現(xiàn)將需要禁用該功能而不會破壞系統(tǒng)其他部分的穩(wěn)定性。對于語言更改可能意味著所有與功能相關(guān)的代碼都由內(nèi)部標志保護。)
這將是我們第一次遵循這一過程,因此回購凍結(jié)也將是反思過程并在必要時進行調(diào)整的好時機。讓我們看看它是怎么回事。