業餘大叔程式心得筆記#2:除錯與解題的精神狀態/葉光釗
現代的除錯工具和環境實在太方便了,這幾天感觸頗深:各家廠商提供各種各樣的功能,可以從不同的角度,看到程式執行的情況,還可以直接在 run time 改變變數的內容,看看結果有甚麼不同。感覺好像在吸大麻,一旦用上了精神上就很難脫離,會越陷越深。
可是話說回來,用了這些工具,遇到難解的問題、或是導致程式走不下去的大 bug,解決的速度就會變快?我覺得沒有。
我自己用這些除錯工具,來確認設計流程對不對、做一些exception handling(例外處理)或是boundary condition(邊界條件)的修正,幫助很大;但是一碰到沒有頭緒的問題,感覺回到了十年前,甚麼工具都沒有的情況一模一樣,慌得要命。
前幾周在使用一個開放原始碼(open source)套件的時候碰到一個問題,整個人抓程式臭蟲抓到幾乎成了一個喪屍,我的小朋友看我呆坐在電腦面前數個小時,都不敢接近(我想嗎媽在旁邊有教訓小孩不可沉迷電腦)。
最後雙手一攤,大喊一聲「放棄了」,轉身就出門跑步去。
就在流了全身大汗開門回家那一霎那,感覺一陣電流打到腦袋,知道是怎麼一回事了。
有件事一輩子也忘不了:在新竹念書的時候,有一次坐中興號(還有人記得嗎?)回台北;沿途一路昏睡,就在快到站、腰痠背疼得準備下車的時候,突然想到,一個帶時間標記的狀態機,它的模擬流程可以用「A* search algorithm」演算法來執行。
我的心得是:泡溫泉的效果可能會比跑步更好,下次應該試試。
寫程式中的神秘事件
「迷信」這個詞,查Encarta百科全書上說的是:
非理性地相信某種行為或儀規具有神奇的效力。
即使像 IT 這樣理性的科學技術,還是到處可以見到例子:例如機房要放乖乖之類的(我想這時候一定有人大叫「不要不信邪!」)
寫程式也是一樣。我在年輕的時候,經驗還不夠,曾經很不自量力的一個人寫了電腦電報機(computer telex;嘿嘿,我敢說讀者知道這個東西的一隻手數得出來)的操作程式,當時還是MS-DOS、而且還沒有沒有硬碟的環境。
有一個情況,那個時候怎麼想也想不通:為什麼在其中的一個函數中,放了一個完全用不到的變數,程式就不會當、一旦拿掉就必死無疑?
難道電腦裡面住個一個精靈,非要我「獻祭」一個變數不可?
還好多一個變數不要錢,就老老實實地留在那裏,程式就出去了。
那個時候太嫩了,完全沒想到是stack overflow的問題。
之後還有,就是從除蟲模式轉成發表狀態,原始碼一個字都沒動,就是不能執行。
「在我的環境裡都run得好好的啊。」
我想這個說法大家都不陌生,應該算是程式當掉的標準回應之一,與「重新開機吧」並列首選。
最近的例子是,想把一套C++的函式庫從Linux系統轉換到Windows上;因為很冷門,所以網路上找不到甚麼資源。只好硬著頭皮問作者(是個在Google工作的傢伙)。
他只飄來一句「不要浪費時間,在Windows上是不行的」,然後就不理我了。
我不信邪,仗恃著對作業系統的瞭解,硬是搬到VS上面去,編譯過關了、也仔細檢查所有會用到的API介面,根本沒看到哪裡是「只有Linux有而Windows沒有」的。
反覆追蹤trace來trace去,結果就是不行;看來作者對Windows有仇,放了無形的蠱,硬是不讓它在上面跑。
上星期中午吃麵的時候突然想到:
啊對了,兩個平台的編譯器行為不同!
嘴裡的麵條差點噴出來。
我的心得是,當AI人工智慧之類的複雜技術越用越多時,會不會取代人類我是不知道,但這種工程師才有的迷信,肯定會越來越多。