既然“天才是百分之一的靈感,百分之九十九的汗水”,那我先來談談這汗水的部分吧。有人問我,提高編程水平最有效的辦法是什么?我想了很久,終于發現最有效的辦法,其實是反反復復地修改和推敲代碼。
在IU的時候,由于Dan Friedman的嚴格教導,我們以寫出冗長復雜的代碼為恥。如果你代碼多寫了幾行,這老頑童就會大笑,說:“當年我解決這個問題,只寫了5行代碼,你回去再想想吧……” 當然,有時候他只是夸張一下,故意刺激你的,其實沒有人能只用5行代碼完成。然而這種提煉代碼,減少冗余的習慣,卻由此深入了我的骨髓。
有些人喜歡炫耀自己寫了多少多少萬行的代碼,仿佛代碼的數量是衡量編程水平的標準。然而,如果你總是匆匆寫出代碼,卻從來不回頭去推敲,修改和提煉,其實是不可能提高編程水平的。你會制造出越來越多平庸甚至糟糕的代碼。在這種意義上,很多人所謂的“工作經驗”,跟他代碼的質量,其實不一定成正比。如果有幾十年的工作經驗,卻從來不回頭去提煉和反思自己的代碼,那么他也許還不如一個只有一兩年經驗,卻喜歡反復推敲,仔細領悟的人。
有位文豪說得好:“看一個作家的水平,不是看他發表了多少文字,而要看他的廢紙簍里扔掉了多少。” 我覺得同樣的理論適用于編程。好的程序員,他們刪掉的代碼,比留下來的還要多很多。如果你看見一個人寫了很多代碼,卻沒有刪掉多少,那他的代碼一定有很多垃圾。
就像文學作品一樣,代碼是不可能一蹴而就的。靈感似乎總是零零星星,陸陸續續到來的。任何人都不可能一筆呵成,就算再厲害的程序員,也需要經過一段時間,才能發現最簡單優雅的寫法。有時候你反復提煉一段代碼,覺得到了頂峰,沒法再改進了,可是過了幾個月再回頭來看,又發現好多可以改進和簡化的地方。這跟寫文章一模一樣,回頭看幾個月或者幾年前寫的東西,你總能發現一些改進。
所以如果反復提煉代碼已經不再有進展,那么你可以暫時把它放下。過幾個星期或者幾個月再回頭來看,也許就有煥然一新的靈感。這樣反反復復很多次之后,你就積累起了靈感和智慧,從而能夠在遇到新問題的時候直接朝正確,或者接近正確的方向前進。