【從學員練習影片觀察到一個關於 TDD 的有趣現象】
極速開發的課後練習作業,雖說重點是放在極速開發要學習的技巧與刻意練習的模型,但開發的方式、順序也是刻意安排成類似 TDD 的進行方式,來讓生產力最大化(TDD 本來就是幫助開發的,不是幫助測試的)
我從2位第一次上我課的學員(當然就是 #極速開發,代表他們沒上過#單元測試 跟 #TDD與持續重構),雖然他們是照著示範影片、上課教學用 TDD 在寫整個 tennis 的過程,但從他們執行測試的時間點就可以發現:
「他是用測試來驗證 production code 的正確性」,即使他先寫了測試,也不先執行,沒有看到紅燈,每次都等到 production code 寫完了,應該要綠燈時,才執行測試。
而其他上過 TDD 課的同學 ,或是上過單元測試的同學,知道測試是用來描述情境,如果現在「加入的這個情境是新的需求或需求異動,代表目前 production code 還不支援這個情境,執行測試跑出的紅燈,就是等等 production code 要完成的 #目標」
test-frist 從來都只是 TDD 其中一個小小的衍生產物,而不是全貌。TDD, 測試驅動開發 從來都是一種開發方法,而不是測試方法。
總有些人老愛把 TDD 拿來跟測試相提並論,就總是喜歡把 test-first 當作靶子打,覺得違反人性跟直覺,覺得先寫測試在很多情況下是浪費時間或是不 work,可能拿來跟一堆測試的方法論相提並論,或總是只拿回歸測試的效益來當作 TDD 的整體。抑或是陷入 isolation unit test 與 integration test (其實就是非 isolation 等級、有實際依賴的自動測試)之爭。
```
註:TDD 事實上是可以不是單元測試等級的。
```
要比較正確看待 TDD 的角度,首先要知道它是幫助開發的、它是一種開發方式(當然不是唯一一種,甚至也不會是最好的一種,因為根本沒有最好,只有剛好)
接著要了解 TDD 可能用 IPO 模型還比較貼切,input-process-output,在你開發任何功能之前,你總要先想過這件事。而先想這件事,才是 TDD 的最基本精神。
接著是怎麼把你想好的東西,變成可執行的 spec,我們只是用測試程式來「描述」你腦袋中的「IPO模型」,把 process 的過程當作一個黑箱子。
而這個 IPO 模型在結合成「使用情境」,就會帶來「高易用性 API 的好處」,只有在一開始就先想好怎麼給別人用,最後才會好用。所謂的一開始想好,指的不是預先設計一堆 class,而是 input/output 想清楚期待(一般會結合實例化需求,搭配 Given/When/Then 的 gherkin style 來把前置條件、資料、前提想好,當發生什麼事,應該是怎樣的結果),然後描述它。在紅燈定義清楚目標,綠燈完成 input/output 關係且沒弄壞前面的所有情境後,來針對 process 進行重構(事實上 Kent Beck 的 TDD by Example 更多是用 refactor 來 #完成 process。
```
註:所謂的 output 不一定只有回傳值,包含外部依賴狀態、資料的改變,甚至顆粒度小一點,針對物件導向設計的話,物件內部狀態的改變也算,只是物件內部狀態改變,驗證點要嘛是拿得到內部狀態,要嘛就是要驗證物件哪個行為會因這個內部狀態而有所不同。
```
## 戰 TDD 之前該先做好的功課
要戰 TDD,是不是至少要把 Kent Beck 的 TDD by Example 看完?
要戰 TDD,請不要拿它跟測試方法論來比,那只是一下就被人看破手腳。因為它是個開發方法論。
要戰 TDD,請不要把它的好處只限縮在跟回歸測試、自動測試的比較,因為那只是它的衍生好處,當你試過在白海報紙上 TDD 就懂,TDD 是在釐清你的思緒的同時,又可以以終為始,確保你在 production code 的每一個動作都是為了滿足某個期待的情境。
要戰 TDD,請不要去把 單元測試、整合測試捲進來,那是測試的顆粒度,那是測試的分類,TDD 從來都不是只能限於單元測試。
要戰 TDD,請不要在那邊戰他是 bottom-up ,是直接從程式/class 的角度出發,事實上 TDD 既不是 bottom-up, 也不是 top-down, (書裡面就有講這件事咩),實務上的 TDD 結合倫敦派(GOOS)跟芝加哥派(Classic TDD),會更像 Outside-In 的進行方式,先定義好驗收情境,接著從最外部(也就是使用者看得到的部份)一路把依賴往另一邊的系統邊界推,直到推到系統以外的依賴資源(persistence 或 external API/service)
```
註: ATDD by Example 中 ATDD by Example, Kent Beck 寫的序最後的一段話。
Kent Beck:
「就像我曾說過的,TDD的一個缺點是,它可能會退化為一種用來滿足開發人員需求的編程技能。某些開發人員從更廣泛的角度來看待TDD,輕易在他們測試的不同抽象級別間跳躍。然而在ATDD中不存在歧義,這是一種加強與非編程人員溝通的技術。我們之間良好的協作關係,以及作為這種關係基礎的溝通,能夠使軟件開發更有效率。採用ATDD是向著溝通更清晰這個目標邁進的重要一步,而此書是一本全面又平易近人的入門讀物。」
```
要戰 TDD,請不要只關注在 test-frist,因為他只是用 test 來幫助你 think-first,不要邊寫邊想。然後不要過份依賴或相信你腦袋的能力,把你想好的東西具體化出來,最好可以被直接執行,最好除了你以外每個人執行出來的結果都會一樣(不管是對的,還是錯的)
要戰 TDD, 請不要把論點放在見樹不見林,如果你有看 TDD by Example 的 Part 1, Part 2 那兩個加起來共 24 個章節,就知道一開始就得把當下想到的全貌紀錄在一個「紙本」的 backlog (所謂的紙本,只是要講這並不依賴於任何工具)
而這個需求輪廓的全貌,會隨著你逐漸完成一部分一部分的情境,設計逐漸浮現後,而隨時跟著增減調整。
但不代表 TDD 就是先想到一個測試案例,就直接先幹下去了,那根本是亂搞。
以上這些,都還不是在列 TDD 的好處,而是針對那些從來沒搞懂 TDD 但又愛戰 TDD 的人一點提醒,你戰的很可能是「你誤解的 TDD」。
TDD 還有許多實務上的用途,列上我在譯者序中的一小段:
>> 測試驅動開發(Test-Driven Development, TDD)!一種以測試為開發輔助、以測試來描述需求情境、以測試來當作目標、以測試來表達期望、以測試來驗證疑問、以測試來實驗學習、以測試來溝通協作、以測試來協助設計高易用性 API 的「開發方法」。
譯者序有開放給大家看,請見:https://tdd.best/book/tdd-by-example/
拜託,要戰之前去看一下祖師爺 Kent Beck 對 TDD 的原始見解:https://www.tenlong.com.tw/products/9789864345618?list_name=srh
如果你想正確的使用 TDD 來幫助你在實務上產生許多的價值,帶來許多的好處,尤其是需求釐清、持續重構、小步快跑的部份,最好理解的培訓課就在這:https://tdd.best/courses/classic-tdd-by-example-video-training/
最後我想講一段話:
TDD 從來都不該被導入到團隊中,但它是一種很好的自我鍛鍊與學習的方式,也是一種能用很低的成本來帶來很多好處的開發方法(見下方註腳),然而它也不是適用所有的情況,但它可以讓『完美』變成一個動詞,而非不變的形容詞。
```
註:
Kent Beck 在 DHH 靠腰:《TDD is Dead》 之後寫的一篇反串文:《RIP TDD》
https://www.facebook.com/notes/1063422864115918/
我幾年前的簡易翻譯,通常也是 TDD 可以幫助你解決的問題,如下:
- Over-engineering (過度設計)
- API feedback (改善API的設計與可用性)
- Logic errors (想的跟寫的不一樣,寫的跟需求不一樣)
- Documentation (寫跟維護文件是痛苦的)
- Feeling overwhelmed (找不到切入點)
- Separate interface from implementation thinking (抽象設計)
- Agreement (確保已修正問題的證據)
- Anxiety (改東壞西的擔心受怕)
```
很久沒對 TDD 發表這種長篇大論了,因為不理解、不想理解、不同角度理解的人居多,能真的到各自的塔上用不同角度來看原義,以及實務上用它來幫助解決的問題有哪些的人,真的太少。
大部分人只想針對這個詞彙來攻訐以博得流量跟吸引目光,而不是想著「我可以用它來幫助我什麼」
問題跟需求是中性的,解決問題跟滿足需求的手段與方式有千萬種,不會只有一種,也不會有所謂的對錯,多點角度去了解不同的方法、方式,然後融會貫通,發揮綜效,在實務上用最少的成本與風險來產生最大的價值,這才是真正的目標。
導入敏捷不該是目標,導入 TDD 也不該是目標,目標永遠都是在實務上產生價值、解決問題、滿足需求。
同時也有1部Youtube影片,追蹤數超過18萬的網紅公視新聞網,也在其Youtube影片中提到,"更多新聞與互動請上: PNN公視新聞議題中心 ( http://pnn.pts.org.tw/ ) PNN 粉絲專頁 ( http://www.facebook.com/pnnpts.fanpage ) PNN Youtube頻道 ( http://www.youtube.com/user/...
海報紙 是 什麼 紙 在 法國生活日記 Facebook 的最讚貼文
今天老佛爺百貨公司已經開始偷跑夏季大打折 ,台灣Line 好友群吹堂打鼓要直播,但我人在鄉下脫離紅塵已久🙏🏽(吃齋唸經),眼裡只見到~哇啦啦!園裡香菜長到兩公尺了!還開出小白花!整個比我還高真的好巨大~!(傻眼)Orz
朋友說同事上次做 涼拌香菜,好好吃,嘴饞😋趕忙問食譜「涼拌香菜 是全部都是香菜嗎?」,整個鄉土村民化。😅
園裡不僅各色玫瑰綻放,覆盆子也成熟了,要快採拾好做果醬免得被鳥吃光,蘋果們魔術般一下子就長得快成形,下個月就可吃了? 看著這一切平和田園風景,真捨不得不久又要離開敏敏醬北漂打滾討生活了~。
因疫情推延了三個月,這週末六年一度法國大區地方選舉又將來臨(法國全國有13個大區,區長大於省長,每一個大區管轄範圍都廣達數萬平方公里,掌管著各地方的經濟政治發展)。
法國地方選舉總是暗中較勁,地方政見發表會各黨派沒什麼大張旗鼓的團結造勢活動,旗幟、紀念品、海報紙張宣傳品很少看到,候選人們也不怎麼會作秀,各黨派之間表面上還算君子之爭,較不會耍弄選民對立叫囂撕裂彼此情感,耳根也清靜不少。新聞報導也算較持平不太操作狗血消息,真的很無聊沒什麼娛樂感(畢竟媒體是良心事業呀!),收視率自然普普,要不是鄉公所外的海報看板出台不知道竟又要選啦?!
(後圖附贈極右派樂朋媽提嘻的34歲原本做園藝的小鮮肉尼可力克的競選海報,她好愛找這類嫩草搭襯她的女王樣😆)
海報紙 是 什麼 紙 在 新奇太太的日本戲虎記 Facebook 的最讚貼文
因為虎吉在找新助理,上週我便委託了幾家派遣公司介紹。這幾天陸陸續續得到一些回覆,其中一個讓我嘖嘖稱奇一定要拿出來分享。
派遣公司業務:「我們找到了一個還不錯的人選,是42歲、秘魯和日本的混血女性,因為在日本長大所以日文溝通無礙,人很活潑爽朗。」
「我先mail她的簡歷給您,如果您覺得不錯再面試看看好嗎?啊對了,她隨時可以去上班,只是8月中到9月初她會請三星期的假,要去國外留學。」
我:「留學?三星期?」
業務:「對,畢竟是混血,比較有國際觀,一年會出國留學一次。」
我:「現在肺炎疫情還沒退燒,就我所知不管去哪個國家,都是要有一定時間的隔離,回來日本後也要隔離,這樣前後應該不只三星期吧??」
業務驚:「對、對耶⋯不好意思,我再去問清楚!」
我:「不用問了,疫情持續這麼久我一年半都不敢回台灣,對方能這樣說留學就留學,也沒考慮到隔離的事,我聽了就害怕⋯」
#這樣的國際觀忍不住想為她拍手
#如果我不是外國人就要被這國際觀騙走了吧
講完國際觀講講日本觀。
上上個月公司搬家,從公寓搬到獨棟平房。新辦公室前的馬路對面就是垃圾集中場,我們還覺得很近很開心。
沒想到某一天被一個大媽嚴厲斥責:「你們那邊跟我們不同町,請你們不要在我們的垃圾區丟垃圾。」
聽到轉述我都傻眼了,也才發現隔一條馬路的對門地址的確跟我們不同,假設我們是A町,他們則是B町。以台灣來說像是不同里的感覺。
日本文化裡很重要的「町內會」,是基層自治組織,有些地方比較傳統的,會強制住民加入町內會、參與整個町的活動以及付費。
對該位大媽來說,我們不同町、既不用付費也不用參加活動不用掃垃圾場,所以也就不能使用。
即便這一切是代表了日本文化,屬於日本的潛規則,但這種潛規則完全沒有法律基礎,對於我這外國人來說還是很難接受。
不過因為沒人知道那個大媽什麼時候會出來,大家臉皮薄,都不想丟垃圾時被大呼小叫,於是只好摸摸鼻子找我們這一町的垃圾場。
偏偏我們辦公室旁邊是一間佔地寬廣的幼稚園,後面是一片田地,要找到垃圾場就必須越過那片田地,丟個垃圾像是去散步,極其浪費時間。
我氣不過打電話給區公所詢問我們使用那個垃圾場是不是合理的,沒想到區公所回覆我:「丟垃圾是合理的,使用離自己家最近的垃圾場也是合理的,但是我們不會插手決定誰可以丟垃圾誰不可以丟垃圾,最好的做法還是要你們去跟對方打一聲招呼,拜託他讓你們丟垃圾,不要引起爭執。」
登愣愣,標準的日本人做法,我嘴上說好,一掛掉電話就大喊誰要去跟那個大媽打招呼,她可以要我們清理要我們付錢,憑什麼一開口那麼沒禮貌我還要去跟她打招呼!!!
連身為日本人的虎吉也不願意去低頭,整個公司大家都充滿自尊心🤣
就這樣散步兼丟垃圾過了兩週,有一天我忽然靈機一動,在垃圾車每週固定來的時間,優雅的拿起垃圾,走到垃圾車旁:「不好意思麻煩您們了☺️」。
收垃圾的人也很客氣的幫我把垃圾收走。
回到辦公室後同事睜大眼睛佩服得看著我:「居然可以這樣!這樣那個大媽就不能說什麼了!你太聰明了!!以後就不用跑大老遠丟垃圾,也不用受氣了。」
足足被稱讚了三分鐘後,我說:「台灣⋯都是這樣丟垃圾的呀⋯因為沒有什麼町內會、沒有那些無聊的潛規則,但是垃圾放在集合場會有臭味,所以都是固定時間等垃圾車來後去丟垃圾,既不用掃也不怕烏鴉吃垃圾,更不用被死老太婆刁難🥰」
#住到第12年了
#還是打從心裡厭惡日本的這些潛規則
#到底為什麼不能好好講話呢
其實這只是日本文化的一環,當然也不是所有日本人都這麼討人厭,像虎吉最近溫柔體貼,又送花又自己把孩子們帶出門,雖然整個家事還是沒做,不過太太可以得到溫柔體貼的對待就很滿意了(很好哄)。
只是我發現虎吉最近一直把腦筋動到我身上,一有空就在規劃他的退休人生,最近一直嚷嚷著等我的台灣事業步上軌道,他就要把公司賣掉跟著一起去台灣,然後邊學中文邊衝浪⋯
我:「邊學中文邊衝浪⋯我上班⋯那家事小孩呢?」
虎吉笑得爽朗:「回台灣你也不用做家事顧小孩啊~每次媽媽妹妹妹夫他們都做得很好內!」
我白眼:「那是回去借住才有的待遇,你真的舉家移民回台灣還肖想人家照顧你嗎!!」
虎吉:「蛤~如果是變主夫的話我要重新規劃一下,畢竟我現在規劃的生活裡是沒有主夫的。」
我再白眼:「怎樣,要當主夫就不敢移民了嗎?」
虎吉再次露出笑容:「不,要當主夫的話,我得先去買一條貴貴的圍裙帶去😊」
#暈倒
#這人到底在想什麼
還是來看看可愛的孩子吧。
上次去兄弟們的學校參觀上課,因為弟弟班級還小怕大家看到爸媽無法上課,於是老師們把牆壁貼滿海報紙然後挖洞,讓爸媽用偷窺的方式看。
結果看到我們家小吃貨楷楷,幾乎一直坐在座位上等吃飯⋯那深怕自己吃不到飯以及看到飯來了的喜悅、還有飯後滿足的模樣真的好可愛。
因為不好拍照片很糊,我就放在留言處囉~
海報紙 是 什麼 紙 在 公視新聞網 Youtube 的最佳解答
"更多新聞與互動請上:
PNN公視新聞議題中心 ( http://pnn.pts.org.tw/ )
PNN 粉絲專頁 ( http://www.facebook.com/pnnpts.fanpage )
PNN Youtube頻道 ( http://www.youtube.com/user/PNNPTS )
PNN Justin.tv頻道 ( http://zh-tw.justin.tv/pnnpts )
公視新聞網 ( http://news.pts.org.tw )
體罰在台灣並不稀奇,但如果對幼稚園的小朋友也體罰、會不會太過分了?新竹市立幼稚園就被家長指控、有一名老師用捲起來的海報紙、打孩子手腳,甚至還把不乖的小朋友頭下腳上抓起來。現在班上有家長發起連署、要求園方處理這名不適任老師,教育處也已經介入調查。
新竹市立幼稚園傳出不當體罰事件,有家長向人本基金會投訴,孩子在園內遭到老師以倒吊的方式體罰,甚至還用海報紙捲起打手腳,要孩子回去不能跟家長講,為此,班上家長還發起連署,要求園方處理不適任老師。
人本基金會新竹分會主任 李慧貞:有個小朋友是在老師團體討論課的時候,因為老師覺得他不乖沒有坐在位置上,就把他抓起來倒立像蝙蝠一樣抓起來,所以當下孩子是驚聲尖叫臉都紅紅的,全班小孩都嚇到講不出話來。
連署家長:可能就是被打,那家長就會問說為什麼在事情的當下你們沒有跟爸爸媽媽反映呢?那小朋友就會說因為老師有交代回家不可以告訴爸爸媽媽。
事情發生後,園方也在教室內加裝監視器,觀察這名李姓老師的上課情況,但因為這起體罰事件,李姓老師這學期暫時請假,班級也由其他老師接手,園方則組成處理小組,針對家長投訴體罰孩子的部分進行調查。
新竹市立幼稚園園長 邱玲玲:當時合班老師看到的狀況是,在團體討論的時候有一位小朋友影響團體討論的秩序,老師要去抓住他抱起他的時候,孩子一掙脫最後孩子只剩下兩隻腳在老師的雙手這裡,所以就變成好像在倒吊一樣。
由於沒有當時的監視器畫面,只能靠孩子和合班老師的描述,究竟當時體罰的情況如何,園方還在調查中,不過園方坦承,這名老師的教學方式,跟家長溝通方面確實有問題,而主管機關市府教育處正介入加強輔導,會依據不適任老師處理流程,最快這幾天就會有初步結果。
記者 冉瑞雯 新竹報導"
![post-title](https://i.ytimg.com/vi/u-3x3ccGAv8/hqdefault.jpg)