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