前言
身邊有很多人問我「怎麼做才可以提升自己的程式能力?」對此,我並沒有一個確切的答案,因為每個人的情況都不同,我也不是什麼大神,只是一個普通的開發者。
然而,在軟體開發的過程中,我發現遵循一些基本原則能夠有助於提高程式碼的品質,並更有效地應對問題。本文將探討我在開發中所秉持的這些原則,並分享透過實踐所積累的經驗。儘管開發並無對錯之分,但選擇最適合當前情境的方法才是最重要的。
什麼是開發?
狹義的定義:程式開發(Programming)
- 定義:撰寫程式碼的過程。
- 內容:包括研究、撰寫、測試、除錯、重構等。
廣義的定義:軟體開發(Software Development)
- 定義:根據使用者需求,構造產品的過程。
- 內容:包括需求確認、設計規劃、程式開發、測試、部署上線、維護等。
Time is money
時間是最寶貴的資源,不容浪費。
這是最基本,也是最重要的開發守則之一。在努力滿足需求時,我們經常希望在最短時間內完成特定功能。然而,現實通常較為複雜,省時行為有時會增加未來的開發成本。每個決策都伴隨成本和效益,我們需在多重選擇中找到平衡點。
DRY(Don’t repeat yourself) 原則
不做重複的事
所有重複行為都能進行優化,抽取重複邏輯。
以下是一些常見優化方法:
- 迴圈:處理相同邏輯的「重複執行」
- 函式:儲存重複「邏輯」
- 陣列:儲存重複「資料」
- 結構:儲存重複「資料形式」
不自己造輪子
如果已經有現成的解決方案,就不要重新造輪子。別人造好的輪子通常是通過大量測試,並經過時間的考驗而成的。當現有的輪子有問題或無法滿足需求時,才應考慮自行開發,否則是浪費時間。
WET(Write everything twice) 原則
儘管我們強調不重複,但建議在開發中至少重寫兩次,然後遵循 DRY 原則。
為什麼?
- 第一次寫的程式碼通常不完美。
- 第二次寫時會發現第一次的問題和重複邏輯。
- 第三次寫時,可以優化程式碼。
KISS(Keep it simple, stupid) 原則
讓程式碼保持簡單。
- 簡單的程式碼比較容易閱讀,也比較容易維護
- 簡單的程式碼比較容易測試,也比較容易除錯
- 簡單的程式碼比較容易擴充,也比較容易重構
DOTADIW(Do One Thing and Do It Well)
軟體中的每個元素,無論是函式、類別、模組、服務等,應僅執行單一功能,並且做好它。 當一支程式負責太多事情時,會變得難以維護及擴充。
YAGNI(You aren’t gonna need it) 原則
不要在程式碼中添加未使用的功能或過早優化。這種過度設計不僅增加開發成本,還可能變成未來無用的程式碼,增加維護成本。
讓數據說話
不要以主觀感覺為依據,需依賴客觀數據。人的感覺容易受多重因素影響,產生錯誤的判斷,只有數據能揭示事實。
善用測試
測試確保程式碼的行為符合預期,同時發現問題。儘管一些人認為測試增加時間成本,實際上,它提高了撰寫、修改和重構程式碼的信心,降低開發成本。
測試也能量化程式碼的性能,如執行時間和記憶體使用。千萬不要盲目的斷定「這個程式碼很慢」、「這樣寫比較快」,你可以保持著懷疑的態度推測假設,但是不要斬釘截鐵的說,除非你有數據支持。
善用 Debugger
Debugger 可以使你直觀了解程式碼執行過程,提升除錯效率。
相信我,反覆使用 print()
來除錯,是一件非常浪費時間的事情。
寫出好的程式碼
在開發過程中,如果時間允許,我們應該盡可能地寫出好的程式碼,而不是只求能夠運行。 有些時候,你只需要多花幾秒鐘、多思考一下,就能寫出品質更好的程式碼。
切記:不要追求完美到走火入魔
替他人著想
在軟體開發的世界中,多數專案都是由多人協作而成,而非一個人獨自完成。當然,如果你能夠獨自完成所有專案,那你可能不需要閱讀這篇文章,但是如果你想要成為一個好的開發者,那麼你需要考慮其他人的感受。
寫程式碼不只是為了自己看,也是為了讓他人理解及參考。當你寫出一段程式碼時,請想想其他人會怎麼看待它,是否能夠理解它的意義。
好的開發者應該能夠寫出易於理解的程式碼,而不是讓其他人猜測它的意義。
命名
命名是一門藝術,盡可能讓命名簡潔、有意義。好的命名能提高程式碼理解和維護性。
應根據變數或函數的作用範圍調整命名詳細度:
- 在廣泛作用域中,使用具體名稱以清晰表達用途。
- 在狹窄作用域中,可使用簡單名稱,因為上下文能夠明確指示其含義。
註解
當程式碼無法直觀表達意義時,我們需要使用註解來補充說明。但是註解並不是萬靈丹,程式碼應盡量自我解釋,註解僅作為輔助。
排版
建議使用 formatter 來排版程式碼,例如:Prettier 以保持一致性、提高可讀性,並節省時間。
縮排
縮排用於強調程式碼層次和結構,不同層級的程式碼通常代表著不同的作用域。
至於用幾個空格或是用 tab,這個部分通常會因為程式語言而有所不同,請參考各語言的官方規範,這邊就不贅述了。
空行
空行用於區分不同的邏輯塊,通常會把相關的邏輯塊放在一起,並用空行隔開不同的邏輯塊。 不過注意不要連續空 3 行以上,這麼做並沒有什麼意義。
空格及換行
空格和換行提高可讀性,規則根據程式語言而異。 通常建議一行不超過 120 字元,參數、函式呼叫或陣列等都可以換行,以提升可讀性。
老一輩的會說不要超過 80 個字元,因為受到 IBM punch card 影響的關係,以前的 terminal 只能顯示 80 個字元。
總結
本文章並沒有明講太多具體的做法,而是提供了一些基本原則,希望能夠幫助讀者在開發中找到方向。
很多書或文章都說怎麼做怎麼做是對的,建立了許多規則及限制,要求開發者追求完美,但是我認為還是要親自去嘗試,才能知道怎麼做才是最適合自己的。