30 October 2008

from: http://xkcd.com/353/

應工作需要,我也開始摸了一下 python,摸了一段時間... 嗯,還真好用。就稍微屁一下吧

使用 Python 最特別的體驗是: python 是由 sequence 和 dictionary 兩種資料結構所構成的語言。 arguments 是一個 dict,scoped variables/method 也是用 dict,連他的物件導向也是用 dict 兜出來的。而 sequence 的觀念則是混合在 string, tuple, foreach, list comprehension...等等之中。整個語言規則幾乎可以用 sequence 和 dict 去理解。簡單講,就是學習曲線低, 然後又有很高的延展性。light weight and powerful!

python 並沒像 ruby 那樣著了魔,處處講究 everything is object,我每次看到 ruby 的 3.times(...) 就很感冒。3 是數字,叫數字 "工作"... 這很違反我的直覺... python 比較沒這種煩惱,不過 python 有一些很基本的物件的性質 卻沒內建。 一個 list 的長度居然是 len(list) 而不是 list.len(),一個物件的字串形態居然是 str(myObj) 而不是 myObj.to_string()。str() 還可以用 cast 去理解,但是 len() 就真的不可原諒了。

除了 OOP, python 也提供 procedure 和 functional 兩種 paradigm,前者讓 python 可以做為一個 script 語言,後者提供了 語言高級應用的可能。functional 的功能沒有很多,不過我覺有 list comprehesion, map(), filter() 和 lambda 就很夠用了。 我之前玩了一陣子 Haskell,什麼 rfold, curry, tail recursive, monad ,blah blah 看的眼花瞭亂。那時我自己的結論跟大家差不多 ... 就是純 functional 語言永遠不會起來的。未來可見的方向是 -- 取其 functional 語言中的精華,予以簡化, 然後逐步納入主流的語言。以此檢驗 python 的過去歷史發展和現在的成果,就可了解它的發展方向是正確的。 python 提供三種 paradigm,語言功能相當的完備,不同的功能可以選用適合的 paradigm 來寫。大家朗朗上口的 "choose the right tool for the job",一個語言就可以滿足。

python 語言的可讀性高這就不廢話了。但是強制縮排這件事讓很多人不滿。寫一陣子 python 後,發現強制縮排的確是有道理, 可以簡化語法。但是!但是!我發現強制縮排的問題不是強制,而是縮排的規則。python 只要上下的縮排的字元數一樣,就算過關。 我想這原意是希望保留一些彈性... 可是,假如你是用 4 個空白縮排的,然後你 google 一下程式範例,比方說 google app engine 的範例 ,查到的縮排卻是兩個空白的,這時剪貼到你自己的程式中就囧大了,只好手動修修改改... 這種事實在是很煩,目前我查到的 IDE 也沒有一個功能 能夠自動修正這種問題的 (手動排版程式碼,這是20世紀的事啊!) python 一開始應該狠一點就強制一定只能用4個空白來縮排就好了, 也不要允許 tab 字元縮排,全世界統一,這樣事情就簡化更多。(真的很計較 "強制" 這種事的人,不管規則怎麼定的有彈性,理由多麼充足, 都不會買帳的)

python IDE 目前做最好的 pydev extension (要錢),有 auto import 和 code completion (比免費的強), rename 和 extract method 等最基本的 refactoring 也有提供,勉強算是跟得上 21 世紀啦。我目前也是寫寫100行內的小玩具而已, 還不大需要 IDE 來管理 code。未來有沒有嘗試大型 python 專案的機會呢?我覺得是很少的,因為不適合。 大型專案比較重要的還是支援、維護、人力...etc,script 語言目前還是無法跟 java/c++ 等相較

python 最最吸引我的並不是簡潔的語法,而是無數的 library。python 程式真的多到翻掉,尤其我是用 linux 的,linux 到處都是 python,ubuntu repository 裡目前有 800 個 python lib,只有一個爽字可形容。 用 windows 的 developer,可惜了,你的人生錯過了 python... 我的意思不是 windows 不能用 python , 而是沒那個環境和機會讓你多接觸。就像在台灣也能學英文,但跟直接住美國學還是差很多啊! 如果要選一個 script 語言來當工具的話,語言本身 ruby 和 python 各有千秋,跨平台性兩者都不錯,但是...龐大的 lib 就代表高生產力啊, 所以 python 成為我的選擇。

script 語言的魔咒是什麼? U.N.I.C.O.D.E ! 任何處理多國語言的程式,不管大小,目前就用 Java 寫吧, 靠 python 嗎? 2010 年我再看看堪不堪用吧! python 3k string 預設型別總算是 unicode 了,過沒多久也要 release 了。 但是別忘了還有無數的 python lib 要轉換到 python 3k 去啊。 python 目前的成功就是自己未來的絆腳石.... 但是再怎麼痛苦還是得快點轉換,因為 21 世紀還不能好好處理 unicode 是一件不可諒的事~~~~

另一個 python 的賣點就是 google app engine。免費的 google cloud host 平台,超夢幻的! 有 google 撐腰,上面提到的成本、維護、人力一些 python 缺乏的好像就不再是缺點了。 我學了一點 python 後,馬上就開始研究了一下.... 但... 目前的結論是 google app engine 是一個玩具引擎.... 不是因為它的功能少,不是因為它的 ORM 不能 join,不是因為它還不太穩定....。而是它不能進行 heavy task!! 一個 http request 限制在幾秒內一定要完成,沒完成就 error ,也沒有提供 backgroud job。 我堅信一個道理:

電腦產生的價值來自於大量的運算和分析

一開始也許做做小小應用可以吧,等到網站大了,你會想要開始分析和研究資料吧?每次分析都把資料從 app engine 全部 dump 下來嗎?當場囧掉 ! 或者你打算做圖學或 bio 之類上的應用,需要大量的數學運算,那...... 真的只能自求多福了。未來若 app engine 不提供進行 heavy task 的功能,那 app engine 上的 app 永遠也做不大 (因為無法提供有價值的事)。而它號稱的 scale 能力也將沒人會用到...... (還真諷刺啊)

啊... 還有一些想屁... 今天時間晚了,就到此為止吧。對了, python 的書,推薦 dive into python 這本,它是一本深入深出的好書 (我沒打錯字,這本是給有語言基礎的人看的)。