Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Upcoming SlideShare
全文搜尋引擎的進階實作與應用
Next
Download to read offline and view in fullscreen.

14

Share

從 Java programmer 的觀點看 ruby

Download to read offline

RubyConf Taiwan 2011

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

從 Java programmer 的觀點看 ruby

  1. 1. 從 Java Programmer 的觀點來看 Ruby 王建興( Qing ) qing.chwang at gmail.com 2011/08/27
  2. 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. 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. 4. 我的程式語言歷程 BASIC 1987 1990 1993 1997 2003 ASM PASCAL C++ Prolog Java C# C ObjC 2009
  5. 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. 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. 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. 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. 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. 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. 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. 12. boolean 型別在 Java 中的影響 int a = 3; int b = 1; if( a = b ) // if( a == b ) { // do something }
  13. 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. 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. 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. 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. 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. 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. 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. 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. 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. 22. 超越 Java – 探討程式語言的未來 *http://www.oreilly.com.tw/product_java.php?id=a187
  23. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 35. 關於程式語言的選用 <ul><li>沒有最好的程式語言,只有相對適合的程式語言 </li></ul><ul><li>多語言的程式設計者就有更多的工具,也能擁有更多面向的觀點 </li></ul><ul><li>有時候,現實的應用程式開發往往會涉及多種程式語言 </li></ul><ul><li>依據你的個性,面臨的工作需求來選用合適的程式語言 </li></ul>
  36. 36. Thanks
  • chesheng

    Jul. 17, 2015
  • ssuserc2b33a

    Feb. 16, 2015
  • bestlong

    Feb. 3, 2015
  • muhaha03

    Dec. 4, 2014
  • yankchina

    Oct. 18, 2013
  • ryudoawaru

    Sep. 26, 2011
  • niplover

    Sep. 18, 2011
  • maxcclai

    Aug. 28, 2011
  • mangoice

    Aug. 28, 2011
  • colinkuo

    Aug. 28, 2011
  • stalinone

    Aug. 28, 2011
  • hiso

    Aug. 27, 2011
  • lyhcode

    Aug. 27, 2011
  • tony915

    Aug. 27, 2011

RubyConf Taiwan 2011

Views

Total views

6,819

On Slideshare

0

From embeds

0

Number of embeds

46

Actions

Downloads

81

Shares

0

Comments

0

Likes

14

×