2012年3月6日星期二

Ruby 初體驗

史丹福大學的網上課程出現問題,未能如期開辦,於是我唔嫁又嫁,上了兩星期 SaaS 的課。課堂乃 UC Berkeley 本科生課堂內容的錄影,完全是正宗名校課堂內容,只不知功課程度與本科生的差幾遠。沒有同學、助教或教授支援,實在有點吃力,結果,第一份功課已經覺得太難,搞到要上網抄功課。抄襲本是學生大忌,但這並非正規課程,而且根據課程簡介所述:
Those who submit homework 1 and receive a passing grade will receive a coupon good for 100 hours of small instances of EC2 for use on the remaining homework assignments plus a coupon to upgrade their free GitHub accounts to a Micro account (both good through the end of course).
有此物質誘因之下,我實在很想學曉如何在 Amazon 設置雲端應用,那管該應用是如何白癡。第三週的功課已經要求學生做 application deployment,真懷疑自己能否完成。

SaaS 課堂用的是 Ruby。Ruby 感覺上有些似 Smalltalk,是很徹底的 OOP(連 class 都是 Class 的一個 instance!)加 dynamic typing。猶如 Java 推出初期,C/C++ 與 Java 的用家之間有 language war 一樣,Ruby 與 Python 的粉絲之間,好像也有互相攻訐。有些粉絲將某些 features 吹噓到天下無敵,以求將對手比下去。我不熟悉 Ruby,對 Python 也只是知道一點點,不敢妄言,但感覺上,Ruby 某些所謂 killer features (例如 block)好像也不是那麼突出,反而是一些小處更有趣,例如 Ruby 的 method names 可以包含 ?(問號)或 !(嘆號)。前者用來表示該 method 乃是非題,會回傳布林值。譬如我想知道某變數 x 是否屬於整數類別,就可以說 x.kind_of? Integer,換了是其他語言,類似的表述就可能寫成 is_integer(x),儘管差不多同樣清晰,但是 method name 有一個問號,讀者就絕不會搞錯這個 method 的意圖。至於感嘆號,乃用來表示該 method 具破壞性,舉例如 y 是一個 array,那麼,呼叫 y.sort! 會作 in-place sort,亦即 y 本身經過排序之後,內容會改變。相比之下 y.sort 只會回傳一個經過排序的 y 的 copy,但 y 本身保持不變。比起 Python 用 y.sort()sorted(y) 來表示兩個版本,Ruby 明顯高出一籌。

初學一種新語言,難免有不習慣的地方。儘管 Ruby 與 Python 都有不少 functional programming 成份,但不知何故,我總覺得 Ruby 的 funcional programming 味道較濃。我唸大學時讀的是數理科目,基本上,除了覺得 lambda functions 相當有用之外(特別是做 numerical optimization 的時候),很少接觸其他 functional progamming 技巧。學了 Python 之後,也只是覺得 list comprehension 很厲害,但其他 functional programming 部份有乜用,我是很疑惑的。事實上,就連 Python 之父 Guido van Rossum 也說一些 functional programming 的程式很難明白,因此他設計 Python 3.x 時,一度想將 Python 2.x 之中的 lambda, map(), reduce(), filter() 除掉三個,只保留 reduce(),但他又說
So now reduce(). This is actually the one I've always hated most, because, apart from a few examples involving + or *, almost every time I see a reduce() call with a non-trivial function argument, I need to grab pen and paper to diagram what's actually being fed into that function before I understand what the reduce() is supposed to do.
當然,如著名開發者 Joel Spolsky 所講,MapReduce 可以是超有用的,不過若電腦的 interpreter 或 compiler 並不利用 map 或 reduce 作平行處理,又或者我們用到的迴圈有 side effect,那麼我覺得 map 或者 reduce 並不很有用場。利用它們,你也許可以將程式由幾行變成一行,但代價是對一般人來說,程式反而變得較難閱讀,而這也是我對 Ruby 感到最不習慣的地方 ── Ruby programmers 似乎有一種意識形態,就是愈少行數,即代表程式愈 elegant。老實說,我覺得這種想法不但搞混了 compactness 等同 conciseness 兩種概念,還太過精英主義,有些變態。

3 則留言:

Chainsaw Riot 說...

NLP 開左課了。可自選用 Python 或 Java ,看落去不錯。

Justin 說...

Seems you can get micro instances for free...

http://aws.amazon.com/free/

The suffocated 說...

電鋸,SaaS 課程的所有部份,我以前皆一無所知,所以學得很吃力。SaaS 與 NLP 之間,大概要二揀一了,不過先看能否撐過本過才算吧。

Justin, yes, the course website has actually indicated us to get a free account, but apparently the coupon allows us to use EC2 small instances (instead of micro instances) for free for 100 hours.