軟件開發是個挑戰,尤其是對于那些完美主義的程序員。他們需要制定大量的決策以及許多問題的解決方案,這對于有些人來說會感到很難。當然,你可以在線搜索到最佳實踐方案或在StackOverflow上提問。但即便你找到了想要的答案,也未必能讓你感到滿意。你懷疑這個設計是否完美,事實上,真正完美的設計幾乎為零。
想徹底解決設計難題是不可能的。這是因為每個需求都會浮現在你的腦海里,你會遇到設計領域里最大的挑戰,比如選擇數據還是表示層。我是使用MVC還是MVVM?哪種OPM工具適合我?我該如何處理多個數據庫?等等。每個問題都會讓你不知所措,并且所遇到的設計問題也在日益增長。每走一步都會使你覺得像是有座大山擺在你的面前。不堪負重的感覺讓你想要逃避或者拖延解決問題的時間。但拖延并不能解決問題。
解決類似這樣的問題最好的辦法就是(Divide & Conquer)拆分 & 克服。你必須暫停思考腦海中的所有系統問題,試著將設計拆分成細小的模塊,并且一個一個的查看可以做哪些簡單的模塊。如果可能的話,選擇迭代開發方法。這樣你就可以將思維專注在設計障礙上 ,那么你就能看到多個小山丘而不是整座大山浮現在你的腦海中。
此外,不要花費太多的時間來選擇工具或者API或者規則引擎。這些工具僅僅是為了讓我們工作起來更加輕松。相反地,把更多的 時間放在設計原理上,比如關注分離(Separation of Concerns)。SoC(系統芯片)會允許你改變任意軟件層或者不影響其他系統的軟件工具。
TDD(軟件測試驅動開發)會讓你鼓足勇氣,讓你在軟件行業發生質的改變。不要忘了,在設計上花費的時間是遠遠不夠的,正如Steve McConnell 在Code Complete這本書中所說:
“When are you done [designing]? Since design is open-ended, the most common answer to that question is “When you’re out of time.”
為了生存,你的客戶或者公司必須適應變化。而這就意味著需求將發生變化。你不可能只編寫一款軟件就能滿足未來所有的需求。總會有些新的需求時不時的跳出腦海中。所以,不要試圖掩蓋未來的需求,嘗試去編寫滿足目前需求的軟件。
如果你花費數天時間來開發某個特別的功能,而這個功能一年里為你的客戶只減少五分鐘,那么實際上你的工作是無用的。我能理解,有時我們無法阻止自己做出一些特別的改變,因為它似乎使我們覺得像是一個更好的程序員或者只是為了好玩而已,但是考慮到成本/效益,時間是寶貴的,把時間花費在其他方面或許會更好。
簡化,當你需要存儲某個對象到系統文件時,沒有密集型的工作或者特別需求,編寫一個自定義對象序列化是毫無意義的。我看到有些設計從工程學角度來看,它們像是杰作,但它們過于復雜。你不應該讓你的設計過于復雜。有時,最好的解決方法就是簡單。因此,請保持 KISS原則。
設計其實是為了檢驗程序員成果的好壞。不同的程序員可拿出不同的設計思路。因為沒有單一的解決方案,這可能會導致你為某個特性搜索所有的最佳方案, 但這并不意味著你應該停止學習或聆聽他人的想法。在設計過程中,不是學習所有最佳實踐就能適合你的問題。相信自己,做最好的設計,實施自己的設計思路。
重構是個非常好的做法。當出現壞代碼時,試著用重構的方式來解決。從錯誤中學習,它將有助于你未來設計。
無論你做什么,最終都會以一款無法令你滿意的軟件而告終。正如 Hunt and Thomas在《The Pragmatic Programmer》中寫道的:
“完美的軟件是不存在的。在計算機歷史上,沒人設計出完美的軟件。這是不可能的,也許你是第一個,除非你不接受這個事實,而浪費時間或者精力去追逐一個不可能實現的夢想。”
我很抱歉,但他們是對的。不要去追逐一個不可能實現的夢想,試著讓你的軟件“足夠好”就好!
英文出自: Thingstocode