【從學員練習影片觀察到一個關於 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 也不該是目標,目標永遠都是在實務上產生價值、解決問題、滿足需求。
同時也有2部Youtube影片,追蹤數超過15萬的網紅原始點YuanShiDian,也在其Youtube影片中提到,更多原始點資訊請至張釗漢原始點醫療基金會官方網站: http://cch-foundation.org...
「原始點腰痛」的推薦目錄:
- 關於原始點腰痛 在 91 敏捷開發之路 Facebook 的最讚貼文
- 關於原始點腰痛 在 健身教官-應充明Jimmy Facebook 的最讚貼文
- 關於原始點腰痛 在 張釗漢原始點醫療基金會 Facebook 的最佳解答
- 關於原始點腰痛 在 原始點YuanShiDian Youtube 的最佳貼文
- 關於原始點腰痛 在 原始點YuanShiDian Youtube 的最佳解答
- 關於原始點腰痛 在 原始點案例:陳年腰痛- YouTube 的評價
- 關於原始點腰痛 在 長期的腰痛及坐骨痛終於獲得舒緩! - YouTube 的評價
- 關於原始點腰痛 在 椎間盤突出原來和腰傷有關! - YouTube 的評價
- 關於原始點腰痛 在 多年腰痛膝蓋痛案例 - YouTube 的評價
- 關於原始點腰痛 在 原始點電熱溫敷用品- 一個動作治好腰痛! 連名醫都 ... - Facebook 的評價
原始點腰痛 在 健身教官-應充明Jimmy Facebook 的最讚貼文
《先問為什麼?》
你走在一個歐洲小鎮的郊區, 前面看到了一個正在施工的工地, 看到了一位正在建築教堂的石匠. 你走過去問他: 師傅, 您熱愛您的工作嗎? 石匠回答: 我已經記不得砌這道牆砌了多久了… 我只知道我日復一日的頂著大太陽在這裡做工, 我的腰痛得腰死, 我甚至不知道在有生之年看不看得到這間教堂完工.. 但至少這還是一份糊口的工作, 可以讓我一家溫飽.. 你謝過他, 繼續往前走. 沒走幾步, 又看到一位石匠在工作, 於是你又走近問他: 師傅, 您熱愛您的工作嗎? 石匠回答: 我當然熱愛自己的工作啊, 我正在建造一座偉大的教堂啊! 雖然我也記不得我倒底工作了多久, 每天一直這樣砌牆, 讓我每天腰都痛得要死… 我甚至不知道我有生之年看不看得到這座教堂完工, 但最重要的是.. 我是在建造一座偉大的教堂耶!
同樣的工作, 但是對於這兩位石匠師傅的意義完全不一樣! 這就是他們是否擁有”為什麼”?
這一本書其實應該是要先看, 才讀第二本”找到你的為什麼” . 但是我的順序是反過來閱讀. 不過無損對於”黃金圈” 理論的理解, 反而讓我有了更深一個層次的認識
作者Simon Sinek在年輕時創立了一間投資顧問公司, 當時的他意氣風發, 集合了一對志同道合的好夥伴一起創業. 在公司營運的頭三年, 業績蒸蒸日上, 每一年都可以找到新的客戶與他們合作, 每一個人的鈔票都賺得可以把口袋鼓到爆! 但是, 突然有一天他開始產生了深深的焦慮… 他清楚知道公司現在之所以看似鵬程萬里的原因是所有的成員都很年輕, 充滿激情, 而且體力旺盛. 絕大多數的業績都是靠他們的三寸不爛之舌以及與客戶死纏爛打得到的… 但是, 這樣還以持續多久? 他明白其實他是沒有理想的, 目標就只是賺錢… 等到有一天原來的方法行不通時, 公司很有可能就在短時間垮台!
因此他開始逃避與人接觸, 開始拒絕面對人群. 一段時間後, 他覺得不能繼續這樣下去. 他開始參加了各式各樣的心理與領導力課程, 但是一直沒有找到他想要的答案.. 一直到一次的課程中, 他聽到了關於人類大腦構造與功能的介紹, 竟然發現這與他在大學時想出來的”黃金圈” 理論不謀而合! 因此他恍然大悟, 再將自己的理論加以擴展, 不但幫助自己從低潮中走了出來, 更積極的開始與人分享這個概念. 因為, 他回憶當初之所以成立投顧公司的原因是為了幫助他人, 他喜歡看到客戶成功以後的喜悅笑容, 這才是他的”為什麼”! 但是正如絕大多數一般人一樣在職場打滾久了, 或是少年得志以後, 反而遺忘了自己當初的初心
黃金圈裡面的最內層是”為什麼”, 就是我們做任何事的理由, 它是我們內心對於自身情感最渴望的聲音. 中層是”怎麼做”, 是我們透過哪一些選擇來我們的理想, 而最外層是 “做什麼”, 意指我們是靠什麼手段來實踐我們的”為什麼”?
想想, 你走進一間3C商場, 在樓面上的各家店員看到你, 就湊過來告訴你: 我們這一家的電腦顯示器有多漂亮, 運算效能有多快, 內存容量有多大, 外型設計有多精美, 價格有多優惠… 你看到他們電視牆上面的廣告也都是在重遇同樣的訊息.. 你都會怎麼回他們? “好的, 我再看一看吧”.. 可是你一轉角進了另一間店家, 店員不疾不徐先讓你看一下他們的宣傳廣告影片: 我們的精神在於挑戰傳統, 而且我們相信”不同凡響”的力量. 而我們的使用的方式, 就是讓我們的產品擁有最精美的設計, 而且簡單好用! 我們是蘋果, 提供給你最好的電腦. 我相信即便是你都還沒了解他們電腦的相關規格是什麼之前, 就已經被打動一半了! 蘋果電腦怎麼會有這種魔力呢?
因為他們先告訴你他們的”為什麼” : 我們的願景, 理想與信念, 而別的公司卻是先告訴你他們的”做什麼” : 他們的產品, 服務與價格…
首先, 在商場上所有銷售手段為了證明自己與眾不同, 會不斷的大量強調他們的特色, 也就是”做什麼” : 我們的車有最佳油耗, 我們的手機有最強的照相功能, 我們的餐廳有最新鮮的食材, 我們的健身房有最專業的教練與設備… 聽起來很熟悉對不? 越是企圖強調自己的不同, 反而越是與人相似! 因為我們總是習慣由黃金圈的外部望內溝通, 而且頂多到”如何做” 就沒有了. 但是反而遺忘了最重要的”中心價值”
黃金圈完美的與人腦的構造與功能相互匹配. 人類大腦的緣腦, 是較為原始與古老的部分, 負責情感, 反應, 生存與決策. 而新皮質 (新皮層) 是最後發展出來的”智人腦” , 負責理性思考, 分析, 以及語言. 緣腦對應到黃金圈的”為什麼”與”怎麼做” , 而新皮質則對應到”做什麼”. 我們的情感運作都是圍繞在緣腦 (有著”邊緣系統”而取名), 所以很多的時候, 我們會有 ”我說不上來, 但總覺得不對…” , 或是 ”感覺對了, 什麼都對了!”由於緣腦不具語言功能, 因此是以情感與直覺為主導, 而新皮質 (特別是前額葉), 則會幫助我們經情感尋找倒適切的言語加以表達
簡單的來說, 由黃金全由內而外的溝通方式, 可以以真實的情感為起點, 但是假如我們是以外向內, 就會喪失了溫度..
作者又提到了一個”創新的擴散法則”. 我們可以將一般人的行為概分成五大類, 而這些人的比例也形成了一個鐘形曲線: 有2.5%是屬於創新者, 這種人就是會徹夜排隊, 只為了成為這世界上第一批買到新iphone, 或是playstation的狂熱份子, 接下來是早期採用者, 占13.5%. 他們也許不像創新者一樣那麼積極, 但是對於特定品牌與行為也是擁抱一樣的熱情, 有著想要搶先體驗的心態. 這兩種人都是以情感驅動, “跟著感覺走”. 一個品牌的腦殘粉, 就來自於這15.5%的人群, 而這一群人, 則會往後影響後面的34%早期大多數. 在後面的34%後期大多數則比較處於觀望狀態, 他們會先看看試用者的反饋再做決定, 因此忠誠度算是最低的, 所以早期大多數的體驗, 會連帶改變後期大多數的行為. 而最後面16%的落後者則是守舊派, 最討厭變動
所以Simon擔任企業的顧問時, 常常會問他們的高層: 你們公司的腦殘支持者佔所有客戶的幾%? 大多數的公司都會很驕傲地回答: 10%! 這根本不夠, 這個覆蓋率還不及創新者加上早期使用者的15.5%, 也就是剩下有90%客戶是很浮動的, 只要競爭對手給他們更好的優惠, 更多的服務, 他們就會見風轉舵了. 而要贏得這近16%的人群, 要與他們的”心” 溝通, 就是由”為什麼” 出發
假如我們對於自己的工作缺乏 ”為什麼” 的感知, 自身就會感到焦慮或是厭倦, 進而也無法讓服務的客戶產生積極的體驗
但是我覺得Simon在書的後半段提的一點非常好, 有了強大的”為什麼”, 你必須要找到一位了解你的人幫助你執行信念, 不然理想家非常容易因為看不清現實而失敗. 因此有一位志同道合的軍師是非常重要的, 他有能力將想法轉化為現實, 而且可以維持一致性, 不會有偏離航道的可能
使用你的”為什麼” 來感動自己, 打動客戶吧!
People don’t buy what you do, they buy why you do it!
原始點腰痛 在 張釗漢原始點醫療基金會 Facebook 的最佳解答
官網發布最新案例~
多年腰痛膝蓋痛案例
http://www.cch-foundationusa.org/html/custom/2021-8-13/1115.html
官方Youtube連結:
https://www.youtube.com/watch?v=oMxb0zBPJY8
原始點腰痛 在 椎間盤突出原來和腰傷有關! - YouTube 的推薦與評價
更多原始點資訊請至張釗漢原始點醫療基金會官方 ... 腰酸要看,腰痛要看,腰间盘突出更要看,只需五分钟教你快速缓解腰部不适. 中华美食栏目官方频道. ... <看更多>
原始點腰痛 在 原始點案例:陳年腰痛- YouTube 的推薦與評價
... <看更多>