【從學員練習影片觀察到一個關於 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影片,追蹤數超過1,470的網紅蕭美琴立委辦公室,也在其Youtube影片中提到,口頭質詢─ ▶6/5在富里、玉里間發生出軌,部長說一個星期內提出檢討報告,但是至今我們還沒有看到完整資訊,反而是臺鐵的網站上提了獎勵名單。本席認為獎勵一定要和檢討並行,沒有完整的檢討完全歸咎於天候狀況,讓人沒有辦法接受。 ▶部長甫上任時說要重新檢視臺鐵提出新的一千多億元以上購車計畫,預計新購1,30...
外部成本外部效益 在 SAP Taiwan Facebook 的最佳解答
揭開中小企業的管理策略難題!怎麼做才能提升公司價值?牛津院評論文章這樣說: https://saptaiwan.pse.is/3jq23j
中小企業的優勢在於組織高度彈性、緊密的客戶、員工關係,但面對大環境衝擊,更高的財務風險、更艱困的人才留任與稍縱即逝的創新良機,都是亟需解決的問題。
一個人也許走得快,但一群人卻能走得更遠!
牛津經濟研究院文章指出,若能實現互連管理,也就是「建立跨部門、跨企業的協作連結」,並著重與外部夥伴間的合作關係及資料分析的流程最佳化,即可用少量的溝通,降低企業整體成本、提升客戶和員工體驗。
產業互連的效益還有哪些?點入連結看更多:
https://saptaiwan.pse.is/3jq23j
一起迎接未來的景氣復甦期,培養企業長期競爭力!
外部成本外部效益 在 賴士葆 Facebook 的最佳貼文
蔡英文指示以去年三倍券的成功經驗為基礎,與蘇貞昌會面拍板定案五倍券的發行。日前吹噓上千億的經濟效益已經被審計部打臉,也被學者專家和研究機構打臉,不知道這所謂的成功經驗是建立在什麼立論根基上面?
行政院說內部民調有超過6成民眾支持五倍券,不知道什麼叫做內部民調,是自家人找自家人做的民調嗎?還是大內宣用的民調?官員不能只關在冷氣房內憑自家人做的民調來做決策,不要掩耳不聽、掩面不看外部反映真實民意的民調吧:
1.《TVBS新聞網》所做的網路民調有93%民眾希望政府發現金。2.《Yahoo》最新民調顯示82.4%網友希望直接發現金不要振興券。3. 《蘋果》民調顯示82.3%希望政府發現金紓困。4.國民黨民調顯示66.1%的民眾支持普發現金。
貴人多忘事,2008年蔡英文說消費券成本高,像煙火式政策,看不出促進就業與產業的直接關聯。蘇貞昌說:「馬政府用子孫的錢發消費券,完全執政,完全失敗。」還有賴清德、鄭文燦、潘孟安及諸多綠委都是抨擊消費券不遺餘力、支持要發現金。顯然,昨是今非的雙重標準對蔡政府已經變成常態,次數多到麻痺,良心就不會被譴責了。
五倍券說最快9月中以後開始使用,說可以繳交學雜費,官員的確真的貴人多忘事,學校9月1日就開學了,要用五倍券繳學費,可以欠繳嗎?
外部成本外部效益 在 蕭美琴立委辦公室 Youtube 的最佳貼文
口頭質詢─
▶6/5在富里、玉里間發生出軌,部長說一個星期內提出檢討報告,但是至今我們還沒有看到完整資訊,反而是臺鐵的網站上提了獎勵名單。本席認為獎勵一定要和檢討並行,沒有完整的檢討完全歸咎於天候狀況,讓人沒有辦法接受。
▶部長甫上任時說要重新檢視臺鐵提出新的一千多億元以上購車計畫,預計新購1,300輛以上的新車,目前有無新的進展?東部一直迫切期待的加長的12節車廂的預定的時程?
部長:支線的規格特別且急需,需做規格上、生產上確定的小量採購,因支線大部分沒有電氣化,但是到了主線又要進入電氣的使用範圍,所以它是燒油的,但是規格、性能就跟主線上大量採購的不太一樣,所以這部分的採購要多花一點時間來討論。大前天已經截止收件,其他的會按照歷次交委會決定規格、數量及廠商資格等方面進行嚴謹性的審查。
鹿潔身副局長:60輛支線使用的環保柴聯車,有兩家投標,會針對這兩家的投標文件進行資格和技術方面的審查,按照政府採購法採用異質採購的審標方式進行,並沒有訂特定的期限;另600輛的城際列車目前正在進行規範的最後審核工作,我們也希望找一些外部的專家來幫忙提供一些意見。經過審慎地審視後,按照政府採購法的程序進行公告。
▶過去國內使用的車種很多,司機的訓練也不太一樣,當初進普悠瑪和太魯閣號列車時,需針對這兩個列車特殊性能再做特定司機的訓練,導致駕駛司機的流動率無法提升,有時在人力不足或連假期間需要加班或增加運能時,還有招考人數的限制。而最近參與臺鐵相關國家考試的人數減少,如果車種過多,也會衍生後續軟體及配套的問題。所以,應在這次整體採購需求的設計中,納入駕駛車輛以及他們彼此之間互換不同線上使用的狀況、互通的需求,讓我們的資產有更多元的使用方式。
副局長:司機員採用證照制,按照不同的車型採用不同的證照。最近幾年一直朝車種簡化,車型單一化。另外運能的部分,路的部分有些長期的規劃,車的部分也希望按照能夠編掛的最大編組數,朝12輛一個列車的編組方向進行。
▶採購新列車的過程中,應善用舊有的車種和人力,同時考量臺鐵營運負債的狀況,思考舊車的翻新的可能性?甚至像古董車的翻新,一樣有其市場價值,翻新恢復它數十年、百年前的高檔列車的型態,可以帶來觀光價值。畢竟我們現有的人力熟悉的就是這些舊型態的車,這些車子本身的renovation和能否延長使用年限、相關經濟價值是否有做精算?未來採購計畫是否要全數用於新車的採購?或者一部分拿來作為舊車的翻新和延長使用年限?整體來講,經濟價值是否會更好?
副局長:舊車改造大概有兩個方向,第一,目前客運上還在使用的兩個主力車輛,例如PP推拉式自強號和500型區間車,在未來六年行車改善計畫裡面已經有編預算做動力改造,因為動力改造之後有一些資本的投入,所以會計上會要求我們延長使用年限。按照成本來看,新車一定比較貴,舊車雖然做了動力改造可以延長使用年限,惟服務的品質還是會遜於新車,而且還是有年限的問題,當然,安全上都沒有問題。另外,目前淘汰下來的莒光號客車,如果車況、安全還是許可,臺鐵也準備撥出一部分車輛來打造主題式的客車車廂來發展鐵路觀光旅遊。改造的部分在已經核定的六年行車改善計畫裡面已有編列預算。未來改造計畫和採購計畫採同步進行,下個年度預算裡面會分開編列。
▶舊的蒸氣火車有特殊觀光價值,目前我們還是有一些蒸汽火車偶爾臺鐵會拿出來用,非常受民眾歡迎,甚至有遠自英國的旅行社也在詢問這些蒸汽火車什麼時候會上路、是不是可以租用讓國外鐵道迷來使用。整體如果有一些特殊的觀光旅遊,例如與鐵道迷專屬的旅遊行程結合,是否有計算過相關的價值?是不是可以把這些舊的蒸氣火車局部性的使用?我們怎麼從它的票價和營運常態化來提升整體周邊的效益,以及住宿和其他旅遊行程,是不是能夠有配套規劃? 請提供有關舊的蒸氣火車的復駛、相關的成本、現在的票務售票狀況、使用的計畫等書面資訊。
部長:新車採購在規格和期程上面都要擴充能量和效益。關於舊車再利用部分,等於在創造臺鐵的特色,同時開發品牌,善用舊的司機、舊的車輛型態來喚起一些特定地點和地方觀光結合。最近松山臺北機廠跟文化部合作,過去隨著技術已經不再適用、維護的空間,透過妥善利用,除了在文化上面是資產之外,更彰顯臺鐵在服務上多元化的經營。
▶華航有一些增班的規劃,這些規劃都是在兩岸、歐洲、東北亞、紐澳等航線的增班直飛,但是現在新政府的新南向政策會特別針對印度及東南亞強化雙邊關係,這樣一個整體國家政策並沒有呈現在華航對未來航線的增加及開發上,這個落差到底要怎麼改善?也請交通部民航局及華航提供書面答復。

外部成本外部效益 在 memehongkong Youtube 的最佳解答
第二,昨晚我講了高斯死了,和我解釋了高斯定理。我今日看到林行止寫了那篇文,是令我非常驚。我讀一段給大家聽下。
「高斯定理」(Coase Theorem)所以被法學家和經濟學家奉為金科玉律,視為突破性貢獻,主要在為追求最大效益的法律制度提供了理論基礎。比如,在考慮政府是否應以行政手段干預市場時,若運用「高斯定理」為分析工具,就不致作出違反經濟規律的決策。
之後還有長一點的解釋,如果從高斯定理可以勉強推到林行止所講的這個結論,但這不是高斯定理的主要理論。大家可以參考一下我昨晚所講解的高斯定理,和看看林行止這一段,一同比較研究一下高斯定理。
高斯定理主要講外部factors是因為產權不明確。只要產權明確了,無論產權誰屬,到最後都會得到同一個結論。好像是產權屬於養牛那個人,他有權去食小麥或者小麥的人有權不給人吃他的小麥,之後大家會開始談判,到最後都會到最著數的均衡點。牛食小麥食到一點,產生最大的經濟效應。
而這不是講林行止所講的東西。因為高斯定律是假設交易成本並不存在。而這些法律制度就是交易成本的一部分。但大家可以看看,再自己比較一下吧。
謎米香港 memehk.com
