5
二月

本質與存在的矛盾

   Posted by: jim yeh   in 問題解決, 寫作, 思考, 新時代, 生活感觸, 閱讀, 電影

從古至今,人類花費許多心力來探尋事物的本質。不論是哲學、宗教乃至於近代的科學在這方面的努力,不外乎是為了讓人們更認識自己、世界乃至於整個宇宙。到目前為止,人類對宇宙的認識已經有長足的進步。我們可以運用牛頓力學預測天體的運行,絲毫不差;而達爾文進化論也告訴我們物競天擇,優勝劣敗,生物演化最後留存下來的物種,也早就是由基因所決定,絶非偶然。

如果宇宙是按照必然的本質在運行,那麼非本質的偶然是否就應該被忽略的呢?近代科學的演進,告訴我們在宇宙必然性的背後,其實存在相對的隨機性。雖然宇宙在表相的物質巨觀層面上,似乎可以預測必然性,但在微觀的粒子層面上,卻是以我們很難理解的隨機方式在運作。

也就是說,事物的本質不見得是單一地存在,而是可能以多種完全不同的樣貌來呈現,甚至會看到客觀的本質與主觀的存在會產生相互的矛盾。特別是在最近在網路上的討論中,同人就很清楚地看到這樣的矛盾如此深刻地影響人們的想法與行為。 Read the rest of this entry »

1/9 在新竹舉辦的敏捷開發方法分享會,當同人分享到 XP Refactoring 實務的經驗時,台下有一位聽者剛好也是我目前的同事提出一個問題:該由誰來決定何時應該重構的問題。同人當時回應重構多半發生在軟體架構的設計上,一般開發應用程式的程式員通常比較不太會有機會重構。在專案每天早會上,團隊各個成員會報告他們目前進行的工作狀態,當同人發現他們遇到架構面上的問題,我便會著手進行架構的重構以避免系統發生疊床架屋的現象。

同事好奇重構的決定是否有客觀的標準,同人表示這部分多半還是個人主觀的經驗居多。在同事後來開車載我回台北的路上,我們再次談到決定重構的時機。同事覺得重構的時機似乎不是一件容易掌握的事,同人進一步地解釋,當時我們在應用程式的開發沒有太多重構的機會最主要的原因,是因為在架構上力求簡潔而單純的設計概念,使得應用程式的開發已經變得很簡單,實在不太需要運用重構用來增加設計的彈性。

趁這個機會,同人向同事強調架構的彈性不應該以需求不得改變為前提,而是要能夠因應「有限度」的變化而發展而不斷地調整及演進。也就是好的架構並非從恒久不變的核心來出發,而是要先去識別出問題的輪廓才找得到適用的核心。同人經常在軟體開發的實務中看到,人們花費了太多的心力來堅持不變的核心,到最後才會發現原來問題是出在自己對問題假設錯誤。

那麼,在軟體開發的過程中,有沒有方法可以避免我們浪費心力在無謂的堅持上,然後用比較簡單而又有效率的方式來完成我們的工作呢?經過與同事上面的對話,同人想到運用到我在分享會中所提到的觀念與實務,可以很輕易地掌握設計演進的節奏。藉由此篇文章分享出來,也算當做同人在 1/9 敏捷開發分享會後的一個註腳吧。 Read the rest of this entry »

1/9 同人要在新竹分享敏捷開發方法的經驗與心得。很湊巧地,在這個禮拜我經歷了有關測試驅動開發與重構實務方法的熱烈討論,也先後寫了三篇文章來表達我的觀點。不過,前面寫的那三篇文章比較傾向用原理的角度來看測試驅動開發與重構,對於沒有接觸過測試驅動開發與重構實務的讀者而言,可能比較不容易體會。那麼有沒有比較生活化的例子可以用來隱喻測試驅動開發和重構呢?同人覺得用最近我們搬家整理房間的經驗,正好可以隱喻這些實務的開發方法。 Read the rest of this entry »

昨天寫的〈測試驅動開發要徹底重構〉,曾經提到 Steven 說到「如果像閣下文中說:『系統不斷演進及需求不斷改變之下,也可能會使架構或設計愈來愈複雜而變得難以維護』,我則認為是在進行 TDD 時候沒有徹底去重構系統。」,同人認為這段話有根本上的邏輯的繆誤,於是回應:

假如上面的話是成立的,那麼代表只要徹底重構系統就不會造成「系統不斷演進及需求不斷改變之下,也可能會使架構或設計愈來愈複雜而變得難以維護」嗎?如果是這樣,那 XP 根本就不需要 Refactoring 這個實務來改善程式的結構,因為你都徹底重構程式,程式結構變差的情況是根本不可能發生。

而且依照本人 20 年來軟體開發的經驗,我還不沒有看到有程式一開始就寫得很好,到後來可以不用改變架構而符合新需求的。倒是隨著對問題的更清楚,或是程式需求的變化,讓程式必須重構的現象時常履見不鮮!

所以如果自以為自己博覽群書,很懂得TDD的實務。也不要忘了用心思考,以免自己對TDD的最佳實務的認知,不小心犯了根本上的邏輯繆誤?

結果,後來同人在 Facebook 的 Scrum community in Taiwan 看到 Steven 做了以下的回應:

先說件簡單易明的事情,其實我很不喜歡閣下把 TDD 放到 『精神』 層次,卻忘記了基本步驟。

之前的討論根本連事實層次都被忽略,根本談不上是什麼多少年的經驗或者如何用心思考,連 TDD 的最基本步驟也忘記,TDD 的基本步,不是閣下做多少年工作就可以把人家的定義去改變的,我也不明白為何有 20 年工作經驗就可以把 『Refactoring』 說成 『並不必然是 TDD 的必要的步驟』,這不是邏輯問題,更不是有過什麼開發經驗然後用心思考就可以改變的事情,這是就算對軟體開發的認知不夠閣下那麼 『全面』 的都能看出的謬誤,如果閣下這樣就認為是因為說不過閣下就建議多看書本,本人深表遺憾。

我是來討論問題的,我沒有興趣去傷害閣下感情,好好閱讀書本,只是反映 TDD 三個步驟是什麼根本不存在爭議,更沒有 『好好閱讀什麼書或文章才能跟我討論』 的意思,我還未自大得要別人看過多少書才可以討論問題,亦正如討論問題我也不用跟別人說我有多少年工作經驗一樣,而且本人是衷心認為多讀書是有益的(不管是閣下還是什麼人),多讀書亦不是為上來辯論的,不過閣下如果感到有所不悅的,我就先行道歉,還是希望冷靜一點討論問題。

而簡單的例子也是思辦的過程的一部份,一方面是簡單易明地討論問題,另一方面是如果連簡單的例子也說不通,又怎麼能去談更複雜的問題呢?

上面提到:』那XP根本就不需要 refactoring 這個實務來改善程式的結構,因為你都徹底重構程式,程式結構變差的情況是根本不可能發生。』

不如冷靜一點再讀讀這句子,』XP 不需要 Refactoring 是因為徹式地進行 Refactoring』,我就看不明白這是什麼邏輯,一邊說不需要,另一邊說徹底地進行。

這裡的問題是軟件是會改變的,可能是新增功能,也可能發現有其他問題,每次帶來的變更其實都需要進行重構的。所以說 XP 不需要 Refactoring 也不正確。

世上的確沒有一寫就好的代碼,而且世界是會變的,Refactoring 就是避免以後的更改越來越困難。把 『徹底地進行重構』 理解成 『XP 不需要重構這實踐』 完全沒有邏輯可言。

我也沒有反對不用改變程式架構就能滿足新需求,亦沒有否定 Refactoring 的重要性,只不過我還是建議新的功能以 TDD 方式進行開發,有測試、有代碼、然後進行重構的。

在足夠測試覆蓋下進行重構是可使系統在不斷演進及需求不斷改變之下,使架構或設計仍然處於可以維護的狀態,相反我指出的是,如果程式架構和設計越來越難維護,是重構的力度不足夠。

前面還提到:』但重構的目的為何?就重構的定義在不改變功能的情況下改善程式結構,以增加程式碼的彈性以利未來增加或改變功能。因此如同那第三步所言,為了去掉重覆性而重構。』

如果重構只是為了去掉重覆性,那 TDD 的第三步不如叫 『Remove Duplication』 好了,無可否認代碼重覆是很常見的問題,但把這裡的重構限制成消除代碼其實會局限系統的將來發展,而且到了 TDD 的第三步,系統是應該有足夠的測試去覆蓋系統,重構的力度沒理由只局限於新增功能和現有程式的重覆。

我就相信閣下是 Refactoring 的專家,也應該會知道一些 Refactoring 的模式是完全相反的,例如 『Pull Up Method』 和 『Push Down Method』,更是需要觀察當時的情況來作決定,而沒有一面倒那個才是好的模式,我實在不明白為何要把 TDD 的 Refactoring 局限到只做 『去掉重覆性』。

這是實務上會發生的事情,消除代碼重覆以外的重構還是會發生的,如果只是單單只是 『消除重覆』,這會是另一個我認為進行重構不夠徹底的事情。

上面已經不單單是用心思考,而是由理論到實踐都可以看得到的事情。

跟討論 Refactoring 和 TDD 觀點以外的聲音,就引用 Chet Henderickson 的說法,全部都是我錯好了,現在可以解決問題嗎?

看了 Steven 的回應,同人當下的反應是不想浪費時間與心力與他周旋下去,但後來想到或許是因為 1/9 敏捷開發分享會我要分享實施 XP 的經驗與心得,也許這是一個巧妙的同步事件。我可以趁這個機會,導正對 XP 或是 Agile 的一些錯誤觀念。

例如敏捷開發並不是教條式的照本宣科,開發者要懂得變通最重要的是用心思考,而非把必要的思考都看成精神層面的問題,這並非適用於敏捷開發的心智模式。以下是同人在 Facebook 的 Scrum community in Taiwan 的回應,但一些詞句有略為做過一番修飾,以清楚表達我對測試驅動開發步驟的看法。 Read the rest of this entry »

同人在〈測試驅動開發的精神〉中,提到「Refactoring 並不必然是 TDD 的必要的步驟」的觀點。David Ko 回應他猜測 Steven 是根據 Kent 在《Test-driven Development》一書的前言中提到的說法,來認為測試和 Refactoring 也是TDD很重要的一環。他說:

…here’s what we do: we drive development with automated test, a style of development called Test-Driven Development(TDD). In Test Driven Development:
* Write new code only if an automated test has failed
* Eliminate duplication
……

The two rules imply an oder to the tasks of programming.
1. Red – Write a little test that doesn’t work …
2. Green – Make the test work quickly…
3. Refactor – Eliminate all of the duplication….

Red/green/refactor – the TDD mantra

在這段敘述中,Kent 認為 Red/green/refactor 是 TDD 的三字箴言,是 TDD 這個 practice 重要的工作。

所以 Steven 才會強調在做 TDD 時,』測試是第一步』,』Refactoring 本身是 TDD 三步之中其中必要的一步』

假如正如 David Ko 所說,測試與 Refactoring 是 TDD 很重要的一環,而來強調 TDD 不應該忽略 Refactoring 的工作,這樣的觀點我可以接受,但同人隨後又看到 Steven 的說法,覺得他自以為是的論點讓我很遺憾。

本人從來沒有指出 TDD 是測試 Practice,亦沒有認為測試是 TDD 的目的。

上面的 『功能』 指代碼的內容規格,寫測試時候就是思考新功能的行為,用測試用例的方式去表達出來。就正如:

AssertEquals(3, add(1,2))

那麼簡單,已經是對 add() 作出規範,投入兩個參數,輸出一個數字作結果,並規範了新 fn 的名字是 『add』。寫這句 Assert 時候就應該思考到 add 有兩個參數,投入 1 和 2 就會得 3 這個數字。

重構是 TDD 其中一步,不存在混淆點,再者,沒有測試覆蓋下的根本不能說成重構;另一方面,先寫代碼後補測試是很痛苦的事情。

如果像閣下文中說:「系統不斷演進及需求不斷改變之下,也可能會使架構或設計愈來愈複雜而變得難以維護」,我則認為是在進行 TDD 時候沒有徹底去重構系統。

我建議閣下好好閱讀 TDD 的書本,Refactoring 是 TDD 必需的步驟,由 Kent Beck 到 Robert Martin 以至其他不太有名的 TDD 書本作者,都指出 TDD 的第三步是重構,而不是 『Refactoring 並不必然是 TDD 的必要的步驟。』

看到「我建議閣下好好閱讀 TDD 的書本」這種不尊重不同觀點的說法,同人根本就不想浪費時間來跟對方爭論。即使耐著性子仔細看他的論點,像那些「沒有測試覆蓋下的根本不能說成重構;另一方面,先寫代碼後補測試是很痛苦的事情。」、「如果像閣下文中說:『系統不斷演進及需求不斷改變之下,也可能會使架構或設計愈來愈複雜而變得難以維護』,我則認為是在進行 TDD 時候沒有徹底去重構系統。」等說法,更讓同人懷疑他對 TDD 的認知,其實是過於偏向理念化而不夠切合實際。

不過,對 David Ko 提出 Kent 認為 Red/green/refactor 是 TDD 的三字箴言的說法,同人倒是覺得有探討的必要。以下分享我在 Facebook 的 Scrum Community in Taiwan 回應 David Ko 的觀點,這些觀點應該可以解釋為什麼測試開發不需要徹底重構 Read the rest of this entry »

在 Facebook 的 Scrum Community in Taiwan 看到 David Ko 提到:

聽到有人說 TDD 是個測試的 practice,跟 RD 不是那麼有關,我想這是誤會了。TDD是一種設計的活動,它並不是單純在做 verification,它是一種 spec 確認的活動。

David Ko 還分享了一篇探討 TDD 的文章供大家參考。這讓同人想到我之前曾經對 InfoQ 的一篇有關軟體開發信仰問題的文章做過的評論

在那篇文章的評論當中,同人認為作者不應該拿 TDD驗收測試相提並論,因為 TDD 並不是測試的 practice,而是設計的活動。如果這兩種實務可以相提並論,似乎就像是爭論有了良好品質的設計就可以省略測試,或是增加測試的效率就可以取代設計的重要性。同人當時在我的評論中提到:

測試的涵蓋面要夠廣,軟體開發所需的開發成本與時間就要增加,所以與其靠檢驗來控制品質,還不如把設計做好。所以,品質是設計出來的,而非檢驗出來的。

不過,雖然品質並不是檢驗出來的,但軟體要具備足以信賴的品質,卻不能省略測試。舉個例子來說,不管開發者如何確保他的開發所產出的品質,驗收測試是絕對不可能省略的,否則客戶是很難信任軟體是合乎他們需求的。良好的軟體設計可以減輕測試的負擔與壓力,但它絕對無法否定軟體測試的價值。

因此,同人認為不該拿 TDD 來與各種形式的測試來做比較,但在 David Ko 提出這個主題後面的討論,我卻看到一個我不太認同的說法。 Read the rest of this entry »

MaoYang 兄看到我分享〈技術經理的教練角色〉之後,他在噗浪河道上回應他對我文章觀點的看法。他說:

我常在做的 『教練』 工作大部分是在講一些基礎的東西與衍生的技術, 但是倒沒有想過要將團隊變成 『一致性』 , 試想, 你身為經理確發現實作的工程師缺乏某些觀念時, 你不得不著急,但是這種狀況出來的時候, 產品也開始出現許多問題, 這是技術經理面臨最大的挑戰。但是當技術經理開始當 『教練』 已經離開工程師角色一段時間, 這又是另一個挑戰

同人很高興 MaoYang 能夠針對這個主題提出討論。對於他所提到的問題,我常看到的是技術經理不能因材施教,所以究竟來看也是身為教練本身指導的彈性不足,也是多樣性的問題,尤其在軟體開發專案更為常見。

而且有時候工程師不是不懂那些概念,而是他們碰到一些技術經理不重視或忽略的問題,但如果沒辦法幫他們解決那些問題,如何讓他們接受那些觀念。教練就只會流於說教的自說自話。 Read the rest of this entry »

31
十二月

在 2009 年的最後一天

   Posted by: jim yeh   in 占星, 寫作, 新時代, 生活感觸

今天是 2009 年的最後一天。計劃未來一直不是同人擅長的項目,隨性的個性也讓我不喜歡依照目標來做事,喜歡把重點放在當下。然而,最近在回顧這一年的經歷卻感受到,在 2009 年的最後一天,很想寫下自己對來年努力方向的期望。

2009 年對同人來說,是「清理過去」的一年。 Read the rest of this entry »

30
十二月

技術經理的教練角色

   Posted by: jim yeh   in 問題解決, 專案團隊, 思考, 溝通, 生活感觸, 職場, 領導

在噗浪的河道上看到 MaoYang 兄提到技術經理做好教練角色的困難。他說:

技術經理有時候要扮演 『教練』 的角色, 這時候要將正確的觀念傳遞, 這是有點困難的, 因為往往會被自己的極限所限制, 想起了一位朋友,他是長笛老師, 他說他知道那個音要如何如何才是完美的, 但是他確無法示範出來

對於 MaoYang 兄的觀點,通達人認為 MaoYang 的朋友應該要學如何示範,不然就不是個夠格的老師。這代表了技術經理應該要學習如何正確示範,否則就不能算是個好教練。MaoYang 兄進一步解釋他對技術經理擔任教練角色的觀察:

在公司內部, 技術經理當 『教練』 並不是明定的工作, 但是當團隊的程度良莠不齊的時候, 技術經理帶頭出來當 『教練』 , 是不得不的, 但是技術經理有時當管理職太久, 要把許多實作交代清楚, 這是當技術經理累人的地方

以上的解釋,通達人認為他同意當「教練」並不是技術經理明定的工作,但為了要避免身為技術經理的時間都被部屬瓜分了,較佳的方案還是當教練,讓部屬有成長的機會和空間。另外,有一位噗友 Daniel Li 也認為,身為技術領導者,給部屬魚吃不如教他如何釣魚。因為總是有一天,他們會離開教練單飛,就像教小孩走路;我們不可能一直挨著他隨時扶著他,只能教他方法、鼓勵或強迫他嘗試,並獎勵或誇大他的小成功。

在觀念上,以上的討論已經將技術經理擔任教練的動機及基本觀念,詮釋地相當清楚。但從自己實際從事技術工作的經驗來看技術經理當教練這件事,事情卻好像並不如以上討論到的那麼簡單。同人認為 MaoYang 兄提到的這個主題,可以從兩方面來探討,一個是技術經理要教練的東西為何,另一個則是技術經理擔任教練的目的為何。 Read the rest of this entry »

22
十二月

買到海砂屋存證信函怎麼寫?

   Posted by: jim yeh   in 問題解決, 生活感觸

去年同人寫下〈從海砂屋陰影學到的教訓〉,分享我們全家陷入海砂屋陰影的經驗,並提供同人從此事件得到的教訓與心得。原來這篇文章的寫作動機,只是想提醒想要購屋的朋友要小心資訊不對稱的現象,不要隨便聽信仲介的說辭而陷入對買方不公平的交易陷阱。但這一年來,看到很多朋友都是發現買到海砂屋之後,才看到同人的文章。從文章的留言與 email 的詢問中,關心最多的應該就是詢問存證信函該如何寫的問題,這似乎提醒我應該再寫一篇文章來分享存證信函該怎麼寫,來爭取買方的權益。

同人先提供當時我所寫的版本如下 Read the rest of this entry »