“差點的更好“設(shè)計理念的興起

0 評論 9548 瀏覽 0 收藏 13 分鐘

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

“差點的更好”還有最后一個好處。因為新澤西式的語言和系統(tǒng)不夠真正的強大來開發(fā)出復雜巨型的軟件,大型系統(tǒng)必須在設(shè)計上進行組件重用。因此,一種整合的傳統(tǒng)就此迅速出現(xiàn)了。

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

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

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

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

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

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

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

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

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

但是,有一點我們可以下結(jié)論,Lisp社區(qū)真的需要認真的反省一下他們在Lisp設(shè)計上的立場。我會在以后更多的談論這個問題。

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

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

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