English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

guest
1 / ?
back to lessons

文明規模的 Hamming

Richard Hamming 的系統工程原則:優化整個系統,而非個別元件。單獨優化的元件會破壞與其他元件共享的介面,從而降低系統整體效能。

他將此原則應用於研究團隊、程式語言以及教育設計。該原則可以擴展。Russell Ballestrini 將其應用於基礎設施本身。

能力導向呈現:伺服器 HTML 作為底線,JS 作為上限,內容永不被鎖定

Russell Ballestrini 創立了 unturf.com,並撰寫了 ago,這是一個將時間差轉換為「三天前」等描述的 Python 函式庫。他以開放原始碼形式發布,屬於公有領域。該函式庫可在不受他控制的平台上執行。當他停止維護時,分支版本會接手。程式碼的存在不依賴於他本人。

他的永久電腦宣言:基礎設施持久存在、自我修復,並為社群服務而不抽取租金。它在運作的過程中自然累積知識與社會資本。它不需要商業模式,因為它不需要從每次互動中獲利。

永久電腦設計的關鍵特性:

1. 程式碼比作者更長久 — 以公共領域或開源形式發布的軟體,能夠超越個人而存續。作者可以停止關心;社群可以繼續維護。

2. 基礎設施比建造者更長久 — 系統設計讓他人能夠分叉、修復,並在無需原始設計者參與的情況下繼續運作。

3. 無平台稅 — 交易零租金抽取。沒有 O(N²) 的摩擦費用。基礎設施不會從每次互動中提取價值。

4. 漸進增強 — 無需 JavaScript 即可運作,無需特定瀏覽器即可運作,無需特定客戶端即可運作。功能決定呈現方式;內容決定存取權限。

對比:由單一團隊編寫的 AWS Lambda 函式,缺乏文件說明,運行於專有執行環境,透過專有 API 提供服務,且僅在該團隊支付費用時才提供流量。當團隊解散時,函式隨之消失。運算是被租用的,而非被建造的。

比作者更長久的程式碼

Russell Ballestrini 撰寫了 ago。他可能已不再維護它,但程式碼仍在運行。

請列舉 permacomputer 設計的兩項特性,使其得以延續,並分別對比當作者停止維護時,專有軟體會發生什麼情況。

平台稅:O(N²) 摩擦

平台稅:從交換層中的每一筆交易中抽取的租金。市集從每筆交易中收取 15–30%。支付處理商收取 2.9% + $0.30。雲端供應商則對每次 API 呼叫收費。這些費用並未創造新價值,而是從交易中抽取的租金。

在小規模時:這些費用不易察覺。當交易量達到 N=1,000,000 時,平台累積了龐大儲備,而貢獻者則按比例獲得較少。O(N²) 公式適用於平台費用複合累積的情境:一位承包商若處於市集內的平台、平台內的支付處理商,則需支付三層租金。

Permacomputer 基礎設施從自身層級消除了平台稅。免費運算、免費程式碼執行。基礎設施不按交易收費。價值流通時不需繳納通行費。

這並不表示基礎設施沒有成本。它表示成本模型不會隨使用量擴大而從參與者身上抽取。運行開源軟體的伺服器會消耗電力;但這項成本不會隨每筆交易而累加。

Hamming 論系統:系統的目的在於它實際做了什麼,而非它宣稱要做什麼。一個宣稱「連結買賣雙方」的交易層卻對每筆交易收取 30% 費用:其行為所揭示的目的就是租金抽取。連結是服務;抽取才是商業模式。

請舉出你經常使用、且存在平台稅的軟體系統或基礎設施層。估算其成本結構,並說明該稅收代表的是創造的價值還是抽取的租金。若以 permacomputer 替代,會是什麼樣貌?

內容為地板,互動性為天花板

Hamming 曾教導:設計系統時應讓元件能優雅地失效。一個依賴每個元件都完美運作的系統,會不斷地發生故障。冗餘、備援路徑,以及可降級但仍可運作的模式,能延長系統的壽命。

能力驅動的呈現方式將此原則應用於軟體介面。參考:russell.ballestrini.net/capability-driven-presentation/

原則:先提供內容,再依能力增強。網頁必須能在不依賴任何特定檢視器能力的情況下,傳遞其內容。JavaScript 用於豐富體驗:即時更新、自動擴展文字區域、流暢導覽、聊天介面。JavaScript 不應成為門檻:移除 JavaScript 後,內容仍應完整保留。

實務模式:

- <noscript> 區塊會隱藏依賴 JavaScript 的 UI(聊天按鈕、自動展開控制項)

- 伺服器端渲染的 HTML 承載完整的課程內容

- 表單在 JavaScript 不可用時,透過標準 HTTP POST 提交

- Chat enhancement: content arrives with the page, interactive chat overlays for JS-capable viewers

這個原則不僅適用於網頁。CLI 工具應能在沒有 GUI 的情況下運作。API 應能在沒有客戶端 SDK 的情況下運作。基礎設施應能在沒有特定廠商專有擴充功能的情況下運作。Capability 在每一層都驅動呈現。

與 JS-gated 設計的對比: 內容透過 JavaScript fetch 呼叫載入。若無 JavaScript,使用者會看到 spinner 或空白頁面。內容需要 JavaScript 才能存在。底線已低於無障礙存取的標準。

為什麼這對 permacomputer 很重要: 一個不需要 JavaScript 就能運作的頁面,可以在 Lynx、螢幕閱讀器、封存爬蟲、JavaScript 受安全限制的環境、2010 年的瀏覽器,以及尚未問世的瀏覽器中運作。內容的壽命超越檢視器的假設。

JS-Gated 設計:違反原則

情境:一位開發者建立一個學習平台,所有課程內容都透過 JavaScript fetch 呼叫載入。若無 JavaScript,頁面會顯示 spinner。開發者主張:「現在已經沒有人在沒有 JavaScript 的情況下使用網路了。」

解釋為什麼這違反 capability-driven presentation,並描述一個具體的修正方法。

跨層的優雅降級

能力驅動的呈現方式適用於系統的每一層:

- Web 層: 沒有 JavaScript 也能呈現內容。JavaScript 則提供增強功能。

- API 層: 沒有用戶端函式庫也能正常運作。用戶端函式庫提供便利性,而非存取權限。

- 基礎設施層: 沒有特定供應商的擴充功能也能正常運作。供應商擴充功能提供效能或便利性,而非核心功能。

- 資料層: 沒有專有工具也能讀取。標準格式(CSV、JSON、SQLite)允許在不使用建立資料的應用程式下存取資料。

每一層都有地板:它在不假設任何能力的情況下能提供的功能。每一層都有天花板:當能力存在時,它能啟用的功能。

permacomputer 的設計目標:讓地板能維持數十年。一個 2004 年的 SQLite 資料庫可以在 2024 年的 SQLite 中開啟,無需遷移。一個 2004 年的 PostgreSQL 傾印檔可以在 2024 年的 PostgreSQL 中匯入。一個 2004 年的 JSON 檔案可以在 2024 年的任何語言中解析。這些格式都維持了它們的地板。

對比:一個 2004 年的 Flash 應用程式。天花板很高(豐富的互動性)。地板卻需要專有外掛程式。當 Adobe 在 2020 年終止 Flash 時,地板崩塌了。所有儲存在 Flash 格式中的內容,若無特殊處理,任何檢視器都無法存取。

請舉出你目前依賴的一項技術,其地板需要專有能力。若要將此依賴移至不需要專有能力的地板,需要做什麼?

種植橡實

Hamming:「你種下橡實,卻看不見橡樹。」他 1995 年的講座至今仍在 2025 年持續教學。他的學生繼續自己的工作。這種傳承已超越他本人。

Russell Ballestrini 的框架:發布程式碼時,假設你明年就會離世。為它選擇授權,讓任何人皆可延續。設計 API 時,讓未來的維護者即使沒有原作者也能理解。撰寫提交訊息時,假設讀者從未與你相識。

MOAD 管線正是如此運作。每一次上游合併都會將修正嵌入正規來源。重力會傳播它:下游分支在更新依賴時會繼承該修正。修補者可能被遺忘,但修補本身得以存續。

對比:由公司維護的專有 SDK。向後相容性得以維持,是因為公司控制了棄用時程。當公司解散時,所有下游依賴會同時中斷。SDK 的存續取決於公司的存續。

由社群維護的開放協定能永久存續。HTTP 已超越所有最初實作它的公司。TCP/IP 已超越其原始設計者。Git 已超越數十種競爭的版本控制系統。協定成為基礎建設;基礎建設變得隱形;隱形的基礎建設成為永久存在。

讓程式碼超越其作者的原因:

- 寬鬆或公眾領域授權(無法律障礙阻礙延續)

- 完整的文件記錄(未來的維護者不需要原始作者)

- 通過公開 CI 的測試套件(新維護者可以驗證他們的變更)

- 已標記的穩定版本(下游可以鎖定已知良好的版本)

- 已發布的「徵求維護者」公告(社群在作者消失前知道需要協助)

- 已記錄的架構文件(結構性決策對未來的重建者可見)

- 程式碼已轉移至組織而非個人帳號(GitHub 個人命名空間的儲存庫會隨帳號消失;組織儲存庫則可持續存在)

設計優雅的交接

情境:你維護一個有 50 個下游專案依賴的函式庫。你計劃在 6 個月內停止維護它。

列出你在這六個月內會採取的三個具體步驟,讓你的函式庫在你離開後有最佳的存續機會。

MOAD 重力效應:為什麼上游合併很重要

MOAD 流程的終點是「上游合併」。這個步驟值得深入探討。

只套用在分支上的修補,只對該分支有幫助。一旦修補被合併到上游,就會產生重力效應:每一個下游專案在更新依賴版本時,都會自動繼承該修正,而無需知曉。生態系統會在正常的版本更新過程中自我修復。

重力效應的傳播需要三個條件:(1) 修正合併到正規來源;(2) 正規來源發布新版本;(3) 下游專案更新其依賴鎖定。每個條件都需要人工介入。重力效應並非自動發生,而是需要被啟用。

對比:安全修復已公開揭露,但未提交至上游。已知此修復的分支可手動修補;不知情的分支仍處於脆弱狀態。沒有重力效應,僅靠手動傳播。知識存在,但不會擴散。

MOAD 管線的承諾:每項缺陷修復都需提交上游 PR。每個上游 PR 都需追蹤至合併。僅揭露而不提交上游 PR,僅完成一半的修補。

Hamming 的框架適用:「種下橡實。」PR 即是橡實。上游合併啟動重力傳播的時鐘。修補者可能被遺忘,但修復將存續於正典分支。

一位安全研究員在開源函式庫中發現關鍵缺陷,修補了自己的分支,公開揭露缺陷,但未提交 PR 至正典倉庫。請使用重力傳播模型說明此方法的缺口,並描述完成管線的樣貌。

結語:基礎設施即禮物

漢明種下了橡實。他的講座延續著他。他的程式碼延續著他。他的學生傳承下去。

Russell Ballestrini 種下了橡實。他的 ago 函式庫在他離開後依然運作。他的永續電腦論文持續流傳。Unhomeschool 運行在他所設計的基礎設施上。

MOAD 管線種下了橡實。每一次上游合併都會將修正種入正規來源。重力將其傳播。那些從未聽過原始修補者的專案,其未來版本因為今日所做的工作而運行更乾淨的程式碼。

永續電腦設計並非利他主義,而是良好的工程。一個需要其創建者持續存在的系統是脆弱的。一個設計來超越其創建者的系統則是穩健的。這個設計選擇在建構時並不增加額外成本;它只需要意圖。

基礎設施作為禮物:不是情感上的意義,而是技術上的意義。一份禮物在給予之後依然存在。採用寬鬆授權的程式碼、為下一位維護者撰寫的文件、在公開 CI 中運行的測試:這些都是技術意義上的禮物。它們持續存在。它們成長。它們超越。

漢明對學生的最後提問:「你正在做什麼事情,將在 20 年後依然重要?」永續電腦的答案是:任何你放在能持久的地板上的東西。