成為更優秀的程式設計師:退後一步看問題

edithfang發表於2014-08-06
請把下面的[客戶]、[老闆]或其它任何東西換成你想要的名稱。
一天,在工作中…
Bug #3890 來自客戶:
有個程式出現了錯誤,程式提示說“SpeedCalculator::compute()裡出現了除零情況”。
請儘快修復!
你開啟SpeedCalculator.php,發現:

public function compute() {
    return $this->distance / $this->time;
}
修復bug
簡單!是誰寫的這段程式碼,他怎麼不用一點腦子!
public function compute() {
    if ($this->time == 0) {
        return 0;
    }
    return $this->distance / $this->time;
}
你就這樣修改完了,這個bug只用了你2分鐘。

後來,同樣的bug又出現在了RatioCalculator和MoneyCalculator中,當把它們也修正後,團隊中的所有人都認為,再也不會有這樣的問題出現了,這是最後一次!程式碼現在又是堅固無比了!

一個月後,另外一個bug出現了。這次程式沒有崩潰,但客戶在報表中發現了錯誤的計算結果,是因為那句return 0;的程式碼修改。
退後一步看問題
如果,我們不是匆匆忙忙的修改,而是退後一步,以更寬廣的視野看待些問題。
為什麼這種事情會發生?
因為$this->time被賦值成 0.
簡單!讓我們阻止這種事情發生。
public function setTime($time) {
    if ($time == 0) {
        throw new InvalidArgumentException("Invalid value");
    }
    $this->time = $time;
}
這樣,修改的效果不是更好嗎?你保證了資料的正確性。但這樣客戶並不是很高興,因為當他輸入0時,程式會跳到一個錯誤頁面。

那麼,你應該在控制層捕捉這個錯誤,讓用一個漂亮的錯誤頁面顯示它們。

當做完了這些,你認識到,在RatioCalculator和MoneyCalculator中,你也應該這樣做,於是你拷貝/張貼,修改了它們兩個。

稍等一下,客戶更喜歡讓錯誤資訊顯示成橘黃色的,而不是紅色的。於是,你再次拷貝/貼上,再次修改一遍。
再退後一步
如果,我們不是修復這個 Bug,而是發現了一個普遍的要求?

為什麼客戶會輸入 0 ?因為他犯了個錯誤。

這對我們的要求是什麼?
  • 我們只需要這次防止使用者輸入 0 來避免“speedCalculationForm = 0”嗎?
  • 我們只需要讓“speedCalculationForm”裡的資料合法就行了嗎?
  • 還是,我們要對所有的使用者輸入繼續校驗?
為什麼不開發一個校驗工具包呢?

且慢!不要自己去開發一個!請退後一步想想,深呼吸,去使用現有的第三方校驗框架。
關於需求
我們,程式設計師,熱愛計算機技術。當你的客戶或老闆,大聲的脫口說出他們想要的東西時,我們無法阻止,我們只能想象如何去實現它們。

但是,我們需要用更全面的眼光看問題。如果我們想對自己的工作更負責,我們應該去理解為什麼他們會提出這樣的需求,而不是著急著去尋找解決方案。當然,這可能會佔用你更多的精力。

是客戶真的需要“一個會躲避滑鼠點選的閃光的按鈕”嗎?還是他們需要的是另外一個功能——他們不瞭解的功能,需要你去幫他們定義的功能?這種事情同樣會發生在你自己身上!你真的需要用程式開啟一個檔案,往裡面寫入一些資訊嗎?還是,你真正需要的是一個日誌系統?

退後一步看問題,看更大的藍圖、更完整的資訊。雖然你是一個很優秀的程式設計高手,但程式設計的目的是為了解決問題。

稿源:Be a better programmer: take a step back
相關閱讀
評論(5)

相關文章