面對問題並解決它們所開發人員的一種生活方式。當問題發生時,咱們但願趕忙把它解決掉。若是一個熟悉的問題再次發生,咱們會但願記起第一次時如何解決的,並且但願下次可以更快地把它搞定。然而,有時一個問題看起來跟之前遇到的徹底同樣,可是咱們卻不記得說如何修復的了。這種情況時常發生。編程
從網上尋找答案固然賽過僅靠我的努力解決問題,可這是很是耗費時間的過程。有時能夠找到須要的答案,有時出了找到一大堆意見和建議以外,發現不了實質性的解決方案。安全
Don't get burned twice
要想獲得更好的效果,不妨維護一個保存曾遇到的問題以及對應解決方案的日誌,能夠快速搜索之前用過的方法,它叫每日日誌(daylog)服務器
能夠選擇符合需求的任何格式。好比,網絡
任何代碼片斷、設置或對話框的截屏,只要它們說解決方案的一部分,或者能夠幫助更深刻地理解相關細節。框架
要共享日誌給他人,而不只僅是靠一我的維護。把它放到共享的網絡驅動器中,這樣其餘人也可使用。或者建立一個wiki,並鼓勵其餘開發人員使用和更新其內容。工具
當程序中出現一個編譯錯誤時,編譯器或是構建工具會拒絕產生可執行文件。咱們別無選擇——必需要先修正錯誤,再繼續前行。單元測試
然而警告倒是另一種情況。即便代碼編譯時產生了警告,咱們仍是能夠運行程序。有些警告說過於挑剔的編譯器的良性副產品,有些則不是。測試
可能有人會說優秀的單元測試能夠發現這些問題。說的,可若是編譯器能夠發現這種問題,那爲何不利用它呢?者能夠節省大量的時間和麻煩。要找到一種方式讓編譯器將警告做爲錯誤提示出來。若是編譯器容許調整警告的報告級別,那就把級別調到最高,讓任何警告不能被忽略。設計
在修改設置的時候,要記得在構建服務器上使用的持續集成工具中,修改一樣的設置選項。這個小小的設置,能夠大大提高團隊簽入到源碼控制系統中的代碼質量。調試
單元測試帶來的積極效應之一,是它會強迫造成代碼的分層。要保證代碼可測你,就必須把它從周邊代碼中解脫出來。若是代碼依賴其餘模塊,就應該使用mock對象,來把它從其餘模塊中分離開。這樣作不但讓代碼更加健壯,且在發生問題時,也更容易定位來源。
不然發生問題時有可能無從下手。也許能夠先使用調試器,逐行執行代碼,並試圖隔離問題。也許在進入到感興趣的部分以前,要運行多個表單或對話框,這會致使更難發現問題的根源。你會發現本身陷入整個系統之中,徒然增長了壓力,並且下降了工做效率。
大型系統很是複雜——在執行過程當中會有不少因素起做用。從整個系統的角度來解決問題,就很難區分開,哪些細節對要定位的特定問題產生影響,而哪些細節沒有。
答案很清晰:不要試圖立刻了解系統的全部細節。要想認真調試,就必須將有問題的組件或模塊與其餘代碼庫分離開來。若是有單元測試,這個目的就已經達到了。不然,你就得開動腦筋了。
Prototype to isolate.
識別複雜問題的第一步,是將它們分離出來。
但是,不少應用的代碼在編寫時沒有注意到這一點,使得分離變得特別困難。應用到各個構成部分之間會彼此糾結:想把這個部分單獨拿出來,其餘的會緊隨而至。在這些情況下,最好花一些時間把關注的代碼提取出來,並且建立一個可讓其工做的測試環境。
隔離問題不該該只在交付軟件以後才着手。在構建系統原型、調試和測試時,各個擊破的戰略均可以起到幫助做用。
從事任何編程工做,都要考慮事物正常情況下是如何運做的。不過更應該想想,當出現問題——也就是事情沒有按計劃進行時,會發生什麼。
在調用別人的代碼時,它也許會拋異常,這時咱們能夠試着對其處理,並從失敗中恢復。固然,要是在用戶沒有意識到的狀況下,能夠恢復並繼續正常處理流程最好不過了。要是不能恢復,應該讓調用代碼的用戶知道,究竟是哪裏出現了問題。
當應用發佈而且在真實世界中獲得使用以後,仍然會發生這樣那樣的問題。當沒法知足用戶需求時,要以優雅的方式進行處理。相似的錯誤發生時,是否是隻要彈出一條優雅且帶有歉意的信息給用戶就足夠了?並不盡然。固然了,顯示通用的信息,告訴用戶發生了問題要好過因爲系統崩潰形成應用執行錯誤的動做,或者直接關閉(用戶會所以感到困惑,並但願知道問題所在)。然而,相似「出錯了」這樣的消息,沒法幫助團隊針對問題作出診斷。用戶在給支持團隊打電話報告問題時,咱們但願他們提供足夠多且好的信息,以幫助儘快識別問題所在。遺憾的是,用很通用的錯誤消息,是沒法提供足夠的數據的。
針對這個問題,經常使用的解決方案是記錄日誌:當發生問題時,讓應用詳細記錄錯誤的相關數據。錯誤日誌最起碼應該以文本文件的形式維護。不過也許能夠發佈到一個系統級別的事件日誌中。可使用工具來瀏覽日誌,產生全部日誌信息的RSS Feed,以及諸如此類的輔助方式。
記錄日誌頗有用,但是單單這樣作是不夠的。開發人員認真分析日誌,能夠獲得須要的數據,但對於不幸的用戶來講起不到任何幫助做用,他們仍是一點頭緒都沒有,不知道本身到底作錯了什麼,應該怎麼作能夠繞過這個錯誤,或者在給技術支持打電話時應該報告什麼。
若是你注意的話,在開發階段就能發現這個問題的早期警告。做爲開發人員,常常要將本身假定爲用戶來測試新功能,要是錯誤信息很難理解或者無助於定位錯誤的話,就能夠想一想真正的用戶和支持團隊,遇到這個問題時會有多麼困難了。
一方面要提供給用戶清晰、易於理解的問題描述和解釋,使他們有可能尋求變通之法。另外一方面還要提供具有關於錯誤的詳細技術細節給用戶,方便開發人員尋找代碼中真正的問題所在。
錯誤報告對於開發人員的生產率,以及最終的支持活動消耗成本,都有很大的影響。在開發過程當中,若是定位和修復問題讓人倍受挫折,就考慮使用更加積極主動的錯誤報告方式吧,調試信息很是寶貴,並且不易得到。不要輕易將其丟棄。