聊一聊第三個系統
最近,我剛好在和我的同事一起重寫 VSCode 的一部分小功能,重寫過程中有一些特定的感受。正好就著最近流行的操作系統話題,寫寫我的想法。因為某種協議的存在,不想為自己尋找麻煩,我這里就稱為第三個系統。
系統是由一些相互聯系、相互制約的若干組成部分結合而成的、具有特定功能的一個有機整體(集合)。這些要素可能是一些個體、元件、零件,也可能其本身就是一個系統(或稱之為子系統)。
所以,如果是一類操作系統的話,那么以系統來定義為更加合適。
三個系統
提及到第三個系統的時候,我想到的是一本很不錯的小冊子(書),其名為《Linux/Unix 設計思想》。這本書主要是在講 Linux/Unix 相關的哲學(實際上,我一直覺得這樣的書很容易寫,學好 Linux 和哲學,然后將哲學套到 Linux/Unix 上即可。唯一的難點是:跨領域知識)。
先簡要地說說三個系統的定義:
- 在背水一戰的情況下,人類創建了『第一個系統』。PS:沒有足夠的時間將事情做好。
- 『專家』使用『第一個系統』驗證過的想法來創建『第三個系統』。PS:『第二個系統』由委員會設計,『第二個系統』臃腫而緩慢。
- 『第三個系統』由那些為『第二個系統』所累的人們創建。PS:『第三個系統』結合了『第一個系統』和『第二個系統』的最佳特征。『第三個系統』的設計者有充裕的時間將任務做好。
結合之下來看,我們就會發現一些非常有意思的事情:
- 充裕的時間,才能讓我們完成一個更好的系統。
- 『第二個系統』是擁有足夠的專家和時間來完成的。
- 『第三個系統』結合了『第一個系統』和『第二個系統』的最佳特征。
由上會產出一些有意思的推論:在有充足時間和資源的情況下,我們可能設計出的是 Windows Phone,巨硬(微軟)的專家太多了。
新的專家
專家不論在哪里都是一種稀缺的資源,要不這個世界怎么會有咨詢公司的存在呢。
開發一個操作系統并不困難。市面上已經有了各種琳瑯滿目的書籍,從《操作系統導論》到《自己動手寫操作系統》、《30 天自制操作系統》,馬上培訓班就會出出《7 天自制操作系統》。
今天,我們基本已經達成了共識,開發一個系統的難點主要在于『生態』。為了生態,它可能要兼容一個系統的 API,這會導致系統臃腫。為了生態,它需要連帶上下游一起豐富起來。為了生態,還需要開發各種各樣的工具……
舉個我們熟悉的 Android 系統為例,它的操作系統的源碼(包含上下游工具)大概 120 G,它的開發工具 IDE 大概 60 G……。這個過程中涉及到大量的計算機相關的核心技術:編譯器、虛擬機、操作系統、編譯器優化、構建系統、圖形編程……。就這么來說吧,它幾乎快包含這一個領域需要的所有知識。而,你并沒有時間預先的進行研究。
就構建來說,Android 系統因為大量的上下游,所以就需要:LLVM、Gradle、CMake、Bazel、GCC、Clang、Soong、Ninja……。而從編程語言上來看,所需要的語言知識有:Java、C++、C、Groovy、Kotlin。而除了這些,還有大量與硬件、芯片相關的知識。
因此,經此一役,這一世界又多了一個能造操作系統的國家。
復刻更難
最近,我和我的同事一起在使用 Rust 重寫 VSCode 的詞法分析工具。起先,我以為這是一件容易的事情,都是 TypeScript 嘛。寫寫測試,直接翻譯就完了。然而,事實并非如此。
- 需要深入理解原有邏輯。不斷地調試舊系統的邏輯,并重新梳理思路。
- 業務未剝離,導致大量耦合。語言之間存在用法上的差異,需要追溯用法上的差異和類型上的差異。哪怕是原文上寫一個無用的 if-else,你都要糾結半天。更不用說,它可能有大量無用的代碼。因此,我們需要尋找一種有效的方式來搞定,比如 TDD。
- 語言交互接口(FFI)。Oniguruma 是我們所使用的正則庫,而且還有指針的指針。
……
相似的,對于一個復雜的系統來說,各種子系統之間的耦合度更是難于剖析 —— 需要大量不同領域的知識。每個問題不單純只是某一語言、技術棧的問題,它往往是跨越了多個系統的問題。
結論
沒有銀彈。
本文轉載自微信公眾號「phoda」,可以通過以下二維碼關注。轉載本文請聯系phoda公眾號。