學習TDD的心路歷程
我們聽了太多的敏捷開發,但不寫測試的敏捷,就像不會動手術的外科醫生一樣荒謬。
我在2017年上了Daniel的CSM(Certificate Scrum Master)課,上完有種毀三觀的震撼,那門課表面上在講SCRUM,其實講的是一套敏捷的人生觀。課程最後一天的下午,Daniel談到了為什麼要自動化測試。
Daniel畫了一張圖,給了一個簡單的理由:雖著時間進展,軟體的功能會線性成長,但每次Release都需要測試全部的功能。不自動化測試的話,遲早有一天你的QA會爆掉。
當時第一次接觸到Scrum,意識到這是很有價值的方法論,回去公司後迫不及待分享給同仁。但那時的我是個無知的敏捷信徒,只會嚷嚷測試很重要,但卻不會寫測試。主管聽完後,思考了一下,表示實務上有困難,PM的需求朝令夕改,如果我替軟體加上測試,軟體會變得穩定,但之後要改架構會變得困難。故決定先暫緩這樣的想法,只在幾個特定的feature上加上自動化測試,未來需求比較穩定後再來試著導入看看。
後來因為其他緣故離開了那份工作,但直到現在,我依然不認為主管當時的決定是錯的。以當時Team的狀況要導入測試的確不容易。我沒有經驗,沒辦法 show, don't tell 直接拉起袖子做,是最主要的敗因。
下一份工作我遇到軟體品質的問題,團隊對於debug相當頭痛。我開始意識到測試的重要性,於是在9月和11月,主動去上了91的極速開發和TDD重構課。
為了確保花的學費有價值,上課前的一個月,我決定先在工作上練習寫單元測試。我還買了Modern C++ Programming with Test-Driven Development閱讀,這是本好書,裡面用Example示範TDD的步驟,還講了許多C++的Stub/Mock技巧。但讀完後,我還是不知道怎麼在範例外的問題上使用TDD,我不知道怎麼設計Test Case、不知道怎麼選擇下一個Test Case,書上講得頭頭是道,也有很多範例程式,但是距離實踐有一大段鴻溝。
上完這兩門課後覺得非常值得,最棒的是親眼看見講師示範「好的TDD開發實踐應該是什麼樣子」。沒有榜樣自己練TDD很容易練成九陰白骨爪。親眼看見會產生疑問,此時詢問講師並獲得反饋,等於直接吸納人家的經驗值,少走很多彎路。
極速開發教的是工具,解決沒有時間寫測試的問題。而TDD重構課大概是91系列課中最有價值的一門課,實際帶你演練一次高手的TDD和重構會是什麼樣子,課程講了實例化需求、測試案例排序。其中最震撼的是,講師讓我們分組寫一段程式,並讓我們改到覺得滿意為止。隔天現場示範重構,每個步驟都拆的很細。那時才意識到,原來我以前根本不會重構,我過去一直以為的重構,就只是抽方法和取一個好名字而已。而真正的重構是有測試作為防護網、有能力辨識程式壞味、有辦法小步地穩健修改。