“差點(diǎn)的更好“設(shè)計(jì)理念的興起

0 評(píng)論 9534 瀏覽 0 收藏 13 分鐘

我和幾乎所有的Common Lisp和CLOS(Common Lisp Object System)的設(shè)計(jì)者都極度深受麻省理工學(xué)院/斯坦福大學(xué)(MIT/Stanford)設(shè)計(jì)風(fēng)格的影響。這種風(fēng)格的本質(zhì)可以用“正確的做法(the right thing)”這個(gè)短語來概括。對(duì)于這樣的設(shè)計(jì)者,重要的就是要遵循下面的這些設(shè)計(jì)理念:

  • 簡(jiǎn)單性—設(shè)計(jì)必須簡(jiǎn)單,這既是對(duì)實(shí)現(xiàn)的要求,也是對(duì)接口的要求。接口的簡(jiǎn)單要比實(shí)現(xiàn)的簡(jiǎn)單更加重要。
  • 正確性—設(shè)計(jì)在任何值得注意的方面都要保證正確。不正確是絕對(duì)不允許的。
  • 一致性 — 設(shè)計(jì)必須保持一致兼容。設(shè)計(jì)可以允許輕微少量的不簡(jiǎn)單和不完整,來避免不一致。一致性和正確性同等重要。
  • 完整性—設(shè)計(jì)必須覆蓋到實(shí)際應(yīng)用的各種重要場(chǎng)景。所有可預(yù)料到的情況都必須覆蓋到。簡(jiǎn)單性不能過度的損害完整性。

我相信大部分的人都會(huì)同意,這些理念都是一些好的實(shí)施原則。我把采用這種設(shè)計(jì)哲學(xué)的方法叫做“麻省理工方法(MIT approach)”。Common Lisp(包括CLOS)和Scheme代表著麻省理工方法的設(shè)計(jì)和實(shí)現(xiàn)。

“差點(diǎn)的更好(Worse is Better)”的理念只是稍微有點(diǎn)不同:

  • 簡(jiǎn)單性—設(shè)計(jì)必須簡(jiǎn)單,這既是對(duì)實(shí)現(xiàn)的要求,也是對(duì)接口的要求。實(shí)現(xiàn)的簡(jiǎn)單要比接口的簡(jiǎn)單更加重要。簡(jiǎn)單是設(shè)計(jì)中需要第一重視的因素。
  • 正確性—設(shè)計(jì)在任何值得注意的方面都要求正確。為了簡(jiǎn)單性,正確性可以做輕微的讓步。
  • 一致性— 設(shè)計(jì)不能過度不兼容一致。為了簡(jiǎn)單,一致性可以在某些方面做些犧牲,但與其允許設(shè)計(jì)中的這些處理不常見情況的部分去增加實(shí)現(xiàn)的復(fù)雜性和不一致性,不如丟掉它們。
  • 完整性 — 設(shè)計(jì)必須覆蓋到實(shí)際應(yīng)用的各種重要場(chǎng)景。所有可預(yù)料到的情況都應(yīng)該覆蓋到。為了保證其它幾種特征的品質(zhì),完整性可以作出犧牲。事實(shí)上,一旦簡(jiǎn)單性受到危害,完整性必須做出犧牲。一致性可以為實(shí)現(xiàn)的完整性作出犧牲;最不重要的是接口上的一致性。

早期的Unix和C語言是使用這種設(shè)計(jì)理論的代表,我把采用這種設(shè)計(jì)策略的方法叫“新澤西方法(New Jersey approach)”。我一直在有意的諷刺這種“差點(diǎn)的更好”理論,讓人們相信它顯然是一種不好的理論思想,新澤西方法就是一種不好的軟件實(shí)現(xiàn)方法。

然而,我相信,即使在一種假象的情況下,這“差點(diǎn)的更好”理論也要比“正確的做法”理論有更大的生存空間,也就是說,在軟件開發(fā)上,新澤西理論要比麻省理工理論更實(shí)用。

讓我來復(fù)述一個(gè)故事,向大家展示麻省理工方法和新澤西方法之間的真實(shí)區(qū)別,以及為什么各個(gè)理論的支持者都完全的相信他們的理論更好。

兩位著名的人物,一位是來自麻省理工,另一位來自伯克利學(xué)院(但是研究Unix的)。一次,他們遇到一起討論操作系統(tǒng)問題。來自麻繩理工的人對(duì)ITS(麻省理工學(xué)院人工智能實(shí)驗(yàn)室的操作系統(tǒng))非常熟悉,并閱讀過Unix的源代碼。他對(duì)Unix如何解決PC機(jī)的loser-ing問題非常有興趣。當(dāng)一個(gè)用戶程序調(diào)用系統(tǒng)例程去執(zhí)行一個(gè)長(zhǎng)時(shí)間的、并包含有重要狀態(tài)的操作時(shí),例如IO緩沖,loser-ing問題就有可能出現(xiàn)。如果在執(zhí)行這個(gè)操作時(shí),發(fā)生了中斷,用戶程序的狀態(tài)必須被保存下來。因?yàn)閷?duì)系統(tǒng)例程的調(diào)用通常是單指令的,運(yùn)行用戶程序的PC機(jī)無法捕捉到例程的過程狀態(tài)。系統(tǒng)例程要么退出,要么強(qiáng)行繼續(xù)運(yùn)行?!罢_的做法”是退出,復(fù)原用戶程序調(diào)用系統(tǒng)例程的指令,讓用戶程序在中斷之后能重新恢復(fù)運(yùn)行,例如,重新進(jìn)入系統(tǒng)例程。這被叫做“PC loser-ing”,因?yàn)镻C機(jī)被強(qiáng)制進(jìn)入一種“弱勢(shì)(loser)模式”,其中,“弱勢(shì)”者是麻省理工對(duì)“用戶”的一種愛稱。

麻省理工的人沒有看到有任何的用來處理這種情況的代碼,問新澤西人,Unix是如何處理這種問題的。新澤西人說,Unix人清楚這個(gè)問題,但提供的解決方式是針對(duì)系統(tǒng)例程通常能正常完成的情況的,當(dāng)系統(tǒng)例程不能成功的完成運(yùn)行時(shí),它會(huì)返回一個(gè)錯(cuò)誤碼,指示操作運(yùn)行失敗。一個(gè)正確的用戶程序這時(shí)需要去檢查這個(gè)錯(cuò)誤碼來決定是否需要再次調(diào)用這個(gè)系統(tǒng)例程。麻省理工人不喜歡這個(gè)解決方案,因?yàn)檫@不是“正確的做法”。

新澤西人說,Unix的解決方案是正確的,因?yàn)閁nix的設(shè)計(jì)理論是追求簡(jiǎn)單,而這“正確的做法”太復(fù)雜。除此之外的好處是,程序員能容易的添加這種錯(cuò)誤探測(cè),重復(fù)他們的操作。麻省理工人指出,這種實(shí)現(xiàn)方案確實(shí)簡(jiǎn)單,功能性上的接口卻變的復(fù)雜。新澤西人指出,這就是Unix在設(shè)計(jì)上做出的合適的取舍。實(shí)現(xiàn)上的簡(jiǎn)單比接口上的簡(jiǎn)單更重要。

麻省理工人這時(shí)嘟囔著說:有時(shí)你需要讓一個(gè)強(qiáng)壯的人去變成一種軟弱的小雞。新澤西人沒明白他是什么意思(我也不太明白)。

現(xiàn)在,我開始主張“差點(diǎn)的更好”確實(shí)是更好。C語言是一種為開發(fā)Unix而設(shè)計(jì)的語言,它的設(shè)計(jì)采用的是新澤西方法。C語言因此是一種很容易就能寫出漂亮的編譯器的語言,它要求程序員編出的代碼要易于編譯器去解釋。有些人稱C語言為高級(jí)匯編語言。早期的Unix和C編譯器都非常的簡(jiǎn)單,易于移植,需要很少的硬件資源來運(yùn)行,它提供了你從一個(gè)操作系統(tǒng)和編程語言里想得到50%—80%的功能。

現(xiàn)有的機(jī)器有一半在任何方面都低于中等配置水平(更小,更慢)。而Unix和C語言在它們上面運(yùn)行良好?!安铧c(diǎn)的更好”理論表明實(shí)現(xiàn)的簡(jiǎn)單性具有最高的優(yōu)先級(jí),這意味著Unix和C語言很容易在這些機(jī)器上進(jìn)行移植。因此,如果任何一臺(tái)機(jī)器,Unix和C能在功能性上提供50%的支持,那它就會(huì)無處不在了。Unix和C就是這樣,不是嗎?

Unix和C語言是終極電腦病毒。

“差點(diǎn)的更好”理論另外一個(gè)好處是,程序員可以有條件的犧牲某些安全性,方便性,全力去獲得優(yōu)良的性能和較少的資源使用。使用新澤西方法開發(fā)的軟件既能在大機(jī)器上運(yùn)行,也能在小機(jī)器上運(yùn)行,程序具有很好的可移植性,這是因?yàn)樗鼈兪窃谝粋€(gè)病毒程序是寫出來的。

有一點(diǎn)很重要,初始病毒必須基本上好用。病毒的傳播由于它的可遷移性而得到保證。一旦病毒傳播開來,迎來的壓力會(huì)促使它進(jìn)一步改進(jìn),促使增加功能至接近90%完備的水平,但用戶此時(shí)已經(jīng)有條件的習(xí)慣了這種比“正確的做法”差一點(diǎn)的東西了。所以,“差點(diǎn)的更好”的軟件會(huì)首先獲得人們的接受,然后會(huì)有限制的讓用戶降低期望,最后進(jìn)行改進(jìn),直至接近“正確的做法”。在實(shí)際情況中,1987年的Lisp編譯器當(dāng)時(shí)和C編譯器都是非常的優(yōu)秀,但是很多的編譯器專家仍然努力讓C編譯器做的更好。

1995年的好消息是我們有了一個(gè)好的操作系統(tǒng)和編程語言;而壞消息是它們分別是Unix和C++。

“差點(diǎn)的更好”還有最后一個(gè)好處。因?yàn)樾聺晌魇降恼Z言和系統(tǒng)不夠真正的強(qiáng)大來開發(fā)出復(fù)雜巨型的軟件,大型系統(tǒng)必須在設(shè)計(jì)上進(jìn)行組件重用。因此,一種整合的傳統(tǒng)就此迅速出現(xiàn)了。

那“正確的做法”的表現(xiàn)如何呢?我們有兩種常見的模式:“復(fù)雜的大型系統(tǒng)”模式和“鉆石類珍寶“模式。

“復(fù)雜的大型系統(tǒng)“模式通常像這樣:

首先,”正確的做法“需要去設(shè)計(jì)。然后實(shí)現(xiàn)過程需要去設(shè)計(jì)。最后,進(jìn)行實(shí)現(xiàn)。因?yàn)檫@是”正確的做法“,它會(huì)提供100%預(yù)期的功能,實(shí)現(xiàn)的簡(jiǎn)單性從來不是一個(gè)可考慮的因素,所以你要用很長(zhǎng)的時(shí)間去完成它。它巨大而且復(fù)雜。它需要復(fù)雜的工具,工具需要能正確的使用。其中20%的功能會(huì)花去你80%的精力,所以,”正確的做法“需要很長(zhǎng)的時(shí)間來完成,它的運(yùn)行只有在采用先進(jìn)技術(shù)的硬件上才會(huì)表現(xiàn)的令人滿意。

“鉆石類珍寶“模式通常表現(xiàn)如下:

”正確的做法“花了大量的時(shí)間去設(shè)計(jì),但這種方式,在單個(gè)功能點(diǎn)上,其實(shí)并沒有占多大比重。這種設(shè)計(jì)的實(shí)現(xiàn),如果想讓它運(yùn)行的快,要么是根本不可能,要么是超出了大多數(shù)開發(fā)者的能力。

頭一種模式也是經(jīng)典的人工智能軟件的開發(fā)模式。

”正確的做法“出來的通常是大型的軟件,但除了”正確的做法“會(huì)把軟件設(shè)計(jì)的巨大外,沒有其它的理由造成這種局面。也就是說,大型軟件里很多功能是偶然會(huì)用到的。

從這些事情中我們學(xué)到的知識(shí)是,人們通常不喜歡按照”正確的做法“做事。但你最好要采納一半的”正確的做法“,讓你的軟件能像病毒一樣流傳。一旦人們被它吸引,花時(shí)間去改進(jìn)它,使它接近90%的”正確的做法“。

一個(gè)錯(cuò)誤的認(rèn)識(shí)是只理解表面意思,認(rèn)為C語言是開發(fā)AI軟件有力的武器。50%正確做法的方案平常是可行的,但AI上不行。

但是,有一點(diǎn)我們可以下結(jié)論,Lisp社區(qū)真的需要認(rèn)真的反省一下他們?cè)贚isp設(shè)計(jì)上的立場(chǎng)。我會(huì)在以后更多的談?wù)撨@個(gè)問題。

本文是從?The Rise of “Worse is Better” 這篇文章翻譯而來。

來源:http://www.aqee.net/2011/07/18/the-rise-of-worse-is-better/

更多精彩內(nèi)容,請(qǐng)關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號(hào)或下載App
評(píng)論
評(píng)論請(qǐng)登錄
  1. 目前還沒評(píng)論,等你發(fā)揮!