Christopher Alexander 在《建築的永恆之道》開頭寫下:「無心之心,道之所存」。他認為建築或城市沒有所謂絕對的「好」,要追求的是一種永恆之道;唯有踏上這條道,建築與城市才會生機勃勃。這不是一個能被「求取」的過程,而是不斷探索的過程。軟體工程(Software Engineering)何嘗不是如此?
終於來到第三十天。
系列快速回顧#
過去二十多天的旅程,Kuma 帶著大家從零到一走過了這些主題:
- 釐清測試的基本概念,分辨單元測試與整合(Integration)測試的責任歸屬,並完成人生第一個單元測試。
- 隨著場景越來越複雜,先以直接操作、再借助 Mock 工具控制依賴,完成 Command 與 Query 的測試;多執行緒與例外場景也都成功攻略。
- 有了測試保護,膽子變大了:以前不敢做的重構,現在也敢動手了;為了抓準時機,還練習如何聞出程式碼的「壞味道」,並順勢避免技術債(Technical Debt)累積。
- 介紹了倫敦派與芝加哥派的 TDD,搭配近年流行的 Clean Architecture 與 CQRS,再交錯使用兩派的 TDD 完成一個實際案例。
- 在流程面,也聊過 Git 分支策略(GitFlow 與主線開發)、XP、Scrum、DevOps 等常見的 Solution。
單元測試是這一切的火柴#
那單元測試呢?
你發現了嗎?前面提到的這麼多軟體工程實踐,其實沒有一個能離開單元測試。或者說,少了單元測試,這些做法都很難發揮完整實力——沒有測試你敢重構嗎?沒有測試你敢用 CI/CD 配主線開發、一天往產線推好幾個版本嗎?
測試是一種實驗,計算機是一門科學。科學的「正確」是靠一而再、再而三嚴謹重複實驗堆疊出來的。同樣地,沒有足夠多且品質夠好的單元測試,你的日常工作很難變得方便又有效率。
從哪裡開始?先點那根火柴#
常有人問:要做的事這麼多,到底該從哪裡開始?Kuma 喜歡舉這個例子:
你在風雪交加的深山小屋,又餓又凍。屋內有壁爐、油燈、爐灶與生食,而你身上只有一根火柴。請問該先點哪一個?
答案是:先點那根火柴。 火柴不點,其他工具再厲害也派不上用場。
在軟體工程的實踐中,「單元測試」就是那根火柴。不要再追問該先做什麼、什麼才是 Best Practice,先動手寫下你人生的第一個單元測試吧;接著再挑選合適的 Solution 解決問題,才會事半功倍。
不要奢望有一天會拿到一份能「長治久安一勞永逸」的軟體工程實踐手冊,世上不存在那種東西。如同 Christopher Alexander 所說,當我們真正踏上程式的永恆之道,感受到的會是平和與安閒,就像在海邊散步、或在草原上大步邁進。
最後,不要奢望老闆會額外給你時間做單元測試——那本來就是工作的一部分。請記得:
單元測試是功能的一部分。
2021 的 iThome 鐵人賽單元測試系列就在這裡告一段落。單元測試只是改善軟體工程實踐的第一步,後面還有很多事等著我們去解決——先動手做了再說吧。
原文出處#
- 原書/iThome:https://ithelp.ithome.com.tw/articles/10275146