程式語言的二三事
最近蠻多看軟體工程師履歷的機會,在技能那一欄多半會列上許多的程式語言: C, C++, C#, JavaScript, Java, R, Python, Ruby 等等等等,而且多半會加上 “精通” 兩字。看多了,很容易好奇每個人對 “精通” 的定義是甚麼?
我自己算是半路出家型,coding 是自學,完全把程式語言當作工具,從來沒有甚麼特別偏好。依照專案的性質,什麼稱手用甚麼。真遇到沒用過的,Google 和 StackOverflow 就成了好朋友,盡量找範例,copy/paste 毫不客氣。這樣下來也混了數十年,捫心自問,要聲稱 “精通” 甚麼語言,有點不好意思說出口。
不過話說回來,究竟這個領越有些資歷,對於各樣的程式語言還是有些心得。其中有一樣比較有趣,我覺得程式語言是有 “個性” 的。
“個性” 是甚麼? 根據經驗,各種語言總有一些點,如果沒有一些參透過的領悟,很難了解本質。
舉來來說吧。職涯中使用比例最高的應該就是 C了,我把它定為是 “刻苦耐勞” 型,早期根本是用來當組合語言的跳板,常有拿 C compiler 編出來的組合語言內如繼續修修改改的情形。要使用 C 基本上要對電腦運作有基本的了解,尤其是對記憶題的存取,許多學 BASIC 或是 FORTRAN 的人始終弄不懂 C,多半是卡在 pointer 的使用,更不說是用 pointer 的 pointer 來表示二維矩陣這種奇怪的觀念。
C++ 則常被看做 “華麗的加強版”,雖然本質上 C++ 與 C 是截然不同的兩種物種 (其實我承認我也常常這樣用)。除了 class 等等 OOP 的關鍵字讓入門者頭痛之外,template 的使用也是個門檻。雖然 STL 提供的 data structure 很方便,可是編出來的binary size 大的嚇死人;像我這種用 C 慣了的吝嗇傢伙,能不用就不用。
有兩個語言我則是定為 “夢幻” 型的,一個是 Smalltalk,另一個是 Lisp。之所以這麼說,是我在接觸它們的時候,沒有可以執行的實際環境。雖然買了一堆參考書籍,但是所有的執行都是憑空想像。尤其是 Smalltalk,它是我學 OOP 的啟蒙 (夠神奇了吧)。其中有一段時間絞盡腦汁就是弄不懂甚麼是 “傳送訊息給一個物件”,一直到有一天吃早餐,想到其實就是 function calls,差點嘴裡的豆漿噴出來。
最近比較有興趣的是 JavaScript,發現它根本是 Lisp 的 “呼畢勒罕” (沒見過? Google 一下吧),它的取名真是個天大的誤會。這是一個很 “公主” 的語言,機制很純粹,甚麼東西都是 object,只是 debug 會令人發瘋。
大家都有個性,那有沒有 “老好人” 式的語言? 有喔,在我看來,早前人人必學的BASIC 和現在當紅的 Python 就是沒個性的語言,沒甚麼突出的地方。Python 現在因為 AI 的應用紅遍半邊天,我覺得跟語言實在沒啥關係,全靠一缸子的 packages。不過這也是它們的優點,門檻低,入手快。
我自己最最喜歡的,還是 Forth 語言。它是我看過最 “短、小、精、幹” 的設計,一個超小型編譯器和一本詞典就可以堆砌起一個世界,不愧是天才設計師 Charles Moore的傑作。年輕的時候曾經用它來設計一套在 Apple II 上的 Logo turtle graphic,原本以為已經佚失,最近一搜尋居然語言和 FIG 還活著,真是驚喜。可得好好想想能用它來做些甚麼。
我的心得: 原來想寫一些語言的使用心得,居然寫成了懷舊文。果然是年紀到了。