我覺得不管是“一切都是檔案”還是“一個工具只做好一件事”,其背後共通的邏輯就是“工程實踐大於理論完美”,或者說“解決問題先於完善架構”。我們知道 UNIX 有很多缺陷。首先就是 C 語言,天生缺乏型別系統,沒有安全的記憶體分配機制,指標導致 segfault 滿天飛。然而它簡單又高效,及時地滿足了核心開發的需求,有一些缺陷也無傷大雅。其次是“一切皆檔案”,或者說基於 raw byte stream 的程式間資訊交換和資訊儲存。缺點是沒有 metadata,沒有型別系統。然而它的普適性很強,只要程式間定好了協議,定好了檔案格式,就可以做各種事情。這樣的設計可以快速地解決問題。而如果要設計一套型別系統,不花大量人力和時間是做不出來的。而且即使做出來了,也可能會存在滿足不了快速變化的需求的問題。比如要求所有 IPC 都使用同一套帶 metadata 的結構化的協議,可能並不適合所有情況,不同型別的服務用不同的協議才更有針對性,更高效。又比如用一套資料庫系統代替檔案系統,可是有了新的檔案型別怎麼辦?檔案的 metadata 欄位不完善又怎麼辦?又比如用統一的配置系統代替每個程式各有各的語法各不相同的配置檔案,又怎麼保證能滿足所有程式的配置需求?要設計一套非常完美的系統是很難的,只有 M$ 這種級別的大公司才能做得出來。但即使是 M$ 也因為揹著沉重的歷史包袱,無法完成這種宏大的工作。M$ 曾試圖把 Windows 設計成一套完美的架構,那就是當年的 Longhorn 計劃,可是到最後卻失敗了,留下了一套先進的 .NET Framework 和仍然必須不斷向後相容的 Win32 API。這就好像 C++ 一樣,既要保持對 C 的相容又要引進現代語言特性,最終變成了一個極其複雜的語言。這並不是說 Windows 或 C++ 不好,而是它們雖然好,卻又沒有做到完美,結果反而對使用者造成了困難。而不管是 UNIX 還是 C,它們雖然簡陋,卻是完善的,這就足夠了。即使我們需要更復雜的東西,也可以在它們上面增加抽象層。對程式設計師來說,UNIX 的架構、層級是簡單的、清晰的。而至於後來 *nix 的上層架構發展沒有 Windows 那麼快,則是因為使用者數量始終上不來,因而也缺乏大公司的支援,我覺得這跟技術本身並沒有關係。我個人認為,真正的新一代作業系統,應該具有以下特點:具有系統級別的型別系統;具有系統級別的資源管理機制;所有資料交換都是帶有 metadata 的結構化資料;資料庫代替檔案系統;對開發者而言記憶體與硬碟之間是透明的,不再有變數和檔案的區別,只有臨時資料和永久資料的區別;由於開發語言的特性以及系統的資源管理,很可能我們不再需要程序,只需要執行緒就夠了,因為語言本身不再可能產生 segfault。(這點有爭議)這究竟有沒有可能實現呢?我對此保留意見。現實世界是很複雜的,真的那麼容易做出抽象嗎?
我覺得不管是“一切都是檔案”還是“一個工具只做好一件事”,其背後共通的邏輯就是“工程實踐大於理論完美”,或者說“解決問題先於完善架構”。我們知道 UNIX 有很多缺陷。首先就是 C 語言,天生缺乏型別系統,沒有安全的記憶體分配機制,指標導致 segfault 滿天飛。然而它簡單又高效,及時地滿足了核心開發的需求,有一些缺陷也無傷大雅。其次是“一切皆檔案”,或者說基於 raw byte stream 的程式間資訊交換和資訊儲存。缺點是沒有 metadata,沒有型別系統。然而它的普適性很強,只要程式間定好了協議,定好了檔案格式,就可以做各種事情。這樣的設計可以快速地解決問題。而如果要設計一套型別系統,不花大量人力和時間是做不出來的。而且即使做出來了,也可能會存在滿足不了快速變化的需求的問題。比如要求所有 IPC 都使用同一套帶 metadata 的結構化的協議,可能並不適合所有情況,不同型別的服務用不同的協議才更有針對性,更高效。又比如用一套資料庫系統代替檔案系統,可是有了新的檔案型別怎麼辦?檔案的 metadata 欄位不完善又怎麼辦?又比如用統一的配置系統代替每個程式各有各的語法各不相同的配置檔案,又怎麼保證能滿足所有程式的配置需求?要設計一套非常完美的系統是很難的,只有 M$ 這種級別的大公司才能做得出來。但即使是 M$ 也因為揹著沉重的歷史包袱,無法完成這種宏大的工作。M$ 曾試圖把 Windows 設計成一套完美的架構,那就是當年的 Longhorn 計劃,可是到最後卻失敗了,留下了一套先進的 .NET Framework 和仍然必須不斷向後相容的 Win32 API。這就好像 C++ 一樣,既要保持對 C 的相容又要引進現代語言特性,最終變成了一個極其複雜的語言。這並不是說 Windows 或 C++ 不好,而是它們雖然好,卻又沒有做到完美,結果反而對使用者造成了困難。而不管是 UNIX 還是 C,它們雖然簡陋,卻是完善的,這就足夠了。即使我們需要更復雜的東西,也可以在它們上面增加抽象層。對程式設計師來說,UNIX 的架構、層級是簡單的、清晰的。而至於後來 *nix 的上層架構發展沒有 Windows 那麼快,則是因為使用者數量始終上不來,因而也缺乏大公司的支援,我覺得這跟技術本身並沒有關係。我個人認為,真正的新一代作業系統,應該具有以下特點:具有系統級別的型別系統;具有系統級別的資源管理機制;所有資料交換都是帶有 metadata 的結構化資料;資料庫代替檔案系統;對開發者而言記憶體與硬碟之間是透明的,不再有變數和檔案的區別,只有臨時資料和永久資料的區別;由於開發語言的特性以及系統的資源管理,很可能我們不再需要程序,只需要執行緒就夠了,因為語言本身不再可能產生 segfault。(這點有爭議)這究竟有沒有可能實現呢?我對此保留意見。現實世界是很複雜的,真的那麼容易做出抽象嗎?