jim yeh on 七月 5th, 2011

最近讀到一篇文章〈不要盲目的 BDD / TDD,我對寫測試的看法〉,看完作者 XDite 反對不論如何都要導入 TDD 的理由,讓同人想提出我對這篇文章的看法。

XDite 在文章中前半段,提到他對做測試的看法:

我個人的看法是認為在大多數的情形下,你需要對你的「軟體」寫 "Test",而且是要先寫 "Test" 再行撰寫程式,也就是 Test-Driven Development。因為程式碼會逐漸龐雜,沒有人可以 write code without bug,也不可能每次都有辦法用手測出來,加上有時候寫錯程式時的損失不是事後修理就有辦法彌補的,所以我們必須要寫 Test Case,及早抓出問題。

XDite 說這是所謂寫測試的重要性。但他強調這卻不是程式設計師「可以」不合時宜的盲目在「任何類型」的專案強行導入 BDD / TDD 的藉口。XDite 指出寫測試程式來確保程式正確性的解決方案,存在著額外多付成本的代價,亦即:

  1. 「 寫測試 + 寫程式」 所花的時間,大概是純寫程式的 1.5 -2 倍時間。
  2. 「會寫 Test」、「正確的測到該測的部份」、「寫出好的測試」,都需要學習時間以及功力。

於是 XDite 提出了四點原因,用來當成反對盲目 BDD/TDD 的理由。即使是程式設計師因為厭倦了維護在之前的專案後期的維護,因為修改程式碼而一再發生的問題(無論是小問題,大問題),而決定在下個專案,無論什麼專案類型都要導入 TDD / BDD,XDite 認為這在他眼中認為這是相當不正確的事情。

1. 每個專案類型不盡相同,有的是要求高正確性且牽扯到金流問題且開發時間充裕。有的純粹只是 event,用過極丟。有的是幫人外包,只要求規格正確,開發時間不寬裕。有些則是混合型。有些部分的程式碼則是相當難以寫測試(如 View),C/P 值極低。應該考慮每個專案的類型甚至是 component 去決定哪部分該嚴厲的規定寫測試,而哪些部分可有可無。

2. Startup 前期應不應該導入 TDD/BDD ? 我認為不應該。為什麼,很多人都認為 TDD / BDD 是為了確保「程式的正確性」,所以無論如何我們都應該執行。卻忽略了 Startup 的成功要素是「快速驗證你的 Idea 的正確性」、「快速應付市場變化調整的速度」、「在市場廝殺中節省成本存活下來」。

3. 寫測試只是為了要能自動驗證「程式的正確性」、降低「程式出錯的機率」,但團隊合作開發程式最重要的是團隊中的「溝通」,大家對 function 和架構要有一定程度以上的理解,共同撰寫程式要有一定程度以上的 convention。變更任何重大架構(如 core function, db schema, 底層設計前)都要提醒大家。

如果每個人都只寫自己的,然後想改什麼東西照自己心情,沒有人想舉手之勞通知大家、跟隊友溝通。坦白說,那寫測試有個屁用,可能只是不會爆 production code,development 拉下來還是爛光光,還是要修到死。

完全不溝通、不制定規範,卻期待寫測試能夠解決一切,這樣的想法不是很奇怪嗎?

4. 無論如何,就算寫了再完美的測試,再完美的程式碼。程式還是可能在你完全預期不到的狀況爆掉,所以應該做的是要接受無論如何就是要修 bug 的這件事,然後想辦法把修 bug 的成本儘量壓低,也把因為 bug 會產生的損失也儘量壓低。

不要期待測試是萬靈丹。否則期待越大,失望也大。

到底是評論 TDD、還是做測試?

同人覺得 XDite 這篇文章的論點令人混淆;他到底是在評論盲目導入 TDD 的行為、還是在探討開發者該不該多花時間寫測試程式,以確保「程式的正確性」?這兩者完全是不能相提並論的事情,同人很不能理解在前面提到寫測試程式來確保「程式的正確性」需要花更大的代價,而下一段就拿寫測試程式必然會忽略其它開發活動(如溝通、修正程式 bug 等活動)來否定 TDD/BDD 的價值。

難道 XDite 以為 TDD 就只是在做確保「程式的正確性」之測試而已嗎?假如 XDite 真的是這樣認為,那麼顯然他把 TDD 誤解成是在做測試。不過,對於同人在文章後面留言提出的質疑,XDite 回應否定他把 TDD 誤解成寫測試,而是不喜歡一些沒有把 TDD 搞清楚的人,強行要把「TDD」和「測試」混在一起,綁在一起要求無論如何都要「TDD」。他提出了一種典型把測試跟 TDD 混淆綁在一起的狀況,是遇到下面這種混蛋邏輯:

因為程式會爆炸,或者是以後改來改去又會暴很麻煩 => 所以我們需要寫測試 => 既然要寫測試,也許我們不應該事後補寫 Test Case,而是應該來試著 TDD。

另外,XDite 還提到理想狀況開發者可以用 TDD 來開發產品,先寫測試去制定出規格,然後寫出實際程式通過測試,達到 System Design。接著藉由不斷的寫新測試、新規格,然後寫出更多的程式,邊修邊測到 boundary。但現實狀況是,就算是熟悉 TDD 的開發者,他卻不一定是「規格」、「設計」的主導者。

XDite 說在這樣的「現實狀況」,很多時候, Team 裡面有開發者不能強迫導入 TDD 的環節。強行推動只是互相絆倒和拖垮彼此的時程。XDite 認為 TDD 只在某種「單純」(專案成員素質接近一致,沒有 highly dynamic factor,目標單純)的專案、環境、Component 下適用。

雖然 XDite 對他的觀點,似乎並沒有留下和同人繼續討論的空間;我發現我後來的留言被當成 spam 處理。同人猜想也許他的文章說歡迎指教,但我的留言讓他感到威脅、或是覺得再繼續討論壓力太大,於是想中止和我就這個議題繼續討論。同人不想責怪他對我留言的反應,即使他這樣做只是要表達內心情緒的不滿,但我仍然不會停止對 TDD 的這個討論主題的思辨,並且會透過網誌來表達我的觀點。

評論 XDite 的四點理由

XDite 提到他不喜歡把「測試」和「TDD」綁在一起的混蛋邏輯,但它反對不管怎樣都要導入 TDD/BDD 的原因,卻又以寫測試案例的「極端」現象來反駁 TDD 的價值,顯得不合邏輯。

在 XDite 寫的四點原因中,除了第二點有明白地表達不該在 startup 前期導入 TDD 之外,其它三點看起來都好像是在批評寫測試程式的問題(還不論是不是先寫測試程式)。因此,這樣看來就很令同人費解;如果真如 XDite 所說的他不喜歡人們把測試和 TDD 綁在一起,怎麼會把寫測試程式出的問題都算在盲目導入 TDD/BDD 的頭上?如果連自己在談 TDD 的時候,都會和寫測試程式的問題牽扯不清,那麼又怎麼能責怪別人把「測試」和「TDD」綁在一起呢?

同人認為在 XDite 所提到的四點原因,它們並非錯誤,而是並沒辦法當作反對不管如何都要導入 TDD/BDD 的原因。雖然在第一點原因中 XDite 並沒有說錯,有些程式像是使用者界面程式的測試程式就很難寫,因此的確不大適合強行對他們進行 TDD。然而,當遇到這種情況的時候,使用者還是可以選擇用 Mock Object 把那些沒辦法寫測試程式的物件區隔起來,然後針對最多部分可測試具有演算邏輯的程式來進行 TDD。

因此,使用者界面程式沒辦法建構 TDD 的測試程式對於 TDD 而言,並不是什麼太大的問題。因為基本上 TDD 不是用來當做測試的工具,而是用來設計可以驗證符合使用者真實需要的工具。所以開發者只要針對可測試、或該測試的部分建構測試案例就夠了。TDD 的目的是要確認花費最小的努力來滿足使用者的需求,測試案例所要求的不是全面的完整,而只是確認達到剛好達到滿足需求的邊界,這將會促使開發者先以界面的思維來整合系統各要件。對 TDD 測試案例比較重要的問題,是如何設計可測元件與非可測模組之間的界面。

至於 XDite 提到對於某些程式沒有必要寫 TDD 的測試程式,同人倒會很好奇有什麼客觀標準、或是有誰可以決定什麼程式沒有建構 TDD 測試案例的必要?在同人導入 TDD 的經驗中,就曾經有開發者要求 Business Object 不要寫 TDD 的測試案例,當時他們的理由是它們沒有什麼太複雜的邏輯、而且不大容易會變動,所以應該不需要為它們建構 TDD 的測試程式。

然而,事實證明,接受開發者這個要求的決定,是整個系統發生苦難的開始。因為所有的問題都從 Business Object 的瑕疵開始引爆,直到把 Business Object 也納入 TDD 測試案例的範圍,系統程式的品質才能達到令人接受的水準。

再來,對於 XDite 唯一有討論到導入 TDD 的第二點,他認為 startup 前期不應該導入 TDD,因為 startup 的成功要素是「快速驗證你的 Idea 的正確性」、「快速應付市場變化調整的速度」、「在市場廝殺中節省成本存活下來」。然而,同人對此卻認為恰好相反,TDD 正是「快速驗證你的 Idea 的正確性」、「快速應付市場變化調整的速度」、「在市場廝殺中節省成本存活下來」的利器。

為什麼?不用 TDD,人們多半傾向會以自己所相信的基本假設來解答問題,也就是以自己的經驗或熟悉的事物,從核心出發來發展解決方案,以期待把事情做正確。在這種情境下,人們通常會想得太多,而容易有過度設計(over engineering)的傾向,而 TDD 則可以讓人回歸到從問題來決定系統的邊界,再以最符合經濟效益的方式來解決問題。所以自然能夠以最省時及省力的方式來做正確的事情,更可以在市場上獲得致勝關鍵。

XDite 說他不同意「快速驗證你的 Idea 的正確性」、「快速應付市場變化調整的速度」、「在市場廝殺中節省成本存活下來」,是「對 TDD 再適合不過」。但同人很清楚這「對於熟悉 TDD 的開發者而言」是很自然的,顯然 XDite 是忽略了我認為這句話成立的前提,在於開發者是否能熟悉使用 TDD 的節奏。

如果開發者熟悉 TDD 的節奏,當他沒辦法寫出測試程式的時候,代表他對系統所要解決的具體問題還不夠清楚。為了要弄清楚他必須更清楚去溝通,而且 TDD 的習慣會促使他傾向以使用者的情境去溝通,而不是拿功能要使用者告訴他該做什麼。只有在開發者瞭解使用者的情境之後,開發者才能具體而正確地寫出驗證程式的測試案例,這說明在 TDD 寫的測試案例不是做測試而是在做設計,而且不可能因為寫 TDD 的測試案例而讓開發者不做溝通

所以 XDite 提出的第三點和第四點原因,或許對於做測試是可能成立,但在 TDD 的情況下卻是可能性很低。因為除了建構 TDD 的測試案例需要了解使用者情境更需要溝通之外,TDD 的測試案例本身就是有用的溝通工具。TDD 的測試案例是能夠經過驗證的具體規格、同時它也是相關元件、API、或是模組的範例程式。

當然 TDD 更不會有太要求測試程式的完美,而忽略修正 bug 的問題,因為 TDD 的測試案例並不要求完美,而只是夠用就好。而且 TDD 在實際上可以用較低的成本來修正 bug,因為它能夠自動發現錯誤,再加上重構能夠逐漸改善程式碼的品質,TDD 沒辦法確保程式一定不會出現錯誤,但它總是能夠以較低的成本得到較高品質的程式碼。

TDD 必須很「單純」?

XDite 說 TDD 只在某種「單純」(專案成員素質接近一致,沒有 highly dynamic factor,目標單純)的專案、環境、元件下適用。但在同人導入 TDD 的成功經驗中,很不巧就有專案、環境、元件不單純的例子。

在一個國內知名金控公司的銀行外匯系統建置專案,表面上專案的目的是為了建置新一代的外匯系統,而不想受制於舊有系統和廠商的牽制,但實際上客戶高層的想望是要架構能夠整合機構其它系統的基礎建設平台。然而,當詢問客戶高層對系統目標的意見時,他們給的回答竟是「把系統做到令客戶咋舌」這種有說等於沒說的答案。

專案的成員並非來自開發組織的單一部門,而是從各個組織挑選各種經驗和背景的人,雖然有專業能力資深的人,但也有對相關技術不熟悉的成員。可以想見,在專業、技術、能力、背景如此懸殊的情況下,因為「人的問題」而發生團隊衝突是很難避免的,這個專案的團隊衝突的課題,正好提供我碩士論文的研究動機。

當時開發團隊過去沒有接觸過相關問題領域的經驗(事實上是客戶指定不希望找對有金融經驗的人來開發,公司沒有開發過相關領域的專案,而有不錯的系統建置專案,才是客戶會選擇我們的主要原因)、開發環境也是用開發團隊過去完全沒有經驗的技術。

客戶指名這個專案要使用 SOA 架構,由前端 JSFWeb service 呼叫到 Application Service,呼叫後端直接存取 POJOs 或是傳送訊息的服務、而中間物件的傳遞則透過 XStream 的序列化以 JAX-RPC 進行遠端傳送、至於元件包括軟體架構也都是從無到有按照系統需求逐漸演化成型。

專案團隊大部分的人都沒做過 TDD,加上這麼多「高度動態的因素」,而導入 TDD 竟然能夠成功,是因為我們運氣好嗎?這麼說必須忽略開發組織守舊勢力對新方法論、架構和技術的反撲,否則就很難解釋公司總經理的質疑和反對。實際的情況是我們不是運氣好,而是用對的方法讓我們做好準備。當公司高層開始質疑的時候,我們早就已經透過 TDD 快速驗證我們的方法沒問題,而讓總經理無法否決我們的設計成果。這讓人目睹 TDD 的真正價值所在,不是確認「程式的正確性」,而是讓人有勇氣並保持簡單的節奏。

同人認為 TDD 的成功並不在 TDD 自動確認「程式的正確性」,而在於TDD 讓人有勇氣把事情做好,讓人遵循良好解決問題的節奏和紀律。那就是:1.確認問題;2.依照問題情境,發展用來驗證方案的標準;3.設計方案並執行驗證,以達符合驗證標準;4.視組織需要改善方案,再次執行驗證以確認符合標準。

依照這樣的節奏和紀律,可以讓人在確認方案做正確之前,已經驗證方案是用來解決正確問題,以避免過度設計和設計不足的兩難。這正是傳統方法很難避免的問題;即使開發者擁有熟練的開發技術,但少了在事情做對之前先做正確事情的紀律,品質問題正是因此而叢生。

現實的真相

XDite 用「理想狀況」來反駁用 TDD 來瞄準、射擊、修正後再射擊的觀念,他說很多時候, Team 裡面有開發者不能強迫導入 TDD 的環節,強行推動只是互相絆倒和拖垮彼此的時程,這是所謂的「現實狀況」。這麼說似乎是意味了 XP 敏捷方法的 TDD 實務無法在「現實狀況」實行,而是「理想狀況」。這種說法對同人其實並不陌生,就像我在〈羅馬不是一天造成的〉這篇文章所提到的情形:

同人偶爾會與 X 君分享我的工作心得,他很羡慕我能夠堅持設計的理想,遵循好的設計原則及開發方法發展出軟體架構,像他就沒有這樣的機會。而和同學分享我的工作成果時,他則認為我堅持設計理念可以成功,是因為我們公司有足夠的資源可以讓我們玩,換成是小公司,就不會有這樣的成功條件。

其實同人在那篇文章所提到的概念、架構和技術的驗證,所用的方法正是 TDD。但同人分享成功經驗看到人們的反應卻發現,除了羡慕和佩服之外,多半是認為我剛好遇到足夠的條件來支持我實踐理想,而他們的「現實狀況」一定不允許他們這樣做。

假如真的是「現實狀況」不允許開發者導入 TDD,那麼面對開發出來的軟體品質不彰,他們採取了什麼行動來面對現實呢?以同人在一家開發軟體產品的 startup 公司看到的「現實狀況」來看,他們只是試著更努力而辛苦地把過去的工作做得更好,可是彷彿都一直不能如願。

同人在那家公司分享過我的 TDD 的經驗,RD 經理認為或許應該要做 TDD,可是因為使用資料庫的關係,會讓 TDD 很難做到或是做了沒有太大的效益。同人並不太瞭解為什麼他會有這種顧慮,因為按照我過去的經驗,資料庫的部分可以用 Mock Object 或是 Hash Map 版本的實作來區隔開來,而且這樣做有優化設計的好處。不過,同人不便公開質疑主管對 TDD 的顧慮,而是選擇尊重他在「現實狀況」下的決定;等到適當的時機再導入 TDD,除了眼下的問題需要被克服之外,還要讓開發者們的步調都能一致。

直到同人離開那家公司之前,TDD 都是一直被人們掛在嘴巴上說,但從來未曾真正去做。然而,隨著需求愈來愈多,程式碼也愈來愈複雜。這時候,關於軟體品質愈來愈殷切的議題便是元件很難被獨立測試,而是必須整塊合在一起才能測試,但這在除錯上很沒有效率。於是各個元件要獨立測試變成一項非常重要的需求,但滿足此項需求最大的問題便是軟體架構需要動大刀,而更緊急的嚴重問題便是有一大堆在客戶端的 P1 和 P2 的 bug 需要解決。

於是在龐大的時程和品質壓力下,常讓 RD 和 QA 沒辦法在時限內產出符合品質要求的軟體。我們用的方法,就是一次又一次的讓 RD 以大規模前置設計(BDUF),然後等程式開發完成之後再 handover 給 QA。雖然表面上公司採用敏捷的開發流程,每天在固定時間召開 Daily Stand-Up Meeting,但是看起來專案管理者的腦袋並沒有換成敏捷的思維,仍然是期待以更精確的預測來改善專案的進展,即使是他們對專案狀況的預估從來沒有準確過。

在這種「現實狀況」下,雖然同人已經提醒 Scrum 偏重管理面而非工程面,但由於 RD 經理對 TDD 仍然有疑慮而不敢貿然採用它來提昇程式的品質。整個開發團隊只是一遍又一遍地用和昨天用過的方法,來試圖解決今天相同的問題,但我發現專案管理者好像不合邏輯地希望得到不一樣的結果。它正符合愛因斯坦對精神錯亂所下的定義:

一遍又一遍做同樣的事,卻期待不同的結果。

同人看到專案管理者對「現實狀況」的理解是,因為開發者在事前(不用心而)想得不夠多,所以不能在一開始就把事情做對,而導致軟體運行發生錯誤。但同人認為「現實狀況」的真相卻是,關鍵在於開發者沒有辦法做正確的事情,在很多時候設想了太多無謂的問題,而把心力分散在處理瑣碎的事情,而無法專注在關鍵問題上思考。

這是因為無法快速驗證方案對解決問題的效果,往往在開發者花費大量心力脫離「焦油坑」之後,才發現真實情況有很多地方是無先無法預料到的。換句話說,這不是開發者做的東西不對或是不好,而是面對適應變化,沒有把握「動作要快、行動要小」[1]的原則。

當然在「現實狀況」下,導入 TDD 的實務不見得真的能夠有效地解決問題,對於任何一種開發方法論,我們都不應該盲目導入,而是要弄清楚它的適用範圍和限制,TDD 當然也不例子。然而,對於把 TDD 和做測試混為一談,然後藉此推測團隊中「一定」有 TDD 不能強迫導入的環節,強制推行只會互相絆倒和拖垮彼此時程,同人認為這是扭曲 TDD 當成做測試的繆誤。

使用 TDD 來開發軟體,開發者實際花費在測試案例的時間並不會很長。因為程式開發者不可能只寫程式而不驗證自己的程式碼,否則無法確認程式符合規格,就不能認定他已經寫完程式了。既然驗證程式碼是他的責任,那麼測試先行只是確認程式碼符合規格的一種方式,這樣只是把後面應該執行的工作先做好,並不會增加開發者額外的工作量。

因此建構 TDD 的測試案例並不需要額外的工作量、也不大可能會因為執迷於測試而沒有花時間溝通共通架構、或是程式的 debug 時間。又能節省開發者因為想太多而多花費過度設計的時間,而且可以支持驗證程式的重構來加強程式的結構,不會因為增加功能而影響程式碼的品質。

TDD 在開發程式之前先寫測試案例的用意,並不是為了及早自動抓出問題。雖然這通常是採用 TDD 能夠產生的附加價值,但 TDD 先寫測試程式的精神是為了驗證未來方案能夠符合需求,以確認方案是在正確的命題方向上發展。開發者發展解決方案,每前進一小步,都能夠知道這一步離他的目標更接近或是遠離,這讓他可以馬上採取行動來調整方向以減少偏差。於是開發者可以做到真正的面對現實,這正是掌握適應改變行動要快、動作要小的原則。

不明究理者的未嘗知義

採用 TDD 來開發軟體,並不能做到確保程式的正確性、或是降低程式出錯的機率。因為要做到這個目的你就必須「預測」程式會發生問題的一切可能性,並且預先把它們都放到測試案例中,才有可能達到這些目的。然而,事先做預測已經違反了敏捷開發的基本原則,也違反了 TDD 的基本精神,認為 TDD 的目的是為了確保程式的正確性、或是降低程式出錯的機率而把它和做測試混為一談,這只是不明究理的人未嘗知義的偏見。

就像在網路社群中,James O. Coplien 以「宗教信仰」形容 TDD 的迷思算是最典型的代表,它以 TDD 不可能達到測試良好的涵蓋率來批評它的效率不如傳統的軟體工程方法。同人曾經評論過這種觀點的繆誤

品質的問題並不是測試效率太低;而是開始測試的時間拖得太久,使得分析設計階段的缺陷不斷地擴散而使開發人員窮於應付。例如開發者在設計的過程中有沒有去思考設計驗證的問題,還是把這個責任推給後續的品管作業,例如 code inspection,或是各種形式的審查作業?

這個答案無關乎方法論本身的優劣,而是關乎開發者面對問題的態度,這對品質有著直接而深遠的影響。沒錯,我們需要專注於思考,但思考的重點並不在用那一種檢驗方式比較有效率,因為那樣我們將會落入品質是檢驗出來的迷惘當中。而是應該思考,對這個問題為什麼我會這樣設計?我如何驗證它是可行的?有沒有可能它會無法解決問題或造成其它我沒有想到的問題?

把做測試和 TDD 混為一談的觀點,忽略了 TDD 的價值不在檢驗程式的正確性,而是找出足以解決問題的系統邊界的設計過程、以及面對目標採用有效的節奏把事情做好。對於 TDD 而言,測試不是用來確認程式沒有錯誤的目的,而是定義系統邊界的手段與過程,因為品質的關鍵不在於確認沒有錯誤的程式,而是從程式接口之間發現軟體自然演化的脈絡;學習庖丁解牛的精神,以游刃有餘的技法來體會軟體開發之道。

至於 XDite 在意以「混蛋邏輯」把 TDD 和測試綁在一起,同人覺得根本就是沒有必要地在鑽牛角尖。當程式設計者說他想要寫測試程式來確認程式的品質,並不見得他真的是把測試和 TDD 綁在一起;而且就算是他真的把測試和 TDD 綁在一起,同人也認為無傷大雅。有時候,管理者不見得會瞭解程式開發者所表達 TDD 的正確的觀念,所以開發者必須學會用不太精確但表達到重點的說法對管理者提出需求。

這也就是說,對於程式設計者而言,他所需要的是擁有能夠提昇他程式品質的方案,而 TDD 是他想要可能可以符合需要的候選方案之一。提出測試的附加價值是讓管理者比較能夠接受的說法,當然程式開發者也有可能真的把測試和 TDD 綁在一起,但即使這樣也沒有關係。因為當他實際採用 TDD 開發程式後會發現程式品質的提昇不是測試,而是在系統邊界附近發生自我組織的演化過程。

很多時候,我們真的沒辦法期待人們觀念正確才開始動手執行,因為那樣等於你什麼都不用做,而且軟體開發的重點不是理論怎麼說,而是實務上怎麼做,程式開發者從實務上的執行才能真正瞭解,TDD 不能跟做測試混為一談。



附註  
  1. 曾昭屏譯(2006年),《溫伯格的系統管理學:系統化思考(第一卷)》,經濟新潮社。[]
     

21 Responses to “不要把 TDD 和做測試混為一談”

  1. xdite 說道:

    我沒有不歡迎你討論啊。可能又是我的 sk2 在做怪吧。我想說怎麼我回一回之後你就不回了

  2. guest 說道:

    同意, xdite 的 startup 那一段說法真的前後矛盾

  3. jim yeh 說道:

    Hi XDite,

    哈哈,原來是誤會一場呀。不過,這也許是上天巧妙的安排,讓我把觀點寫清楚再發表。

  4. fr3@K 說道:

    typo: Daily Standard Meeting -> Daily Stand-up Meeting

  5. fr3@K 說道:

    該死的 touch input: Metting -> Meeting

  6. jim yeh 說道:

    Hi fr3@K,

    謝謝你,都已修正。

  7. 可樂魔 說道:

    現在任職公司的狀況,我大概可以用「積習已久,無藥可救」來形容。長久而言都是用錯誤的工作模式進行,產生出來的問題淺而易見,甚至還有那種教科書都可以輕易點出的「公式性結果」,不過視而不見、無心處理…..這就是我現在看到的囧況。無力啊…..

  8. jim yeh 說道:

    可樂魔,

    那代表需求大概不夠強烈吧,這和組織文化有關,如果主事者不夠有決心,或是根本不在意,那就隨個人造業個人擔吧!

  9. M Jwo 說道:

    我很大程度認同xdite的說法,更建議看 http://coolshell.cn/articles/4891.html 這篇的說法。
    我更感興趣的是外匯系統,我知道現在台灣並沒有那麼『成功的』外匯系統,我所知道的那麼複雜的外匯系統都很慢,能私下跟我說是哪個銀行嗎?
    還是跟台灣大多數的系統一樣,只要上線了就是成功的專案?

  10. jim yeh 說道:

    基本上,XDite的說法不是完全不對,而是搞錯主題。他的論點不能說明「盲目」TDD的問題,就像是拿白蘿蔔評論馬鈴薯的扭曲,不能因為它們都長在土裡,就以為它們是一樣的東西。

    在我文章中提到的Coplien,他對TDD未嘗知義的偏見也是一樣的問題,他的評論顯露出根本不懂TDD,而只是拿他熟知的東西建立他自己的工程信仰而已。

    最後對於你的疑問,我恐怕沒辦法幫你了。因為我跟你不熟,我沒辦法告訴你太多。至於你的假設,我沒有必要去辯駁什麼,只想告訴你:你不知道的事情不代表它不存在。因為那個系統改善的績效,IBM曾為它頒發SOA創新獎給甲乙雙方,還需要我們多說什麼嗎?

  11. M Jwo 說道:

    只能說我跟IBM非常熟了,我所有的專案都跟IBM有關,所以我以為你的不是IBM的外匯,既然拿到IBM獎項就很好查了。
    舉例多年前IBM用當時 IBM 最新的的 ESB with MQ Flow + SOA 導入後某銀行後導致性能由<1sec到2sec-2min,也是拿到 IBM SOA獎項。

  12. M Jwo 說道:

    沒法隱私發文,不過我剛說的某銀行跟你的外匯系統是同一個,所以你可以去查證那個ESB+MQ Flow+SOA的問題有變的多慢,我們去參觀的時候一個跨主機電文可以經過三分鐘才回來。

  13. M Jwo 說道:

    同一個銀行,不是同一個系統,比你說的系統早上線大約四五年。

  14. M Jwo 說道:

    最後一篇,我想你說的那個系統最成功的地方應該在SWIFT的部份,目前已有的SWIFT都不怎麼樣,銀行又很封閉不想要換。
    不過SWIFT是有標準規格的,很容易做到TDD。
    但是與前文說到的需求不明的前端(還用JSF開發!),無確定規格的SOA服務,只要規格變動很大要從TDD做起難度很高,難度很高不代表作不到,你們的團隊要很努力才行。
    對了,有任何不方便直接刪回應可。

  15. M Jwo 說道:

    加一篇,一般說的外匯系統,不是只有單純的存放匯出入而已,所以我才會對前述的用JSF(是的,這是最大的問題)達成上千交易,交易有數百欄位又可換多頁甚至於編寫文件的系統覺得很訝異。

  16. jim yeh 說道:

    拿到 IBM SOA 創新獎未必是 IBM 的外匯系統,事實上,那個系統是 IBM 一直要涉入而不能如願。

    我們就是不會告訴 IBM 我們的系統架構和設計,除了用 RSA/RAD 和 WAS 之外,那個系統和 IBM 沒什麼太大關係。

    IBM 一直要賣我們的業主 WPS,但實際上那根本不需要。關鍵成功因素不在技術/工具/方法論,而是如何善用解耦的手法及發展團隊合作的默契。我想 M Jwo 關注的方向是搞錯了。

  17. [...] 看到一篇很有趣的文章:不要把 TDD 和做測試混為一談  [...]

  18. jim yeh 說道:

    pcbill 寫的〈【單元測試】的四面向〉提到從不同角度,切入採用單元測試後,所產生的四種面向。對於種種的討論,正反辯證前,應該要先分辨是處於哪個面向裡,不同面向,討論著眼點應該會不一樣,不然討論容易失焦,牛頭不對馬嘴。同人覺得這篇文章整理的很不錯,也列舉了一些應用單元測試如何協助開發的不同方式,讓人思考不同應用測試案例的優缺點。

  19. [...] 不要把 TDD 和做測試混為一談 此篇文章,對於 TDD [...]

  20. ICO 說道:

    貴文中提到的TDD優點,不斷的強調,TDD會逼迫人往好的一面方展
    但現實中,那只是理想情況,

    你說的那種話給我感覺就像,
    念了數學系數學就會變好,念了物理系物理就會變好,因為他不得不

    其實這也是很多人都有的錯誤思考,

    你所說的那些TDD帶來的好處 是建立在程式人員
    己經懂得溝通、已經熟稔商業邏輯、已經知道接下來可能遇到的情況

    對一個彼此都陌生的團隊,沒有人創立過的商業模式
    寫TDD根本就是極度沒有必要

    如果是行之有年的商業模式、有對領域熟析的人
    那寫TDD才會帶來你所提到的好處

    在前一種情況下,寫TDD只會卡死團隊而己

  21. jim yeh 說道:

    覺得好就去做,勝過那些不去做卻說一些風涼話的人。那些風涼話,我從來沒少聽過,但對專案卻沒有什麼建設性的幫助。卡死團隊?自以為是才是真正會卡死團隊的東西,跟有沒有做 TDD 沒有直接的關係。

Leave a Reply

You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="">