學程式語言的樂趣
國三時為了做北市數學科展,實習老師教我使用 Microsoft Word,這是我首次體會到電腦在遊戲之外的樂趣。為了學會怎麼灌 Windows,高一時參加了社團,結果社團學長 Scott 說:「灌 Windows 太簡單了,你來學 C 吧。不過我們這裡只有 Red Hat Linux,就邊學 C 邊學 Linux 吧。」傻傻的我,以為 Linux 裡只有 Vi,就四處翻 Linux 入門書,看完各本書裡 Vi 部份,還寫了篇 Vi 的教學。日漸熟悉 Vi、bash 指令後,覺得玩系統、寫程式真有趣。於是上課無聊就偷看電腦書,下課耍自閉繼續看書,中午放學都跑去社團混,就這樣渡過我的高一。不知不覺,我打下日後學習能力最重要的基礎。
高一一時想不開,同時學 C 和 Perl,用 Perl 寫東西頗有趣的,特別是費盡心思把程式擠到一行作完一件煩人的小工作時,有說不出來的成就感。可是我基礎太弱,無法明白兩者更深層的差異,只能當作兩個不同工具看。兩者同時學的下場,學一陣子仍不熟兩邊的語法。於是我先專心學 C,之後 Perl 也忘光了。那段日子最大的收獲是,不要一次同時學兩個語言。另外,多虧 Scott 心理不正常,用 K&R 的《C 程式語言》當入門書,我直接學會標準語法,和 C 的典型寫法。這個習慣一直伴隨我到現在,每學一個新語言時,我傾向直接找能教我典型寫法的書,省去先花時間學一堆語法,再去蕪存菁地寫出典型風格。
寫了三年的 C,大一接觸到 Java 後,覺得 OOP 很有趣,這麼簡單又優雅地,讓我能同時使用兩個 Stack!雖然一開始寫著滿滿的 C-like Java,程式裡都是 static method,看了些 OOP 的書,開始轉型寫著自以為是 OOP 的怪東西。時至今日,我仍然不明白要怎麼寫出真正的 OOP。至少我發現自己寫得不是 OOP,和大學時相比,算是進步不少。
有些課要求用 C++,我就會用 Java 學到的 OOP 觀念和 C 的經驗來寫。每次要寫 C++ 就重翻一下 C++ 快速入門的書,寫完後又忘光一切。大三做專題時,我和朋友們打算參加一個國外的比賽,由於主要贊助商是 Microsoft,我們決定用 .NET Framework 開發。就這樣,我有個好機會寫 C#。亂翻一些 ASP.NET 的書把殼刻一刻後,我找了《C# Essentials》來看。這本書如其名,薄又都是重點,很快地明白 C# 的特色,讓我覺得 C# 挺漂亮的。不過寫完專題後沒繼續寫 C#,現在什麼也不記得了。而且,當時我的底不夠深,仍無法感受到各語言的特色。
除 C++、C# 兩個插曲外,大學時主要用 Java 和 PHP。用途很簡單,接網站案子用 PHP,其它用 Java。我練習 PHP 的方式是不斷改寫自己的網站,還有接些小案子,可是我覺得 PHP 實在不怎麼美,沒動力學好它,能用就好。
大學中途有試著寫了一點 Python、Scheme,可惜無法持續。一直到碩一一時興起,一方面是厭煩了用 PHP 寫重覆的東西,另一方面想試看看當紅的 Ruby on Rails,就邊查邊寫完成一個小案子。寫得過程裡,覺得 Ruby 很奇妙,於是在寒假花了一週讀完《Programming Ruby》第一部份,這才正式開始我學的第三個語言。
自那之後,我只有寫 Ruby,Java、PHP和其它語言碰也沒碰,這樣直到碩士畢業。沒錯,我的碩士論文也是用 Ruby 寫的,這才深深體會到 Ruby 有多慢有多肥,幸好實驗室的機器很壯,不然我得改用 Java 完成碩論。這段期間,把一個論文裡用到的程式零零總總地加起來,大概有兩千多行,也驚覺 Ruby 幫我省了不少寫程式的時間,相信用 Java 的話,我無法在不到一個月的時間裡寫完自己的演算法、數個比較對象的演算法、前置處理、評估分數等程式。不過卻辛苦交接的學妹,這樣瘋狂用一個不熟語言趕出來的程式碼,原以為不會繼續用的說。
用 Ruby 讓我有了第二次衝擊,就像當年從 C 到 Java 發現可以同時有兩個 Stack 那般驚奇,沒想到 iterator、code block 這麼好用,腦裡想什麼,手就可以直接敲出來,不用寫一寫還要把游標移來移去。而且,Ruby 可以寫出很短又好讀的程式,我從來沒想過程式可以寫到這麼精簡,而寫到這麼精簡後,又更容易理解。
碩士畢業去一家公司實習時,該公司不用 Ruby,我藉機來試看看 Python。於是,對照先前一年多寫 Ruby 的經驗,我明白很多事。有時選擇某個語言,沒有什麼明確的理性依據,單純是個人偏好。高中時我一直想知道 Python 和 Perl 的差異,到底學那個比較划算,如今又多了一個 Ruby 列入抗爭。現在來看,即使我可以找到三者在語言設計、執行速度、社群、函式庫、上手度等各方面的比較,到頭來,選擇何者反而像是信仰。
附帶一提,若要推廣一個程式語言,良好的互動直譯器、快速隨手查的文件、精簡易讀的入門書,三者缺一不可。 Ruby 大概就互動直譯器弱了一些,而 Python 三者都完美無缺,非常容易上手。至於 Java,即使到現在,我仍不知道要推薦別人看什麼書入門。最後附上我對各語言入門方式的看法,入門書書單是針對已學過一種語言的人:
| 語言 | 互動式直譯器 | 隨手查的文件 | 入門書 |
|---|---|---|---|
| C | 無 | man page | 《C 程式語言》 |
| Ruby | 設定後的 irb | ri | 《Programming Ruby》 |
| Python | ipython | ipython | 《Python Essential Reference》 |
| Java | 無 | CHM格式的 Java doc | 無 |
( 待續 )
歷史上的今天
- 《海潮之聲》中文版小說 - 2007
All, Java, Programming, Python, Ruby
chm 格式的 javadoc 不好用啊!還是用 html 格式的唄。可以隨 browser 的功能放大縮小字型、圖片。
CHM 格式方便搜尋和索引,畢竟是隨手查的文件嘛。
想請問一下,如果學過 C++ 了,要學 Python 從那一本開始比較好呢 ?
如我文末所言,可以看《Python Essential Reference》。這本的好處是沒有廢話,像 if、while 這類語法一頁就講完了,不像一般入門書在那說明控制流程是啥。
看完這本書後,我為了查資料有時翻了一些《Dive into Python》(這本有免費電子書),我覺得也不錯,不過我只是跳著看,不知有沒有《Python Essential Reference》精簡。
至於不少人推的《Learning Python》,我覺得那較適合第一次學程式語言的人看,理由如前,會多說明一些我們早知道的事,我看過幾次覺得太慢就沒繼續看了。
非常感謝! 我就是看了 Learning Python 覺得太長了,我會找這兩本書來看看。
The 4th Edition of Python Essential Reference (http://www.amazon.com/Python-Essential-Reference-Developers-Library/dp/0672329786) was published on July 19, 2009.
It covers Python 2.5 and 2.6 language features like using generators to implement coroutines and the new ContextManager protocol. If you didn’t read the “Whats new in Python X.Y” documentation:
http://docs.python.org/dev/whatsnew/2.6.html
you’ll want to know about managing resource handles with ContextManagers and the “with” keyword.
過一陣子來翻翻 4/e,謝啦。
翻了一下 what’s new in 2.6,好多令人心動的功能,with 看起來頗好用的,只是 Ubuntu 預設是 2.5,讓我有點懶得用 2.6。慢慢學新功能好了。
Hi camel, 我是以前CNMC的FantasyABC,不知道你還記不記得我xD,看到你這段歷程好像又回到高中時光~ (記得好像上過你vi的教學課?!)。你說的大三參加的比賽是Microsoft的Imagine Cup嗎~
是 sabc 嗎? 我大三參加的是 IEEE CSIDC http://www2.computer.org/portal/web/education/csidc
“到頭來,選擇何者反而像是信仰。” => 我蠻認同這句話的。
不過,我之前讀書時是非常討厭寫程式的,反而是出社會後,陸續工作上需要寫一些小程式來輔助,才開始學習的。