jim yeh on 二月 7th, 2007

最近有人找我討論專案中日誌功能的整合問題,他認為以 log4j 實作的 Logger 已經完成了,所以系統後端的 service 實作應該直接呼叫到這個特定實作。 不對吧!依據我們系統的架構,任何的實作不應該相依到其它的實作,而是讓有 log 需求的 service 實作擁有一個標準的 Logger 界面,不管以什麼方法實作你的 Logger,只要實作這個標準的界面就可以不讓 service 實作被另一個實作來綁住,這是我們的鬆綁策略,一直以來我們就是這樣做的呀!原來用 console 的 SystemOut 實作,而現在只要把那個實作抽換掉,因為我們用 springframework 來做反轉控制,所以連 Factory 程式都不用寫,只要設定 context 把 Logger 的 bean 應對的 class 換掉就搞定了。 可是對方似乎很堅持,認為用注入的方式太複雜了,他想要用靜態連接,只要用一行程式就好了,不用設什麼設定檔,也不用宣告 attribute 及實作 setter 及 getter。 我發現再這樣討論下去,問題好像會失焦喲,於是問道:請問現行設計有什麼需求不能滿足嗎?對方回應:可以滿足,但這樣作很複雜,程式不好寫,因為…。其實我不想聽他解釋,為什麼?因為既然需求可以滿足,就沒有必要改變我們的設計,他想要做的事是以特定實作來主導設計,而不是面對問題來調整設計,既然要用這種頭痛醫頭,腳痛醫腳的做法,那就不需要架構的藍圖了,而可憐的對方他其實是NPS(No-Problem Syndrome)-沒有問題症候群(Gerald M. Weinberg,1986)的患者,而且似乎病得不輕。

Continue reading about 軟體開發的沒問題症候群