從 java programmer 的觀點看 ruby

36
從 Java Programmer 從從從從從 Ruby 從從從Qing qing.chwang at gmail.com 2011/08/27

Upload: -

Post on 26-Jun-2015

5.756 views

Category:

Documents


0 download

DESCRIPTION

RubyConf Taiwan 2011

TRANSCRIPT

Page 1: 從 Java programmer 的觀點看 ruby

從 Java Programmer 的觀點來看 Ruby從 Java Programmer 的觀點來看 Ruby

王建興( Qing )qing.chwang at gmail.com

2011/08/27

Page 2: 從 Java programmer 的觀點看 ruby

講者簡介講者簡介 現職

聖藍科技技術長 譯作

Thinking in Java 4th Edition, 正體中文版 Thinking in Java 2nd Edition, 正體中文版 Essential C++, 正體中文版

專欄 iTHome 電腦報程式人專欄

榮譽 2004 年趨勢百萬程式設計競賽冠軍 2009 年經濟部通訊大賽 -Android 手機軟體設計競賽第三名

NOTE 不是任何語言的基本教義派

Page 3: 從 Java programmer 的觀點看 ruby

AgendaAgenda

我的程式語言歷程 對 Ruby 的初次印象及認知 淺談生產力 Java 的興起及既有問題 Ruby 江山代有才人出 Ruby 的侷限 站在 Java 肩膀上的 Ruby

Page 4: 從 Java programmer 的觀點看 ruby

我的程式語言歷程我的程式語言歷程

BASIC

1987 1990 1993 1997 2003

ASM

PASCAL

C++

Prolog

Java

C#

C

ObjC

2009

Page 5: 從 Java programmer 的觀點看 ruby

唯一用過的直譯式程式語言 - BASIC唯一用過的直譯式程式語言 - BASIC

10 REM Sample BASIC Program - Counts To Ten20 REM30 REM Copyright 2005 Andrew Eichstaedt40 REM Eichstaedt Development Group50 REM http://www.andrew-eichstaedt.com60 REM70 PRINT "Hello! I am a sample BASIC program"80 PRINT "that counts to ten."90 PRINT100 FOR I=1 TO 10110 PRINT I120 NEXT I130 PRINT140 PRINT "Thanks for running me."150 END

*http://www.andrew-eichstaedt.com/sample-basic-program.html

Page 6: 從 Java programmer 的觀點看 ruby

為什麼學了這些程式語言為什麼學了這些程式語言

BASIC 是第一個啟蒙的程式語言 開始自學 80x86 組合語言是因為想對電腦的運作更了解

組合語言寫成的程式又小又快 開始學 C 是想踏入結構化程式語言的領域

C 搭配 80x86 組合語言成了有一陣子最喜歡的組合 PASCAL 是學校教學常用的程式語言 為了進到物件導向的殿堂所以開始學著使用 C++ 想要擴展對程式語言類型的了解,所以修了一門教 Prolog

的課 被研究所指導教授誤以為會寫 Java ,只好趕快學會 Java 因為工作的關係,開始用 C#/ObjC 寫作程式

Page 7: 從 Java programmer 的觀點看 ruby

最喜歡的程式語言最喜歡的程式語言

C Simple is Beautiful 深深影響 C 族系的程式語言,包括 C++, Java, C#,

ObjC Java

運用在實戰中能有高生產力 反省 C++ 以降的諸多影響生產力的因素 Java = C++--

Page 8: 從 Java programmer 的觀點看 ruby

對 Ruby 的初次印象及認知對 Ruby 的初次印象及認知

在 2006 年,當時當紅的 Web 2.0 網站 HEMiDEMi 採用RoR 開發,宣稱有 Java 十倍的生產力

身邊開始陸續有不少朋友投入 Ruby/RoR 的領域從事開發

會轉戰 Ruby/RoR 的開發人員,許多都是被高生產力所吸引

Page 9: 從 Java programmer 的觀點看 ruby

為什麼我不用 Ruby/RoR為什麼我不用 Ruby/RoR

個人偏好 喜歡編譯式程式語言 喜歡靜態型別程式語言

目前尚未遭遇太嚴重的生產力問題 影響生產力的因素有很多,不單是語言及框架

Page 10: 從 Java programmer 的觀點看 ruby

影響生產力的因素影響生產力的因素

程式語言 程式庫

核心程式庫 開放原始碼程式庫 自有的程式庫

應用程式框架 設計

易於重複使用的程式碼 不容易出錯的設計

開發工具 開發方法及流程

Page 11: 從 Java programmer 的觀點看 ruby

程式語言如何影響生產力 - 以 Java 為例程式語言如何影響生產力 - 以 Java 為例

以 C++做為一個反省的目標 不由程式設計者自己配置 /釋放記憶體

改用 GC 機制 不支援指標

僅有 reference 不允許越界的陣列操作 - ArrayOutOfBoundException 對空指標的處理 - NullPointerException 將 boolean納入基礎型別,所有的 condition 都必須是

boolean … 等等

Page 12: 從 Java programmer 的觀點看 ruby

boolean 型別在 Java 中的影響boolean 型別在 Java 中的影響

int a = 3;int b = 1;if( a = b ) // if( a == b ){ // do something}

Page 13: 從 Java programmer 的觀點看 ruby

減少程式設計者犯錯的機會 (1/2)減少程式設計者犯錯的機會 (1/2)

是否容易犯錯是影響生產力的關鍵之一 一個錯誤要花數倍的時間才能修正 Java透過語言上的設計,盡量減少程式設計者犯錯的

機會 這是 Java 生產力更勝於 C++ 的關鍵原因之一

Page 14: 從 Java programmer 的觀點看 ruby

減少程式設計者犯錯的機會 (2/2)減少程式設計者犯錯的機會 (2/2)

C++ 的語法很有彈性,也很有威力 C++裡有 operator overloading , Java僅有 String 的

+ 是有 operator overloading 的 C++ 有多重繼承, Java 中僅有多介面實作 透過削減容易出錯的語言構建,來減少程式設計者犯錯的機會

即使語言威力變弱了,看起來不那麼巧妙了,或許要用比較多的程式碼才能做到一樣的事,看起來很笨,但因為不容易犯錯,反而可以提高生產力

Page 15: 從 Java programmer 的觀點看 ruby

魔幻語言 – 孟岩 “ Ruby 1.9 不會殺死 Python”魔幻語言 – 孟岩 “ Ruby 1.9 不會殺死 Python”

“魔幻語言”擁有豐富的特性,聰明的技巧和意想不到的奇效,永遠有發掘不完的奇技淫巧,總能找到讓人匪夷所思的” yet another way" 主要代表作品有 C++ 、 Perl 、 Javascript 和 Ruby

“簡約語言”崇尚清晰直接,夠用就行,要求從代碼容易理解,寧可笨一點、累一點、多寫一點代碼,反對出人意料的技巧,反對故弄玄虛 C 、 PHP 、 Python 和 Lua 這一派語言的代表作

而 Java 和 C# 從語言設計來說,一開始還是比較簡約的,但是近來越來越魔幻,而且標準庫設計相當繁複

*http://blog.csdn.net/myan/article/details/2028545

Page 16: 從 Java programmer 的觀點看 ruby

寫程式要克服的兩種困難寫程式要克服的兩種困難

“No Silver Bullet” - Frederick P. Brooks, 1986 附屬性( accidental)的困難

因為用的編程工具不對才會難 例如手動記憶體管理

本質上的困難 就像是處理程式不同部分的細微互動 比如找出你剛加入的新功能影響到的所有地方

* 「超越 Java :探討程式語言的未來」書評 - Joel Spolsky

Page 17: 從 Java programmer 的觀點看 ruby

各世代程式語言演化所解決的附屬性困難各世代程式語言演化所解決的附屬性困難

組合語言 代數語言(包含 Fortran) 結構化語言( Algol-60 跟 C) 宣告式語言(包含 SQL) 記憶體管理語言(包含 Lisp, VB, 和 Java)

* 「超越 Java :探討程式語言的未來」書評 - Joel Spolsky

Page 18: 從 Java programmer 的觀點看 ruby

程式庫如何影響生產力 - 以 Java 為例程式庫如何影響生產力 - 以 Java 為例

Java相較於 C++ , Java 有個先天的優勢是它的核心程式庫 字串 , I/O處理 , 網路 , XML處理 , 容器 , 多執行

緒 , 資料庫連線 , 加解密 , 正規表示式 , loggin, 多國語言處理 , …

甚至到 Android平台上都沿用了不少核心程式庫 早期的 C++ 程式設計者,可以說是人人都有套自己的

程式庫 C++ 中期有所謂 STL ,後期則有 boost

STL沒有十分統一的標準,各編譯器支援不盡相同 好的程式庫不僅造就好的生產力,也和應用程式運行效能息息相關

Page 19: 從 Java programmer 的觀點看 ruby

Java 成功的關鍵Java 成功的關鍵

適逢 Internet 時代的到來 和 C++ 系出同門的血統 改進諸多 C++ 的問題 開放原始碼社群運作良善,威力強大

Tomcat ant log4j struts hibernate Lucene …

Page 20: 從 Java programmer 的觀點看 ruby

Java 語言本身的問題Java 語言本身的問題

愈來愈魔幻的語法 例如: Generics

靜態型別系統 相較於 Smalltalk 及 Ruby還不夠動態 額外的語法及語言結構,導致程式碼的長度增加 不能說是問題,只能說是特質

不夠純粹的物件導向 例如 primitive type ,讓 Java操作資料上分成了物件

和 primitive type兩套系統 效率考量

相較於直譯式程式語言,編譯和部署週期更長

Page 21: 從 Java programmer 的觀點看 ruby

Java 在 Web 應用程式開發的問題Java 在 Web 應用程式開發的問題

複雜的應用程式框架,造成學習曲線長 Struts, Hibernate, …

過度倚賴 XML形式的設定檔 複雜的編譯部署程序

Page 22: 從 Java programmer 的觀點看 ruby

超越 Java – 探討程式語言的未來超越 Java – 探討程式語言的未來

*http://www.oreilly.com.tw/product_java.php?id=a187

Page 23: 從 Java programmer 的觀點看 ruby

Ruby 在語言上的特點Ruby 在語言上的特點

動態型別系統 更純粹一點的物件導向程式語言 語法上捕捉出更多的高階抽象元素 meta-programming 整體而言,大部份的特質

某種程度上有助於減少程式碼的複雜度及長度 抽象度提高,程式碼就會減短

Page 24: 從 Java programmer 的觀點看 ruby

Ruby 語言被發明的初衷Ruby 語言被發明的初衷

松本行弘 會想做 Ruby 是因為同事 (石塚圭樹 ) “Perl 寫來方便但讀起來很難。如果有好的 OO Scripting 語言就好了”。雖然當時有 Python ,不過其 regular expression 沒內建,無法像 Perl 那樣寫得很快速

因此想寫一個兼具 Perl 的快樂及 OO 美感的語言 要能夠快樂寫程式,我是這樣想著而創造 Ruby 的

David Heinemeier Hansson Ruby 是 “能寫出美麗的程式碼,能使程式員快樂的語言 "

Page 25: 從 Java programmer 的觀點看 ruby

動態型別系統 vs. 靜態型別系統動態型別系統 vs. 靜態型別系統

靜態型別系統 透過編譯期的型別檢查,協助找出程式碼中潛在的問題

可減少執行期錯誤,但是型別檢查語法需要付出成本

基於靜態型別系統, IDE 能得到更多的資訊,例如進行 autocompletion ,或做自動化的重構

動態型別系統 語法成本降低,程式碼能較為簡短 對程式設計者技巧 / 自律的要求更高 可讀性有時候會受到影響,有些時候是因此而提高

Page 26: 從 Java programmer 的觀點看 ruby

動態型別系統和測試驅動式開發動態型別系統和測試驅動式開發

沒有靜態的型別檢查,就有可能犯下型別錯用的可能性 光是 typo就有可能造成災難

除了倚靠程式設計者的技巧,經驗和自律之外,利用開發方法可以做為輔助 測試驅動式開發( Test Driven Development, TDD) 透過測試程式進行檢查

Page 27: 從 Java programmer 的觀點看 ruby

動態型別系統不是沒有代價動態型別系統不是沒有代價

Java相較於 C++ ,在型別系統上已經更為動態許多 Runtime Class Loading Reflection RTTI

動態型別系統要付出的重要代價就是效率 C++/Java 問世時,都試著在效率和彈性上取一個在當

時最佳的平衡點

Page 28: 從 Java programmer 的觀點看 ruby

關於效率關於效率

是否具備足夠的效率,是會隨著時代而有不同的意義 硬體效能成長 應用程式不單只是 CPU-intensive 的行為模式

愈是高度抽象化的語言,愈有機會得到更高的效率 程式庫的好壞,也會影響到應用程式的效率 Java也經歷過大眾對於效率的質疑 生產力的重要性,在大多時候重於效率

Page 29: 從 Java programmer 的觀點看 ruby

關於程式設計風格的差異關於程式設計風格的差異

Java 是個容易統一程式設計風格的程式語言 高手庸手的差異不在語法運用上,而在設計上 更適合大規模的協同開發 大巧若拙

Ruby相較而言,程式設計風格較難統一 語法靈活,變化空間大 高手易於展露炫技 寫作方式易於因而人異

Page 30: 從 Java programmer 的觀點看 ruby

RoR vs. Java Web 應用程式開發RoR vs. Java Web 應用程式開發

RoR無疑是個成功的應用程式框架 吸引眾人投入 Ruby 的領域

Java 在 Web 應用程式開發的問題,大體上來說,不是語言的問題 而是應用程式框架設計方向的問題 輕量化的應用程式框架有助於消解這些問題

例如, Java社群很多人採用 Hibernate來存取資料 我們採用自己開發的輕量化資料存取程式庫:

http://sourceforge.net/projects/lwdba/ 例如, CRUD 應用程式產生器 例如, DB schema與資料物件的自動對映

Page 31: 從 Java programmer 的觀點看 ruby

Ruby 的侷限Ruby 的侷限

目前的焦點僅限於 Web 應用程式開發 相較而言, Java 是一個更為一般化的程式語言 從晶片卡、到手機、機上盒、 電視、到個人電腦、到伺服器端,都有 Java 的蹤影

Ruby 目前最有力的實證還是在 Web 應用程式的開發,而這主要是憑藉著 RoR 的威力

究竟是因為 Ruby 的天性所以程式寫的快?還是因為 RoR 設計的好,所以程式寫的快?

“RoR 在實現中用了很多奇技淫巧,但是在這個框架之上開發 Web 應用,卻顯得比 PHP 更簡約直觀,這就是通過魔幻達到簡約的例子” – 孟岩

Page 32: 從 Java programmer 的觀點看 ruby

Ruby 尚需努力的方向Ruby 尚需努力的方向

運行效率 可用資源

尤其是程式庫 開發工具 技術支援 社群力量

Page 33: 從 Java programmer 的觀點看 ruby

站在 Java 肩膀上的 Ruby (1/2)站在 Java 肩膀上的 Ruby (1/2)

JRuby Ruby 程式語言的 Java 實作品 可以將 Ruby 直譯器嵌入 Java 應用程式中 允許 Ruby 程式和 Java 程式的雙向互動

透過高效的 JVM足以提升 Ruby 的運行效率 Java/JVM 有著更成熟豐富的既有資產

最佳化技術 程式庫 市場佔有率 現成的企業級運行架構 跨平台

Page 34: 從 Java programmer 的觀點看 ruby

站在 Java 肩膀上的 Ruby (2/2)站在 Java 肩膀上的 Ruby (2/2)

JVM 未來很有可能成為一個超級平台 多種語言能同時運行於 JVM之上

透過 JVM做為一個溝通的平台,更有利於不同語言間的溝通及界接

讓每種語言發揮在最適合發揮的地方,透過 JVM來聯絡

Page 35: 從 Java programmer 的觀點看 ruby

關於程式語言的選用關於程式語言的選用

沒有最好的程式語言,只有相對適合的程式語言 多語言的程式設計者就有更多的工具,也能擁有更多面向的觀點

有時候,現實的應用程式開發往往會涉及多種程式語言

依據你的個性,面臨的工作需求來選用合適的程式語言

Page 36: 從 Java programmer 的觀點看 ruby

ThanksThanks