Web 應用程序設計中是否已經放棄了 Unix 哲學?
Unix 哲學鼓勵使用小型的、一般可重用的協作程序,這些程序與管道、fifo、套接字等程序間通信形式協作,而不是共享記憶體空間和連結。MH 和 uzbl 程序通常作為在其設計中體現 Unix 哲學的應用程序範例給出。
如果真是這樣,難道 Unix 哲學在 Web 應用程序的設計中已經完全被拋棄了嗎?幾乎所有處理請求的 Web 應用程序現在都建構為單個大型、整體式長時間執行的程序,這些程序不僅處理一個資源,而且處理整個域中的所有資源的整個請求/響應週期(除了對外部數據庫程序的呼叫)。
這主要是因為管道到外部程序集合以建構對 Web 請求的動態響應具有過多的程序啟動時間成本嗎?如果您想通過管道輸出到 Ruby 或 Python 腳本,我可以看到這種情況,但也許如果您使用像 Haskell 這樣可以編譯的語言,那麼在建構 Web 應用程序時遵循 Unix 哲學的任何真正障礙都會消失嗎?
我認為這很大程度上取決於您在應用程序之間劃定界限的位置(即您對應用程序的定義是什麼),以及您考慮了哪些案例。
雖然您可以將 Web 瀏覽器實現為
wget
/的合併curl
,但它是一個 HTML/XML 解析器,可以為每個文件節點呼叫簡單的應用程序,一個獨立的 JavaScript 引擎可以與所有這些互動,以及一個“簡單”的顯示器“只是”將上面的輸出放在螢幕上(並將輸入返回到一些核心協調過程)它會比(可能任何)今天的其他瀏覽器更混亂。至於將數據傳送到外部程序 - 這就是它實際開始的方式。如果您關心平均 Web 應用程式碼的大小,是的,它們通常很大(而且通常是因為它們是位於以解釋性程式語言而不是“簡單”應用程序編寫的平台之上的一層),但是比較一下到他們的等價物。電子郵件客戶端、辦公套件……應有盡有。所有這些都非常複雜,並且具有太多功能,無法作為通過管道進行通信的幾個程序來實現。因為您使用這些應用程序的任務通常也很複雜。複雜問題沒有好的簡單解決方案。
也許是時候看看 UNIX 座右銘“只做一點但擅長它的應用程序”背後的動機了。將“應用程序”替換為“通用模組化單元”,您將獲得基本的良好程式實踐之一:模組化地做事,以便部分可以重複使用和單獨開發。這才是真正重要的,恕我直言(程式語言的選擇與它幾乎沒有關係)。
ps (在評論之後):從最嚴格的意義上講,您基本上是對的-Web 應用程序沒有遵循 UNIX 哲學(被拆分為幾個較小的獨立程序)。然而,應用程序是什麼的整個概念似乎相當模糊——在某些情況下
sed
可能會被認為是應用程序,而它通常只是充當過濾器。因此,這取決於您要如何理解它。如果您使用程序的通常定義 - 作為單個程序執行的東西(在核心看到的意義上),那麼例如由模組在 httpd 中解釋的 PHP Web 應用程序是完全相反的。載入的共享庫是否仍屬於單個程序的範圍(因為它們使用相同的地址空間),還是它們已經更加分離(從程序員的角度來看是不可變的,完全可重用並通過定義良好的 API 進行通信)?
另一方面,當今的大多數 Web 應用程序都分為客戶端和伺服器部分,它們作為單獨的程序執行——通常在不同的系統上(甚至在物理上分離的硬體上)。這兩個部分通過定義良好的(通常是文本的)介面(基於 HTTP 的 XML/HTML/JSON)相互通信。通常(至少在瀏覽器中)有多個執行緒正在處理應用程序的客戶端(JavaScript/DOM、輸入/輸出…),有時甚至是執行外掛的單獨程序(Java、Flash、… )。這聽起來與最初的 UNIX 哲學完全一樣,尤其是在 Linux 上,執行緒是(幾乎)任何帳戶的程序。
除此之外,伺服器部分幾乎總是分成幾個不同的部分——對結構化(或非結構化)數據執行請求操作的獨立數據庫引擎就是一個典型的例子。將數據庫集成到 Web 伺服器中沒有多大意義。然而,將數據庫拆分為幾個專門用於解析請求、從數據儲存中獲取數據、過濾數據的程序也沒有多大意義……人們必須在創建一個無所不能的龐然大物和一個無所不能的龐然大物之間取得平衡。一群幾乎無能的工人,他們大部分時間都在互相交談。
至於文本界面:請注意,40 年前處理的數據在今天不一定正確 - 二進制格式在反序列化所需的空間和功率方面更便宜,而且數據量要大得多。
另一個重要的問題是,UNIX 哲學的實際目標是什麼?我不認為數值模擬、銀行系統或可公開訪問的照片畫廊/社交網路曾經有過。然而,執行這些服務的系統的維護肯定已經並且很可能會在未來進行。