SlideShare a Scribd company logo
從 Java Programmer 的觀點來看 Ruby 王建興( Qing ) qing.chwang at gmail.com 2011/08/27
講者簡介 現職 聖藍科技技術長 譯作 Thinking in Java 4th Edition,  正體中文版 Thinking in Java 2nd Edition,  正體中文版 Essential C++,  正體中文版 專欄 iTHome  電腦報程式人專欄 榮譽 2004 年趨勢百萬程式設計競賽冠軍 2009 年經濟部通訊大賽 -Android 手機軟體設計競賽第三名 NOTE 不是任何語言的基本教義派
Agenda 我的程式語言歷程 對 Ruby 的初次印象及認知 淺談生產力 Java 的興起及既有問題 Ruby 江山代有才人出 Ruby 的侷限 站在 Java 肩膀上的 Ruby
我的程式語言歷程 BASIC 1987 1990 1993 1997 2003 ASM PASCAL C++ Prolog Java C# C ObjC 2009
唯一用過的直譯式程式語言  - BASIC 10 REM  Sample BASIC Program - Counts To Ten 20 REM 30 REM  Copyright 2005 Andrew Eichstaedt 40 REM  Eichstaedt Development Group 50 REM  http://www.andrew-eichstaedt.com 60 REM 70 PRINT "Hello! I am a sample BASIC program" 80 PRINT "that counts to ten." 90 PRINT 100 FOR I=1 TO 10 110 PRINT I 120 NEXT I 130 PRINT 140 PRINT "Thanks for running me." 150 END *http://www.andrew-eichstaedt.com/sample-basic-program.html
為什麼學了這些程式語言 BASIC 是第一個啟蒙的程式語言 開始自學 80x86 組合語言是因為想對電腦的運作更了解 組合語言寫成的程式又小又快 開始學 C 是想踏入結構化程式語言的領域 C  搭配  80x86  組合語言成了有一陣子最喜歡的組合 PASCAL 是學校教學常用的程式語言 為了進到物件導向的殿堂所以開始學著使用 C++ 想要擴展對程式語言類型的了解,所以修了一門教 Prolog 的課 被研究所指導教授誤以為會寫 Java ,只好趕快學會 Java 因為工作的關係,開始用 C#/ObjC 寫作程式
最喜歡的程式語言 C Simple is Beautiful 深深影響 C 族系的程式語言,包括 C++, Java, C#, ObjC Java 運用在實戰中能有高生產力 反省 C++ 以降的諸多影響生產力的因素 Java = C++--
對 Ruby 的初次印象及認知 在 2006 年,當時當紅的 Web 2.0 網站 HEMiDEMi 採用 RoR 開發,宣稱有 Java 十倍的生產力 身邊開始陸續有不少朋友投入 Ruby/RoR 的領域從事開發 會轉戰 Ruby/RoR 的開發人員,許多都是被高生產力所吸引
為什麼我不用 Ruby/RoR 個人偏好 喜歡編譯式程式語言 喜歡靜態型別程式語言 目前尚未遭遇太嚴重的生產力問題 影響生產力的因素有很多,不單是語言及框架
影響生產力的因素 程式語言 程式庫 核心程式庫 開放原始碼程式庫 自有的程式庫 應用程式框架 設計 易於重複使用的程式碼 不容易出錯的設計 開發工具 開發方法及流程
程式語言如何影響生產力  -  以 Java 為例 以 C++ 做為一個反省的目標 不由程式設計者自己配置 / 釋放記憶體 改用 GC 機制 不支援指標 僅有 reference 不允許越界的陣列操作  - ArrayOutOfBoundException 對空指標的處理  - NullPointerException 將 boolean 納入基礎型別,所有的 condition 都必須是 boolean …  等等
boolean 型別在 Java 中的影響 int a = 3; int b = 1; if(  a = b  ) // if( a == b ) { // do something }
減少程式設計者犯錯的機會  (1/2) 是否容易犯錯是影響生產力的關鍵之一 一個錯誤要花數倍的時間才能修正 Java 透過語言上的設計,盡量減少程式設計者犯錯的機會 這是 Java 生產力更勝於 C++ 的關鍵原因之一
減少程式設計者犯錯的機會  (2/2) C++ 的語法很有彈性,也很有威力 C++ 裡有 operator overloading , Java 僅有 String 的 + 是有 operator overloading 的 C++ 有多重繼承, Java 中僅有多介面實作 透過削減容易出錯的語言構建,來減少程式設計者犯錯的機會 即使語言威力變弱了,看起來不那麼巧妙了,或許要用比較多的程式碼才能做到一樣的事,看起來很笨,但因為不容易犯錯,反而可以提高生產力
魔幻語言 – 孟岩  “ 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
寫程式要克服的兩種困難 “ No Silver Bullet”  - Frederick P. Brooks, 1986  附屬性( accidental )的困難 因為用的編程工具不對才會難  例如手動記憶體管理  本質上的困難  就像是處理程式不同部分的細微互動  比如找出你剛加入的新功能影響到的所有地方  * 「超越 Java :探討程式語言的未來」書評  - Joel Spolsky
各世代程式語言演化所解決的附屬性困難 組合語言 代數語言(包含 Fortran ) 結構化語言( Algol-60 跟 C ) 宣告式語言(包含 SQL ) 記憶體管理語言(包含 Lisp, VB,  和 Java ) * 「超越 Java :探討程式語言的未來」書評  - Joel Spolsky
程式庫如何影響生產力  -  以 Java 為例 Java 相較於 C++ , Java 有個先天的優勢是它的核心程式庫 字串 , I/O 處理 ,  網路 , XML 處理 ,  容器 ,  多執行緒 ,  資料庫連線 ,  加解密 ,  正規表示式 , loggin,  多國語言處理 , …  甚至到 Android 平台上都沿用了不少核心程式庫 早期的 C++ 程式設計者,可以說是人人都有套自己的程式庫 C++ 中期有所謂 STL ,後期則有 boost STL 沒有十分統一的標準,各編譯器支援不盡相同 好的程式庫不僅造就好的生產力,也和應用程式運行效能息息相關
Java 成功的關鍵 適逢 Internet 時代的到來 和 C++ 系出同門的血統 改進諸多 C++ 的問題 開放原始碼社群運作良善,威力強大 Tomcat ant log4j struts hibernate Lucene …
Java 語言本身的問題 愈來愈魔幻的語法 例如: Generics 靜態型別系統 相較於 Smalltalk 及 Ruby 還不夠動態 額外的語法及語言結構,導致程式碼的長度增加 不能說是問題,只能說是特質 不夠純粹的物件導向 例如 primitive type ,讓 Java 操作資料上分成了物件和 primitive type 兩套系統 效率考量 相較於直譯式程式語言,編譯和部署週期更長
Java 在 Web 應用程式開發的問題 複雜的應用程式框架,造成學習曲線長 Struts, Hibernate, … 過度倚賴 XML 形式的設定檔 複雜的編譯部署程序
超越 Java –  探討程式語言的未來 *http://www.oreilly.com.tw/product_java.php?id=a187
Ruby 在語言上的特點 動態型別系統 更純粹一點的物件導向程式語言 語法上捕捉出更多的高階抽象元素 meta-programming 整體而言,大部份的特質 某種程度上有助於減少程式碼的複雜度及長度 抽象度提高,程式碼就會減短
Ruby 語言被發明的初衷 松本行弘 會想做  Ruby  是因為同事  ( 石塚圭樹 ) “Perl  寫來方便但讀起來很難。如果有好的  OO Scripting  語言就好了”。雖然當時有  Python ,不過其  regular expression  沒內建,無法像  Perl  那樣寫得很快速 因此想寫一個兼具  Perl  的快樂及  OO  美感的語言  要能夠快樂寫程式,我是這樣想著而創造  Ruby  的  David Heinemeier Hansson Ruby  是 “能寫出美麗的程式碼,能使程式員快樂的語言 "
動態型別系統  vs.  靜態型別系統 靜態型別系統 透過編譯期的型別檢查,協助找出程式碼中潛在的問題 可減少執行期錯誤,但是型別檢查語法需要付出成本 基於靜態型別系統, IDE 能得到更多的資訊,例如進行 autocompletion ,或做自動化的重構 動態型別系統 語法成本降低,程式碼能較為簡短 對程式設計者技巧 / 自律的要求更高 可讀性有時候會受到影響,有些時候是因此而提高
動態型別系統和測試驅動式開發 沒有靜態的型別檢查,就有可能犯下型別錯用的可能性 光是 typo 就有可能造成災難 除了倚靠程式設計者的技巧,經驗和自律之外,利用開發方法可以做為輔助 測試驅動式開發( Test Driven Development, TDD ) 透過測試程式進行檢查
動態型別系統不是沒有代價 Java 相較於 C++ ,在型別系統上已經更為動態許多 Runtime Class Loading Reflection RTTI 動態型別系統要付出的重要代價就是效率 C++/Java 問世時,都試著在效率和彈性上取一個在當時最佳的平衡點
關於效率 是否具備足夠的效率,是會隨著時代而有不同的意義 硬體效能成長 應用程式不單只是 CPU-intensive 的行為模式 愈是高度抽象化的語言,愈有機會得到更高的效率 程式庫的好壞,也會影響到應用程式的效率 Java 也經歷過大眾對於效率的質疑 生產力的重要性,在大多時候重於效率
關於程式設計風格的差異 Java 是個容易統一程式設計風格的程式語言 高手庸手的差異不在語法運用上,而在設計上 更適合大規模的協同開發 大巧若拙 Ruby 相較而言,程式設計風格較難統一 語法靈活,變化空間大 高手易於展露炫技 寫作方式易於因而人異
RoR vs. Java Web  應用程式開發 RoR 無疑是個成功的應用程式框架 吸引眾人投入 Ruby 的領域 Java 在 Web 應用程式開發的問題,大體上來說,不是語言的問題 而是應用程式框架設計方向的問題 輕量化的應用程式框架有助於消解這些問題 例如, Java 社群很多人採用 Hibernate 來存取資料 我們採用自己開發的輕量化資料存取程式庫: http://sourceforge.net/projects/lwdba/ 例如, CRUD 應用程式產生器 例如, DB schema 與資料物件的自動對映
Ruby 的侷限 目前的焦點僅限於 Web 應用程式開發 相較而言, Java 是一個更為一般化的程式語言 從晶片卡 、 到手機 、 機上盒 、  電視 、 到個人電腦 、 到伺服器端,都有 Java 的蹤影 Ruby 目前最有力的實證還是在 Web 應用程式的開發,而這主要是憑藉著 RoR 的威力 究竟是因為 Ruby 的天性所以程式寫的快?還是因為 RoR 設計的好,所以程式寫的快? “ RoR 在實現中用了很多奇技淫巧,但是在這個框架之上開發 Web 應用,卻顯得比 PHP 更簡約直觀,這就是通過魔幻達到簡約的例子” – 孟岩
Ruby 尚需努力的方向 運行效率 可用資源 尤其是程式庫 開發工具 技術支援 社群力量
站在 Java 肩膀上的 Ruby (1/2) JRuby Ruby 程式語言的 Java 實作品 可以將 Ruby 直譯器嵌入 Java 應用程式中 允許 Ruby 程式和 Java 程式的雙向互動 透過高效的 JVM 足以提升 Ruby 的運行效率 Java/JVM 有著更成熟豐富的既有資產 最佳化技術 程式庫 市場佔有率 現成的企業級運行架構 跨平台
站在 Java 肩膀上的 Ruby (2/2) JVM 未來很有可能成為一個超級平台 多種語言能同時運行於 JVM 之上 透過 JVM 做為一個溝通的平台,更有利於不同語言間的溝通及界接 讓每種語言發揮在最適合發揮的地方,透過 JVM 來聯絡
關於程式語言的選用 沒有最好的程式語言,只有相對適合的程式語言 多語言的程式設計者就有更多的工具,也能擁有更多面向的觀點 有時候,現實的應用程式開發往往會涉及多種程式語言 依據你的個性,面臨的工作需求來選用合適的程式語言
Thanks

More Related Content

Viewers also liked (20)

PPTX
全文搜尋引擎的進階實作與應用
建興 王
 
PDF
Apache Hadoop an Introduction - Todd Lipcon - Gluecon 2010
Cloudera, Inc.
 
PPT
開發實用創新的 Android 應用程式
建興 王
 
PPT
開放原始碼的回收與再利用
建興 王
 
PPT
lwdba – 開放原始碼的輕量級資料庫存取程式庫
建興 王
 
PPT
IKVM.NET 深入敵營的 Java
建興 王
 
PPTX
認識 C++11 新標準及使用 AMP 函式庫作平行運算
建興 王
 
PPT
在雲端上啜飲爪哇
建興 王
 
PPT
Introduction to C++ over CLI
建興 王
 
PPT
「沙中撈金術」﹣談開放原始碼的推薦系統
建興 王
 
PPTX
Introduction to Apache Hadoop Ecosystem
Mahabubur Rahaman
 
PDF
Hadoop.TW : Now and Future
Jazz Yao-Tsung Wang
 
KEY
Hadoop at Twitter (Hadoop Summit 2010)
Kevin Weil
 
PDF
大資料趨勢介紹與相關使用技術
Wei-Yu Chen
 
PDF
海量視覺資料-孫民
台灣資料科學年會
 
PDF
孫民/從電腦視覺看人工智慧 : 下一件大事
台灣資料科學年會
 
PPT
Hadoop Map Reduce 程式設計
Wei-Yu Chen
 
PDF
MLDM Monday -- Optimization Series Talk
Jerry Wu
 
PDF
Practical Problem Solving with Apache Hadoop & Pig
Milind Bhandarkar
 
PDF
[系列活動] Machine Learning 機器學習課程
台灣資料科學年會
 
全文搜尋引擎的進階實作與應用
建興 王
 
Apache Hadoop an Introduction - Todd Lipcon - Gluecon 2010
Cloudera, Inc.
 
開發實用創新的 Android 應用程式
建興 王
 
開放原始碼的回收與再利用
建興 王
 
lwdba – 開放原始碼的輕量級資料庫存取程式庫
建興 王
 
IKVM.NET 深入敵營的 Java
建興 王
 
認識 C++11 新標準及使用 AMP 函式庫作平行運算
建興 王
 
在雲端上啜飲爪哇
建興 王
 
Introduction to C++ over CLI
建興 王
 
「沙中撈金術」﹣談開放原始碼的推薦系統
建興 王
 
Introduction to Apache Hadoop Ecosystem
Mahabubur Rahaman
 
Hadoop.TW : Now and Future
Jazz Yao-Tsung Wang
 
Hadoop at Twitter (Hadoop Summit 2010)
Kevin Weil
 
大資料趨勢介紹與相關使用技術
Wei-Yu Chen
 
海量視覺資料-孫民
台灣資料科學年會
 
孫民/從電腦視覺看人工智慧 : 下一件大事
台灣資料科學年會
 
Hadoop Map Reduce 程式設計
Wei-Yu Chen
 
MLDM Monday -- Optimization Series Talk
Jerry Wu
 
Practical Problem Solving with Apache Hadoop & Pig
Milind Bhandarkar
 
[系列活動] Machine Learning 機器學習課程
台灣資料科學年會
 

Similar to 從 Java programmer 的觀點看 ruby (20)

PPTX
初探程式語言設計以C#為例
Johnson Gau
 
PPT
SCJP ch01
r82093403
 
PDF
專業外語(二)hwhwbajwnjsnansjsjsnsnnsnsnsb-W04.pdf
MeiMei986041
 
PDF
專業外語(二)ghbhuhhhyggyyggyggggggggg-W04.pdf
MeiMei986041
 
PDF
計概:Programming Paradigm
Rex Yuan
 
PDF
2006 recycle opensourceprojects
George Ang
 
PDF
Recycle Open Source Projects
George Ang
 
PDF
Java SE 7 技術手冊試讀 - Java 平台概論
Justin Lin
 
PPT
Java2新觀念教本投影片ch1
5045033
 
PDF
Java Tutorial:Learn Java in 06:00:00
Justin Lin
 
PDF
Java SE 7 技術手冊投影片第 01 章 - Java平台概論
Justin Lin
 
PPT
教學投影片01_Vb2005
洋夫 葉
 
PDF
如何用十分鐘快速瞭解一個程式語言 《以JavaScript和C語言為例》
鍾誠 陳鍾誠
 
PDF
Foundation of software development 1
netdbncku
 
PPT
Java
博元 蕭
 
PDF
如何在 Java App 中導入 Scala
javatwo2011
 
PDF
3. java basics
netdbncku
 
PPTX
哥寫的不是程式,是軟體 - 從嵌入式系統看軟體工程全貌
Tun-Yu Chang
 
PPT
Java
博元 蕭
 
初探程式語言設計以C#為例
Johnson Gau
 
SCJP ch01
r82093403
 
專業外語(二)hwhwbajwnjsnansjsjsnsnnsnsnsb-W04.pdf
MeiMei986041
 
專業外語(二)ghbhuhhhyggyyggyggggggggg-W04.pdf
MeiMei986041
 
計概:Programming Paradigm
Rex Yuan
 
2006 recycle opensourceprojects
George Ang
 
Recycle Open Source Projects
George Ang
 
Java SE 7 技術手冊試讀 - Java 平台概論
Justin Lin
 
Java2新觀念教本投影片ch1
5045033
 
Java Tutorial:Learn Java in 06:00:00
Justin Lin
 
Java SE 7 技術手冊投影片第 01 章 - Java平台概論
Justin Lin
 
教學投影片01_Vb2005
洋夫 葉
 
如何用十分鐘快速瞭解一個程式語言 《以JavaScript和C語言為例》
鍾誠 陳鍾誠
 
Foundation of software development 1
netdbncku
 
如何在 Java App 中導入 Scala
javatwo2011
 
3. java basics
netdbncku
 
哥寫的不是程式,是軟體 - 從嵌入式系統看軟體工程全貌
Tun-Yu Chang
 
Ad

從 Java programmer 的觀點看 ruby

  • 1. 從 Java Programmer 的觀點來看 Ruby 王建興( Qing ) qing.chwang at gmail.com 2011/08/27
  • 2. 講者簡介 現職 聖藍科技技術長 譯作 Thinking in Java 4th Edition, 正體中文版 Thinking in Java 2nd Edition, 正體中文版 Essential C++, 正體中文版 專欄 iTHome 電腦報程式人專欄 榮譽 2004 年趨勢百萬程式設計競賽冠軍 2009 年經濟部通訊大賽 -Android 手機軟體設計競賽第三名 NOTE 不是任何語言的基本教義派
  • 3. Agenda 我的程式語言歷程 對 Ruby 的初次印象及認知 淺談生產力 Java 的興起及既有問題 Ruby 江山代有才人出 Ruby 的侷限 站在 Java 肩膀上的 Ruby
  • 4. 我的程式語言歷程 BASIC 1987 1990 1993 1997 2003 ASM PASCAL C++ Prolog Java C# C ObjC 2009
  • 5. 唯一用過的直譯式程式語言 - BASIC 10 REM Sample BASIC Program - Counts To Ten 20 REM 30 REM Copyright 2005 Andrew Eichstaedt 40 REM Eichstaedt Development Group 50 REM http://www.andrew-eichstaedt.com 60 REM 70 PRINT "Hello! I am a sample BASIC program" 80 PRINT "that counts to ten." 90 PRINT 100 FOR I=1 TO 10 110 PRINT I 120 NEXT I 130 PRINT 140 PRINT "Thanks for running me." 150 END *http://www.andrew-eichstaedt.com/sample-basic-program.html
  • 6. 為什麼學了這些程式語言 BASIC 是第一個啟蒙的程式語言 開始自學 80x86 組合語言是因為想對電腦的運作更了解 組合語言寫成的程式又小又快 開始學 C 是想踏入結構化程式語言的領域 C 搭配 80x86 組合語言成了有一陣子最喜歡的組合 PASCAL 是學校教學常用的程式語言 為了進到物件導向的殿堂所以開始學著使用 C++ 想要擴展對程式語言類型的了解,所以修了一門教 Prolog 的課 被研究所指導教授誤以為會寫 Java ,只好趕快學會 Java 因為工作的關係,開始用 C#/ObjC 寫作程式
  • 7. 最喜歡的程式語言 C Simple is Beautiful 深深影響 C 族系的程式語言,包括 C++, Java, C#, ObjC Java 運用在實戰中能有高生產力 反省 C++ 以降的諸多影響生產力的因素 Java = C++--
  • 8. 對 Ruby 的初次印象及認知 在 2006 年,當時當紅的 Web 2.0 網站 HEMiDEMi 採用 RoR 開發,宣稱有 Java 十倍的生產力 身邊開始陸續有不少朋友投入 Ruby/RoR 的領域從事開發 會轉戰 Ruby/RoR 的開發人員,許多都是被高生產力所吸引
  • 9. 為什麼我不用 Ruby/RoR 個人偏好 喜歡編譯式程式語言 喜歡靜態型別程式語言 目前尚未遭遇太嚴重的生產力問題 影響生產力的因素有很多,不單是語言及框架
  • 10. 影響生產力的因素 程式語言 程式庫 核心程式庫 開放原始碼程式庫 自有的程式庫 應用程式框架 設計 易於重複使用的程式碼 不容易出錯的設計 開發工具 開發方法及流程
  • 11. 程式語言如何影響生產力 - 以 Java 為例 以 C++ 做為一個反省的目標 不由程式設計者自己配置 / 釋放記憶體 改用 GC 機制 不支援指標 僅有 reference 不允許越界的陣列操作 - ArrayOutOfBoundException 對空指標的處理 - NullPointerException 將 boolean 納入基礎型別,所有的 condition 都必須是 boolean … 等等
  • 12. boolean 型別在 Java 中的影響 int a = 3; int b = 1; if( a = b ) // if( a == b ) { // do something }
  • 13. 減少程式設計者犯錯的機會 (1/2) 是否容易犯錯是影響生產力的關鍵之一 一個錯誤要花數倍的時間才能修正 Java 透過語言上的設計,盡量減少程式設計者犯錯的機會 這是 Java 生產力更勝於 C++ 的關鍵原因之一
  • 14. 減少程式設計者犯錯的機會 (2/2) C++ 的語法很有彈性,也很有威力 C++ 裡有 operator overloading , Java 僅有 String 的 + 是有 operator overloading 的 C++ 有多重繼承, Java 中僅有多介面實作 透過削減容易出錯的語言構建,來減少程式設計者犯錯的機會 即使語言威力變弱了,看起來不那麼巧妙了,或許要用比較多的程式碼才能做到一樣的事,看起來很笨,但因為不容易犯錯,反而可以提高生產力
  • 15. 魔幻語言 – 孟岩 “ 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
  • 16. 寫程式要克服的兩種困難 “ No Silver Bullet” - Frederick P. Brooks, 1986 附屬性( accidental )的困難 因為用的編程工具不對才會難 例如手動記憶體管理 本質上的困難 就像是處理程式不同部分的細微互動 比如找出你剛加入的新功能影響到的所有地方 * 「超越 Java :探討程式語言的未來」書評 - Joel Spolsky
  • 17. 各世代程式語言演化所解決的附屬性困難 組合語言 代數語言(包含 Fortran ) 結構化語言( Algol-60 跟 C ) 宣告式語言(包含 SQL ) 記憶體管理語言(包含 Lisp, VB, 和 Java ) * 「超越 Java :探討程式語言的未來」書評 - Joel Spolsky
  • 18. 程式庫如何影響生產力 - 以 Java 為例 Java 相較於 C++ , Java 有個先天的優勢是它的核心程式庫 字串 , I/O 處理 , 網路 , XML 處理 , 容器 , 多執行緒 , 資料庫連線 , 加解密 , 正規表示式 , loggin, 多國語言處理 , … 甚至到 Android 平台上都沿用了不少核心程式庫 早期的 C++ 程式設計者,可以說是人人都有套自己的程式庫 C++ 中期有所謂 STL ,後期則有 boost STL 沒有十分統一的標準,各編譯器支援不盡相同 好的程式庫不僅造就好的生產力,也和應用程式運行效能息息相關
  • 19. Java 成功的關鍵 適逢 Internet 時代的到來 和 C++ 系出同門的血統 改進諸多 C++ 的問題 開放原始碼社群運作良善,威力強大 Tomcat ant log4j struts hibernate Lucene …
  • 20. Java 語言本身的問題 愈來愈魔幻的語法 例如: Generics 靜態型別系統 相較於 Smalltalk 及 Ruby 還不夠動態 額外的語法及語言結構,導致程式碼的長度增加 不能說是問題,只能說是特質 不夠純粹的物件導向 例如 primitive type ,讓 Java 操作資料上分成了物件和 primitive type 兩套系統 效率考量 相較於直譯式程式語言,編譯和部署週期更長
  • 21. Java 在 Web 應用程式開發的問題 複雜的應用程式框架,造成學習曲線長 Struts, Hibernate, … 過度倚賴 XML 形式的設定檔 複雜的編譯部署程序
  • 22. 超越 Java – 探討程式語言的未來 *http://www.oreilly.com.tw/product_java.php?id=a187
  • 23. Ruby 在語言上的特點 動態型別系統 更純粹一點的物件導向程式語言 語法上捕捉出更多的高階抽象元素 meta-programming 整體而言,大部份的特質 某種程度上有助於減少程式碼的複雜度及長度 抽象度提高,程式碼就會減短
  • 24. Ruby 語言被發明的初衷 松本行弘 會想做 Ruby 是因為同事 ( 石塚圭樹 ) “Perl 寫來方便但讀起來很難。如果有好的 OO Scripting 語言就好了”。雖然當時有 Python ,不過其 regular expression 沒內建,無法像 Perl 那樣寫得很快速 因此想寫一個兼具 Perl 的快樂及 OO 美感的語言 要能夠快樂寫程式,我是這樣想著而創造 Ruby 的 David Heinemeier Hansson Ruby 是 “能寫出美麗的程式碼,能使程式員快樂的語言 "
  • 25. 動態型別系統 vs. 靜態型別系統 靜態型別系統 透過編譯期的型別檢查,協助找出程式碼中潛在的問題 可減少執行期錯誤,但是型別檢查語法需要付出成本 基於靜態型別系統, IDE 能得到更多的資訊,例如進行 autocompletion ,或做自動化的重構 動態型別系統 語法成本降低,程式碼能較為簡短 對程式設計者技巧 / 自律的要求更高 可讀性有時候會受到影響,有些時候是因此而提高
  • 26. 動態型別系統和測試驅動式開發 沒有靜態的型別檢查,就有可能犯下型別錯用的可能性 光是 typo 就有可能造成災難 除了倚靠程式設計者的技巧,經驗和自律之外,利用開發方法可以做為輔助 測試驅動式開發( Test Driven Development, TDD ) 透過測試程式進行檢查
  • 27. 動態型別系統不是沒有代價 Java 相較於 C++ ,在型別系統上已經更為動態許多 Runtime Class Loading Reflection RTTI 動態型別系統要付出的重要代價就是效率 C++/Java 問世時,都試著在效率和彈性上取一個在當時最佳的平衡點
  • 28. 關於效率 是否具備足夠的效率,是會隨著時代而有不同的意義 硬體效能成長 應用程式不單只是 CPU-intensive 的行為模式 愈是高度抽象化的語言,愈有機會得到更高的效率 程式庫的好壞,也會影響到應用程式的效率 Java 也經歷過大眾對於效率的質疑 生產力的重要性,在大多時候重於效率
  • 29. 關於程式設計風格的差異 Java 是個容易統一程式設計風格的程式語言 高手庸手的差異不在語法運用上,而在設計上 更適合大規模的協同開發 大巧若拙 Ruby 相較而言,程式設計風格較難統一 語法靈活,變化空間大 高手易於展露炫技 寫作方式易於因而人異
  • 30. RoR vs. Java Web 應用程式開發 RoR 無疑是個成功的應用程式框架 吸引眾人投入 Ruby 的領域 Java 在 Web 應用程式開發的問題,大體上來說,不是語言的問題 而是應用程式框架設計方向的問題 輕量化的應用程式框架有助於消解這些問題 例如, Java 社群很多人採用 Hibernate 來存取資料 我們採用自己開發的輕量化資料存取程式庫: http://sourceforge.net/projects/lwdba/ 例如, CRUD 應用程式產生器 例如, DB schema 與資料物件的自動對映
  • 31. Ruby 的侷限 目前的焦點僅限於 Web 應用程式開發 相較而言, Java 是一個更為一般化的程式語言 從晶片卡 、 到手機 、 機上盒 、 電視 、 到個人電腦 、 到伺服器端,都有 Java 的蹤影 Ruby 目前最有力的實證還是在 Web 應用程式的開發,而這主要是憑藉著 RoR 的威力 究竟是因為 Ruby 的天性所以程式寫的快?還是因為 RoR 設計的好,所以程式寫的快? “ RoR 在實現中用了很多奇技淫巧,但是在這個框架之上開發 Web 應用,卻顯得比 PHP 更簡約直觀,這就是通過魔幻達到簡約的例子” – 孟岩
  • 32. Ruby 尚需努力的方向 運行效率 可用資源 尤其是程式庫 開發工具 技術支援 社群力量
  • 33. 站在 Java 肩膀上的 Ruby (1/2) JRuby Ruby 程式語言的 Java 實作品 可以將 Ruby 直譯器嵌入 Java 應用程式中 允許 Ruby 程式和 Java 程式的雙向互動 透過高效的 JVM 足以提升 Ruby 的運行效率 Java/JVM 有著更成熟豐富的既有資產 最佳化技術 程式庫 市場佔有率 現成的企業級運行架構 跨平台
  • 34. 站在 Java 肩膀上的 Ruby (2/2) JVM 未來很有可能成為一個超級平台 多種語言能同時運行於 JVM 之上 透過 JVM 做為一個溝通的平台,更有利於不同語言間的溝通及界接 讓每種語言發揮在最適合發揮的地方,透過 JVM 來聯絡
  • 35. 關於程式語言的選用 沒有最好的程式語言,只有相對適合的程式語言 多語言的程式設計者就有更多的工具,也能擁有更多面向的觀點 有時候,現實的應用程式開發往往會涉及多種程式語言 依據你的個性,面臨的工作需求來選用合適的程式語言