當前位置: 華文問答 > 數位

如此復雜的linux作業系統的開發過程是怎麽實作幾十萬個完全互不相識的開發者如此步調一致的協同的?

2022-10-16數位

哦,為什麽我覺得各位講的Linux來自某個高魔的平行世界呢?

在本世界裏,Linux能夠成功,是因為它貫徹了如下兩個核心原則。

原則一:做一件事,把一件事做好。

原則二:明確,不要含糊。

做一件事,把一件事做好

這實際上就是所謂的unix哲學。

這實際上也是「高內聚、低耦合」這個軟體工程第一原則的形象化表述。

舉例來說,unix/Linux下有一個標準程式叫yes,它的作用是連續不斷的輸出y。

嗯,思路很簡單,很多程式會提出一些問題,要求使用者回答Y(yes)或者N(no),這很煩。有時候我們只需要一路Y就足夠了——於是就有了這麽個程式。

很無厘頭,是吧。

但它完美契合unix哲學:做一件事,把一件事做好。

它就連續輸出y,這難道還不夠好嗎?

類似的,寫內核,行程排程模組就是行程排程,就只做這一件事,並把這件事徹底做好。

只做這一件事,意思就是行程排程只做行程排程,不要管虛擬記憶體;把這件事徹底做好,意思就是要支持一切優秀的行程排程演算法、處理好包括驚群問題在內所有問題。

你看,這也並不容易。

當系統的每個模組、每個元件都只做一件事、並把這件事做到極致時,是不是其他人就可以信賴你了?

對吧,最好的行程排程器就在這裏,你幹嘛不配合它?

那麽,Linus先寫了內核(包括記憶體管理、行程排程等部份),品質上佳、功能完善;然後,其他人是不是就可以在這個穩固的基礎上,開發驅動程式、內核模組以及shell了?

最終,Linux系統的確復雜,程式碼量/模組數目/功能點可以說是史無前例的;但,它的每個功能、每個模組,都簡單、清晰——只做一件事,把一件事做好。

如此一來,是不是每個開發者都可以定下心、不用擔心其他、專註於「做自己的事,把事情做好」?

你要每個模組都想搞「大而全」,一個功能在不同人不同層級的不同模組實作了八千遍,只因為這個功能可以「變現」——這些破玩意兒還可能配合的起來嗎?

因此, 只做一件事,把一件事做好 ,這就是Linux能夠成功的核心秘訣。

明確,不要含糊

前面提到了unix哲學「只做一件事,把一件事做好」,這很好;但問題來了:達到什麽標準,才算是「做好」?

你看,我要覺得「大而全就是好」,那是不是就徹底亂套了?

答案很簡單:明確,不要含糊。

比如說,yes,它就是反復輸出y,也可以輸出使用者指定的其他字串——它的行為是可以預測的,它的參數是清晰明確的,沒有任何含糊之處。

類似的,我們知道,rm -rf 是極其危險的一個命令,它的作用是刪除指定目錄以及其子目錄下的所有檔。每年都有無數新手rm -rf了自己的根目錄、搞死了自己的系統,甚至把某些小公司搞破產……

那麽,我們是不是應該讓rm -rf多一些提示、多一個挽回機會?

答案是:不行!

因為rm的作用就是刪除檔或者目錄,-r參數就是遞迴刪除,-f就是強制刪除無需提示——你改了,看似安全了,但實際上就把命令的作用/含義搞含糊了。

比如說,使用者可能會說,為什麽rm -rf /sbin時會提示後才執行,但rm -rf /var/www/data時無提示就執行了?我搞網站營運的,這玩意兒是最值錢的東西!反而是/sbin,刪了就刪了,我覆蓋安裝一下就能恢復,/var/www/data可是無法恢復的!

尤其是,如果在機器A上面,你用alias把rm搞「安全」了;那麽在機器B上,你是否可以習慣性的認為rm安全?

清晰,明確,危險的東西就該讓它危險,這才能確保整個系統狀態清晰、每個命令每個操作結果都可以預測——而這個清晰、精確、可預測的整體狀態,又有助於盡快暴露缺陷、免得藏匿bug。

類似的,行程控制表的定義,kernel module的介面標準/行為規範,一切都有清晰、明確的成文標準;只要你符合標準,哪怕寫出了bug,也可以在執行時透過rmmod命令清出記憶體、不影響內核其它部份。

最復雜、最困難的內核都能如此,何況那些更簡單、風險更小的UI界面。

當然,正因為UI設計不得不遷就不夠專業的使用者、使得「明確,不要含糊」的標準不能徹底貫徹——即所謂的「傻瓜界面」——這才使得它的GUI部份不夠穩定。

原因很簡單,「傻瓜」所以就必須包容、就必須允許一些模棱兩可的狀態、就必須猜測使用者動機然後做一些「模糊」操作——而這些,就使得系統狀態不夠明確,就有了含糊余地,然後自然就難以保證正確性了。