期間:2004
隱喻式提問
我的作品的常客讀者可能知道,我對於使用其他專業的隱喻來推論軟體開發非常懷疑。特別是,我相信工程隱喻對我們這個專業造成傷害 - 因為它鼓勵了將設計與建構分開的概念。
當我在倫敦辦公室閒晃時,這個問題在精實製造的脈絡中出現,精實製造是一個在敏捷圈中經常使用的隱喻 - 特別是Poppendiecks。如果我不喜歡土木工程的隱喻式推論,我是否會更喜歡精實製造的隱喻式推論?
語意差異
大多數版本控制系統仰賴使用和理解人工製品不同版本之間的變更 - 通常稱為 Unix 中可以產生這些變更的指令中的差異。對於文字和二進位檔案,都有不錯的差異(和合併)演算法。這些差異的問題在於它們相當愚蠢。它們所做的就是查看兩個人工製品版本,並產生從一個版本到另一個版本的簡單方法。
多米尼克
我們最近進行了年度潛水假期。每當我們這麼做時,我們都會面臨一個兩難:我們要去我們非常喜愛的薩巴,還是嘗試新的地方?我們對此的答案是去薩巴和一個新地方,這導致了一個較長的假期,彌補了從寒冷的東北出發的漫長旅程。我們的新地方是多米尼克。
更多版本控制
作為一個一直使用版本控制的人,我認為它可以擴展到更多電腦使用領域。除了軟體開發人員之外,很少有電腦使用者使用版本控制。然而,正如軟體開發人員所知,版本控制是一個很棒的協作工作機制,允許多人共同作業於單一軟體系統。版本控制更廣泛使用的優點是什麼?
OOPSLA 2004
我參加 OOPSLA 已超過十年。它已成為我與許多朋友見面並了解他們最近在做什麼的地方,並試著了解 OO 社群的發展方向。
Clarity 之前
清楚的程式碼很好,但你應該為了可測試性而犧牲清楚嗎?
本地 D T O
如果你一直在關注我的同事 ThoughtBloggers,你就會知道似乎 我的其中一個機器人燒毀了保險絲,澳洲的陽光顯然讓這些瑞典模型變得很脆弱。
Jon 對 資料傳輸物件 感到厭煩,但這並不是因為 DTO 是壞東西,就像任何模式一樣,它們在特定情況下是有用的。模式總是包含兩個部分:如何和何時。你不僅需要知道如何實作它們,還必須知道何時使用它們以及何時讓它們保持原狀。
靜態替換
當我聆聽我們的開發團隊討論他們的作業時,一個常見的主題是他們不喜歡靜態中所保存的事物。我們通常看到常見的服務或元件保存在具有靜態初始化項目的靜態變數中。靜態(在大部分語言中)的一項重大問題是您無法使用多型來以一個實作替換另一個實作。這對我們來說很麻煩,因為我們是測試的忠實愛好者,而要進行良好的測試,能夠以 服務 Stub 替換服務非常重要。
Debian Java
在 Debian 上安裝大部分事物都非常容易:apt-get install package-name
。遺憾的是,Java 是個例外,因為它不在基本的 Debian 系統中。我最近在我的 Debian Sid 桌面上下載並安裝了 Java 1.5(或 5,或他們現在稱呼它的任何名稱)。簡而言之,程序如下。
固定範圍的幻覺
許多公司喜歡撰寫固定範圍和價格的合約,因為他們認為這樣可以降低風險。幻覺表示他們的財務義務固定在交易價格上。如果他們沒有獲得令人滿意的軟體,那麼他們就不會花費成本。
Lambda
由於對動態語言的興趣日益增加,越來越多的人接觸到一個稱為 Lambda(也稱為閉包、匿名函數或區塊)的程式設計概念。具有 C/C++/Java/C# 語言背景的人員沒有 Lambda,因此不確定它們是什麼。以下是一個簡短的說明,對於已經在具有 Lambda 的語言中進行大量程式設計的人員來說,不會覺得有趣。
Subversion
Subversion 是開放原始碼版本控制系統,基本上是 CVS 的後繼者。它修正了 CVS 中最大的問題,引入了原子提交和支援檔案及目錄重新命名等功能。我已經使用它好幾年了,發現它非常穩定。
標準故事點數
最近我聽說有人提出幾個問題,關於如何為使用極限程式規劃方法的多個團隊制定標準故事點數機制。希望所有團隊都能使用等效的故事點數,這樣一個團隊的三個故事點數的努力程度與另一個團隊相同。
我認為,盡力想出這個方法價值有限,而且最糟糕的是很危險。
麥哲倫 Meridian Gps
幾個聖誕節前,辛蒂送我一個 麥哲倫 Meridian Gold GPS 裝置。由於我的導航能力比一般人好,所以我沒有把它視為真正需要,而把它當作玩具來玩。從那以後,我發現它更像是一個有趣的玩具,而不是我經常使用的東西。
修正未知錯誤是否為重構
以下是 Przemyslaw Pokrywka 提出的一個有趣的難題。在 書中 的重構之一是 引入 Null 物件 - 一個非常有用的重構(也在 Josh 的新書 中討論過。)Przemyslaw 的觀點是,這個重構可能會改變行為。如果你有一個方法傳回 null,而且你呼叫那個 null 上的方法,你會得到一個 null 指標例外。如果你使用 Null 物件,你會得到一些預設行為。
最佳化是否為重構
如果你做出一個變更來改善程式效能,這是否為重構?
宣告順序是否為重構
變更宣告的順序是否為重構,例如 Java 程式中的方法和欄位?
快速失敗
如果軟體要往南走,吉姆在這篇文章中解釋了為什麼它應該盡快崩潰。
Junit 新執行個體
我常收到問題,這些問題圍繞著 JUnit 測試架構中的一個設計選擇,也就是為每個測試方法執行建立一個新物件。足夠保證一個快速的 bliki 條目。(不過我幾乎不得不指出,我寫關於 JUnit 的文章並不表示我不認為其他形式的測試很重要。有很多有用的測試活動,儘管 JUnit 及其相關程式對許多活動來說很有價值,但它並非萬靈丹。對於更多關於測試的部落格,我建議你看看 Brett Pettichord、Brian Marick 和 James Bach 的部落格。你也不應該假設我寫關於 xUnit 測試的文章暗示重構、用例或使用牙線不重要。)
精細細節
Cindy 非常注重木工中的精良做工。她會注意到我所忽略的各種精細細節。她特別欣賞那些看起來不起眼,但實際上做起來相當棘手的東西。
禮貌實作
當你撰寫一個類別時,你主要努力確保該類別的功能對該類別有意義。但有時為類別新增一個功能是有意義的,以使類別符合它自然應該具備的更豐富介面。
測試資源池
我正在翻閱一些舊筆記,並發現 Rich Garzaniti 給我的簡單但有用的提示。
技術人員組織
此頁面現已棄用,因為我不再認為它是有用的資訊來源。請前往 ActivityOriented 以獲得關於此主題的更佳說明
功能人員組織
此頁面現已棄用,因為我不再認為它是有用的資訊來源。請前往 OutcomeOriented 以獲得關於此主題的更佳說明
偏好功能人員組織
此頁面現已棄用,因為我不再認為它是有用的資訊來源。請前往 BusinessCapabilityCentric 以獲得關於此主題的更佳說明
開放智慧財產
有很多原因讓我安心在 Thoughtworks 工作,其中很大一部分原因是因為這裡的大多數人都與我分享一套廣泛的原則。多年來引起一些爭論的一項原則是我們對自己智慧財產的態度,基本上我們將它放棄。
Belkin Kvm Linux
(滑鼠、Belkin KVM 切換器與 Linux 的問題)
Slimp3
這些現在稱為 Squeezebox。
簽名系列標準
時常有人詢問如何讓一本書進入我的簽名系列。市面上有很多書系,每個書系都有自己的一套決定標準。以下是我決定標準
關聯資料模型
大多數人透過關聯資料庫和 SQL 語言最了解關聯資料模型。通俗地說,我們將資料庫視為一組表格,每一列都包含資料。我們可以用各種方式操作這些表格來執行查詢,每個查詢都會產生另一個表格。與 NetworkDataModel 相比,表格之間沒有明確的指標,連結是透過共用值在連結表格中建立(儘管使用替代鍵表示您實際上有指標)。
封裝集合
如果您學習物件導向設計,您很快就會了解封裝資料的重要性。最簡單的封裝形式是使用存取器(取得和設定方法)或屬性,如果您的語言支援的話。(有些甚至在類別中執行此操作 - SelfEncapsulation
現場客戶
現場客戶是極端程式設計的實務之一,是 白皮書 中提到的十二項之一。它表示客戶應與開發人員坐在開放的工作區域中,以便回答問題並與開發團隊互動。事實上,他們是開發團隊的一份子,並認知到團隊的成功與他們和開發人員一樣重要。他們不必放棄定期工作來執行此操作,但他們必須親自到場。
無斷言測試
這是朋友的朋友的一個故事。我確定這一定是真實的,至少在某個地方。
網路資料模型
網路資料模型將資料結構化為記錄類型,並使用指標連結允許在一個記錄和另一個記錄之間導覽。因此,要查詢網路資料模型,您從一個記錄開始,並在指標參考之間移動。
多個桌面
幾年前,我改變了工作生活中的重要面向。在那之前,我嘗試只在一台電腦上工作(或更嚴格地說,只使用一個硬碟)。我所有的工作檔案都保存在我的筆電硬碟中。如果我使用桌上型電腦,我會透過檔案分享功能使用那些檔案。
使用案例
使用案例是一種組織和引出需求的技術。它們最初由艾瓦·雅各布森在 80 年代後期和 90 年代初期推廣。
Wardish
形容詞:一種技術、工具或設計概念,明顯簡單到荒謬的地步,以至於不可能有任何好處,但當你開始使用它時,它卻具有一種與其簡單性不相符的力量。
Intelli Csharp
經過漫長的期待,JetBrains 的人已經為他們的 C# 工具啟動了早期存取計畫。遺憾的是,他們忽略了我的命名建議,反而稱它為ReSharper。我同事們的早期反應很熱烈,但仍希望有更多功能。
安裝 Debian
最近幾個月,我瘋狂地安裝 Debian Linux。在過去幾個月中,我的設定中出現許多新的環境。我買了一台新的桌上型電腦,並在上面安裝 Windows XP,一台裝有 MacOS X 的 Powerbook 筆記型電腦,以及一台裝有 Windows XP 的新工作用筆記型電腦。所有這些都需要花費大量時間,即使是我的工作用筆記型電腦,上面已經預先安裝了 Thoughtworks 設定的 Windows XP,仍需要花時間安裝我在工作中使用的各種應用程式。
最重要的設計準則?
每個人都有自己的一份重要設計準則清單。Scott 專注於介面,以及如何設計介面,讓它們易於正確使用,且難以錯誤使用。
資產擷取
資產擷取是開發 StranglerFigApplication 的策略。你可以將許多應用程式視為管理一組關鍵資產。薪資系統負責員工,交易系統負責交易,租賃系統負責租賃。要逐步轉換到新系統,你可以先找出你將從新系統開始的一組資產。通常,最適合從中開始的資產是簡單的資產(因為它們可以快速啟動),或那些使用舊系統特別難以處理的需求。
Strangler Fig 應用程式
當 Cindy 和我前往澳洲時,我們在昆士蘭海岸的熱帶雨林中度過一段時光。這個地區的自然奇觀之一是巨大的 絞殺無花果。它們在樹的上方枝幹上結籽,並逐漸沿著樹幹向下生長,直到它們在土壤中生根。經過多年,它們長成奇特而美麗的形狀,同時絞殺並殺死作為它們寄主的樹。
拋出估計
如果你使用 XP 風格規劃,你需要從開發人員那裡取得快速共識估計。拋出估計能讓你快速得知開發人員對估計是否有相同的看法(這樣你就可以記錄下來並繼續進行),或是有分歧(你需要更詳細地討論使用者故事)。
UML 草圖工具
我畫了很多 UML 圖,但我沒有使用 CASE 工具。原因是我對UmlAsSketch有興趣,而不是所有儲存庫的東西。到目前為止,我的常規選擇一直是 Visio。雖然 Visio 附帶 UML 範本,但我沒有使用內建範本 - 我比較喜歡Pavel Hruby的範本。
沉沒成本驅動架構
我發現這是一種很常見的架構風格。你的公司購買了一些非常昂貴的基礎設施軟體。然後你被告知你必須在專案中使用它,即使它不適合該專案,而且會讓你付出額外的努力。在為它支付了所有費用之後,你不想讓它浪費,對吧?
敏捷移交
我看到關於敏捷專案最常見的問題之一是如何處理移交給另一個團隊。如果你有一個開發團隊離開並將支援移交給支援團隊,當敏捷專案往往產生比計畫驅動流程少得多的文件時,他們該如何應對?
一般建議的限制
作為軟體開發的作家和演講者,我對我們的職業提出了大量的普遍建議。無論是像說明DecoratedCommand如何運作那樣具體,還是像如何思考你的軟體開發態度那樣富有哲理,我所製造的噪音都是無止境的。此外,我僅是廣大一般建議提供者社群中的一員:作者、分析公司、記者,這些建議比任何人都能讀到的還要多。
昨天的天氣
這項原則表示,你今天完成的工作量將與昨天完成的工作量相同。在重複的專案中,表示你應計畫在這次重複中完成與上次重複相同的工作量。此術語來自極限程式設計社群。
問題時間小組
我參加過許多會議小組,也自己組織過幾次。當我組織小組時,我喜歡使用一種特定格式,這種格式是根據英國電視時事小組「問題時間」而來。我做過幾次,而且非常喜歡這種格式,比傳統小組好多了。
數量
處理有維度的數字,例如:12 英尺和 9.99 美元
範圍
將一系列值(例如 10 月 22-25 日)視為單一物件。
訴諸權威
每隔一段時間,就會有人不只不同意我說的話,還會對我說的話感到驚慌。「像你這樣的專家說了什麼,很多人就會盲目地照你說的做」。
設計已死?
對於許多與極限程式設計接觸過的人來說,極限程式設計似乎要求軟體設計走向死亡。不僅許多設計活動被嘲笑為「大規模前期設計」,而且 UML、彈性架構,甚至模式等設計技術都被淡化或完全忽略。事實上,極限程式設計涉及許多設計,但以不同於既有軟體流程的方式進行。極限程式設計透過允許演化成為可行的設計策略的實務,讓演化設計的概念重獲新生。它也提供新的挑戰和技能,因為設計師需要學習如何進行簡單的設計,如何使用重構來保持設計的簡潔,以及如何以演化的方式使用模式。
MDA:模型師的復仇,還是 UML 烏托邦?
在 2003 年的 OOPSLA 中,Dave Thomas(OTI 的創辦人)對模型驅動架構提出了深思熟慮且有力的批評。在這篇文章中,他解釋了他認為為什麼通用的模型驅動方法可能會失敗,並指出 UML 和特定領域語言仍然有價值。
敏捷認證
敏捷方法是否應該有認證計畫?
日本
我現在已經結束我的旅程,為了回報我透過電子郵件收到的所有建議,以下是我們為期三週的日本之旅的一些感想。
敏捷適用於所有人嗎
一般的開發人員可以使用敏捷方法嗎?
程式碼範例
我寫關於設計的文章,我的觀點是,即使你在討論有點抽象的設計模式,提供原始碼範例也是有用的。當然,這可能會導致人們認為程式碼範例就是模式,但我認為程式碼提供的精確性大於這種風險。有幾次我不太確定一個想法,但程式碼範例有助於我釐清它。因此,在我關於設計的文章中,我總是試著提供程式碼範例。
指導態度
兩種 軟體開發態度 之一。指導態度認為,由於大多數開發人員並不好(據說幾乎 50% 低於平均水平),我們需要指導他們做事的方式。這種指導是為了防止他們對他們正在處理的系統造成傷害。通常,這種態度會表現在設計和工具中,這些設計和工具可以防止開發人員執行某些事情,限制他們可以做的事情,以使他們遠離複雜的領域。
啟用態度
兩個 軟體開發態度 之一。啟用態度認為開發人員是負責任的專業人員,因此應該給予他們自由,讓他們可以做任何需要做的事情。遵循此態度的設計應該讓事情易於使用,但應假設開發人員知道自己在做什麼,因此不必努力防止錯誤使用。因此,這些工具可能會被濫用,但採取的態度是使用者應該更了解,如果他們不了解,他們就應得他們所得到的。
模組組裝
模組化程式設計不只是針對介面進行程式設計,它還包括在各種模組不知道它們正在與哪些具體模組對話的情況下將模組組裝在一起。
資料模型
我早期最喜歡的書之一是 Tsichritzis 和 Lochovsky 關於資料模型的書。這本書討論了思考資料的不同模型,特別是當時討論最多的三個模型:關聯資料模型、階層資料模型 和 網路資料模型。
公開 C# 欄位
當我第一次接觸 C# 時,我就喜歡屬性的概念。C++/Java 的 getX 和 setX 約定對我來說總是顯得相當愚蠢,寫成 obj.X = other.X
自然多了。提供具有 get 和 set 方法的屬性會將常見約定轉換為語言的自然支援功能。
模型驅動架構
有些人認為 模型驅動架構 (MDA) 將會是自從從組譯器轉移到第一批高級語言以來軟體開發最大的轉變。其他人則認為它不過是活死人案例工具之夜。我屬於後者陣營,但覺得需要的不只是一個巧妙的說法。
裝飾命令
這是一個非常常見的模式,也很簡單,它實際上只是應用於命令的裝飾器模式。我看到它經常與 CommandOrientedInterface 一起使用。您還聽說這稱為攔截器,並作為面向方面程式設計的一種形式。
極低缺陷專案
當人們談論 極限程式設計 時,他們通常會專注於其適應性規劃風格,或其演化方法設計等事項。一個小但成長中的趨勢特別引起我的興趣,即極限程式設計專案的數量雖小但成長中,且缺陷率非常低,我的意思是每月低於一個生產錯誤。
控制反轉容器和依賴性注入模式
在 Java 社群中,出現了一波輕量級容器,有助於將不同專案的元件組裝成一個有凝聚力的應用程式。這些容器的基礎是一個常見的模式,說明它們如何執行配線,一個他們在非常通用的「控制反轉」名稱下引用的概念。在本文中,我深入探討此模式如何運作,在更具體的「依賴性注入」名稱下,並將其與服務定位器替代方案進行對比。它們之間的選擇不如將組態與使用分開的原則重要。
建置語言
Bruce Eckel 的 最近文章 關於 ant 和 make 觸發我分享一些我對建置語言的想法。ant 和 make 都指定建置如何發生,它們是描述建置的語言。兩者都廣泛使用且已成功。然而,兩者都遇到限制,對於較大的系統,人們通常會發現從其他程式產生他們的 ant/make 檔案。
資料庫和建置時間
以下是最近發現的一個有趣的對比。兩個規模相似的企業應用程式專案(~100 KLOC),環境類似(Java 和 .NET)。一個可以在一小時內完成完整的建置和測試,另一個則需要 2-3 分鐘。
XML 的使用
XML 已經存在一段時間了,而且被廣泛使用 - 確實比它應該被使用的還要多。與大多數工具一樣,XML 對於某些事情是有用的,但對於其他事情則不然
重構謬誤
曾經只被少數人知道的術語「重構」現在在電腦產業中被廣泛使用。我喜歡認為我對此負有部分責任,並希望它改善了一些程式設計師的生活和一些企業的底線。(重點是,我不是重構的父親或發明者 - 只是個記錄者。)
持續設計
重構、JUnit 等工具以及極限程式設計 (XP) 等敏捷方法日益普及,已經帶來了一種新的設計風格。持續設計是使用重構持續改善程式設計的過程。吉姆在本文中討論了他對持續設計的經驗,特別是國際化和交易等看似棘手的設計問題。
物件和反覆運算
從物件導向開發的初期開始,OO 設計就與反覆和增量開發連結在一起。但是,正如許多人指出的,這兩者之間沒有固有的連結。你可以在瀑布中進行 OO,你可以在沒有物件的情況下進行 IID。那麼,為什麼這兩者如此緊密地連結在一起呢?