國產作業系統問題
最近和幾個朋友吃飯,談起國產作業系統應該怎麼做的問題。我這個人,寫程式寫慣了,啥東西都喜歡建邏輯,這是我處理資訊的方式,所以把一些想法串起來,整理在這裡。這不表示我提出什麼結論了,就好像我以前談過“道紀”的概念,這僅僅是一個“道紀”,不是結論。
很多時候,你問我一個問題,我在進行邏輯推演前,我都沒有結論的,完成推演以後,我才會有結論,但這個結論不一定就是我寫出來的那個結論。正如以前說過,邏輯是是超於真實的存在,是一個動態的真實。這就是道紀。
首先我收縮一下範圍,我不在乎某個作業系統是誰做的這個名。如果都可以用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,LittleEndianHeavyLockBalnceTreeV2.2。
但你拉了分支,上層使用你的模組就需要加一堆的if,else。用你不同的庫。所以我們說架構設計是一門藝術。你手上並沒有嚴謹的邏輯來進行決策,它不是個“已知記錄,記錄長度,key,求記錄value”這種問題,你看著自己有無限的自由,最後被自己的選擇綁住所有的自由度。
作為一種常見的工程實踐,我們會同時維護“構架分支”和“戰地分支”,“構架分支”承擔所有的複雜度,但效能不高,功能受限。因為他要儘量保護邏輯的生存能力。讓核心的增刪找在最多的場合裡面可以用。而戰地分支用於在具體的用用場合中“落地”,當我們進行落地的時候,如果被落地的場合沒有多核,我們就可以不上鎖,場合就是Little Endian的我們可以不做位元組序轉換,沒有Cache Flush需求的可以不做這個操作。這樣,我們可以保證效能的情況下,把複雜度降下來。但很明顯戰地分支的生存能力是非常受限的。
架構師是在構架分支和戰地分支上平衡的人,他既要保證程式碼的生存能力,也要保證應用時的競爭力,才能保證這個東西可以生存下去。對於作業系統,能否生存下去,構架操縱能力是第一要素。每種具體的技術都能搞定,搞定以後是否把未來的所有改進都堵死了,這才是關鍵問題。
國內企業最大的問題,在長期的競爭中,一直把時間放在了戰地分支上,對如何維護構架分支一無所知。他們以為他們落地在自己手機中,或者雲伺服器上的Android和Linux比“主線”更“先進”,卻沒有注意到,他們只是在消耗構架分支為他們建立的發展優勢。如果你需要自己維持一個分支,很快就會掉入自相矛盾的邏輯陷阱中了。
這個問題非常難解決,因為我們無法評估一個架構分支的架構好不好的,這個東西效能最低,功能最差,所有人都吃它的好處,卻自以為自己比它好。沒有強力的資源和環境支援,很難活下去。
好了,我們完成問題的理解,知道困難在哪裡了。現在看看可以如何突破。作業系統是個生態問題,沒有人用作業系統是為了用作業系統本身的,都是為了用上面的應用,而應用願意適配到這個作業系統上,要素是:
- 這個作業系統有足夠的使用者量
- 這個作業系統有足夠好的開發環境(不好用也就罷了,但你別連功能都沒有啊)
- 這個作業系統能發展下去(不會發展兩三個版本就自相矛盾運作不下去了)
這樣,自研國產作業系統的基本要求就出來了:
- 必然基於現有的開源系統來改,最多替換其中部分關鍵部件(否則維持不住Toptip的競爭)
- 由大型商業企業提供類似手機或者ChromeBook一類的軟硬體整合解決方案,而且初期核心軟體必須通過投資或者合作開發的方式直接整合
- 換掉幾批架構師後培養出來的架構能力
關於最後一點,感覺必須直接開源運作才有可能真正做成,原因是開源運作才會保證一代死掉後,有其他人可以在某個基礎上試著接著上。(第二點保證技術作業系統開源運作,但商業企業仍能盈利)
除此之外,我暫時想不出還有什麼可行的解決方案。