當我還是本科生的時候,在一門名為 “計算機系統工程” 的課程中,我們閱讀了許多系統設計的經典論文。我從這些論文中獲益良多,但有一篇特別讓我印象深刻,那就是 Saltzer 等人的 “系統設計中的端到端論點”。這篇論文是關於系統設計的一個非常通用的論述 —— 它確實探討了幾個具體系統或應用的例子,但最終它闡述了端到端原則作為一種可以適用於幾乎任何系統設計的視角或設計啟發。
我建議閱讀這篇論文 —— 它短小且非常易讀 —— 簡而言之,它主張系統的許多功能更好地在系統的 “端” 處處理,而不是在每個較低層級的接口邊界處。作為一個具體的例子,論文主張,文件傳輸系統更好地通過強檢查和必要的重試來確保端到端的正確性,而不是堅持要求每個底層網絡層的完美無損傳輸。
我在軟件和設計領域專業工作的時間越長,就越發現自己反思端到端論點及其對系統設計的細微差別和影響。我想在這裡承諾寫下我認為特別有趣的兩個不同觀點。
要理解這兩個觀點,我們首先需要反思我們所說的 “系統” 和 “系統設計” 是什麼。梅里亞姆 - 韋伯斯特 定義 “系統” 為 “定期互動或相互依賴的項目組成的統一整體”。因此,系統的本質特徵是它是一個單元,可以分解為一些子組件,這些子組件可以在相互隔離的情況下被理解或考慮。因此,系統設計是執行這種分解的過程:決定如何將所需的系統分解為可以組建成一個功能完整的整體的單個單元。
悲觀的觀點:你無法組合正確性#
在系統設計中,我們可能希望的一個特性是,我們可以在某種意義上僅通過正確地組合正確的子系統來達到一個正確的系統。這種希望有時被表述為對軟件設計 “樂高積木” 的渴望:如果我們能夠設計出正確、穩健、基本的軟件設計構建塊,我們將能夠以任意方式將它們組合在一起,並以低成本和努力設計出複雜的系統。
端到端論點直接挑戰了這種樂觀情緒。它主張,無論底層構建塊的複雜程度如何,我們始終必須在最上層的端到端設計層面定義和強制執行我們系統的基本正確性屬性。我們無法輕易地從子系統的正確性中推導出正確性:我們必須始終將其視為一種端到端的屬性。
因此,端到端論點也表明了抽象和系統設計中缺乏尺度不變性。擁有 “端” 的系統受端到端原則的約束,並負責強制執行正確性。相反,僅作為更大整體的子系統或組件存在的系統可能不具備這種責任,並且可以將某些保證委託給超出其範疇的端到端系統。
因此,這種尺度依賴性暗示了世界上缺乏某種 “根本正確” 抽象的情況。如果我們想為某一類功能設計一個組件,適當的設計約束和保證取決於我們是構建一個端到端系統還是僅僅一個更大系統的組件。而且,如果我們正在設計一個組件,我們必須提供的保證取決於頂層系統準備自己強制執行哪些屬性。
在這方面,我認為這種對端到端論點的看法與漏水抽象法則密切相關,該法則指出所有足夠複雜的抽象在某種程度上都是漏水的。這兩個原則都表達了在抽象堆棧的高層與底層系統的實現細節之間存在某種不可避免的 “帶外” 交互。
這是我在大學第一次閱讀這篇論文時最強烈的感受。我當時覺得這相當令人沮喪;作為一名年輕熱情的有抱負的系統設計師,我想相信存在某組理想化的柏拉圖抽象,這些抽象如果能夠從軟件的原始以太中提取出來,將無縫且永遠地提高軟件設計師工作的抽象層次。端到端原則表明,世界是混亂的,雖然可能存在 “足夠好” 的抽象幾乎是普遍的,但我們將永遠攜帶著複雜性,向更高的系統設計層次推進。
樂觀的觀點:TCB 觀點#
這第二種觀點是我在實際系統設計中越來越欣賞的,我認為它更接近論文作者希望傳達的智慧。
正確性是困難的。任何在軟件領域工作過很長時間的人都非常熟悉這一現實:編寫大多數時間都能正常工作的軟件比編寫始終正常工作的軟件要容易得多。這一真理在大型系統中更是如此,因為我們必須與外部組件互動,而這些組件本身可能具有不確定的可靠性特性。
端到端論點鼓勵我們接受並擁抱這一現實。我們可以選擇一些基本的正確性屬性(例如:消息從 A 點到 B 點未經修改地複製;每個交易在我們的賬本中出現一次)並將這些屬性 定位 在我們系統的一個子集(在 “端” 處)。一旦我們完成了這一步設計,我們就可以要求這些端到端組件的正確性,並將系統的其餘部分視為一個優化問題。
我稱這為 “TCB” 觀點,因為我將其比作操作系統理論中的 “可信計算基礎” 概念。我們尋求減少系統中直接威脅整體系統完整性的錯誤的部分;在這樣做之後,我們可以在信心中開發系統的其餘部分,因為錯誤可能表現為性能問題,甚至是整體系統中的可檢測故障,但應該不可能無聲地導致災難性故障。
結論#
系統設計是錯綜複雜的,充滿了權衡、工具、技巧和如何從組件組裝複雜系統的啟發。我非常喜愛端到端論點,以及關於它的這篇論文,因為我認為它是我們系統設計中最好的 “自上而下” 工具之一。許多技術和原則專注於 “自下而上”—— 從可用的實現原語中組合組件,架構上升。但最終,我們的目標是用整體系統解決具體問題,而端到端論點是一個強有力的工具,可以將這一整體目標與系統的分解聯繫起來。
這種自上而下的觀點,將端到端功能與組件設計聯繫起來,可能會令人沮喪,因為這意味著我們可能需要對每個系統設計問題進行實質性的重新考慮;在兩個問題之間看似相似的組件可能根據最終目標有著重要不同的功能需求。然而,與此同時,它也為我們提供了一個強大的工具和結構,以進行這種分解並思考系統設計。