Worse is Better_風聞
code2Real-有人就有江湖,有code就有bug2021-05-20 13:12
worse-is-better 哲學:
* 簡單性(Simplicity)——(代碼或系統)設計一定要簡單,不論它的實現還是接口,都一定要簡單。而相較而言,讓實現保持簡單更重要。簡單是最重要的,其他的特性都不如保持簡單更重要。
* 正確性(Correctness)——在所有可以觀察到的方面,設計一定要正確。但是可以為了簡單而輕微犧牲正確性。
* 一致性(Consistency)——設計一定不能太過不一致。某些情況下,為了保存簡單可以犧牲一致性。如果將某個不常見的情況引入設計,會導致實現變複雜或者不一致,那麼就不要考慮這種情況。
* 完整性(Completeness)——設計一定要儘可能多得涵蓋重要的情況。所有符合預期的情況一定要被覆蓋到。完整性可以為任何其他特性讓步。實際上,一旦威脅到實現的簡單性,完整性必須要被犧牲。如果保持簡單,可以犧牲一致性來實現完整性;尤其是接口的一致性。
早期Unix和C即是這種設計下的完美例子。就把這種設計策略叫做新澤西佬們的策略吧。是的,就是在譏諷他們,為的就是讓你明白這幫新澤西佬們搞出來的實現方式是真的糟糕。
-----------------------------------------------------------------------------
每一個Common Lisp和CLOS的設計者都對MIT/Stanford設計風格都身經百戰,爛熟於心了。這種風格的本質一言蔽之就是做對的事。對於一個設計者來説,(代碼與系統設計)最終要的是需要做到以下幾點:
* 簡單性(Simplicity)——(代碼或系統)設計一定要簡單,不論它的實現還是接口,都一定要簡單。相較而言,讓接口保持簡單更重要。
* 正確性(Correctness)——在所有可以觀察到的方方面面,設計一定要準確。不要妄想做一個不正確的設計。
* 一致性(Consistency)——設計一定不能是不一致的。為了確保一致性,你可以略微犧牲簡單性和完整性。一致性和簡單性同等重要
* 完整性(Completeness)——設計一定要儘可能多得涵蓋重要的情況。所有符合預期的情況一定要被覆蓋到。完整性優先級應該高於簡單性。
我相信,大多數人會同意,這些是好的設計所應該有的特性。我將貫徹了這種設計哲學的實現方式稱作MIT approach。Common Lisp(以及CLOS)和Scheme是MIT approach的代表。
----------------------------------------------------------------------------------------------------
然鵝,我相信worse-is-better哲學卻更能大行其道。在做軟件的時候那幫新澤西佬們的方式比MIT approach更好。。
這兩種哲學的倡議者都是真心實意認為自己更好的。
很久以前,MITer和新澤西佬碰頭開始討論操作系統的相關問題。
MITer對ITS(MIT AI Lab操作系統)是身經百戰了,而且一直在閲讀Unix的資料。最近開發ITS的時候碰到一個問題,就是當用户程序調用系統例程以執行可能具有重要狀態的冗長的操作(例如IO緩衝區)時會出現The PC loser-ing問題。如果在操作期間發生中斷,則必須保存用户程序的狀態。由於系統例程的調用通常是單個指令,因此用户程序的PC無法充分捕獲進程狀態。因為PC會被強制進入loser mode。
MITer沒有看到處理此案的任何代碼,並向新澤西佬詢問如何處理該問題。
新澤西佬:哦。Unixer都知道這個問題,就讓系統例程始終完成,但有時會返回一個錯誤代碼,表示系統例程未能完成其操作。然後,我們相信,正確的用户程序會檢查錯誤代碼以確定是否再次嘗試跑跑系統例程。
MITer(懵了):這不科學!我不喜歡。
新澤西佬:Unix這麼做不對嗎?Unix設計理念本身就很簡單呀。我是真的不懂你們為什麼總把事情搞的這麼複雜。程序員又不是不能輕而易舉地對他進行測試。。。
MITer(質疑):。。可是你們這麼做實現是很簡單,但是你們的功能接口會很複雜啊。。
新澤西佬:trade-off懂嘛?實現簡單更重要。
MITer(喃喃道):那也就是説我寫個helloworld都得心驚膽戰咯。。?
現在我想説worse-is-better更好。
C是為編寫Unix而設計的一種編程語言,它是使用新澤西佬們的方法設計的。因此,C是一種易於編寫一個像樣的編譯器的語言,它要求程序員編寫易於編譯器解釋的文本。有些人稱C是一種奇特的彙編語言。 早期的Unix和C編譯器都具有簡單的結構,易於移植,需要很少的機器資源來運行,並且提供了大約50%-80%的操作系統和編程語言。
近一半的機器性能表現低於中位數,而Unix和C可以很好地在上面工作。 worse-is-better哲學意味着實現簡單性具有最高優先級,這一點使得Unix和C很容易在這些機器上移植。 而又有這一半的機器可以令人滿意地工作,使用他們又何樂而不為呢?
Unix和C是絕對的計算機病毒。
因此,當西方公司竭力向中國推薦unix/linux系統時,就是在往中國國產操作系統中滲沙子,注病毒。他們推銷linux,就象微軟默許windows被盜版一樣包藏禍心。
一旦中國的國產操作系統接受了新澤西模式,就意味着放棄安全性、一致性、完整性,成為漏洞百出的系統,為CIA植入木馬提供方便。
當中國程序員愉快地用簡單的工具編程時,雖然開始時很爽,但是由於接口複雜增加了,使得中國人在整合大系統時遇到很多麻煩很難向更高的層次發展,做成大系統,維護時成了火喪場。
持新澤西佬哲學的還有馬斯克,他的特斯拉和spaceX都堅持新澤西模式。
例如,傳統的航天監控電腦成本上億元,需要要考慮抗空間輻射,但是馬斯克用7台商用CPU解決了問題,用票選算法判斷7個CPU的正確性,這樣將航天電腦的成本降低到20萬美元。
spaceX用的火箭引擎是梅林,反正安全性不用考慮太多了,關注的是推重比和成本。
一枚火箭有9個引擎,當一部分引擎出現故障時,火箭可以靠剩餘的引擎工作。
蘇聯當年也想那樣做,反覆試驗多次都沒成功。
特斯拉更不用説,我以為他會用QNX這樣的實時操作系統呢,結果用了魔改的linux。特斯拉其它部分是能省就省,這樣的產品還要對標超跑,賣超跑的價。
很久以前,有幾個中國人在歐洲一家公司打工時,得到軟件的源碼(可能是有人故意泄露的)。於是他們就趕緊回國開公司賣這個軟件。
幾年後,這個歐洲公司在中國開分公司,總經理還宴請他們幾個人,説感謝他們幫助打開中國市場。
原來,歐洲公司的軟件源碼和框架是分開的,這些中國人得到源碼在中國推廣時發現,小規模時還能用,一旦規模擴大就招架不住了,而歐洲公司因為懂框架原理,所以只須調整幾個參數就能應付大規模應用了。
中國近代經歷百年戰亂,人心不定,不願意踏踏實實地做事,看到什麼都想拷貝複製,這給了西方一個很好的機會。
後面的話就不用我多説了,請自行體會。