我的程式語言之路
從大學以來,這十幾年的工作與生活總與程式設計脫不了關係。前前後後寫了不少的 Code, 也接觸過許許多多不同的 Programming Language。這邊就來記錄一下自己現在還有印象的程式語言,也許十年之後再來回顧,又是另一種不同的想法吧。
QBasic
高中時候獲得人生的第一台電腦,當時還是 DOS 的年代,每個裝了 MS-DOS 的電腦都會內附 QBasic。還記得用 QBasic 寫過一些簡單的遊戲,像是 1A2B、迷宮產生之類的,但是真要說自己寫的其實也不是,很多都是照著當時雜誌(例如「第三波」)上的代碼 key 進電腦中而已。
Turbo C++
說真的,我已經不記得是 Turbo C 或是 Turbo C++ 了,但可以肯定的一點是,我當時一定只用到 C 的語法概念,沒有物件,只有單純的流程控制,對指標有似懂非懂的感覺。其實嚴格說起來,Turbo C++ 只能算是種 IDE,不算程式語言。
Borland C++ Builder
這也是 IDE,不過因為同樣的 C++ 語言在不同的 IDE 與不同的基本函式庫下會呈現出截然不同的個性,所以我就單列了。記得在我還是學生的時代,BCB 的出現帶來革命性的軟體開發方式,只要簡單拉一拉就可以有個像樣的視窗程式。當時蔚為風潮,我也趕流行玩了一陣子,不過也沒拿來寫過什麼東西就是。
Visual Basic
很簡單的程式語言。我曾經用 VB 寫過一個「光榮三國志臉譜瀏覽程式」的工具,可以讀取《三國志》四代、五代的頭像檔案。可惜現在原始碼與二進位檔都沒有留下,只有留下當時在巴哈姆特發佈時的帖子。如果有人看到這篇文章,又碰巧有留當年的程式的話,歡迎跟我聯絡。也許哪天我心血來潮會再重寫一遍也說不定。 ;-)
Common Lisp & ML
這兩個都是因為學校的課程而接觸的。剛開始學 Lisp,腦袋會打結,就是一層又一層的括號,常見的數學運算也都得換成前置式;不過作業寫到後來我還蠻喜歡寫 Lisp 的感覺。ML 也是,跟一般我們常見的 C-like 語法結構都不一樣。那時候我還蠻愛這兩個語言的,一直到畢業後的幾年間,我只要重灌電腦完要重新安裝軟體時,我就會把這兩個程式語言給裝進去,就像現在我會安裝 Python 一樣。
ASP
大四時接了一個學姊的家教網案子,那時候用的開發語言就是 ASP。不過說真的現在我對 ASP 都忘光光了。附帶一提,那個網站現在還活著,當然已經轉型了就是,不再是以媒介家教資訊為主。
Java
學生時代有寫過一些 Java applet,那時候的網頁很流行水波效果,幾乎十個個人網站有八個的 banner 都要來一下水波盪漾。Applet 也是淺嚐個大概而已,倒是 Java Servlet 因為工作的關係寫了蠻長久一段時間,從學生時代到退伍後都還有在接觸。話說事隔多年後,因為最近工作的關係,又開始跟 Java 打交道了。
HTML & JavaScript
還在唸書時因為有協助維護一個購物網站,因此免不了要碰到 HTML 與 Java Script 的撰寫。當時那個購物網站使用的技術,有一部分是上面提到的 Java Servlet,另外也有用到 PHP 的部份。之後過了好幾年,有一個跟朋友合作開發 Facebook 遊戲的機會,在那次開發中又重新溫習了一次 Java Script,並且大量採用 Ajax 技術。可惜那個遊戲在發佈之前就胎死腹中了。
PHP
最主要就是上面提到的購物網站與 Facebook 遊戲這兩個案子用到,不過卻前前後後持續寫了蠻長久的一段時間。維護購物網站的時後基本上都還是程式碼硬幹,到了寫 Facebook 遊戲的時候,就有現成的框架了,我選了一個叫 CodeIgniter 的框架,大體上類似 ROR 的寫法。其實一開始選的是 CakePHP,比較完整,不過真的是太龐大了,所以才換成 CodeIgniter。此外,由於以前經常安裝討論區、部落格、Wiki、購物車等網站套件,其中許多是 PHP 寫的,常常需要 hack 部分代碼,因此對 PHP 還算蠻熟悉的,有陣子甚至拿 PHP 當 Shell Script 來使用,用來解決手邊的小問題。
SQL
說到網站程式就不能不提到資料庫。前前後後接觸過一些不同的資料庫,學生時代在 IBM 打工時是 DB2,前面提到的購物網站是 MySQL,進了遊戲公司之後,陸續又接觸到 PostgreSQL、Microsoft SQL Server,Oracle。其實單就 SQL 來看的話都大同小異,各資料庫 Server 之間最大的差異性還是在 Server 的管理與調校上,以及各種千奇百怪的程式介接函式庫寫法。
Shell Script
除了用 PHP 當 Shell Script 外,在我還在第一家遊戲公司時,由於是在 Linux 平台上開發的關係,也用 BASH 寫了不少方便日常工作或是開發的 Script。有少部分的代碼用 Perl 寫,用 Perl 寫起來很快,不過寫完看起來真的像天書一樣,真的是「寫完即丟」的語言。在 Windows 上,也曾經用 Batch 檔或是 Power Shell 寫過一些臨時性的小工具。
C++
進入遊戲公司後,幾乎就一直過著與 C++ 分不開的生活。早先是在 Linux 下寫 Server,能用的就是 Emacs 或是 Vim,後來換了公司,改用 Visual C++ 寫,一開始我還真的很不習慣,這麼複雜而多功能的介面,有時常常不曉得從哪邊開始下手。雖然在念書時學過,但我是從進遊戲公司之後,才真正重新認識了 C++,學到物件導向、Template、設計模式、重構等概念。當然,上面有些概念是跨語言通用的,不過因為 C++ 是我這幾年來長期接觸的語言,自然也成為前述幾個概念的學習媒介。
C++ 是個頗具爭議性的語言,他使用者多,但批評者更多,C 語言的陣營批評 C++ 不夠簡潔、純粹,STL 更是把許多工作變成讓人摸不著頭的黑箱;反之 Java 或 C# 的支持者又覺得 C++ 不夠完善,要寫個功能還要到處找函式庫,同個功能可能還有好幾種不同的函式庫,不同的實作與不同的使用概念,令人眼花撩亂。我自己是覺得,C++ 雖然亂,雖然我也對此感到困擾,但是也正因為他的兼容並蓄,使得各種各樣的想法與實作都能在上面獲得實踐。不過話說回來,對於產品開發而言,有時候工具還是單純點好。
Auto Hotkey Script
為了玩 Facebook 遊戲更「方便」而去學的程式。有寫了餐城(Restaurant City)的自動撿垃圾、自動到別人家評分,以及 Farmville 的自動種植、收割、耕地等功能,Mafia Wars 的連續任務。這些工具都是自娛,沒有對外釋出。隨著社群遊戲不斷的改版,這些工具也早就失效不能使用了。
Lua
在之前待過的公司中有用過,之後自己出來做的案子也有用。雖然如此,自己還是覺得對 Lua 的使用還不夠熟。曾經有寫過一個專案,使可以整合 C++ 與 Lua / Python / Squirrel 這三種 Script Language,目的是可以從 C++ 呼叫寫在 Script 的函式,也可以反過來。不過當初只寫了一個方向(C++ 呼叫外部),反過來的方向由於各 Script 語言存在的差異較大,自己的能力也不夠,就沒繼續開發下去了。
Python
這語言已經成為我這一兩年來的最愛了。在 Script Language 的領域中,一開始我是對 Lua 比較有興趣的,畢竟公司專案在用,而且 WOW 的 Custom UI 也都是用 Lua 撰寫,有 Billizard 的光芒加持,自然讓人不得不多看 Lua 幾眼。不過自從寫過 Python 的 Code 之後,我發現寫 Python 的過程可以獲得一種純粹的程式撰寫樂趣,我面對的是「程式所要解決的問題」本身,而不再是陣列、記憶體配置、指標、堆疊等等這些瑣碎的雜事。去年開發一個簡單的動畫編輯器,就是以 Python + wxPython 作的;而最早接觸 Python 的起點呢?喔,那是為了寫一個 Travian 的找資源點的工具,比較了幾個語言後發現用 Python 來抓網頁資料進行解析最為方便,於是就一頭踏入 Python 的思考領域了。
NSIS (Nullsoft Scriptable Install System)
最近才開始摸的東西,是用來寫安裝程式的語言。除了一開始入門門檻稍高外,不算太難,只要跨進去後剩下的就簡單了。之所以說一開始稍難,是因為最簡單的安裝軟體也要做許多事情,畢竟安裝軟體可不像其他語言只要秀秀 “Hello World” 就算完成第一個程式了。NSIS 也有 function 跟 macro,不過 function 沒有傳入參數,反正所有變數都是全域,也就不用傳入什麼了;如果真的需要傳入參數的話,倒是可以用 macro,雖然意義上不是,但程式碼看起來更接近傳參數的函式。這算是最近寫 NSIS 的一個小小心得吧。
Objective-C
這是目前正在進行的專案所用的語言。如果熟悉 C++/Java/PHP 這類 C-like 的語言,要學 Objective-C 真的很快。比較大的不同在於 message 的概念,前面的幾個語言不管是 function 或是 method,都是圓括弧呼叫的方式,在 Objectiv-C 中,函式的呼叫變成了訊息的傳遞,而且每個變數都必須寫出變數名字。剛開始看的確會有些彆扭不習慣,但是徹底改用「訊息傳遞」的角度去思考理解的話,其實 Objective-C 的這種寫法還蠻可愛與口語化的。
後記
看了一下 TIOBE Programming Community Index for July 2011,前十名的程式語言中,除了 C# 之外,有九個我都接觸過或多或長的一段時間。其實之前為了研究 XNA,也有稍微看過 C# 的 code,不過稍微看看也不算寫過就是。但是 Windows Phone 的開發免不了得靠 C#,或許再不久的將來有機會寫 C# 也說不定?