如同看完電影一代宗師後的震撼

一代宗師是我最愛的電影,經典台詞不可勝數;而上完91哥的課程後,91哥的經典語錄還是言猶在耳,『哥教的是開發,測試只是順便』、『老闆花錢是請你來寫production code,不是請你來寫測試』、『重點在需求,焦點要放在解決問題,測試只是剛好而已』、『如果你的程式,測試加不上去,測試很難寫,很難獨立對它進行測試,那代表你production code寫太爛』、『TDD是我目前看來解決over design最好的武器』、『透過BDD與TDD,我們能達到需求、測試、開發、文件一次解決』。

緣起


因為大澤木小鐵去上過91哥的課程大力推薦,本來因為我們只會PHP,擔心C#會聽不懂,但大澤木小鐵我完全不會C#,上課也不是問題,這給了我們很大的信心,既然鐵哥都說不是問題了,我們就在Laravel台灣社團約了6位社友,一起去上91哥陳仕傑SkillTree開的自動測試與TDD開發實務(使用C#)第四梯了。

Q&A


我不想以傳統流水帳的方式介紹91哥的三天內容上些什麼,既然重點在需求,焦點在解決問題,我想直接以沒上過91哥課程會有的疑問為需求,直接以問答的方式來解決問題。

Q 我是RD,我不懂C#與ASP.NET MVC,上91哥的課會聽不懂嗎?

A 我個人是略懂C#,但我沒寫過ASP.NET MVC,只寫過ASP.NET WebForm與Windows Form,由於這次我們一共有6位寫PHP的社友一起上課,之前擔心其他夥伴完全不會C#,上課會有障礙,所以在課前的一個星期幫大家惡補了C# ,但後來發現其實91哥上課沒用到多進階、炫麗的Design Pattern或OOP技巧,而是最基本的OOP特性跟原則,基本上你只要懂interface,懂繼承,懂virtual/override這三招就夠了,如同葉問說的 : 三板斧就夠你受的了1 1詳細請參考PHP與C#語法快速導覽

也因為只有這三招,所以只要你所使用的程式語言支援interface、繼承與virtual/override,就可以將91哥上課所教的東西套在你自己的開發上,PHP已經是算眾多語言中最晚支援OOP的了,但目前也可以順利將91哥所教的unit testRefactorTDDBDD套用在實務上,所以程式語言真的不是問題,重點在於你懂不懂它的內功心法,與實務上該怎麼執行,這正是91哥上課要傳承給大家的。

Q 我是RD,91哥上課用的Visual StudioMSTestNSubstitueSpecFlow…等工具都是給C#用的,我用其他程式語言也無法使用啊?

A 我是寫PHP的,不是用Windows,也沒有Visual Studio可用,更沒有MSTest、NSubstitute與SpecFlow,不過在這三天課程中,讓我看到了unit test、Refactor、TDD與BDD該如何在實務上使用Visual Studio串起來,重點是實務上正確的開發flow,而不是在工具上,也因為91哥在上課中Visual Studio的啟發,讓我在JetBrainsPhpStorm實現出與Visual Studio上99%相同的開發flow,至於其他工具,就要感謝大澤木小鐵PHP上學會自動化測試與實戰TDD課程中,教大家用PHPStorm實現RefactorPHPUnit取代MSTestMockery取代NSubstituteBehat取代SpecFlow,既然連PHP都可以,我相信其他程式語言也一定也可以找到適合的取代方案,重點是學到91哥的內功心法實戰經驗,而不用執著在工具上。

Q 我是RD,unit test、Refactor、TDD與BDD這些東西聽起來很玄,很擔心91哥的課程如同一些Scrum講師只會嘴砲,聽完了還是不知道怎麼用在實務上?

A 我自己對於課程內容還蠻挑的,我不喜歡那種只會講理論,講願景的課程,整堂課看不到一行code,畢竟我們是RD,live coding最有感覺,但也不喜歡那種完全實務導向的課程,覺得大師們的理論都是屁,只有實作才是王道,我覺得那些大師只所以被稱為大師,其理論是從實戰歸納出來的,只是我們目前還不懂而已。而91哥課程是理論與實戰兼具,分理論、Lab、Homework三個部分 :
1. 理論 : 首先會講理論部分,所謂一圖解千文,91哥大量使用圖解的方式去講解TDD等玄妙的觀念,上課之前我已經開始用TDD開發,不過還是有很多觀念跨不過去,經過91哥的圖解之後,就一目瞭然了,不再只是文字的抽象解釋,畢竟每個人對文字的理解不一樣。
2. Lab : RD就是要看到code才有感覺啊,接下來91哥會live coding每個lab,實際用code解釋剛剛講的理論,91哥上課的lab都非常具有代表性,都是實務上會碰到的例子,不是很多書上的鳥、shape之類的範例,讓人一看就會有我之前也是在這裡痛過的感覺。
3. Homework : 離開學校之後,已經很久沒寫homework了,但91哥強調絕對不要先去參考別人寫好的homework,那你就失去了打通任督二脈的機會,因為卡關,講師帶著你打通關,才是這門課的價值,91哥會幫每個人的作業寫comment,若不合需求就退回,直到做對為止,而91哥homework題目也非常具有代表性,都是實務上會遇到的問題,讓你寫完之後就會想明天用在工作上。
總體來說,lab與homework才是91哥課程的精華,透過這樣的實戰,讓我們對理論更有感覺,也可以立刻用在實務上。

Q 我是RD,有些講師本身功力很高,可是不善於教學,不會掌握課程節奏,只讓人聽了想睡覺,91哥的課程會這樣嗎?

A 我第一天上課的狀況並不好,前一晚失眠,只睡了3個小時,一直很擔心上課會睡著,但結果是多慮了,91哥讓我從早上9點一直high到下午6點,腦袋CPU不斷高速運轉 :
1. 使用RD的話講課 : 很多講師/教授沒有太多實戰經驗,只是將書中那套理論搬出來,但91哥講的卻是拳拳到肉的實戰經驗,馬上打到我們的痛點,想睡都睡不著。
2. Recap與分組搶答 : 當理論與lab完了之後,還有個recap時間讓我們分組搶答,大家為了91哥的獎品更是拼了老命,PHP代表隊就是這樣才贏得第一天與第三天的積分第一名 XDD。
3. Homework Review : 每次上課前,91哥會花約一個小時的時間去review大家前一次的homework,將大部分人遇到的問題提出來討論,由於homework大家親手寫過,所以review起來非常有感覺。

Q 我是RD,已經開始寫unit test,可是實務上總無法順利的將自己的production code加上測試,我能在91哥課程學到我想要的東西嗎?

A

如果你的程式,測試加不上去,測試很難寫,很難獨立對它進行測試,那代表你production code寫太爛。

91哥

最主要的問題,就是你的production code有太多的相依物件,導致測試加不上去。關於這點,91哥在上課花了相當大的篇幅與lab講這個部分,為了不破91哥的梗,在此就不細講,請直接去上課去聽91哥詮釋。

Q 我是RD,我會OOP,也會Design Pattern,可是為什麼用了Design Pattern之後反而更難維護呢?我能在91哥課程學到我想要的東西嗎?

A

大家都經歷了學習OO,誤用OO;學習Design Pattern,誤用Design Pattern的歷程。

先有code再重構,比一開始設計套用一堆Design Pattern來的精準。

TDD是我目前看來解決over design最好的武器。

91哥

回想自己學習OOP的歷程也是這樣 :

  • 一開始學OOP時,非常喜歡使用繼承,但後來發現一旦需求發生變化,上層class一改就一髮動全身,反而更難維護。
  • 後來學了Design Pattern,拿到spec就開始切interface,後來才發現根本over design,多了無謂的複雜性,反而更難維護。

91哥教給大家的TDD,採用測試->紅燈->開發->綠燈->重構->綠燈的開發流程。

  1. 有了需求,才有紅燈。
  2. 解決需求,才有綠燈。
  3. 重構架構,繼續綠燈。

因為先有紅燈才有綠燈,所以我們不會over design,每個開發都是恰好解決了需求
雖然需求不斷的增加,但因為不斷的重構,讓整個架構一直維持在好維護的狀態。
因為已經寫了測試,所以不用擔心重構改壞原有功能
關於TDD與重構, 只要跟著91哥的lab與homework,就能完整感受其威力。

Q 我是QA,測試是很無聊的事情,是否能將測試加以自動化呢?我能在91哥課程學到我想要的東西嗎?

A

哥教的是開發,測試只是順便。

91哥

雖然測試只是順便,不過在第二天的課程中,91哥會教大家使用Selenium,可將在瀏覽器的動作錄製下來,將來可以重複執行所錄製的動作,若發現bug,QA甚至可以將所錄製的檔案交給RD重現bug,是非常方便的工具。

關於Selenium,91哥提供了很多lab,甚至可以將在瀏覽器前端的操作轉成後端程式,並與BDD與TDD結合,非常實用。

Q 我是RD,我必須花很多時間跟PM溝通,但常常我寫出來的東西不是PM所要的,害我又要一直改一直改,我能在91哥課程學到我想要的東西嗎?

A

重點在需求,焦點要放在解決問題,測試只是剛好而已。

91哥

unit test確保了我們程式寫的想的一樣,而TDD確保了我們想清楚scenario才動手寫,但什麼確保了我們想的跟PM一樣呢?這也是RD常常寫出不是PM所要東西的主要原因,透過BDD,我們可以使用人話描述需求,與PM確認,再使用人話轉成測試案例,最後繼續我們的TDD,如此就能確保RD用TDD所開發的東西,真的是PM所想要的東西,而不用因為認知差異而一直改一直改。

Q 我是PM,我希望我寫的spec能讓RD直接開發使用,並且自動產生測試報告,我能在91哥課程學到我想要的東西嗎?

A

透過BDD與TDD,我們能達到需求、測試、開發、文件一次解決。

91哥

BDD是RD透過Gherkin格式描述人話,如下圖所示 :

若PM也能以Gherkin格式描述需求的話,RD將可直接以它當spec轉成測試案例從事TDD,並自動將測試結果產生測試報告,如此將大幅提升開發效率。

關於BDD部分,91哥有一個範例就是以Gherkin描述需求,透過BDD與TDD,最後自動產生一份測試報告

Conclusion


習武之人必有三個階段 : 見自己、見天地、見眾生。

宮寶森  - 一代宗師

很感謝見眾生的91哥將自己實務上TDD與BDD的經驗很熱血地分享給後輩,雖然表定課程是上到晚上五點,但課後我們將實務上的問題請教91哥時,91哥總是毫不保留的傾囊相授,甚至講到晚上六點,最後我必須很老實的說一句 : 這是我上過的付費課程中,無論是理論或lab,內容最有料的一次,也是最震撼的一次!

2015-11-07