第一是因為它比其它的方案都要短
之前在微博上推薦了一個(gè)對 Dijkstra 的采訪(fǎng)視頻,看了兩遍之后覺(jué)得實(shí)在很好,所以再正式推薦一下。大部分人可能都知道他對圖論算法和操作系統的貢獻,而其實(shí) Dijkstra 在程序語(yǔ)言上的造詣也很深厚。我們常用的程序語(yǔ)言里面司通見(jiàn)慣的“遞歸函數”,其實(shí)當年就是 Dijsktra 和另一個(gè)人不顧委員會(huì )里眾人的反對和懷疑,堅持要放進(jìn) Algol 60,所以后來(lái)才進(jìn)入了 Pascal,C,Java 這樣的語(yǔ)言的。那個(gè)時(shí)候 John McCarthy 缺席,不然的話(huà)就會(huì )有三個(gè)人支持了。現在看來(lái),任何一個(gè)語(yǔ)言里面沒(méi)有遞歸函數都是不可思議的事情,然而在1950-60年代的時(shí)候,居然很少有人知道它有什么用!所以你就發(fā)現,所謂的“主流”和“大多數人”一直都是比較愚蠢的?,F在,同樣的故事發(fā)生在 lambda 身上。多年以后,沒(méi)有 lambda 的語(yǔ)言將是不可接受的。
在這里只摘錄他提到的幾個(gè)要點(diǎn)。某些觀(guān)點(diǎn)也許不是最好的辦法,但我確信其中有非常值得學(xué)習的地方。
- 軟件的版本號 2.6, 2.7, ... 都是胡扯。本來(lái)第1版就應該是最終的產(chǎn)品,可是軟件公司總是先弄出來(lái)一個(gè)不完整的版本,騙大家買(mǎi)了,以后再慢慢“升級”。每次升級都要用戶(hù)再次付錢(qián)。
- 編程有多種流派,我喜歡把它們歸類(lèi)成“莫扎特 vs 貝多芬”。當莫扎特開(kāi)始寫(xiě)樂(lè )譜時(shí),作品就已經(jīng)完成了。他的手稿一氣呵成,書(shū)法也很好。貝多芬不一樣,他總是在懷疑和掙扎。他的作品一般是還沒(méi)有想好就開(kāi)始寫(xiě),然后就往上面貼紙條修改。有一次貝多芬改了9遍才把手稿完成,后來(lái)有人把這手稿一層層的撕開(kāi),發(fā)現第一版和最后一版是一摸一樣的。這種改來(lái)改去的做法是 Anglo-Saxon 民族的傳統,它貫穿了英國式的教育。
- 作曲家的工作不是寫(xiě)樂(lè )譜,而是構思音樂(lè )。最早的時(shí)候人們編程都是用匯編語(yǔ)言的,就跟寫(xiě)樂(lè )譜差不多。后來(lái)他們發(fā)明了高級語(yǔ)言,就以為這些語(yǔ)言把編程的問(wèn)題解決了。但是你仔細一瞧,發(fā)現它們只是把編程最微不足道的問(wèn)題解決了,但是困難的問(wèn)題仍然困難。這些高級語(yǔ)言與越來(lái)越大的野心加在一起,反而讓程序員頭腦的負擔更重了。
- 稱(chēng)職的程序員都知道自己頭顱的尺寸是有限的,所以他們以謙遜的態(tài)度來(lái)對待工作,像回避瘟疫一樣地回避小聰明。
- 當我1970年在法國巴黎講學(xué)如何編程的時(shí)候很成功,聽(tīng)眾都非常積極?;丶业穆飞衔矣衷诒壤麜r(shí)布魯塞爾的一個(gè)大軟件公司進(jìn)行了同樣的演講,結果非常失敗。那恐怕是我一生中最失敗的演講。后來(lái)我發(fā)現了為什么:他們的管理層不喜歡無(wú)懈可擊的程序,因為這公司是靠“維護軟件”的合同來(lái)維持生存的。程序員對此也不感興趣,因為最讓他們興奮的事情在于不知道自己在干什么。他們覺(jué)得如果清楚地知道自己在干什么,那就沒(méi)有挑戰性了,就是無(wú)聊的工作。
- 研究物理的人如果遇到不理解的事情,總是可以責怪上帝,世界這么復雜不是你的錯。但是如果你的程序有問(wèn)題,那就找不到替罪羊了。0就是0,1就是1,就是你把它搞砸了。
- 1969年,在阿波羅號登月之后不久,我在羅馬的北約軟件工程會(huì )議遇到了 Joel Aron,阿波羅計劃的軟件負責人。我知道每個(gè)阿波羅飛船上面的代碼都會(huì )比前一個(gè)多4萬(wàn)行。我不知道“行”對于代碼是個(gè)什么單位,但4萬(wàn)行肯定是很多了。我很驚訝他們能把這么多代碼做對,所以我問(wèn) Joel:你們是怎么做到的?他說(shuō):做什么?我說(shuō):把那么多代碼寫(xiě)正確。Joel 說(shuō):“正確?!其實(shí)在發(fā)射前僅僅五天,我從登月器計算軌道的代碼里發(fā)現一個(gè)錯誤,這代碼把月球的重力方向算反了。本來(lái)該吸引的,結果寫(xiě)成了排斥。是一個(gè)偶然的機會(huì )讓我發(fā)現了這個(gè)錯誤?!蔽业哪樁及琢?,說(shuō):這些家伙運氣真好?Joel 說(shuō):“是的?!?/li>
- 軟件測試可以確定軟件里有 bug,但卻不可能用來(lái)確定它們沒(méi)有 bug。
- 程序的優(yōu)雅性不是可以或缺的奢侈品,而是決定成功還是失敗的一個(gè)要素。優(yōu)雅并不是一個(gè)美學(xué)的問(wèn)題,也不是一個(gè)時(shí)尚品味的問(wèn)題,優(yōu)雅能夠被翻譯成可行的技術(shù)。牛津字典對 elegant 的解釋是:pleasingly ingenious and simple。如果你的程序真的優(yōu)雅,那么它就會(huì )容易管理。第一是因為它比其它的方案都要短,第二是因為它的組件都可以被換成另外的方案而不會(huì )影響其它的部分。很奇怪的是,最優(yōu)雅的程序往往也是最高效的。
- 當沒(méi)有計算機的時(shí)候,編程不是問(wèn)題。當有了比較弱的計算機時(shí),編程成了中等程度的問(wèn)題?,F在我們有了巨大的計算機,編程就成了巨大的問(wèn)題。
- 我最開(kāi)頭編程的日子跟現在很不一樣,因為我是給一個(gè)還沒(méi)有造出來(lái)的計算機寫(xiě)程序。造那臺機器的人還沒(méi)有完工,我在同樣的時(shí)間給它做程序,所以沒(méi)有辦法測試我的代碼。于是我發(fā)現自己做的東西必須要能放進(jìn)自己的腦子里。
- 我的母親是一個(gè)優(yōu)秀的數學(xué)家。有一次我問(wèn)她幾何難不難,她說(shuō)一點(diǎn)也不難,只要你用“心”來(lái)理解所有的公式。如果你需要超過(guò)5行公式,那么你就走錯路了。
- 為什么這么少的人追求優(yōu)雅?這就是現實(shí)。如果說(shuō)優(yōu)雅也有缺點(diǎn)的話(huà),那就是你需要艱巨的工作才能得到它,需要良好的教育才能欣賞它。
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。