• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
從 Java programmer 的觀點看 ruby
 

從 Java programmer 的觀點看 ruby

on

  • 5,971 views

RubyConf Taiwan 2011

RubyConf Taiwan 2011

Statistics

Views

Total Views
5,971
Views on SlideShare
5,928
Embed Views
43

Actions

Likes
10
Downloads
71
Comments
0

5 Embeds 43

http://tweetedtimes.com 28
http://twitter.com 6
http://us-w1.rockmelt.com 4
http://www.hanrss.com 4
https://twitter.com 1

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    從 Java programmer 的觀點看 ruby 從 Java programmer 的觀點看 ruby Presentation Transcript

    • 從 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