最近和幾個朋友喫飯,談起國產操作系統應該怎麼做的問題。我這個人,寫程序寫慣了,啥東西都喜歡建邏輯,這是我處理信息的方式,所以把一些想法串起來,整理在這裡。這不表示我提出什麼結論了,就好像我以前談過「道紀」的概念,這僅僅是一個「道紀」,不是結論。

很多時候,你問我一個問題,我在進行邏輯推演前,我都沒有結論的,完成推演以後,我才會有結論,但這個結論不一定就是我寫出來的那個結論。正如以前說過,邏輯是是超越真實的存在,是一個動態的真實。這就是道紀。

首先我收縮一下範圍,我不在乎某個操作系統是誰做的這個名。如果都可以用Windows,都可以用Android什麼的,就算他們不是國產的,我都不覺得這是需要解決的問題。我們要解決問題,不是要求名。

比如,Android的AOSP,這本來就是開源的,根據GPL和Apache協議,提供者無權拒絕你使用這個源代碼,所以,如果你僅僅覺得代碼不是你自己寫的,就想著要自己重新寫一個,這是神經病,我不討論這種類型的問題。

還聽有人說過自己寫的纔不會被別人留下漏洞,這個同樣沒有意義,漏洞是邏輯破綻,寫好的邏輯你都找不出破綻,你自己從頭寫一個你就能避免邏輯破綻?這個理論不過腦子。

所以,我們需要國產OS的核心問題不是這個名的問題,不是人家有,我也要有。軟體和硬體不一樣。軟體拷貝是沒有成本的,人家做好一輛汽車,我要自己做一輛才能擁有這個汽車。軟體不需要,軟體拷貝了就能用,不需要消耗鋼材橡膠和汽油。

這裡涉及軟體一個普通人無法理解的特點,是我們很多人對自研操作系統的問題建不出有效邏輯的原因。這個特點是:軟體是一個動態的,組件可換的存在。

這句話說出來很容易理解,很多人以為自己瞭解,但其實你不理解。很多人討論軟體研發的時候,常常詢問「技術沙盤」是什麼。比如,做一個操作系統吧,投資人問:「操作系統的技術沙盤是什麼樣的?」——聽起來挺合理的。部分軟皮蛇架構師就開始列了:

BIOS,SecureFireware,調度器,驅動框架,IPC,中斷管理,設備管理,文件,libc,調試器,工具鏈……

這感覺就好像開地圖一樣,打開一個點,打個Mark,再打開一個點,再打個Mark,或者標記「完成30%」。還整個顏色,開始是灰的,超過30%變黃,超過80%的就變成綠色,等整個沙盤都變成綠色的了,就認為「我們擁有了自研的操作系統」了。

這完全是外行。

因為你忘了前面那個前提了:軟體是一個動態的,組件可換的存在。

所有你提到的這些部件,它們都沒有完成度一說,一直是一個動態變化的過程。也沒有某個東西必須存在一說,你的操作系統可以一直缺很多東西,但用於某個資料庫節點,只要你把資料庫支持好,它就可以是100%的完成度。而且你要不斷投入人力,保證你這個操作系統能支持一個市場最優的資料庫,這個操作系統就是成功的,否則就算你打通了所有所謂沙盤組件100%的完成度,這個東西都是個垃圾。

這樣我們就能理解「國產操作系統」的真正需求是什麼驅動的:比如你使用AOSP,後面真的和Google交惡了,Google決定不給你下個版本了,你真正的問題是:你不能維持你的發展了。

有人可能覺得「不能維持就不能維持唄,用點舊的也沒有啥的」。我不知道各位跑過俄羅斯沒有?俄羅斯機場過關是我見過最慢的通關關口了。我注意了一下,其實關員也沒有特別怠工,他們是等那個掃描和識別系統等太久了。我大概去了解了一下原因,據說是由於西方國家禁運,他們這部分設備全部是自研的,自研完成後也沒有別的競爭驅動了,就一直這麼用著,這個技術就迅速出現代差了,有和沒有就沒有多大區別了。

技術這東西,不是說你有就夠了的。蘇俄堂堂科技大國,淪落到賣資源為生。技術競爭的失敗,後果是很難看的。

所以,操作系統研發,不是一個有無的問題,而是一個如何維持的問題。你基於某個Linux發行版,乃至BSD發行版,直接做一個,再通過強制使用來澆灌市場,這不是不可以。但沒有競爭,這個東西會開始停滯,然後拖慢你生態上的所有技術發展。比如你做一個「飛龍Linux」,要求QQ,Office就要支持這個平臺,國家給補貼。研發這個Linux的那個組織錢都拿到了,哪裡有興趣給你升級?然後QQ拿到你的補貼,給你移植了一個版本,後面升級,怎麼升?——還用說嗎?當然是升級給最新Windows那個版本了,哪有空給你升飛龍那個版本啊,那個版本自己的Bug都不修,還指望通過它優化用戶體驗?

我們需要這樣來理解研發操作系統是怎麼回事,才能發現問題的關鍵在什麼地方,如果你拿著技術沙盤這種煞筆玩意兒,就不要指望搞明白為什麼錢都扔水裡了。

實際上,很多所謂的操作系統研發企業,我能一眼看出它是真的還是假的,就是你去查它的生命週期計劃就可以了。它一個版本打算維護多少年?下一個版本的研發怎麼切換上來?如果它沒有這樣的計劃,基本上意味著它就沒有想過持續維護這攤子事呢,這種東西你想構成生態?這是緣木求魚。

對於生命週期管理,這就涉及軟體構架的問題了。軟體構架這個詞語說出來很高大上,其實大部分時間,它解決的是個非常直接的問題:怎麼把多個發展的邏輯綜合到一段代碼中。

你一開始寫一段代碼,比如說搜索吧:建一顆平衡二叉樹,處理增刪找,三個函數提供API,搞定。這段代碼寫起來沒有什麼難度。

好了,現在我是在多核裡面做的,多個線程同時可以訪問這個增刪找,這段代碼的壓力就大了,因為你要上鎖來保證多個核同時來增刪找,互相不能衝突,鎖密了性能低,疏了介面受限。

好,你解決這個問題了,然後新需求決定發現這段代碼需要持久化,也就是說,這個數據結構,在特定場景下,需要被寫入到磁碟,在部分時候需要從磁碟中恢復,而且在這個寫入和恢復的過程中,我還需要繼續增刪找。這樣,相同的流程中必須加上和持久化流程互斥的代碼了。

然後我需要在10種硬體上都能跑,他們的原子操作行為是不一樣的。所以,你的鎖操作在不同平臺上使用的上鎖方法不同。

然後這些硬體的endian也是不一樣的,你進行持久化的過程中需要對不同的情況進行處理

然後Cache Flush的方法是不一樣的……

你看,本來很簡單的一段代碼,只不過落地的時候面對不同的情形,同一段代碼就會面對無數的問題。本來簡單的三個語句,每個上面都要加上一個if,if裡面可能要調一個函數。這個複雜度會複雜到你無法忍受。

而且他們會互相衝突,增加記錄的時候需要上鎖,但上鎖的時候不能做Cache Flush,否則他們自相矛盾了。

到複雜度高到你無法忍受的時候,你就只能對整個演算法拉分支:比如BigEndianLocklessBalanceTreeV1,LittleEndianHeavyLockBalanceTreeV2.2。

但你拉了分支,上層使用你的模塊就需要加一堆的if,else。用你不同的庫。所以我們說架構設計是一門藝術。你手上並沒有嚴謹的邏輯來進行決策,它不是個「已知記錄,記錄長度,key,求記錄value」這種問題,你看著自己有無限的自由,最後被自己的選擇綁住所有的自由度。

作為一種常見的工程實踐,我們會同時維護「構架分支」和「戰地分支」,「構架分支」承擔所有的複雜度,但性能不高,功能受限。因為他要盡量保護邏輯的生存能力。讓核心的增刪找在最多的場合裡面可以用。而戰地分支用於在具體的用用場閤中「落地」,當我們進行落地的時候,如果被落地的場合沒有多核,我們就可以不上鎖,場合就是Little Endian的我們可以不做位元組序轉換,沒有Cache Flush需求的可以不做這個操作。這樣,我們可以保證性能的情況下,把其他優化邏輯加上去。但很明顯戰地分支的生存能力是非常受限的。

架構師是在構架分支和戰地分支上平衡的人,他既要保證代碼的生存能力,也要保證應用時的競爭力,才能保證這個東西可以生存下去。對於操作系統,能否生存下去,構架操縱能力是第一要素。每種具體的技術都能搞定,搞定以後是否把未來的所有改進都堵死了,這纔是關鍵問題。

國內企業最大的問題,在長期的競爭中,一直把時間放在了戰地分支上,對如何維護構架分支一無所知。他們以為他們落地在自己手機中,或者雲伺服器上的Android和Linux比「主線」更「先進」,卻沒有注意到,他們只是在消耗構架分支為他們建立的發展優勢。如果你需要自己維持一個分支,很快就會掉入自相矛盾的邏輯陷阱中了。

這個問題非常難解決,因為我們無法評估一個架構分支的架構好不好的,這個東西性能最低,功能最差,所有人都喫它的好處,卻自以為自己比它好。沒有強力的資源和環境支持,很難活下去。

稍微說遠一點。架構分支控制是個非常複雜和困難的問題。是那種典型的「努力也不能解決問題」的問題類型。很多人開始做自己的分支的時候,喜歡說,我從一個上游分支裡面做Deviation。比如,他們會宣稱「我兼容CentOS」。但你這樣想,完全兼容CentOS的發行版,只有CentOS本身。所以,只要你拉了分支,響應了獨立的需求,你就不可能兼容CentOS。就算你僅僅是在裡面加了一個應用,你已經導致了「新的應用不能和你加的應用名稱、位置衝突」這個不兼容了。更大的問題是我們前面說的:軟體是個動態的,組件可換的存在。CentOS是動態升級的,每個星期都有安全補丁。那麼你的分支也要支持這個同步嗎?如果你支持,基本上你自己的Deviation就很難有自己的響應能力了。作為這個系統的使用者或者應用開發者,根本不會在意你的Deviation了,他們將在意的是CentOS的發展(相應地你也失去了前面說的,對方不給你供貨時或者你和對方有技術分歧的時候,你自己的發展能力)。如果你不支持——難道CentOS的升級是喫飽了撐的?你失去了這個升級能力,你這也不是「兼容CentOS」了。所以,你不要指望談需求的時候談你的Deviation,談兼容的時候談你的同步升級。這兩者仍是自相矛盾的邏輯。

好了,我們完成問題的理解,知道困難在哪裡了。現在看看可以如何突破。操作系統是個生態問題,沒有人用操作系統是為了用操作系統本身的,都是為了用上面的應用,而應用願意適配到這個操作系統上,要素是:

  1. 這個操作系統有足夠的用戶量
  2. 這個操作系統有足夠好的開發環境(不好用也就罷了,但你別連功能都沒有啊)
  3. 這個操作系統能發展下去(不會發展兩三個版本就自相矛盾運作不下去了)

這樣,自研國產操作系統的基本要求就出來了:

  1. 必然基於現有的開源系統來改,最多替換其中部分關鍵部件(否則維持不住Toptip的競爭)
  2. 由大型商業企業提供類似手機或者ChromeBook一類的軟硬體整合解決方案,而且初期核心軟體必須通過投資或者合作開發的方式直接集成
  3. 換掉幾批架構師後培養出來的架構能力

關於最後一點,感覺必須直接開源運作纔有可能真正做成,原因是開源運作才會保證一代死掉後,有其他人可以在某個基礎上試著接著上。(第二點保證即使操作系統開源運作,但商業企業仍能盈利)

除此之外,我暫時想不出還有什麼可行的解決方案。

推薦閱讀:

相關文章