敏捷軟體開發一直是和多內部開發的核心概念,強調個人、合作、回應和使用工作軟體(wiki, version control, unit testing, build automaion),2001年由一群軟體開發者發表宣言如下:

  1. 個人及互動勝於流程與工具
  2. 可用的軟體勝於詳盡的文件
  3. 與客戶合作勝於合約談判
  4. 回應變化勝於墨守計畫

軟體開發是連續(continuous)的,不是最後才測試,也不是最後才佈署,更不會停止收集需求跟feedback。正是因為開發軟體是如此複雜的活動,任何種類的錯誤如果不儘快修正,往往最後就會無法控制的失敗,因此唯有每天不斷的一點一滴的去修正,每天解決一些比較小的問題而不是最後脫韁野馬的大問題,這才是解決的辦法。

何謂 Agility 的定義,作者給了:
“Agile development uses feedback to make constant adjustments in a highly collaborative environment.” (敏捷開發是一個在高度合作的環境中不斷根據回應來做修正的開發方式)

透過經常性地建構出可以實際使用的軟體,我們持續得到 feedback。程式碼會因為需求擴充而不斷地被修改重構演進。工作的流程被拆成一至四周的短 iterations,每次透過 demo 得到 feedback,確保方向正確。

敏捷開發最大的不同到底是什麼呢? 這本書不談方法論流程(XP、Scurm等),而是談人本身,談團隊本身,談如何成為一個敏捷的開發人員。書的每一章由數個 Tips 組成,整本書共45個 Tips 來敘述什麼是敏捷的做法。這本書也得到2007年的 Jolts Productivity Award

前兩章 Beginning Agility 跟 Feeding Agility 講的是基本的專業態度:

Read more…

一年一度的盛事結束了,大概翻了一遍目前可供下載的 RailsConf 2008 Presentation Files,我自己最喜愛以下四份投影片,談如何寫出更好的 Rails/Ruby 程式碼:

  1. Advanced Active Record Techniques Best Practice Refactoring
    用一個實際的例子,告訴你如何正確運用 Active Record 機制,將大部分的 Controller 移至 Model。
  2. The Worst Rails Code You’ve Ever Seen (and how not to write it yourself)
    挺有趣的投影片,舉例一些有點誇張的爛code。結論是請把 Ruby 基礎學好啊,跟厲害的人一起 co-work,多唸點書 (啊啊~可是講者的 Rails Way 一書好厚啊~)。
  3. Refactoring Your Rails Application
    Rails 重構型錄 Paper 真是不錯,如果再搭配 Martin Fowler 重構一書服用,保證你對如何寫出漂亮的code超有想法。
  4. “Design Patterns” in Ruby
    引述結論: “traditional” design patterns rely heavily on structure to solve problems, dynamic languages use language facilities to create simpler solutions.

Update(2008/7/8): 推薦Topfunky’s bong搭配使用,非常簡單。

做網站效能調校,一件重要的事情就是量測(measure)。調之前測一次,調之後再測一次才知有沒有藥效。

“Server 回應 requests 的速度有多快?” 就是一個最基本的問題。這技巧也叫做黑箱分析(Block-box analytic)。Advanced Rails 一書中給了幾點特別要注意的事項:

  1. 有台 front end server (Apache,Nginx等)先測試 static files,這個數據是一個上限。Rails 不會比這更快了。
  2. 找近一點的地方測,減少網路 latency 的變異性
  3. 不要用 server 同一台測試,雖然 CPU 不太會是問題,但是 I/O 可能會有影響。

觀測的數據除了平均,更要看標準差跟計算信賴區間,因為除了平均之外,低變異也很重要。基本的統計學告訴我們,相差平均一個標準差可以涵蓋 68% 的資料,相差兩個標準差就可以涵蓋 95% 的資料。因此我們可以算出 95% 的信賴區間,也就是 95% 發出的 requests 中,可以在幾秒到幾秒內回應。基本的統計知識是做 analytic 必備,Zed Shaw 為此還寫了篇Programmers Need To Learn Statistics Or I Will Kill Them All

在 Mac 上透過 MacPorts 安裝 httperf 很簡單,輸入 `sudo port install httperf` 即可。

httperf 的用法

基本用法是指定 Server、Port、URL和總共要發出多少個 requests:

httperf --server project1.local --port 3000 --uri /events --num-conns 1000

其中最重要的 output 資訊就是 Reply rate 有平均和標準差的那一行。要注意的是 httperf 是每五秒抓一次樣本(sample),根據 httperf 的建議是希望至少有 30 個樣本數才能得到準確的標準差,因此當 sample 數太少的時候,要記得把 –num-conns 往上加。

另一種算壓力測試,也就是去測試“Server 每秒可以承受多少 requests?”。請再加上 –rate 跟 –hog 參數:


httperf --server project1.local --port 3000 --uri /events --num-conns 5000 --rate 500 --hog

逐步把 rate 往上調,直到 server 超過極限時,就會開始少 replies (有 requests 被 drop off 了) 並出現 Errors。

Rails 的相關設定

有幾項設定可以增加更多相對比較數據:

  1. 透過 config.action_controller.perform_caching = false 的設定可以在 production mode 也把所有 caching Page, Action, Fragment 暫時關掉
  2. 暫時註解掉 before_filter 中的權限檢查
  3. 透過 session :off 關掉 session

本文參考資料

  1. Advanced Rails Chap.6 Performance
  2. Peepcode httperf screencast