業餘大叔程式心得筆記#11:程式語言與除錯方式的個性/葉光釗

每一種程式語言,都有一些展現自己個性的點;如果沒有一些參透過的領悟,很難去瞭解它們的本質;不同的程式除錯方式,也有不同的風格。你專精的程式語言是哪一種?又有什麼樣的個性呢?你的除錯偵探方式,又是哪個流派?

過去一陣子有些看軟體工程師履歷的機會;這些應徵者在技能欄上,多半會列出許多的程式語言,像是C、C++、C#、JavaScript、Java、R、Python、Ruby等等,而且多半會加上「精通」兩字。看多了這類履歷之後,不由得會好奇,每個人對「精通(某種工作技能)」的定義有什麼不同。

筆者自己是半路出家,寫程式能力是自學而來的,而且完全只把程式語言當作工具,從來沒有什麼特別偏好;依照專案的性質,什麼稱手就用什麼。如果真遇到沒用過的語言,Google和StackOverflow網站就成了好朋友;盡量找範例,copy/paste毫不客氣。

雖然這樣下來也混了數十年,但捫心自問,要聲稱「精通」什麼語言,還真有點不好意思說出口。

程式語言是有個性的

不過話說回來,究竟在這個領域有些資歷,對於各式各樣的程式語言還是有些心得;比較有趣的心得之一,就是我覺得程式語言是有「個性」的。

從經驗來看,各種語言都有一些展現自己個性的點;如果沒有一些參透過的領悟,很難去瞭解它們的本質。

舉來來說,職涯中使用比例最高的應該就是C語言了。我把它定義為「刻苦耐勞」型,早期根本是用來當作組合語言的跳板;在實務上,甚至經常有將C編譯器編好的組合語言內容拿出來,然後用手工繼續修修改改的情形。

要能善用C語言,對電腦底層的運作必須有基本的瞭解,尤其是記憶體存取方面。許多學BASIC或FORTRAN語言的人始終弄不懂C,多半是卡在「指標」(pointer)的使用上,更不說用「pointer的pointer」來表示二維矩陣這種奇怪的觀念了。

至於C++,雖然本質上與C是截然不同的兩種動物,但常被看作「C的華麗加強版」(但我承認自己也常常這樣用)。除了「class」(類別)等等物件導向語言的關鍵字讓入門者頭痛之外,「template」(模版)的使用也是個門檻。

雖然標準模版庫(STL)提供的資料結構很方便,可是編出來的程式碼大得嚇死人;像我這種用慣了C的吝嗇傢伙,能不用就不用。

另外有兩個語言,我則是定義為「夢幻」型的:一個是Smalltalk,另一個是 Lisp。

之所以這麼說,是我在接觸它們的時候,並沒有可以執行的實際環境;雖然買了一堆參考書籍,而且所有執行都是憑空想像,但它卻是我學習物件導向語言的啟蒙(夠神奇了吧)。

其中有一段時間,再怎麼絞盡腦汁,就是弄不懂什麼是「傳送訊息給一個物件」,一直到某一天吃早餐時想到,其實就是「function calls」,差點把嘴裡的豆漿噴出來。

最近比較有興趣的,則是JavaScript;我發現它根本是Lisp的「呼畢勒罕」,而且它的取名真是個天大的誤會。這是一個很「公主」的語言:機制很純粹,什麼東西都是物件(object),只是除錯除起來會令人發瘋。

既然大家都有個性,那有沒有「老好人」式的語言?

有。在我看來,過去人人必學的BASIC、和現在的Python,就屬於比較沒個性的語言。雖然Python近年因為人工智慧(AI)方面的應用而紅遍半邊天,但我覺得跟語言本身實在沒啥關係,全靠一缸子的套件(packages);不過這也是它們的優點:門檻低、入手快。

我自己最最喜歡的,還是Forth語言。它是我看過最「短小精幹」的設計;一個超小型編譯器和一本詞典,就可以堆砌起一個世界,不愧是天才設計師Charles Moore的傑作。

年輕的時候,曾經用它來設計一套在Apple II電腦上跑的Logo turtle繪圖工具;原本以為已經佚失,最近一搜尋居然發現,語言本身和這套工具還活著,真是驚喜。可得好好想想能用它來做些什麼。

除錯和推理也有流派

我從年輕時就喜歡看推理小說,而且習慣一開始翻書就一路看不停。從撲朔迷離的線索之中,抽絲剝繭找出線索,最後真相大白;那種看到最後「原來如此」的感覺,很容易欲罷不能。

身為一個推理小說迷,以及還算資深的程式員,很難不注意到「推理解謎」和「除錯」兩種心智活動之間,令人驚訝的相似程度。

推理小說有好幾種派別;早期最熟悉的是「安樂椅神探」,一位厲害的偵探完全無需出門探案,只要由旁人提供線索,即使不需要親眼看到現場,也能推論出答案。

早期在除錯工具不多的現實中,我們也常會做「在大腦中除錯」的事情;只用筆和紙,再三重覆檢查邏輯的流程。不過就像神探不是常人,這樣的事沒辦法常做;不但累人、而且非常沒效率,不可能像書中的主角那麼風光。

後來熱衷的是「現實派」。主人翁通常是警察之類的執法人員,既不神奇、也不是天才,只能一步一腳印,蒐集那些看起來微不足道、但很多時候可能是破案關鍵的線索。

這跟程式員的現實生活就接近多了:在除錯的時候,多半就是鍥而不捨的一再重複 追蹤程式碼執行、看看找不找得到微小的差別。程式員的日常中,有九成時間就是一直盯著黑底白字的編輯器,深怕漏看了什麼;隨著解錯(破案)的時限越來越近,壓力也越來越大。

而現代化軟體大廠的除錯模式,就跟以上的單打獨鬥完全不同。他們的方式就跟CSI科學辦案一樣是團隊作戰,有專門的測試人員執行測試用例(test cases),就像是蒐集科學證據;也有專門的工具,用於分析測試結果、或是程式產生的紀錄檔,如同科學家做DNA解譯一樣。

SDE解錯就純粹是「證據走到哪裡,案子就辦到哪裡」;沒有什麼模糊地帶,直接了當。

話說回來,看推理小說還是比程式除錯有趣多了;欣賞別人動腦的成果,比自己燒腦所花的力氣輕鬆太多。

你專精的程式語言是哪一種?又有什麼樣的個性呢?你的除錯偵探方式,又是哪個流派?