Your SlideShare is downloading. ×
0
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
從 Java programmer 的觀點看 ruby
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

從 Java programmer 的觀點看 ruby

5,740

Published on

RubyConf Taiwan 2011

RubyConf Taiwan 2011

0 Comments
14 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
5,740
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
75
Comments
0
Likes
14
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

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

×