12/26/2006

新手學習 Ruby on Rails 必看的幾件事

寫這個Blog,我的 Email 信箱會遇到很多讀者的鼓勵,也會有很多新手的發問。但是我想說的是,我也是上班族,我很多時刻是在工作的,不回答你只是因為我在忙,不是我在生氣之類的。最重要的是,我覺得我要跟大家理清一下,學 Ruby on Rails 應該有的態度。

  1. 學習 Rails 很簡單,但是你不肯花功夫下去去學就一點都不簡單。
    我遇到很多人連花點時間都不肯,就想直接問我找答案。用這種態度根本就學不到任何東西,不管是那一方面的學問都一樣。
  2. 遇到問題時,先看看 Error log,嘗試去解決他,不行再去找答案。
    我在學 Linux 的時候,一個月上手,第二個月用 Debian 架出一個 Linux 桌面,第三個月開始管站。不是我行,是我遇到問題會嘗試去看 Error log,嘗試解決問題,就算解決不了問題,光是在解決的過程中,我就學到了更多東西。
  3. Ruby on Rails 是用 Ruby 寫的 Framework,這代表你要花點時間去看 Ruby。
    有時候有些人問的問題,或是寫的 code 不對,就開始怪 Ruby on Rails。可是我後來發現大多數的問題,都是對於 Ruby 不熟悉所造成。我想問的是,你在學 Java時,會連語法都不去看就開始寫嗎?你在寫 C++ 時,會連要怎麼寫 C++ 都不知道,就去寫程式嗎?那為什麼遇到 Ruby on Rails ,你會連 Ruby 都沒花時間去看,就開始寫 Ruby on Rails 程式呢?
  4. 不要好高騖遠,先用 Webricks 來當伺服器。
    有些人一定要一開始就架設好 Apache + Fcgi ,lighttpd+fastcgi,一定要一開始就將整個架設伺服器的架構都搞定,然後才開始學習 Ruby on Rails。但是這根本就本末倒置,一開始要學習的是熟悉 Ruby on Rails ,而非如何架設一個可以上線的系統。
    一個可以上線的系統需要的是 MIS 極為專業的技巧,但是 Ruby on Rails 專長是如何快速的開發程式,兩者不太一樣,都是需要時間去專精的東西,你在研發期應該作的是學習 Ruby on Rails,而非架設系統。我所認識一位矽谷公司老闆,他們就是先寫 Ruby on Rails 程式,然後程式直接放 Web Host 就好,等到流量夠大,有了足夠的資金,目前才在開始考慮請 MIS 來架站。其實到這個程度了,你也不用花時間學習架站,就多請幾個專業的MIS 來解決即可。
  5. 想做就做吧,想寫就寫吧。等到問題出現再來解決吧。
    有些時候,我會問自己這樣作有沒有考慮到其他衍生的問題,然後一再反覆的討論,結果到最後時間不夠了,還沒開始寫程式。這是我以前寫 PHP 的習慣,因為程式進行重構本身是非常困難的問題,一重構可能要花個一天到一周不等的時間,所以與其花那麼多時間如此不如一開始考慮清楚。
    雖然這個立意是好的,但是目前現實就是『計畫永遠趕不上變化,變化永遠趕不上老闆的一句話』,有太多太多巨細靡遺的 spec 因為客觀環境情況改變了而胎死腹中。與其去考慮全盤的狀況,花了太多時間,結果最後連一點東西都生不出來。不如一開始有了想法就先作出一點東西,遇到問題在進行修改即可。
    當然有人會問,那麼重構的問題怎麼辦。PHP 或是 JAVA 我不知道,但是 Ruby on Rails可以把重構的時間極小化。我開發 Ruby on Rails 程式至今,曾經寫了一個 Project 裡面重大的重構了 10次以上,每次重構的時間是一個小時到三個小時不等。

    為什麼?

    因為 Ruby on Rails 本身 code 量就比其他語言來得少,大概是一般語言的 1/5 到 1/10。程式碼行數的多少會跟重構時間呈現絕對正相關。也就是說,Ruby on Rails 極為精簡的程式碼會大幅度的減少重構所需時間。加上 Ruby on Rails 開發速度快,所以重構的速度也超快。在加上 Convention over Configuration 的概念讓重構可以維繫一個統一的標準,DRY原則會讓重構的 cost 減少。這些東西都會讓人感覺到,DHH在設計 Ruby on Rails 時,他其實不是想設計一個開發快速的架構,他的目標是設計一個重構快速的架構。

    所以,寫 Ruby on Rails 程式不要想太多,寫了就是,有問題就改吧,沒啥大不了。

以下是讀者們常問我的新手問題,我希望大家如果在遇到問題時先看看這篇,相信可以避開 90% 的問題。
  1. 我一開始就出現 Application Error,那是什麼問題?
    Ans :這是一個所有人都會遇到的問題,簡單的回答就是某些目錄(tmp,log)使用權限設定錯誤,你可以請參照這篇的回答
  2. 要是出現下面的 Error,那是什麼問題?
    WARN TCPServer Error: Address already in use - bind(2)
    /opt/local/lib/ruby/1.8/webrick/utils.rb:73:in `initialize': Address already in use - bind(2) (Errno::EADDRINUSE)
    Ans:這是另外一個幾乎每個人都會問的問題,但是這個問題總是會讓我很不爽,因為這代表你不看 Error Message,還有基本觀念不足。Address already in use 就是你今天要啟動一個 port,但是之前已經有其他程式將這個 port 註冊走了,所以你的作法就是關掉之前聽這個port的程式 ,或是換個 port 即可。
  3. 為什麼我的Rails無法連結 MySQL?
    Ans:通常 80% 的原因是你的 config 沒寫,或是沒寫正確。50% 的原因是你沒安裝 Ruby 的 MySQL Client,請用 gem i mysql 來安裝。
  4. 為什麼我的 Rails 連結到 SQL Server 有問題?
    Ans:我聽說 Rails 或是 PHP 對 SQL Server 支援不好。不過因為我沒有花錢買 SQL Server,我手邊沒有 Windows的機器,我寫程式暫時也不會去使用 SQL Server,所以我無法測試他的相容度好還是不好。
  5. 為什麼我的 Rails 出現 application error?
    Ans:如果第一個問題已經解決了,但是有時候寫的一半還是出現 Application Error。那代表你寫了一些 code 讓 Rails 不爽,請先看過 error log ,去 google 一下,去討論區問問,等到都沒解答,你可以嘗試來問我。


沒有留言: