一個條件判斷引發的思考
有一套web系統,會部署到不同的伺服器上分別執行,這套系統類似於市面上的OA系統一樣, OA開發商會給不同的企業客戶部署一套獨立的互不關聯的系統,我維護的這套系統也差不多,分別被部署在互不關聯的伺服器上,當然,這些系統的程式碼是同一套,功能也都是相同的。
前兩天,有客戶反饋,他們系統的某個功能無法正常使用。我開始排查問題,發現部署在其它伺服器的系統這個功能都是正常的,唯獨這個客戶的系統存在問題。而據我所知,這套系統功能上對於所有客戶都是一視同仁的,是不存對於不同客戶有不同功能的情況,因為部署在所有伺服器上的程式碼是同一份。
剛開始以為問題是程式碼不同步導致的, 後來反覆確認出問題的那套系統的程式碼的確是最新。可為什麼大家的程式碼都是一樣的偏偏就它有問題呢? 而出現的這個問題是純業務邏輯上的問題,跟伺服器環境是不相關的。
反覆檢視程式碼, 反覆檢查配置檔案,反覆在開發環境中除錯,始終找不出個所以然來, 百思不得其解。
最終我不得不祭出只有在嘗試了所有方法後依然無法奏效萬不得已才會去使用的殺手鐗:線上除錯。
我登上伺服器,編輯程式碼檔案,在我認為容易定位到問題所在的程式碼位置加上列印資料的語句, 然後執行出問題的功能,觀察出問題的資料。在這裡我要感謝運維,感謝PHP,沒有他們的幫助,我還要繞個大圈圈才能幹這事。
然後以我觀察到的資料為線索, 一步步的向上追蹤問題程式碼, 最終發現, 在某一個很深的角落裡, 靜靜的躺著這樣一段程式碼
if($_SERVER["SERVER_NAME"] == "192.168.110.233" || $_SERVER ["SERVER_NAME"] == www.xxx.com"){
//問題系統消失的功能的程式碼
}
看到這段程式碼我心裡萬馬奔騰, 氣不打一處來, 並且狠狠的罵了一句:CMNLGB。 緊接著,一股深深的無力感湧上心頭。
使我受盡折磨,並且付出一下午美好時光的BUG居然是由這麼一個在正常的程式碼中絕不因該出現的腦殘的條件判斷引起了。 不值得啊。
我很想懟寫著段程式碼的程式設計師,但是這個任務我完不成了, 因為她離職了,我就是從她手裡接手這套系統的。
於是我去除程式碼中的這個條件判斷,同步程式碼,出問題的系統能正常運行了。
冷靜下來以後, 我思考這個問題。 毫無疑問,對於這個問題,寫出這段程式碼的程式設計師當時面對的需求應該是讓某個功能只在部分伺服器上部署的系統中體現, 於是這個腦殘的條件判斷應運而生。
如果是我實現這個功能,我可能會在配置檔案里加一個具有描述性名稱的flag,然後在程式碼中讀取這個flag進行條件判斷。
然而,這樣做能從根本上解決問題嗎? 顯然不能。 假如我面對的是這個改進版本的條件判斷,頂多能讓我有機率加速定位到問題所在,也就是我檢視配置檔案並且眼尖看到了這個配置專案就能明白事情的真相。如果我不去看配置檔案,或者沒有看到這個配置項,那麼到達目標的路徑依舊不會有變化,而且這是大概率事件,因為這次出現的問題的特殊性,很難讓人將它和配置檔案中的配置項聯絡到一起。
那如何做才能從根本上避免這個問題?
為專案維護一份文件? 不太現實,程式碼都來不及寫, 哪有時間寫文件。
離職交接時把注意事項說清楚? 不太現實, 離職交接都是交接一些巨集觀的內容,程式碼上的細節不可能在這個範圍之內。
規範化專案管理, 功能迭代流程,更新系統功能需要稽核? 不太現實,部門中這樣的專案大大小小几十個,這樣做成本太高了。
不給做這樣的需求? 更加不現實,人家需求方分分鐘投訴到大領導那, 讓我們吃不了兜著走。
那究竟怎樣做才能避免這類問題,才能讓我愉快的寫程式碼, 求各位大神支招, 在下感激不盡。