【從學員練習影片觀察到一個關於 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 也不該是目標,目標永遠都是在實務上產生價值、解決問題、滿足需求。
部分驗收定義 在 Facebook 的最佳解答
【地下電影 X #公視】,淺談漫改動畫《#勇者動畫系列》
2020 年,台灣疫情尚未進入三級警戒,電影院持續苦撐之際,成為火車頭帶動票房增長的,是來自日本的動畫作品《鬼滅之刃劇場版:無限列車篇》,「大哥沒有輸」頓時成為家喻戶曉的口號,《鬼滅之刃劇場版:無限列車篇》最終在日本打破影史票房紀錄,台灣也寫下破 6 億台幣的傲人成績,幕後推手動畫製作公司幽浮社(ufotable)推高了動畫作品票房的天花板。
2020 年底,「品質保證」的皮克斯推出動畫新作《靈魂急轉彎》,片中緊扣「靈魂樂」一題,飽含對生命思辯的因果哲理,循序漸進地提出「活在當下」的核心意旨,成為疫情之下撫慰人心的最佳電影之一。皮克斯屢屢推出動畫電影,都令觀眾直呼「大人看的動畫片」,也真正做到「闔家觀賞」的實質意義,來自美國加州的這塊金字招牌在疫情下仍舊耀眼。
然而,回望國內電影競賽最高殿堂金馬獎,去年在「最佳動畫長片」的項目,由易智言導演 12 年磨一劍,首部創作的動畫作品《廢棄之城》拿下,當然,也讓《藍色大門》班底——易智言、桂綸鎂、陳柏霖師徒三人在金馬舞台上重聚。對於《廢棄之城》,金馬給出的評語是:「開創台灣動畫新格局。」易智言也在台上喊出「動畫是集體的創作成果,是未來」。
若站在金馬獎的歷史上回溯,2016 年第 53 屆競賽將「最佳創作短片」獎分為「最佳劇情短片」及「最佳動畫短片」兩獎[1],至今產出 5 部最佳動畫短片,其中 2019 年由王登鈺創作的《金魚》更在鍍金之後,於該年 12 月 20 日誠品電影院上映[2],動畫短片做正式商業放映,此舉與金馬動畫短片獎的增設遙相呼應,提升動畫短片的能見度與重要性,寫下里程碑。
走到 2021 年,由文化部前瞻預算支持,公視主導、大貓工作室製作的《勇者動畫系列》,或許更加具備商業潛力。此作品改編台灣漫畫家「#黃色書刊」的同名作品,為台灣漫畫 IP 首次改編動畫影集,在良好基礎的觀眾群下,《勇者動畫系列》擁有一定的變現量能,如發展週邊公仔、衣服、配件等等,實際上漫畫原作的確如此實踐,但透過動畫加深、拓寬群眾池子,有益無害。
而《勇者動畫系列》幕後製作團隊皆出自台灣,音樂部分,由五⽉天阿信擔任統籌,凝聚獅子 LION、美秀集團、茄子蛋、旺福、鼓鼓以及魏嘉瑩創作系列主題曲、片尾曲與插曲共五首歌曲,角色配音則請到黃子佼、吳慷仁、孫可芳以及近年出場率極高的劉冠廷,試圖以市場號召力極高的「明星」們帶動熱度,進而打進「非動畫」族群,走出同溫層。
實際看完《勇者動畫系列》,第一季共 6 集,每集落在 24 分鐘左右,在原先穩健的漫畫文本架構中,轉譯為動畫就有良好基礎,故事為標準三幕劇結構,「起、承、轉、合」各部分明,每一集皆在衝突的堆疊中提供觀眾探索故事的動力,且互為表裡,採取跳躍方式卻彼此緊扣,並逐步拼湊龐大的世界觀。
動畫也延續漫畫口吻,以詼諧幽默的基調,深入淺出叩問「善惡」、「種族」、「演化」等艱澀議題,顯然創作者嘗試於架構的奇幻異世界中,映照當代社會,並透過通俗動畫表現,勾勒出世界可能的成因與走向,娛樂之餘不失深度。
筆走至此,憶起 2018 年的動畫電影《幸福路上》,此片展現天馬行空的浪漫本質,同樣不忘探討現實人生的面向與可能性,乘載 80 年代至今台灣人的集體記憶。在跨度 30 餘年的時間軸裡,透過主角小琪的視野,不斷探索幸福的定義,並深刻傳遞出創作者對台灣這片土地的觀察與濃厚情感。再往前看台灣動畫,記憶最強烈的應該就屬千禧年前的《魔法阿媽》,說自己的故事,永遠是對抗全球化資本浪潮的唯一解答。
最後,或許這幾十年台灣在動畫產業的商業發展是緩慢、斷裂、缺席的,對比歐美、日本距離真正的「工業化」仍好幾步之遙(也包含整體影視產業),但從近年的創作脈絡與市場動向來看,仍能窺見「動畫」創作者們蠢蠢欲動的零散星火,當這股星火凝聚一方,在打死不退、一再失敗後的餘燼復燃後,就有可能於未來成燎原之勢。
而易智言去年在金馬獎上高呼的:「動畫是集體的創作成果,是未來」,能否在《勇者動畫系列》之中,一把火燒出未來,7 月 4 號本週日,觀眾是最後一塊拼圖,待市場實際驗收。
🎬以下為播出資訊:
《勇者動畫系列》於 7 月 4 日起,每週日晚間 10 點於公視頻道、公視+播出。此外,8 月 1 日 將在 myVideo,9 月 1 日 LINE TV 全套上架,Netflix 9 月 1 日於全球 192 個國家上架。
備註
[1]今年金馬獎更另設「最佳紀錄短片」
[2]經網友指正,台灣史上首部正式商業上映動畫短片為《微笑的魚》
公視粉絲團
勇者動畫系列
大貓工作室 Bigcat Studio
部分驗收定義 在 讀書e誌 Facebook 的最佳解答
從遠距辦公,提升到 “遠距股份有限公司”的執行長
兩個月前新出版的這本書,收集了歐美在疫情間遠距工作的調查與經驗值,不但提出非常多實用的小撇步,更是回歸到在企業辦公室工作的本質,然後思考虛實並行的世代,如何重塑工作的樣貌和機會。當然不是所有工作性質都有辦法遠距完成,但是在過去一年多全世界生活型態劇變後,部分遠距工作和室實體和線上混搭的模式,已經是一個不可擋的趨勢了。
這本書最核心的精神,就是說明在遠距工作的時候,應該把自己當成一人公司 (Business of One) 來經營。這就表示你是自己的人事長,開發團隊,研發長,也是行銷長。用這樣的概念思 “遠距股份有限公司” 上班時應該有什麼樣的穿著?應該要如何培訓員工(自己)?要如何跟客戶 (老闆)定義進度和驗收標準?以及要如何讓自己在線上和線下所呈現的專業度是足夠的?
而當你自己一個人在家的時候,其實就要兼顧很多人在辦公室時不需要面對的問題。包括周遭環境的預備,更不要說有孩子的人就同時會變成式督課老師和營養午餐廚師。所以在這當中思考取捨是非常重要的,作者有提出兩個應該摒除的“P" 以及所謂 “OHIO”的原則
第一個要摒除的是拖延 (procrastination) ,一些小的撇步,包括重新拆解自己工作的步驟,讓自己工作視野範圍看到是乾淨和專業的 (就是你要面對的那面牆,還有你的電腦桌面),還有其他協作的同事們設定短期階段性任務,等等。
第二個要摒除的是完美主義 (Perfectionism) ,當然文件能夠弄得越完美越好,但是在精力有限時,最重要的是抓緊目標和驗收條件,適度的放掉其他的堅持,好管理自己的精力,只用在刀口上。在最重要的事上不要進行多工。
而所謂 "OHIO" 原則,是 “only handle it once” 的簡寫,也就是每一個事件只處理一次。對所有的訊息和郵件,試著立刻做歸類的決策。(我自己個人的方法是3個 "D" ,“Delete" 不重要所以刪除,“Defer/Delegate" 立刻轉給需要接手的人, “Do something" 回應或取行動)。概念就是不要讓自己同一個郵件上花兩到三次重複的時間,免得自己的訊息或是郵件開始塞車了 (回到不要糾結完美主義地點)
另外一個很有趣的觀點是思考如何讓自己有3強的能力,他舉例像是一個表演者,能歌能舞能演,就有很高的不可取代性。而在職場他提出的三強是 Reading,Writing,Meeting,我把它廣義的理解為:
- 收集和吸收資訊的能力
- 創作和表達的能力 (開發客戶,產品設計,和寫程式等等都算是創作)
- 與他人協作和組織群體的能力
本書用很多的篇幅給予使用的小技巧,包括上面3種能力有哪些APP工具可以協助,如何整理自己的工作環境還有創造儀式感,甚至還教你如何說服老闆可以少一些視訊會議! 與其說是時間管理,我覺得“精力管理”是一個更精準的表達方式,所以飲食運動休息必須堅持規律,讓自己保持好的精力,也要了解哪些事情讓你充電,哪些事情使你耗竭 (不見得不喜歡,只是很花腦力),有效的跟優先順序和工作時間搭配 (每個人一天當中最有精神的時間不同)。作為自己 “遠距有限公司” 的執行長,最重要的就是有效分配資源啊!
最後我想分享的,是書中有提到在第一個月的時候將近一半的人都感到身心疲乏,畢竟一開始得適應需要點時間,而且遠距工作如果只是把在辦公室的事情,原封不動搬到家,其實會忽略了很多在辦公室不需要花力氣處理的事情 (即時視訊開會,大腦要花的力氣也比面對面要多),所以不要太沮喪,給自己一點重新調整的時間,甚至可以藉著這個機會重新思考自己的個人定位和人生目標。
20多年前的網路興起,在短短幾年之內經歷快速起飛和快速泡沫化。但真正網路的影響力其實從那之後的20年都一直在發酵著。所以我們如果思考虛實混搭的工作場景會是一個長遠的效應,那麼也就不要完全糾結在短期的應付,或是要求自己立刻轉變。而是好好的盤點自己的職涯優勢,思考自己的人生優先順序是什麼,然後用紀律和耐性來幫助自己轉型。個人亦然,經理人亦然,企業亦然。同時也可以好好思考,當大家真的可以身處在同一個空間的時候,是否可以發揮創意讓面對面的時間,變得更加難以取代,更加令人期待?
📚延伸閱讀📚
Upheaval “動盪” (轉型的12步驟,千萬不要全盤推翻自己!)
"The Art of Gathering" 聚集的藝術 (如何讓面對面的時刻,有難以取代的魔力?)
全文與延伸閱讀的連結在部落格中👇👇👇
https://dushuyizhi.net/remote-inc-%e9%81%a0%e8%b7%9d%e6%9c%89%e9%99%90%e5%85%ac%e5%8f%b8/
#RemoteINC #遠距辦公