業餘大叔程式心得筆記#1:打掉重來/葉光釗

今年(2017)下半年一段短暫的職場經歷告一段落之後,想想還是重拾鍵盤,回頭開始好一段時間沒有繼續的程式撰寫;也同時將一些寫程式的心得片段寫下來,也算是自娛的一種形式吧。

程式可以打掉重來,人生呢?

這幾天在重新看一個已經養了三十幾年的程式,心中有一個感嘆:在很多面向上,程式跟人一樣,是會衰老的。

在舊程式架構上加功能的時候,心中總是會嘀咕「哎呀,當初怎麼沒想清楚,沒有留下空間加東西」、或是「傷腦筋,都寫死了,這下改不動了啦」;就好像在埋怨一個老人,老頑固學不了新知識,或是習慣不好改都改不過來。

如果是別人寫的,心中一口惡氣要發出來,不咒罵祖宗十八代無法洩憤;程式是自己寫的更糟,只能吞下怨氣、然後內傷。

這時候最常發生的念頭,就是打掉重來。改不動了,重寫好了,不然改到死;這甚麼鳥架構,重來,我絕對不會犯同樣的毛病!與其浪費時間在看人家的爛程式碼上面,重寫還比較快!

……但,這就是這段時間我看自己的 code 的情緒反應。

可是當真的想要舉起袖子重幹的時候,心裏另一個聲音冒了出來:「真的要重寫嗎?那誰要來測阿?這麼多功能要從哪裡先寫?時間夠不夠?重寫的錢誰出?」

然後開始問號越來越多,心裡也慌了起來;最後自己給自己台階下,先看個Facebook換換心情,再想想。

所以我的心得是:大叔程式打掉重來改架構跟中年換工作一樣,說的人多,做的人少。

人生不能打掉,但可以加很多很多註解。

說到看程式、改程式,寫程式的人都知道,「應該」要寫註解,在工作上也經常會被要求;但問題是,我已經算是比較勤奮的程式設計師了,即使偶而心血來潮多寫一點,但是只要過了峰頭,很快回復原狀,總是有一搭沒一搭。

想來想去,只能這樣解釋:

寫註解這件事應該是違反人性的。

……所以才必須常常要求,時時提醒。

話說回來,懶得寫註解,在程式中註解符號(在C++語言中是「 //」 或是「 /* */」)就用得少?才不呢。

前一陣子突發奇想(也是夠無聊了)寫了一個小程式,算一算我自己的程式碼中用了多少註解符號;結果真是有趣:有一個550行的C++程式,「 /* */」註解用了384對,「 //」 用了6,132個。

也就是說,平均下來,每個程式文字檔大約有 1/3 到 1/4 的內容是在註解符號裡面。

/*天啊!我有這麼會寫註解嗎?*/

當然不是。只要寫過程式,都知道這些都是用來標出(所謂「mark掉」)不想執行的程式碼。

年輕的時候沒想太多,現在做大叔了,得好好自我反省:我幹嘛這麼做,而不是把那些部分刪掉?

經過冷靜的分析,應該大約有這幾種心態:

  • 我試試看這行沒有會怎樣,待會就會還原(但90%都是標過就忘了)。

  • 這部分要改寫,不過舊的碼要參考,mark起來先。

  • 我好不容易寫的code耶,搞不好哪天要重用,捨不得刪掉。

  • 實在想不起來為什麼要mark掉,不過為了保險起見,還是留著吧

我的心得是:

/*總有一天,我寫的程式,註解會比能執行的程式還多。*/

程式跟洋蔥一樣,是有架構的。

小時候不懂事的時候,覺得寫程式應該跟寫(英文)作文一樣,從左寫到右、從上寫到下,把我想做的事情照順序寫出來就好了。

當第一次將「Hello World!」 一氣呵成寫出來,完全不用除錯就能跑的時候,那種成就感真是放大到無限。

事情當然不是這麼簡單。

學寫幾個小程式還OK,當想寫的規模越來越大之後,許多教科書上警告的情況會一下子統統出現。

這時候的關卡是,你得決定要不要繼續走這條路來混飯吃。要的話,就得好好讀一下教科書上寫甚麼、前輩們說些甚麼,程式要小塊小塊寫、小塊小塊測,把這種「simple, even naive」天真過頭的想法放一邊。

隨著這條不歸路一直走,甚麼模組化設計啦、OOP啦、還有最近流行的「test-driven design」層層疊加上去;寫程式越來越像是刻字,而不是畫畫,樂趣越來越少。

最近想給一個舊程式加一個新功能,就童心大發,想要一次把code先寫完,再來一次總測試,看能不能一次到位;有點像一直循規蹈矩、小心翼翼,不敢犯錯的人,偶而也想刺激一下,發個酒瘋。

結果可想而知。

我的心得是,寫程式不要像高爾夫球初學者一樣,運氣好揮出好桿,就以為那是自己的實力。