【從學員練習影片觀察到一個關於 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 也不該是目標,目標永遠都是在實務上產生價值、解決問題、滿足需求。
跳躍形容詞 在 文茜的世界周報 Sisy's World News Facebook 的最佳貼文
《梅克爾的童話故事》—文茜説世紀典範人物之二
她成長於童話般的森林小鎮。
那裡距離柏林開車約一個半小時,有著湖、運河、古老建築、綿延翠綠的森林與遼闊無邊的天空。
所有童話故事必備的佈景,都在她的故鄉。人們以為成長於德東地區的人,必然是孤寂拘謹或者不安的;但梅克爾回憶她的森林莊園成長史,「沒有陰影」。
柏林圍牆於一九六一年八月十三日築起,當時梅克爾才七歲;但梅克爾並未感覺自己的世界被分割。
她總是坐在學校廁所的馬桶上,偷聽收音機報導西德內閣誰當選誰上台的消息;在森林莊的家中,她們一家收看西德的一切,自小梅克爾即對西德歷任總理的名字倒背如流。童話故事的故鄉,使這個女孩習慣「慢慢且安靜的生活」,並「與生命和平相處」。
梅克爾成為「主導歐洲」的女人之後,人們急著尋求她「領導魅力」的答案。
自二〇〇五年出任總理至今,她度過了金融海嘯、歐債危機;當經濟崩潰沖倒世界多數執政黨時,梅克爾在上屆選舉時仍繼續高票連任,毫無對手。她成功的秘訣是什麼?
她看起來如此猶豫,如此盤算,一旦出手卻堅定立場,不因外界聲浪而動怒或動搖;她的人物圖像一向讓外界抓不住,說不準。
梅克爾和所有廿世紀我們熟悉的政治巨人如此不同,話語平淡,不以「勇者」自居,卻往往創造驚奇.... 她的政治有另一種想像,一種淡淡的香味,至今成謎。
她太不像傳統政治人物。
有的時候,我很想把丘吉爾從天上抓下來和梅克爾對話; 前者充滿熱情、勇氣、文采、智慧、滔滔不絕。丘吉爾留下了太多名言,而執政至今已經十六年的梅克爾,人們幾乎無法從她長達十六年的公開談話中摘錄一句,啟蒙人生。
二〇一四年,梅克爾代表歐洲巨人的角色在中國清華大學演講,學子們對她充滿期盼。一個德東出身的人物、物理學家,女性;跨越了層層圍牆,統治著世界文明的搖籃: 「歐洲」。 尤其那些穿著體面的歐洲貴族們,例如薩科奇、卡麥隆,無論衣著品味多麼「優雅」,在梅克爾媽媽有點肥胖臃腫的身軀前,都像一群毛毛躁躁的「足球男孩」。
清華大學的年輕人忍不住崇拜,等待著,等著她開口。結果除了德語發音的隔閡之外,她全無抑揚頓挫的口音,平淡的內容, 「可持續發展」「二〇一五議程」.... 提了二十多回,最終學子在梅媽媽平靜的演說中,一一沈入「搖籃曲」,一場「不可持續的昏迷」,半數學生半數時間睡著了。
或許在一個快速且庸俗的媒體年代,這樣的政治人物,才能生存。
你找不到一個標題,可以斷章取義她的話語。
她極少表態,語焉不詳;商業又醜陋的現代媒體文化,在她身上真榨不出太多好處。
於是研究梅克爾的書籍撰寫她的內容總是有若墜入迷宮,除了「猶豫、搖擺、小碎步」等形容詞之外,人們大概只能以討論她和普丁見面時「不喜歡他的狗」來吸引讀者的眼球。
翻閲梅克爾的成長過程,我注意到這個女孩自小「正向」的特質。即使在東德禁錮的年代,她也不覺得自己少了什麼。
是的,世界有一道圍牆擋住了前往柏林、巴黎、西方的路;但世界這麼大,另外半個地球已足夠一個森林莊長大的女孩探險。
當蘇聯控制德東,甚至派軍駐防她的故鄉時,梅克爾在這個蘇聯境外最大基地感受的不是「母親的心臟被入侵者插了一根刀柄」,她利用機會與穿著制服的駐防士兵練習俄語;而且感覺頗有「異國情調」。
梅克爾的俄語無懈可擊,這不只使她當上總理和普丁談話流暢無比(包括表達不喜歡普丁的狗),也使梅克爾獲得了「俄文最佳學生」的獎賞;小小年紀她被送到東德各地旅行,尤其「前進莫斯科」。
在莫斯科,她買了第一張披頭四的唱片;十年級左右,和朋友背著背包於中歐四處火車旅行。
才十五歲,她已去過布拉格、布達佩斯、保加利亞、以及黑海之濱巴圖米(Batumi)的海水浴場。即使對西方有所渴望,小梅克爾告訴自己:「倫敦大概和布達佩斯很相似吧!」
對於東德的威權控制,高中快畢業的梅克爾,有了第一次田園態度外的「放肆」,她找了一堆同學共同演一齣戲: 「莫三比克自由運動」,內容反抗外來葡萄牙佔領者(諷蘇聯),而且故意以「英文」高唱國際歌,接著朗誦詩句:人應該追求自己,「否則只是一條坐在圍牆(柏林圍牆)上的哈巴狗。」
她有技巧地「打著紅旗反紅旗」,但態度搞笑。這是小梅克爾政治上第一次的「表態」,方法:在政治敏感邊緣擦槍,但方式幽默。
她佯裝可愛,最終完成安全的叛逆任務。
閱讀梅克爾的一生仍然是有趣的,總可以在平凡中找到一點跳躍的煙火;好像在一望無盡的森林田園中,突然遇見了一匹色彩鮮豔的馬車。
例如她的本名叫Angela Kasner ;如今舉世聞名的Angela Merkel,梅克爾(Merkel)姓氏來自於她的第一次婚姻,丈夫烏里西·梅克爾(Ulieh Merkel)。
她很愛這個男人嗎?以致於第二次婚姻不改姓、一輩子也以「梅克爾」之名附身、名滿天下嗎?
事實答案是她第一次結婚時年僅廿三歲,烏里西是一位物理學家,倆人認識三年後結婚;結婚的理由非常務實,按照當地規定只有結婚才能分配住房。這一段婚姻四年後破裂,倆人形同陌路,Angela回憶她「幾乎在一夜之間,從倆人東柏林共有的房子搬出去」,留下震驚的烏里西。
這個看似「平穩」的女子,在處理個人婚姻事件時,可沒有許多人描述的「猶豫、搖擺、小碎步」。
她直接,她了當。而她離婚了卻不改姓,因為:許多資料需要重填,麻煩。
梅克爾這輩子最大的恩人是她的政治恩師柯爾,柯爾總理把她帶到了政治大位;但當柯爾後來陷入政治獻金醜聞時,向來「聽話」「安靜」「穩重」「小女孩」的梅克爾,居然向他發出了公開決裂信;並且以秘書長的身份從此一躍接任柯爾,當上基民黨黨主席。
這正是「梅氏」童話故事的特徵。
她看起來那麼乖巧,與俄羅斯士兵聊天,愉悅地學習俄語,遊歷莫斯科。但必要時,她會「咬人」。
她和東德許多開放的人有不同也相同,渴望西方價值,但很務實地多數時刻妥協於既有框架。
柏林圍牆倒塌前, 梅克爾惟一對西方的憧憬是:六十歲以後,盼到西方一遊;僅此而已。
但她的一生平凡中始終藏著特例,如一隻隱居於森林中的豹子,必要時跳起來捕捉獵物;平日則安於餵養,表現不強求,不掠奪。
而這正是她成功的方式。
這「平凡的例外」 ,使她的政治對手總是低估了她。
梅克爾把政治及人生看成如物理學般線性的過程,她常形容自己喜歡妥協勝於衝突,所以多數時刻沒有鮮明的個人色彩。
但總有例外,而且每次都是例外讓她得分。
例如處理敘利亞難民事件。
在此之前梅克爾的形象是不近人情的冷酷撙節女王;但當歐洲難民湧入時,她改變了過去德國二十世紀「屠殺者」的形象。德國正在崛起,過去的包袱從此卸下,她使用各種手段結盟,阻止德國種族主義另類選擇黨崛起,公開斥責他們無恥:然後,她留下一個新名片給廿一世紀的歐洲領導國:德國。
從此德國的代名詞是人道主義大國,在敘利亞危機時,德國共接納並安置了120萬難民。
這並非天真。
她深入思考德國國內穆斯林人口已佔4%,早有激進份子;於是她「例外」地放手一搏,決定開放近一百萬二十難民進入德國(佔約德國人口1%),他們可以合法接受教育,可以合法工作。
從此「梅克爾」及「德國」是人道主義的象徵,穆斯林的朋友,柏林總理辦公室中的梅克爾才是真正的現代「自由女神」。
她以物理線性的概念理解某些移民衝突仍會持續,但長期德國需要一個新的符號,一個溫暖的標籤;捨別一次大戰、二次大戰中侵略國的永久印記。
她更明白穆斯林激進主義形成的歷史背景,梅克爾相信遏阻激進極端主義的方法不是佔領、戰爭、或是空襲;而是在最關鍵時刻,對穆斯林表現出愛、同情與包容。
在國內,她聯合反對派,面對如此的困境。選後她慷慨地捐棄恩怨,與社會民主黨組成大聯合政府。
當她決定放手一搏,她看的是長遠的歷史。未來的德國,過去的德國。
地方選舉一輸,她先辭去黨主席,再表態不再尋求連任,化解當下排山倒百的壓力。
當她再次站到平凡的對面,「例外」那一邊.... 責罵她的聲音慢慢小了。
六年之後,難民不是危機,他們融入德國社會,提供人口紅利,補足工廠、服務業、基層勞動力不足。
她不戀棧權位,16年的總理生涯,她知道何時該總結?用什麼方法總結!
因此當2015年敍利亞難民危機導致德國民意分裂時,她不擔心政治後座力,她知道一旦勇於捨去權力,她會有足夠的線型時間與空間,證明接納廣大敘利亞等地難民,對德國是一件好事 。
六年過去了,梅克爾把歐洲及西方已疲倦但應接不暇的反恐、反穆斯林,改成正向的童話故事;最終不只讓德國在國際形象中得到「了不起」的掌聲,並為德國高齡社會注入新勞動力,尤其與穆斯林關係達到一種可能的和解平衡。
而大西洋另一端,美國正在棄守阿富汗。
於是,那隻看似平凡保守,卻偶爾例外勇敢、精明的豹子,田園中,再次躍起。
如今所有她曾創造的故事,已近尾聲⋯⋯留下六年前反對她、逼她下台的人開始恐懼:沒有梅克爾的德國,會是什麼?
梅克爾教了我一件事:或許成功的民主政治就該多一點點無聊。因為那代表細膩、耐心、妥協、寛容與堅持併存:沒有也不該有簡簡單單的吶喊口號。
跳躍形容詞 在 Facebook 的最佳貼文
來幾句形容詞增加想像力
宅在家沒事看手機,看到很多介紹酒的影片!主持人講了一堆,我一直在等他的形容詞~
「這支隻酒有多好,各位!這瓶酒曾經痛宰過法國五大酒莊⋯⋯」無可厚非,畢竟是講酒的評鑑,比賽,等級。
想起二戰時期的英國首相邱吉爾,他曾經這樣形容香檳洒~
「它使人興奮,它擁抱神經,它攪拌想像,它讓機智四處跳躍」
邱吉爾是金句王,留下經典名言無數!
他也曾説過:「堅持下去,並不是我們真的足夠堅強,而是我們別無選擇!」
共勉之
續命po文第六回
蘆洲:肉肉多涮涮鍋(熟成牛肉專賣店)
https://www.facebook.com/rorodohotpot/
台中:八時神仙草-創始店
https://www.facebook.com/godlike1019
Ps:還想看罐頭料理請+1
跳躍形容詞 在 一個個複製貼上送出。 結果是浪斯邦尼Let's Bonnie脫穎而出 的推薦與評價
嚴格說起來這句的文法是錯的(Let's後面應該要接動詞,但Bonnie是形容詞),但我喜歡那Bonnie活力跳躍感,管他的,我把形容詞當動詞用不行嗎? ... <看更多>
跳躍形容詞 在 看板GMAT - [SC. ]PP2-55 N1 of N2 +that+V - 批踢踢實業坊 的推薦與評價
1.想在這邊跟大家釐清一個觀念
我知道'非限定'形容詞子句可以跳躍修飾前面的名詞
想請問在'限定'形容詞子句中是否也可以跳躍修飾?
N1 of N2 + that +V 印象中that是可以跳躍修飾N1的
但是目前寫題目似乎大部分的題型限定形容詞子句都是在修飾最靠近的名詞
不知道有人是否可以舉例'限定'形容詞子句跳躍修飾的題目?
2.
With a new park, stadium, and entertainment complex along the Delaware River,
Trenton, New Jersey, is but one of a large number of communities that is
--
looking to use its waterfront as a way for it to improve the quality of
-----------------------------------------------------------------------
urban life and attract new businesses.
----------------------
(B) is looking at using its waterfront to improve the quality of urban
life and attract
(C) are looking to use their waterfronts to improve the quality of urban
life and attract
翻了一下白勇語法 他老人家說(only/but) one of N複+that+V複
the (only) one of N複+that+V單
想請問該如何從句子意義上去了解為何一個用(V複)一個用(V單)?
硬背的話很怕怎麼記都是記成反的@@
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.82.82.43
... <看更多>