← 上一章:寫在最前面 - 這是一本入門書! 下一章:環境設定 →
生態圈及簡介
Ruby 生態圈
Ruby 這個程式語言可以說是因為 Rails 的盛行而興起的也不為過,我認識大部份的人會開始學習 Ruby 或知道 Ruby 這個程式語言,大多是因為 Rails 的緣故。事實上,在 Rails 風行之前,Ruby 這個程式語言可能全世界幾乎只有日本的工程師在使用。
關於 Ruby
什麼是 Ruby?
很多人因為聽聞 Rails 可以快速開發網站而開始知道有 Ruby 這個程式語言,所以會認為 Ruby 就是用來開發網站,或是以為 Ruby 是個最近幾年才發明的程式語言。事實上 Ruby 是一種泛用的腳本式程式語言,從資料分析、繪圖、3D 建模、系統管理、遊戲開發等程式都可以使用 Ruby 來開發,而且它的年紀已經超過 20 年了。
Ruby 是由一位名叫松本行弘的日本人所發明(日文:まつもとゆきひろ,網路上大家通常稱他 Matz)。Ruby 參考了 Perl、Lisp 及 Smalltalk 等程式語言的設計,是一款物件化非常徹底的程式語言。在 1995 年釋出了第一個版本,在早期實際使用 Ruby 在工作上的開發者並不多,相關的技術文件也大多是日文居多,直到 Rails 開始風行之後,才慢慢的有越來越多人關注它。
為什麼選擇 Ruby
引用一句已故大師 Alan Perlis 的話:
“A language that doesn’t affect the way you think about programming is not worth knowing” — Alan Perlis
中文意思是:
「如果某種程式語言不會影響你寫程式的思考方式的話,那就不值得去學習它。」
Ruby 是個很容易學、很容易上手的程式語言,語法寫起來也很自然、有趣,也因為 Ruby 的自然語法,寫久了真的會影響你在寫程式時候的思考或設計方式。
因為 Ruby 的語法寫起來很自然,所以用 Ruby 寫出來的程式碼的可閱讀性也相當高。不管是接手別人的專案,或是維護自己幾個月前寫的系統,比較好的程式碼可讀性對開發者來說可以減少不少負擔。
另外,現在全世界的 Ruby 社群都相當活躍,要找什麼套件幾乎都有熱心人士幫忙寫好了。除了可以免費取得之外,連原始程式碼都公開給你看。在台灣,Ruby 社群也是十分活躍,每個月甚至每週都有實體的線下聚會,也有大型的國際程式研討會 RubyConf Taiwan,每年都有不少國內外的 Ruby 開發者前來與會,連 Ruby 的發明人松本行弘也會遠從日本來台灣參加。
在本文撰寫的當下,官方最新推出的 Ruby 穩定版本是 2.4.1 版,較舊版本的 Ruby(1.8、1.9 或更早之前)的部份功能也可能會被提到,本書將會以 2.4.1 版本為主。Ruby 2 系列對之前的版本有向下相容的特性,原本在 1.9 版可以正常執行的程式碼,大部份在 2.0 之後的版本應該也可以正常運作。
誰在用 Ruby?
很多人在評估程式語言的優劣,是看有哪些大公司、單位在使用它,或是使用的開發者人數。老實說我個人不是很關心這個問題,有些人覺得 Ruby 並不是很流行,在 TIOBE 網站上的排名也不是非常前面,但我個人認為,好的東西不一定要流行,只要能完成任務的工具就是好工具。在 iPhone 還沒流行之前,誰也沒料到開發 iOS app 的 Objective-C 這個語法看起來很奇怪的程式語言有一天可以這麼熱門。
關於 Rails
什麼是 Rails?
Rails 是一款使用 Ruby 程式語言所開發出來的網站開發框架(Web Framework),作者是名為 David Heinemeier Hansson(簡稱 DHH) 的丹麥人。當年他在開發自家的產品的同時,發現好像可以把一些網站開發常用的模組或函式庫組成一個框架,利用這個框架可以大大的縮短網站應用程式開發的時間。DHH 在 2005 年年底釋出第一個版本,他在研討會現場展示如何使用 Rails 在 15 分鐘內開發出一個 Blog,讓所有的人眼睛為之一亮,在那之後 Rails 便開始慢慢的風行到全世界,也讓更多人開始關注 Ruby 這個有趣的程式語言。現在世面上常見的網頁開發框架的設計(例如 Laravel),多少也直接或間接的受了 Rails 的影響。
一開始的時候大家會把 Ruby on Rails 簡稱為「RoR」,不過因為「RoR」實在不好發音,後來大家開始慢慢的改稱之 Rails,包括本書也是。
有些朋友在學習 Rails 過程中曾問道「既然 Rails 這麼方便,那有必要學 Ruby 嗎?」。我的建議是:「是的,有必要。你也許不需要把 Ruby 學得非常熟、不需要知道 Ruby 裡所有的方法,但至少你該學會在 Rails 專案裡常看到的 Ruby 語法」。
很多人一開始可能搞不清楚 Ruby 跟 Rails 之間的關係,如果打個比方的話,大家也許看過或玩過樂高(Lego)積木,Rails 就像是一塊一塊的積木,可以讓你很快的把城堡蓋起來;而 Ruby 則像是積木的原料(塑膠),沒有原料就不會有這個積木。
Ruby 是一款設計很特別、寫起來也很有趣的程式語言,如果能花時間更去深入 Ruby 這個程式語言特別的點,相信在寫 Rails 的時候可以寫出更漂亮、簡潔、有效率的語法。
Rails 設計哲學
在 Rails 世界有兩個主要的設計哲學:
- 慣例優於設定(Convention over Configuration, CoC)
- 不要做重複的事(Don’t Repeat Yourself, DRY)
慣例優於設定(Convention over Configuration, CoC)
所謂的「慣例」就像是不成文的規定,當遇到某種情況的時候我們會用特定的方式來解決問題,或是該把某個功能的程式碼放在什麼地方,不過即使不照著慣例寫,也有別的方法可以達到一樣的目的。
在 Rails 裡有相當多這樣的慣例,例如像是專案的目錄結構、資料表的關連及命名等,順著 Rails 的慣例,程式碼可以變得更簡潔、優雅。甚至可以說在學習 Rails 的過程,除了學習 Ruby/Rails 的語法之外,也是在學習 Rails 的慣例。
不要做重複的事(Don’t Repeat Yourself, DRY)
如果有些程式碼或結構一直重複的出現,就應該把重複的部份抽離出來,整理成為一個方法、類別或模組。這樣不僅可以重複使用,也會因此變得比較好維護,有發生問題也比較容易被發現。
常見問題
聽說寫 Ruby/Rails 要先買 Mac 電腦?
其實不需要的,使用 Mac OS 作業系統只是在開發環境上比較方便,但並不是必需品,即使用一般的 PC 安裝 Linux/Ubuntu 系統一樣可以進行開發。事實上,最後網站部署的環境也是 Linux/Ubuntu,所以不要聽信「要先學 Ruby/Rails 要先買 Mac」之類的江湖謠言。
當然,如果經濟許可,使用 Mac 電腦開發 Ruby/Rails 專案是件挺開心的事,至少不用太擔心開發環境的問題。
聽說 Ruby/Rails 很慢?
這點完全不否認,以市面上常見的的程式語言來說,Ruby 的確不是最快的程式語言,而 Rails 為了功能的完整性,本身也是一個體積有點肥胖的框架。即便如此,Ruby/Rails 並沒有慢到不堪使用的程度。
Ruby 的重點,在於可以用自然、簡短的語法開發你想要的功能,而 Rails 的重點則是可以快速的打造出產品雛型,讓產品早點上線試一下水溫,試一下商業模式是否可以運作,如果真的有人買單,再來擔心效能也不遲。網站流量如果真的做起來的話,需要比較好的效能的部份也可再考慮改用其它程式語言改寫。
線上遊戲有一句名言「死人沒有 DPS(Damage Per Second)」,意思就是手上握有再強大的武器,但只是躺在地上看星星也是沒用的。同理,若使用強大效能的程式語言或框架但開發時程較長而錯過市場時機,效能再快、再好也是沒有用的。
用 Windows 系統可以嗎?
如果只是練習,使用 Windows 作業系統是可以的,有打包好的懶人安裝包(Ruby Installer 及 Rails Installer),但在 Windows 平台可能偶爾會遇到套件安裝失敗或不支援的問題。如果您平常的工作還是在 Windows 平台的話,建議您可以使用 VirtualBox 在 Windows 上安裝個 Linux/Ubuntu 的虛擬作業環境,可以少一些麻煩。
一定要安裝在自己的電腦裡嗎?
也許因為某些因素,你無法在電腦上安裝 Ruby/Rails 環境(例如設備是借來的、公司內部管制,或是設備的記憶體不夠多,跑不動 VirtualBox 之類的軟體等),也有其它線上的環境可以讓你練習。
Try Ruby
如果只是想練一下 Ruby 的話,可以試試 Try Ruby 網站:
在畫面的左邊會一直出現要你完成的題目,右邊輸入區則是類似 Ruby 的 irb 環境。
C9.io
如果想要在線上寫 Rails 的話,c9.io 這個線上平台也是個很不錯的選項:
c9.io 除了有線上開發環境外,也可直接在線上預覽的功能。
codeanywhere
雖然 c9.io 功能很完整而且有免費方案,但唯一的缺點就是它在註冊帳號的時候需要輸入信用卡號,這對沒有信用卡的學生來說是個滿大的問題,如果有信用卡號的問題,也可考慮使用 codeanywhere。
事實上,在各種不同的硬體及作業系統安裝 Ruby/Rails 環境,對剛入門的新手來說是個很大的挑戰,所以不管在學校或是企業的教育訓練課程中,我也常推薦大家直接使用 c9.io 或 codeanywhere 之類的線上平台來進行練習。
Comments