RFC-0001:Fuchsia 留言請求 (RFC) 程序

RFC-0001:Fuchsia 意見請求 (RFC) 程序
狀態已接受
區域
  • 管理事宜
說明

做出專案範圍內技術決策的程序。

Gerrit 變更
作者
審查人員
提交日期 (年-月-日)2020-02-20
審查日期 (年-月-日)2020-02-27

摘要

Fuchsia RFC 流程旨在提供一致且透明的途徑,以做出專案範圍內的技術決策。舉例來說,RFC 程序可用於演進專案藍圖和系統架構。

提振精神

目前 Fuchsia 專案沒有正式程序,可做出專案範圍的技術決策。以我們目前的規模來說,這種非正式做法會導致不同人員對專案的進展和系統的組建方式,抱持不同甚至不一致的觀點。為專案範圍內的技術決策建立一致且透明的途徑,所有利害關係人都能對專案的技術方向抱持信心。

設計

本節說明 RFC 程序的設計。

使用這個程序的時機

絕大多數的 Fuchsia 變更都不需要 RFC。這些變更應改用程式碼審查程序進行。不過,對專案有廣泛影響的技術決策,需要更廣泛的共識,且必須透過 RFC 程序與專案進行溝通。

下列變更類型必須使用 RFC 程序:

  • 變更專案藍圖。專案藍圖說明對整個系統有廣泛影響的變更,通常會影響系統的大部分,或跨越子系統之間的界線。

  • 限制日後的開發作業。一旦做出某些決策,就會限制系統的未來發展。我們必須謹慎做出這類決策,因為日後可能難以修正。

  • 制定專案政策。專案政策對系統的影響範圍很廣,通常會影響整個專案的貢獻者。舉例來說,即使並非所有人都使用新語言,變更支援的語言集仍會影響所有需要偵錯及瞭解系統的人員。

  • 變更系統架構。系統架構說明系統整體如何整合。根據定義,變更系統架構會跨越子系統之間的界線,因此需要與許多利害關係人審慎諮詢。

  • 委派決策權限。專案通常需要經常做出某些類型的決策,而這些決策可從專業知識中獲益。專案可以將這些類別的決策權委派給其他群組或程序,不必透過 RFC 程序做出所有決策。舉例來說,我們經常需要決定平台 API,這會對日後的開發作業造成限制,但如果平台 API 的每次變更都使用 RFC 程序,並不切實際。

  • 回報問題和錯誤。最後,有爭議的變更可透過 RFC 程序的透明度和清晰度獲益。如果對技術方向有異議,且個人技術領導者無法解決,異議方或另一位貢獻者可將決策提報至 RFC 程序。

RFC 程序也可用於其他類型的變更,因為這種結構化的決策方法和決策的永久記錄,對這些變更都有好處。

角色與職責

人員可透過多種角色參與 RFC 程序:

  • RFC 作者。RFC 作者是指撰寫 RFC 的人員。凡是為 Fuchsia 做出貢獻的人,都可以成為 RFC 作者。一個 RFC 可以有一或多位作者。特定 RFC 的作者會主導該 RFC 的程序。

  • 利害關係人。利害關係人是指與專案是否接受特定 RFC 有利害關係的人員。利害關係人通常是 Fuchsia 貢獻者,但部分 RFC 的利害關係人可能超出 Fuchsia 專案範圍。舉例來說,利害關係人可能參與使用 Fuchsia 的其他專案,或受到 Fuchsia 變更的影響。利害關係人並不一定會直接參與 RFC 的討論。利害關係人通常會指派代表,通常是技術主管或其他負責一組利害關係人的人員。

  • 工程委員會。工程委員會會協助討論,並最終決定專案是否接受 RFC。

運作方式

本節說明 RFC 流程的每個步驟。

步驟 1:社交

RFC 流程的第一步,是向專案宣傳您的想法。 舉例來說,您可能發現某個問題,認為有解決的必要。其他人是否也遇到這個問題?可能有人已在處理問題,或瞭解問題的背景或脈絡,對您有所幫助。越早發現這項資訊越好。

相較於流程中的其餘步驟,這個步驟相對非正式。本文不會詳細說明如何宣傳您的想法,將技術概念傳達給他人是一項獨立的技能。不過,您可以先與要解決問題相關領域的技術主管討論這個主題。舉例來說,您可能想諮詢 OWNERS 檔案中的人員,瞭解需要修改哪些程式碼集區域才能執行您的想法。

如果不確定如何宣傳想法,請諮詢技術主管。他們通常有更多分享想法的經驗,或許能為你指引正確方向。

範例。這項 RFC 是透過在工程論壇中討論而發布,該論壇是 Google 內部定期舉行的會議,由參與專案的各工程領導人組成。我們也與 FTP 和 CTP 程序的建立者分享了 RFC,他們對這些程序有充分的背景知識和脈絡。

步驟 2:草稿

透過社交活動收集所有背景和脈絡後,即可開始 RFC 程序的正式部分。接下來,請撰寫 RFC 文件初稿。

從機制上來說,RFC 是 //docs/contribute/governance/rfcs 目錄中的 Markdown 檔案。如要建立 RFC,請建立 CL,將檔案新增至該目錄。首先,請複製 RFC 範本。雖然並非必要,但範本會提示您以半結構化方式思考要解決的問題,引導您撰寫高品質的 RFC。

在這個階段,請勿為 RFC 指派號碼。請改用 0000 做為預留位置。舉例來說,檔案名稱應類似於 0000_my_idea.md。RFC 獲得核准或遭到拒絕後,在登陸前會取得編號。

建議。在準備好取得意見回饋前,請考慮將含有 RFC 的 CL 標示為「處理中」。

步驟 3:疊代

建立含有 RFC 初稿的 CL 後,您就可以與適當的利害關係人反覆討論構想。希望您在宣傳構想時,已找出大部分適當的利害關係人,但您很可能在這個階段發現其他利害關係人。

在機制方面,您應將利害關係人新增至 CL 的「審查者」或「副本」欄位,邀請他們提供 RFC 意見回饋,就像一般程式碼審查一樣。利害關係人應在程式碼審查工具中,透過在 RFC 留下註解的方式提供意見回饋。

如果討論內容太過複雜,不適合使用程式碼審查工具,請考慮與相關利害關係人安排會議,提高討論效率。會議結束後,請在 CL 上發布會議摘要,讓未出席會議的人員瞭解會議討論內容。

如果討論變得有爭議,請提報給 RFC 編輯人員。工程委員會可以協助推動討論,例如為討論提供額外的架構,或將討論移至其他論壇。無論討論如何進行,任何非 CL 討論的結果都必須記錄在 CL 中,通常是將討論摘要發布為 CL 註解。

如要撤銷 RFC,請將包含 RFC 的 CL 標示為已放棄。如果情況有變,您或其他使用者隨時可以復原 RFC。如果想重新啟動他人建立的 RFC,請從頭開始 RFC 程序,但可以將撤銷的 RFC 做為起點,而不是 TEMPLATE.md。請與原始作者商議,確認他們是否希望自己的名字繼續與新版 RFC 相關聯。

建議。如果您對 RFC 有興趣,不妨設定 Gerrit Code Review 工具,在 CL 修改 //docs/contribute/governance/rfcs 目錄時傳送電子郵件通知

步驟 4:核准

當 RFC 的疊代版本趨於一致時,您就可以進入核准階段,讓利害關係人將 Code-Review 標記設為 +1 或 +2,以簽署 RFC。一般來說,需要核准 CL 的利害關係人 (即 RFC 必須獲得其簽署才能繼續進行) 應以 +2 簽署,而不需要核准的利害關係人則應以 +1 簽署。不過,如果利害關係人想表達對 RFC 的熱情,也可以以 +2 簽署。

如要反對 RFC,利害關係人可以將 Code-Review 旗標設為 -1 或 -2,視他們認為 RFC 不應繼續進行的程度而定。將 Code-Review 旗標設為 -1 或 -2 時,利害關係人必須說明反對原因,最好能讓他人清楚瞭解反對意見,而不必閱讀反對意見之前的所有討論內容。

如果利害關係人將 Code-Review 標記設為 -1 或 -2,專案不一定會拒絕 RFC。如要進一步瞭解專案如何決定是否接受 RFC,請參閱下方的「決策方式」一節。

所有利害關係人提供程式碼審查標記後,請傳送電子郵件至 eng-council@fuchsia.dev,提示工程委員會決定是否接受您的 RFC。

步驟 5:提交

如果專案決定接受您的 RFC,工程委員會成員會在您的 CL 上留言,說明 RFC 已獲准,並為 RFC 指派編號 (通常是該系列中下一個可用的編號)。如有任何 -1 或 -2 的程式碼審查旗標,工程委員會會明確清除每個旗標,方法是總結反對意見,並說明為何 RFC 仍要繼續進行。

如果專案決定拒絕您的 RFC,工程委員會成員會在 CL 中留言,說明 RFC 遭拒,並提供拒絕理由。遭拒的 RFC 是很有價值的工程構件。工程委員會將與 RFC 作者合作,推出標示為已拒絕的 RFC 版本,並納入相關理由。

您應上傳 RFC 的新修補程式集,並在 RFC 標題和檔案名稱中加入指派的編號。如果您的 RFC 獲得核准且需要實作,請務必在問題追蹤器中提出問題,並在 RFC 的標頭中加入該問題的連結。

工程委員會隨後會將您的 CL 程式碼審查標示為 +2,您就可以提交 RFC!

恭喜!您為專案貢獻了寶貴的工程構件!

決策方式

是否接受 RFC 由工程委員會決定,委員會成員會大致達成共識。如果決策涉及由工程委員會成員撰寫的 RFC,這些成員必須迴避決策。

如果工程委員會無法達成粗略共識,則不會接受 RFC。 工程委員會決定是否接受 RFC 時,會考量下列因素:

  • RFC 是否有助於達成專案目標?
  • RFC 是否符合專案價值觀?
  • 討論中是否適當納入所有利害關係人?
  • 如有任何利害關係人反對,工程委員會是否完全瞭解反對意見?

如果對工程委員會的決策有異議,可以向上提報給專案的管理機構。

說明文件

本 RFC 是 RFC 程序的說明文件。

缺點、替代方案和未知事項

實作這項提案的主要成本,是導入正式決策程序可能會減緩決策速度。對於某些類型的決策,這個程序可能過於繁瑣。

在來源存放區中記錄決策,可避免這些決策遭到變更。在某些情況下,這項影響可能是正面的,但在其他情況下,這項影響也可能是負面的。

「何時使用此程序」一節中的條件會嘗試縮小程序範圍,以因應重大情況,但這類範圍必然會出現偽陽性和偽陰性,因此會盡量減輕這項缺點。

解決根本問題的替代策略非常多。舉例來說,我們可能會使用以同步會議為中心的決策程序,但這類程序難以擴展到全球開放原始碼專案。我們也可以選擇其他決策機制,更著重共識或權威。

既有技術和參考資料

開放原始碼專案的決策程序有許多先前技術。這項提案深受下列現有程序影響:

  • IETF RFC 程序。IETF 長期以來一直成功執行大規模的決策程序。本文所述程序採用了許多 IETF 程序的概念,包括部分術語。

  • Rust RFC 程序。Rust 社群會執行 RFC 程序,這項程序在為類似的軟體工程專案制定決策時相當有效。本文所述程序是根據 Rust RFC 程序直接建模而來。

  • Blink 導入意圖程序。Chromium 專案會針對影響網頁的行為執行決策程序。本文所述程序是根據我 (abarth) 的經驗而來,我曾協助設計及執行該程序一段時間。

  • FIDL 微調提案。Fuchsia 專案曾直接使用類似程序,針對 FIDL 語言做出決策。這項提案的誕生,正是因為該決策程序成功運作。