同其它領域一樣,計算機科學和工程領域也是群星璀璨,有些耀眼的星光甚至刺得我們無法直視,只能匍匐在地上聆聽神諭。也正如其它領域一樣,雖然大家聽到的是同樣的話,卻有各式各樣不同的理解。我這里想講的,就是我觀察到的不同理解引發的現象。
“過早優化是萬惡之源。” 這是 Donald Knuth 的一句名言。雖然大部分人都不知道,或者會忘掉前面半句:“We should forget about small efficiencies, say about 97% of the time:premature optimization is the root of all evil.” Knuth 說出這句話時,可能想不到這句話會多么地流行,多么根植在很多人心中,以至于成為程序員偷懶的借口,阻礙進步的動力。因為有了這句話,在你指出別人代碼中可以優化的問題時,還必須浪費口舌來解釋這樣的優化是必要的,不是過早優化或者過度優化。
就我的觀察而言,對很多程序員來說,其能力還遠遠達不到過早優化的地步。但他感覺自己受到了 Knuth 的神啟,仿佛具有了某種魔力,不優化代碼反而成了一種優越感!關于大多數人是否具備過早優化代碼的能力,我可以舉幾個至今我還覺得神奇的例子。
我供職的公司內部有這樣一個模塊,隔一兩個星期總會掛掉幾臺服務器,現象是內存占滿導致服務器假死或者宕機,但事實上根據請求推算根本不會同時使用那么多內存。最后的排查結果發現,每個線程都有這樣一個數據結構,它的內存是只增不減的。當你調用它的 clear 接口,它只會把所有的內存還回自己的內存池里,而不是還給系統。這就導致可供分配的內存越來越少、越來越少...
還是這個模塊里,僅僅加載一個幾 K 的配置文件,就能夠占用超過 1G 的內存。為什么呢?因為它用 char str[MAX_CONF_LEN] 保存配置字符串,用 struct xx_t xx[MAX_XX_NUM] 讀取配置,而且這個 struct 中還有嵌套的 struct yy_t y[MAX_YY_NUM] 數組。
該模塊是個個例嗎?還是這家公司,一個全公司使用的公共日志庫,LOGGING 宏定義中直接傳一個需要系統調用的函數作為參數,導致無論關不關該級別日志都要進行一次系統調用。
這家公司好歹也位列國內頂尖的互聯網公司之一,工程師的招聘要求也是極其高的,還會普遍出現這種肆意浪費資源的情況。那么我想對于大部分工程師來說,談避免“過早優化”、“過度優化”,還為時尚早。
還有一句名言“好代碼本身就是最好的文檔。當你需要添加一個注釋時,你應該考慮如何修改代碼才能不需要注釋。” 這是 Steve McConnell 說的。同樣,大部分人都不知道,或者忘掉后面半句:Good code is its own best documentation. As you're about to add a comment, ask yourself, "How can I improve the code so that this comment isn't needed?" Improve the code and then document it to make it even clearer. 如果你是程序員,回想一下多少次跟別人討論代碼是不是必須要注釋時,這句話被引用到;有很多次在寫代碼時喜愛這句話,又多少次改別人的代碼時痛恨這句話。
還是從我個人的觀察來看,對很多程序員來說,其編碼能力還不足以達到“代碼本身就是最好的文檔”的地步,包括我自己。敝司招聘過很多頂尖的工程師,有傳說中的各種杰出前輩,可能在各種學校、公司內部事跡廣為流傳。但若是你哪天繼承了他的代碼遺產,就會發現很多傳說中的明星跌落凡塵。成百上千行沒有注釋,使用一個公共庫函數時要么接口就根本沒注釋只能基本靠猜,要么即使注釋也語焉不詳讓你踩到未注明的大坑。每到這個時候你心里總會暗暗罵娘,后面別人再談到他的光輝事跡時,你跟隨訕笑時心中暗自腹誹:“牛逼個錘子!”
但我想很多人爭論的焦點是:“注釋是不是不可省略的、要強制執行的?”即使個別人能力真能達到“代碼本身就是最好的文檔”的地步(我還沒見過),我也不建議在團隊中傳播“注釋可以省略”這一想法。因為如果你說“注釋可以省略”,可能你會發現大家都理解和實踐成“終于可以不寫注釋了”。如果一個剛剛大學畢業、腦袋里從來沒有過 documentation 概念、從來沒寫過注釋的新人進入公司,就“終于可以不寫注釋了”,那么我想他的代碼會很難達到“代碼本身就是最好的文檔”這個級別。因為他根本沒有機會懂得什么叫做 documentation。
在公司里,代碼注釋深遠地影響著團隊合作的每個人,以及軟件生存期里所有的維護者,甚至會影響自己的職業聲譽。所以無論別人怎么想,我對注釋這個問題的答案始終是:“注釋是不可省略的,越完善越好的,甚至強制執行矯枉過正也沒關系的!”
原文轉自:http://www.anti-gravitydesign.com