許多年前我剛開始學(xué)編程時,朋友曾說過一個笑話:差勁的程序員有兩種,一種是開始就寫main函數(shù)的;還有一種是上來就上網(wǎng)找各種類庫源代碼的。當(dāng)時我并不能完全理解:編程序,不去找類庫源代碼,不從main函數(shù)開始,那要怎么做呢?后來才逐漸明白,上來就寫main函數(shù),或者上來就找類庫找源代碼,歸根到底都是因為不能克制對于代碼的沖動。直接寫代碼當(dāng)然很“爽”,很有“成就感”?墒牵@樣做真的是好事嗎?
在現(xiàn)實生活中,我確實看到相當(dāng)多的程序員寫代碼的沖動相當(dāng)強烈,甚至難以克制。這可能是因為任何軟件都需要以代碼的形式來實現(xiàn),拿到一個任務(wù),直接寫代碼可以為程序員帶來強烈的成就感。在心里想個明白或在紙上寫寫畫畫,反而成了一種難以克制的煎熬。但有經(jīng)驗的人都知道,程序不等于代碼,程序的含義和復(fù)雜性遠遠超過代碼;沒有明晰的需求,沒有清楚的頭腦,沒有良好的規(guī)劃,寫出來的代碼就成了無源之水,無本之木,寫得越爽,后果可能越嚴重。
我曾經(jīng)見過一套系統(tǒng),其中充滿了各種狀態(tài)碼的條件判斷,這種情況本來很正常,不幸的是所有的狀態(tài)碼都是硬編碼的數(shù)字,整個系統(tǒng)就是一本天書:一會兒判斷這里是否等于2,一會兒判斷那里是否大于7……究其原因是程序員覺得這些狀態(tài)碼無非就是“用數(shù)字代表狀態(tài)”,所以隨便選些數(shù)字就好了,2代表什么,7對應(yīng)什么,自己記得就好了。更重要的是,硬編碼的狀態(tài)碼“用起來方便”,敲代碼的速度大大提升——不需要查找變量,也不需要輸入整個變量名。這種系統(tǒng)的問題相信大家都猜得到,維護和修改起來無比痛苦。因此,盡管寫這些程序的程序員已有一兩年甚至更多年的工作經(jīng)驗,但很難說他們有“職業(yè)素養(yǎng)”。
與此相反,重構(gòu)的人員吸取了之前的教訓(xùn)。雖然全部硬編碼看起來不爽,用起來更不爽,人人都有立刻動手改掉它的沖動,但重構(gòu)時不是首先改代碼,而是先仔細閱讀程序,編寫了一份包含所有狀態(tài)碼的圖表(并且打印出來供隨時查閱),再根據(jù)狀態(tài)碼的意義和使用場景,重新設(shè)計狀態(tài)碼(因為各個狀態(tài)之間還存在邏輯關(guān)系,所以需要以自定義類型表示狀態(tài)),最后才動手編碼完成重構(gòu)。事實證明,這種策略是非常成功的:閱讀代碼、制定圖表、重新設(shè)計需要三周的時間,真正的重構(gòu)只用幾天就順利完成了,而且從此以后維護和修改的難度大大降低,真正達到了重構(gòu)的目的。完成重構(gòu)工作的程序員,工作經(jīng)驗并不比最初編寫程序的人多,他們沒有一開始就寫代碼,甚至沒有花太多時間在代碼上,更沒有用到高深莫測的技術(shù),但他們身上體現(xiàn)出來的,恰恰是可貴的職業(yè)素養(yǎng)。
幾乎所有程序員都喜歡狂敲代碼的快感,但職業(yè)程序員必須要克制寫代碼的沖動,在寫代碼之前花更多時間理解需求,設(shè)計系統(tǒng),制定規(guī)劃,這樣寫出來的代碼才會更加精練,更加聰明,整個程序也因此更有價值。貢獻更有價值的程序才是程序員職業(yè)素養(yǎng)的體現(xiàn)。
作者余晟,非正統(tǒng)技術(shù)愛好者,畢業(yè)于計算機系,副修中文,《正則指引》作者。
關(guān)于我們
產(chǎn)品與平臺
企業(yè)信息咨詢