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