【從學員練習影片觀察到一個關於 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影片,追蹤數超過2萬的網紅輕易豐盛學苑 Jamie 賺錢小宇宙,也在其Youtube影片中提到,●了解自己天賦特質,幫自己加薪上萬元! ‣ https://lihi1.com/ou2i3 ●超強理財攻略小資理財 :https://reurl.cc/8lKQDb #描述欄有免費有錢人的理財表 #窮與富 #有錢人跟你想的不一樣 8分鐘學苑主動收入一次大公開 幫自己加薪 賺這麼多的秘密!學員收入...
浮子式流量計 在 Facebook 的最佳解答
周末東北風吹吹,不夠久又不夠強
浪小風大要挑點,東北部可能帶雨
但重點是,你的特休假,夠嗎?
周末各地浪況不佳,回到冬季看風向臉色的情況,上班族孝順浪加減玩,逐浪人建議裝備整理很值得,如果可以積點…此時不做更待何時?
本周末
北海岸吹風飄雨,磺港水尾浪小
秋蟹季節要注意車流量大
宜蘭週六蜜月首選,雙獅北堤周日穩些
冬季浪點不夠大有尷尬至少不塞車
花東季節來臨皆適合
恆春周末佳樂水風大,早或傍晚
西岸普遍浪小陸風,不用期待
以上關鍵字 #加減玩&#狂積點
以下開始才是重點
颱風16號蒲公英是環流大系統,走向往日本、速度不快,不斷在西太平洋上打轉,風吹帶浪影響環太平洋各地,由於距離夠遠、週期夠長,台灣東岸預計整整一周漂亮海浪,這狀況用說的可能無感,舉兩個例子:
夏威夷北岸/澳洲黃金海岸
皆受南北極大範圍風暴遠距離吹拂形成美麗海浪,下周台灣就是這情況。由於周期很長能量集中,看起來平平,時間到會有怪物,稱為長浪或瘋狗浪,海浪的實際尺寸會比預報來的更大!北海岸,東海岸或東部離島
#不適合遊客與初階衝浪者
#不適合浮淺或潛水活動
長浪水下能見度不佳,帶來的海流會更強,影響範圍與時間由南往北,恆春台東周一開始,花蓮宜蘭晚一些,北海岸要到下周三後,當颱風再往北就會幅合東北風,屆時全部都GG
#請把握機會
有假肚子痛不會被笑
在冬季正式來臨前
這應該是 #2021颱風的最後一舞
周末在家推薦
NETFLIX的韓劇-#魷魚遊戲
AMAZON的 #Under_an_Artic_Sky
冰島探險衝浪紀錄片
這部太威,必看經典
祝大家週末愉快、肚子痛好痛滿
娘娘浪平安開心、歡送最後一舞
封面照拍攝由 islandsurfilm
浮子式流量計 在 股魚-不看盤投資 Facebook 的精選貼文
9.9(四) PM 8:00 線上教學 墜天使-惡魔表象,天使的投資機會
🔥🔥🔥 https://bit.ly/3tkvDaU
.
債券在整體投資內屬於守門員的角色,保護投資人一輩子辛苦累積的資產並提供高於銀行的殖利率表現。像是國外風行的FIRE(Financial Independence, Retire Early,財務獨立、提早退休)活動,其核心的指標就是創造出4%現金流量覆蓋生活所需的金額且可以持續一輩子。
.
以4%來講,若步入退休階段的準備。計算出個人每月至少需要支出2萬為例。一年要準備24萬,以4%殖利率推算需要準備600萬的本金投入到投資市場中,殖利率不同需要準備的數字就會有所不同:
.
以相同的每年至少24萬為例,找到2%、4%、6%殖利率需要的本金差異如下:
2%:1200萬
4%:600萬
6%:400萬
.
而怎麼找到穩定優質的配息產品就是重要議題。在專案建議採用A級債券ETF的方式來達成,主要是著眼於債息的穩定性。面對退休階段,你不會想看到配息數字浮動過大或是總資產部位隨著股市大幅變化,而債券ETF有免稅與債息穩定的特性,最適合追求退休穩定的投資人來運用,當然分紅型儲蓄險也是可以的只是本金就需要多準備一點。
.
但在目前市場中A級~BBB投資級債券的殖利率約在3.2~3.6%之間,在尚未升息的狀況下這個數字也不會有太大的變動。那退而求其次的就要往高收益債來找,但高收益債的波動率跟股票差不多,那還有其他更好的選擇嗎?有的那就是墜天使債券ETF,他有投資級債券的評級卻有高收益債券級的殖利率。
.
這個商品對許多人來講都是陌生的,甚至是第一次聽到。老師秉持投資前必須對商品有所了解的原則下,來幫各位介紹這樣的特殊商品,讓各位在面對投資項目時能有多一個選擇機會。
浮子式流量計 在 輕易豐盛學苑 Jamie 賺錢小宇宙 Youtube 的精選貼文
●了解自己天賦特質,幫自己加薪上萬元! ‣ https://lihi1.com/ou2i3
●超強理財攻略小資理財 :https://reurl.cc/8lKQDb
#描述欄有免費有錢人的理財表 #窮與富 #有錢人跟你想的不一樣
8分鐘學苑主動收入一次大公開 幫自己加薪
賺這麼多的秘密!學員收入清單大公開
看著學苑越來越精彩,讓身為老闆的我,
任何鬼點子都可以逐一實現!
不僅課程越來越多元,也有更多團體活動讓大家相互交流學習。
賺錢的好時機 #你跟不跟
2020年是一個特別的轉折點!
由於疫情擴散讓許多商機正式浮出水面,
賺錢管道也變的門檻較低,更容易上手!
今天我就一次公開我們學員賺錢的秘密!
幫自己加薪‣https://youtu.be/nwBZRKT9SxQ
我真心的希望大家跟我一起搭上這班財富列車,
讓自己增加主動收入,為理財路上鋪條美美的紅地毯!
賺錢乘車處 ‣ https://lihi1.com/ou2i3
0:00 影片開始
1:09 增加主動收入的重要
1:50 主動收入1:自媒體-文
2:30 主動收入1:自媒體-武
3:17 主動收入2:業務班
4:42 主動收入2:業務班-文(聯盟行銷)
5:07 主動收入2:業務班-武(保險、組織行銷、蝦皮、微商)
6:03 主動收入3:辦創業(亞馬遜、二房東、能量財富流教練)
@輕易豐盛學苑
影片剪輯:鄭宇涵
●了解自己天賦,幫自己加薪上萬元! ‣ https://lihi1.com/ou2i3
●超強理財投資攻略#小資理財 :https://reurl.cc/8lKQDb
●免費領取🆓有錢人獨家理財表🔮https://reurl.cc/keyQr
// Jamie給你正能量💪 //
IG ‣ https://reurl.cc/0K1ax
FB ‣https://reurl.cc/VLoWR
YouTube ‣http://bit.ly/2WWUv7A
⬇️變有錢秘密在這裡⬇️
‣ 啟動天賦三步驟:https://lihi1.com/ou2i3
‣ 輕易豐盛粉絲團:http://bit.ly/richjamie
‣合作邀約:choujamie33@gmail.com
更多推薦影片:
📍#關於天賦
💡必看!財富翻倍找到自己的財富流:https://youtu.be/l_PXoJdY09Y
💡為什麼你一定要了解天賦?:https://youtu.be/ptIS97NGdpk
💡 #順流致富 GPS:https://youtu.be/19iIYB9xbQY
📍#理財達人秀
🔹獨家知識型YouTuber 好葉Better Leaf 專訪:https://youtu.be/llx4KvcLnwI
🔹打造富腦袋!從零累積被動收入Ms.Selena專訪:https://youtu.be/MeeSmrWg35U
🔹2020房地產投資?李同榮老師房產趨勢分析:https://youtu.be/UzztESwbr60
🔹共居美好房東生活-時尚包租婆Gina姊姊:https://youtu.be/1cbFb6Jvepc
🔹投資基金搞懂投資3個基本觀念賤芭樂老師:https://youtu.be/RuVZ1W_c9hs
🔹假如我有五千萬,自己的投資會有什麼不同? feat. 市場先生:https://youtu.be/dXE3Y0F9dAM
🔹流量變現金-自媒體的獲利模式 佐邊茶水間 Zoey:https://youtu.be/OuUPhqidNtI
📍#財富能量
⭐如果你想多了解心想事成的秘密:https://youtu.be/GAFUB_kaRuM
⭐面對憂鬱與躁鬱的情緒失衡:https://youtu.be/IwU-8Hobq2g
⭐我中了一台賓士...財富能量7大關鍵:https://youtu.be/GAFUB_kaRuM
📍#被動收入
💎斜槓人生主動收入系列:https://youtu.be/UwkqUfEGVtk
💎你愛的被動收入系列:https://youtu.be/V7yQk61DPBg
📍#投資理財
▪如何從0存款到!5步驟小資財富大翻身:https://youtu.be/4OUvOCrHmIA
▪打造巴菲特複利王國:https://youtu.be/uiv4-QoZjS0
▪信用卡推薦-現金回饋:https://youtu.be/C9tpl0B4W5E
▪沒有錢怎麼理財:https://youtu.be/F1LwoGTIOEk
▪晉升小資的五個聰明花錢方法:https://youtu.be/u_2Ps16oKRk
▪用一張紙看完人生 瞬間秒懂時間的威力:https://youtu.be/Rjk4NsDb-_M
📍#電影影評
🔸寄生上流#寄生上流 3大人性弱點:https://youtu.be/x9mQt3AiR2E
🔸阿拉丁面對金錢誘惑7招扭轉人性弱點:https://youtu.be/vkWbGpLD9Pg
📍#輕易豐盛 #見證
📌8年級年收百萬的秘密 掌握時機高獲利出場 :https://youtu.be/GehxE7cRRTA
📌透過夫妻理財找到財富順流:https://youtu.be/5suWRqD7Bwo
📌資源整合擁有4個主動收入+自助洗事業:https://youtu.be/Ok8eyIMDqu4
#理財 #理財達人 #理財規劃 #小資理財 #小資族投資 #小資存錢法 #小資 #小資女 #天賦
#免費 #翻倍 #財富 #迷路 #創富計畫 #2020 #理財 #秘密 #致富 #商機 #新年快樂 #禮物 #創造財富計畫 #財富翻倍 #改變 #改變人生 #商機分享 #人生致富 #致富人生
