第十三章 書呆子的復仇:在高科技行業,只有失敗者采用“業界最佳實踐”。
由此也就得出了20世紀50年代的編程語言(Lisp)到現在還沒過時的原因。簡單說,因為這種語言本質上不是一種技術,而是數學。數學是不會過時的。你不應該把Lisp語言與50年代的硬件聯系在一起,而是應該把它與快速排序算法進行類比。這種算法是1960年提出的,至今仍然是最快的通用排序方法。
評論:Lisp為什么過了這么多年仍然不僅不落后,而且還是大大超越其他編程語言的原因。因為它是數學。
在大型組織內部,有一個專門的術語描述這種跟隨大多數人的選擇的做法,叫做“業界最佳實踐”。這個詞的出現的原因其實就是為了讓你的經理可以推卸責任。既然我選擇的是“業界最佳實踐”,如果不成功,項目失敗了,那么你也無法指責我,因為做出選擇的不是我,而是整個“業界”。
技術本來就應該是尖端的。正如伊拉恩·加內特所說,編程語言的所謂“業界最佳實踐”,實際上不會讓你變成最佳,只會讓你變得很平常。如果你選擇的編程語言使得你開發軟件的速度只有(選擇更激進技術的)對手的幾分之一,那么“最佳實踐”真是起錯了名字。
評論:其實問題不是出在“最佳實踐”起錯了名字,問題出在我們究竟是想把軟件開發黑客化還是軟件開發工程化。如果黑客化,那么尖端的、更難的技術就是更好的選擇。但是如果工程化,那么我們就需要保證所采用的技術更能夠被普通的,或者說平庸的程序員所理解并使用。顯然Graham傾向于創業公司采用前者。
如果你想解決一個困難的問題,關鍵不是你使用的語言是否強大,而是好幾個因素同時發揮作用:(a)使用一種強大的語言;(b)為這個難題寫一個事實上的解釋器;(c)你自己變成這個難題的人肉編譯器。...舉例來說,在面向對象編程的世界中,我們大量聽到“模式”(pattern)這個詞,我覺得那些“模式”就是現實中的因素(c),也就是人肉編譯器。
皮特諾維格發現,總共23種設計模式之中,有16種在Lisp語言中“本身”就提供,或者被大大簡化。
評論:獲取我們之前并未意識到,如果某一種設計模式可以經常的被復用的話,那么為什么我們不將其放入語言機制中,而不是每次都要重新實現呢?
第十四章 夢寐以求的編程語言:一種好的編程語言,是讓黑客可以隨心所欲使用的語言
讓我們試著描述黑客心目中夢寐以求的語言來為以上內容做個小結。這種語言干凈簡練,具有最高層次的抽象和互動性,而且很容易裝備,可以只用很少的代碼就解決常見的問題。不管是什么程序,你真正要寫的代碼幾乎都與你自己的特定設置有關,其他具有普遍性的問題都有現成的函數庫可以調用。...這種語言抽象程度很高,使得你可以快速寫出一個程序的原型。然后,等到你開始優化的時候,它還提供一個真正出色的性能分析器,告訴你重點應該關注什么地方。你能讓多重循環快得難以置信,并且在需要的地方還能直接嵌入字節碼。...這種語言的內核很小,但很強大。各個函數庫高度獨立,而且和內核一樣經過精心設計,它們都能很好地協同工作。
它提供的抽象能力只是為了方便你開發,而不是為了強迫你按照它的方式行事。事實上,它鼓勵你參與它的設計,給你提供與語言創造者平等的權力。你能夠對它的任何部分加以改變,甚至包括它的語法。它盡可能讓你自己定義的部分與它本身定義的部分處于同等的地位。這種夢幻般的編程語言不僅開放源碼,更開放自身的設計。
評論:就本書的作者而言,顯然目前沒有一種語言可以滿足上面的要求,既是Common Lisp也不行,因為Common Lisp內置運算符名稱“長的可笑”。Perl, Python,Ruby某種程度上是這些夢寐以求編程語言成長的范例,雖然最后仍然沒有完全達到要求。也許這就是夢想和現實的差距。C++的運算符重載某種程度上給予開發者設計出語言本身運算符同等地位的定義,而Java用equals來進行字符串比較就顯得非常可笑??傊?,Java總是淪落到要被黑的地步了。
第十五章 設計與研究:研究必須是“新”的,設計必須是“好”的。
為什么15世紀油畫首次亮相會引起轟動并很快流行起來?原因就是油彩使得畫家可以在原型上直接畫出最后的樣子。你可以按照自己的想法畫出初稿,但是它并不對你構成限制。接下來你可以逐步加上細節,甚至對初稿做出重大修改,直到最后完成。
軟件開發也可以這樣做。原型(prototype)并不只是模型(model),不等于將來一定要另起爐灶,你完全能夠在原型的基礎上直接做出最后的成品。我認為,只要有可能,你就該這樣做。...我的一位美術啟蒙老師告訴我:如果你覺得畫某樣東西很乏味,那么你畫出來的東西就會真的很乏味。...開發軟件的時候,我有一條規則:任何時候代碼都必須能夠運行。...跟你說實話吧,畫家之間甚至流傳著一句諺語:“畫作永遠沒有完工的一天,你只是不再畫下去而已?!边@種情況對于第一線程序員真是再熟悉不過了。
評論:快速做出原型再繼續打磨似乎已經成為這個年代軟件開發的共識,但是如果說明白一件事情就代表會照著去做,那么所有人可能都會成為偉人?,F實的情況是,當有一個好的想法或者開始動手做一個項目時,三分鐘的熱度會讓我們在剛開始的時候花費大量的精力甚至過度設計,消耗了開發完成整個項目的熱情。我覺得更好地做法是,先想好大致上整個項目做出來會是一個什么樣子的情況,比如游戲,大致的流程是什么樣子,然后主要的關卡都做出了,再逐漸的添加關卡或者打磨。這樣至少會讓我們有一個大致完整的項目。