成為更優(yōu)秀的程序員:退后一步看問題
請把下面的[客戶]、[老板]或其它任何東西換成你想要的名稱。
一天,在工作中…
Bug #3890 來自客戶:
有個程序出現(xiàn)了錯誤,程序提示說“SpeedCalculator::compute()里出現(xiàn)了除零情況”。
請盡快修復(fù)!
你打開SpeedCalculator.php
,發(fā)現(xiàn):
- public function compute() {
- return $this->distance / $this->time;
- }
修復(fù)bug
簡單!是誰寫的這段代碼,他怎么不用一點腦子!
- public function compute() {
- if ($this->time == 0) {
- return 0;
- }
- return $this->distance / $this->time;
- }
你就這樣修改完了,這個bug只用了你2分鐘。
后來,同樣的bug又出現(xiàn)在了RatioCalculator
和MoneyCalculator
中,當(dāng)把它們也修正后,團隊中的所有人都認(rèn)為,再也不會有這樣的問題出現(xiàn)了,這是最后一次!代碼現(xiàn)在又是堅固無比了!
一個月后,另外一個bug出現(xiàn)了。這次程序沒有崩潰,但客戶在報表中發(fā)現(xiàn)了錯誤的計算結(jié)果,是因為那句return 0;
的代碼修改。
退后一步看問題
如果,我們不是匆匆忙忙的修改,而是退后一步,以更寬廣的視野看待些問題。
為什么這種事情會發(fā)生?
因為$this->time
被賦值成 0.
簡單!讓我們阻止這種事情發(fā)生。
- public function setTime($time) {
- if ($time == 0) {
- throw new InvalidArgumentException("Invalid value");
- }
- $this->time = $time;
- }
這樣,修改的效果不是更好嗎?你保證了數(shù)據(jù)的正確性。但這樣客戶并不是很高興,因為當(dāng)他輸入0時,程序會跳到一個錯誤頁面。
那么,你應(yīng)該在控制層捕捉這個錯誤,讓用一個漂亮的錯誤頁面顯示它們。
當(dāng)做完了這些,你認(rèn)識到,在RatioCalculator
和MoneyCalculator
中,你也應(yīng)該這樣做,于是你拷貝/張貼,修改了它們兩個。
稍等一下,客戶更喜歡讓錯誤信息顯示成橘黃色的,而不是紅色的。于是,你再次拷貝/粘貼,再次修改一遍。
再退后一步
如果,我們不是修復(fù)這個 Bug,而是發(fā)現(xiàn)了一個普遍的要求?
為什么客戶會輸入 0 ?因為他犯了個錯誤。
這對我們的要求是什么?
- 我們只需要這次防止用戶輸入 0 來避免“speedCalculationForm = 0”嗎?
- 我們只需要讓“speedCalculationForm”里的數(shù)據(jù)合法就行了嗎?
- 還是,我們要對所有的用戶輸入繼續(xù)校驗?
為什么不開發(fā)一個校驗工具包呢?
且慢!不要自己去開發(fā)一個!請退后一步想想,深呼吸,去使用現(xiàn)有的第三方校驗框架。
關(guān)于需求
我們,程序員,熱愛計算機技術(shù)。當(dāng)你的客戶或老板,大聲的脫口說出他們想要的東西時,我們無法阻止,我們只能想象如何去實現(xiàn)它們。
但是,我們需要用更全面的眼光看問題。如果我們想對自己的工作更負(fù)責(zé),我們應(yīng)該去理解為什么他們會提出這樣的需求,而不是著急著去尋找解決方案。當(dāng)然,這可能會占用你更多的精力。
是客戶真的需要“一個會躲避鼠標(biāo)點擊的閃光的按鈕”嗎?還是他們需要的是另外一個功能——他們不了解的功能,需要你去幫他們定義的功能?這種事情同樣會發(fā)生在你自己身上!你真的需要用程序打開一個文件,往里面寫入一些信息嗎?還是,你真正需要的是一個日志系統(tǒng)?
退后一步看問題,看更大的藍(lán)圖、更完整的信息。雖然你是一個很優(yōu)秀的編程高手,但編程的目的是為了解決問題。