今天看到托尼·霍爾(Tony Hoare,快速排序演算法QuickSort的發明者)老大的一個訪談裡面提到他當年圖靈獎獲獎演說《皇帝的舊裝》的故事。
問題四:聽說你在獲得圖靈獎的時候做了一個名為《皇帝的舊裝》的演講,能說說當時您都談到了什嗎?
托尼·霍爾:我在那天的演講當中主要是談程式設計語言的設計,我當時是想對那個時候的一些方法提出一些批評,比如說像Algol 68這樣的設計,我認為它們太過複雜了。我就打了一個比方,說這些語言這麼複雜,就好像一個人穿了太多件衣服在身上。我就借鑒了安徒生的《皇帝的新衣》的童話故事來說,目前在這樣一種情況下,就好像一個人穿了太多件衣服,而皇帝之所以穿了太多件的衣服呢,是因為他害怕出現那種在《皇帝的新衣》裡面出現的最後赤身裸體、什麼衣服都沒有穿的狀況。我用這樣的一個比喻來描述當時的這些程式設計語言太過複雜。而當時的編程太過複雜是因為每一個人都想往裡面加更多的功能,最後就導致這些新的功能最後超出了程式的必要性。所以,我就覺得我們應該回到一個比較簡單的狀況,讓程式設計語言不要那麼複雜。我同時也說,一個程式的正確性要比在寫程式的時候的難易程度更重要。我現在回想起來,我當時說這些話,可能有一點太過傲慢。
先贊一下這個演說題目——《皇帝的舊裝》,實在是很恰當、很有趣的一個隱喻,堪稱典範。
實際上托爺爺談到的問題在今天仍然很有意義,一個好的設計(當然這裡說的肯定是專指程式的設計)到底是應該大而全OR小而精?
Anders Hejlsberg也曾經談到過他們在C#語言的設計過程中最難的事情並不是如何?一些看起來很玄的東東,反而是如何砍掉各種新奇的idea提案,保持語言的簡潔性。這個也很好理解,一個好的feature只要不是必須&急需,即便你今天不加入明天加入也不是什麼大的問題;但是新功能一旦加入想把它拿掉可就沒那麼容易了。畢竟像Python 3那種拋棄相容性的做法還是需要很謹慎的。如果語言當中充斥著大量因為曆史原因遺留下來的垃圾feature,基本上這個語言就準備著沒落吧……
Agile裡面同樣在談“過度設計”,這個觀點一般我是很贊同的,不過必須清楚的是這可不是“不做設計”的理由。“過度設計”指的是那些真的沒有必要,看起來有用實則十分脆弱的設計,因為過度的設計反而會阻礙程式的更新(畢竟簡單的東東改起來容易嘛)。
花開兩朵,各表一枝。現在再來說說反方觀點。我映像最深的是C++老爹Bjarne Stroustrup的觀點。因為老是有人批評C++太複雜,Bjarne老大實在忍不住之後終於跳出來反駁,指出那些號稱簡單的語言只不過是處於嬰兒期而已,等它長大之後一樣會變得複雜的。現在看來,Bjarne的觀點基本屬實,各種語言發展到後期都不會很簡單,至少跟它最初相比肯定是肥了一大圈。
以前在A公司開發R程式的時候,裡面每一個平常耳熟能詳的功能都有一套極其複雜的機制來專門處理,最初很是納悶有必要那麼複雜嗎,把開發門檻搞得這麼高,害得我做一個簡單的功能還需要去熟悉你一套怪獸層級的架構,不用你這套東東我自己實現一個好像也用不了多少時間。不過後來在開發過程中才慢慢體會到實際上這些重量級的架構還是很有價值的,很多功能自己當然也是可以實現,但多半都是因為最初的需求很簡單。隨著不斷有新的需求加進來,最初自己那個簡單的實現也需要不斷加入新的功能去處理這些新的需求。慢慢地,自己的實現就會越來越大,越來越複雜,一不小心自己又重新發明了一個怪獸出來……這時候你就會發現實際上這些功能在那個看起來怪怪的架構/庫裡面人家早就考慮進去了。
回到開頭,到底什麼才是好的設計?這估計是一個沒有答案的問題,不過我想最重要的一點是好的設計應該經得起時間的考驗,在不斷的變化過程中堅如磐石,才能熠熠生輝!