內容簡介
本書的特色是,對於會影響專案成敗的諸多變數(如規模、複雜度、風險、顧客的要求、人力、時間、壓力……)進行動態分析;有許多例子可證明,若能在“控製點”上做好管理的工作,就可防止危機發生,或是不讓危機繼續惡化下去。溫伯格特別強調,“動作要早,動作要小”是保持軟體過程都在控製之中的關鍵。
內頁插圖
目錄
緻臺灣讀者
Prefacc to the Chinese Editions
〔導讀〕從技術到管理,失落的環節
前言
第一部 品質的模式
1 何謂品質?品質的重要性何在?
1.1 軟體品質打開的故事
1.2 品質的相對性
1.3 品質足在某人心曰中的價值
1.4 Precision Cribbage牌戲
1.5 要改善牕質九何如此閑難
1.6 軟體文化與次文化
1.7 心得與建議
1.8 摘要
1.9 練習
2 軟體次文化
2.1 剋勞斯此的想法應用於軟體業
2.2 軟體次文化的六種模式
2.3 模式0:渾然不知型
2.4 模式1:變化無常型
2.5 模式2:照章行事型
2.6 模式3:把穩方嚮型
2.7 模式4:防範木然型
2.8 模式5:全麵關照型
2.9 心得與建議
2.10 摘要
2.11 練習
3 怎樣纔能改變模式?
3.1 思維模式的政變
3.2 利用模型以選齣較佳的模式
3.3 讓模式能夠接納新資訊
3.4 心得與建議
3.5 摘要
3.6 練習
第二部 管理的模式
4 管理用的控製模式
4.1 射擊移動的標靶
4.2 榘成y(的控製模型
4.3 模式與模式的控製論模型
4.4 工程化的管理
4.5 從計算機科學到軟體工程
4.6 心得與建議
4.7 摘要
4.8 練習
5 讓管理模型變得透明
5.1 為什麼事情會不照計畫進行?
5.2 線性模型從其謬誤之處
5.3 效應圃
5.4 從輸齣結果逆嚮得齣效應圖
5.5 非線性纔是事態惡化的上因
5.6 心得與建議
5.7 摘要
5.8 練習
6 反皚效應
6.1 小矮胖癥候群
6.2 失控、棊增、與癱瘓
6.3 動作要早,動作要小
6.4 負嚮反鱸——為什麼完全沒有癱瘓發生
6.5 心得與建議
6.6 摘要
6.7 練習
……
17 如何處理停擺的壓力
18 我們努力得來的成就
註解
法則、定律、與原理一覽錶
索引
精彩書摘
何謂品質?
品質的重要性何在?
軟體行業中人對於消除「模稜兩可的用詞」可說是不遺餘力,作傢亦復如此。不過,有時作傢會故意把用詞弄得摸棱兩可,就像本書的書名。「高品質軟體管理」(Quality Software Managemcnt)的意思可以是「高品質欹體的管理」,也可以是「軟體業的高品質管理」,因為我認為這兩者是無法分割的。兩者的意思都若重於「高品質」一詞,因此我們若想在閤理的範圍內保持用詞的模稜兩可,首先我們必須將這個經常受到誤解的術語之真正涵義弄清楚。
1.1 與軟體品質有關的故事我的妹妹有個女兒名叫泰拉,她是她們傢中唯一步找後塵,以作傢為業的。她寫的是有開醫藥史方麵頗具趣味件的書籍’而我對她所寫每一本書的進展都很關心,就像那是我自己的書一樣。為瞭要提拔自傢人的這份私心,當她第一本書(美國大眾傳播媒體上的疾病).完成後,竟然發現一大堆嚴重的打字錯誤和整段的文字遺漏,這讓我感到非常難以忍受(參看圖1-1)。讓我更不能忍受的是,那些錯誤都是因她所使用的文字處理軟體——Cozy Write(輕鬆寫)——中的一個bug所造成,而該軟體足由我的一個客戶Mini Cozy(迷你輕鬆)軟體公司所發行。
泰拉請我在下一次拜訪Mini Cozy公司時,能夠和該公司討論一下這個問鱷。我找到Cozy Write的專案經理’他承認該產品中存在此一錯誤。
「這個bug很難碰得到,」他說。
「我可不這麼認為,」我反駁道「在我外甥女的書中,我可以找齣25個例子。」
「可是這類錯誤要在寫作計晝的規模有一本書這麼大的文件上纔會發生。我們的產品有超過10萬個用戶,當中可能不齣10個用戶,其寫作計畫甲一檔案的大小有到那麼大的。」
「不過,偏偏樁我的外甥女給碰上瞭。這是她的第一本書,也把她給嚇壞瞭。」
……
前言/序言
軟件工程的基石:從理論到實踐的係統化路徑 本書聚焦於現代軟件開發流程中的核心挑戰——如何構建穩定、可維護且高效的軟件係統。 它不是對某一特定編程語言或框架的介紹,而是深入剖析支撐優秀軟件工程的根本原則和方法論。通過詳盡的案例分析和對經典理論的係統闡述,本書旨在幫助讀者建立起超越技術棧限製的、宏觀的係統思維框架。 第一部分:理解復雜性與分解 軟件係統的復雜性是技術進步的必然産物,本書首先著手解決如何管理這種復雜性。我們探討瞭“大爆炸式”設計模式的弊端,並引入瞭係統的層次化分解技術。這不僅僅是模塊劃分,而是對信息流、控製流和數據存儲進行清晰邊界設定的過程。 抽象的藝術: 我們深入研究瞭如何設計有效的抽象層。良好的抽象能夠隱藏實現細節,允許團隊在不影響全局的情況下迭代局部功能。書中詳細分析瞭“關注點分離”(Separation of Concerns)的哲學內涵,並提供瞭多種實現高內聚、低耦閤的架構模式,如六邊形架構(Hexagonal Architecture)和分層架構的演進。 契約先行: 強調接口(Interface)設計的重要性遠高於實現細節。接口是係統不同部分之間的“法律文件”。我們將探討如何設計健壯的、嚮前兼容的API契約,以及如何在需求不明確時,使用最小可行契約(Minimum Viable Contract)來驅動早期開發。 第二部分:流程與節奏的同步 軟件交付絕非一蹴而就,它是一個持續、迭代的循環。本書的第二部分著眼於如何建立一個可持續的、可預測的交付節奏,將理論知識轉化為可衡量的工程實踐。 需求的真實麵貌: 需求管理是項目成敗的關鍵。本書批判性地審視瞭瀑布模型在需求凍結上的脆弱性,並闡述瞭如何將需求轉化為可執行的工作項。我們關注“用戶故事”(User Stories)背後的價值驅動,以及如何運用價值流圖(Value Stream Mapping)來識彆並消除開發過程中的浪費。 度量與反饋: “如果你無法衡量它,你就無法改進它。”本書詳細介紹瞭關鍵的軟件質量和效率指標。我們區分瞭“領先指標”(如代碼評審速度、部署頻率)和“滯後指標”(如缺陷密度、平均修復時間)。重點在於如何建立一個閉環反饋機製,確保度量結果能夠實時指導團隊的戰術調整。 持續集成與部署(CI/CD)的哲學根基: CI/CD不僅僅是工具鏈的堆砌。本書探討瞭其背後的工程哲學:任何代碼提交都必須是可驗證的、可部署的。我們討論瞭如何通過自動化測試金字塔、構建時間管理以及快速迴滾機製來構建一個“失敗是廉價的”環境。 第三部分:維護與演化的工程 軟件的生命周期中,維護和演化占據瞭絕大部分的成本。本書將大量篇幅投入到如何讓係統具備“韌性”和“適應性”。 可讀性與知識傳遞: 代碼的第二個讀者是未來的自己或同事。我們探討瞭代碼風格規範的必要性,但更強調“意圖錶達”的重要性。書中提供瞭關於有效命名、注釋的原則,並論述瞭重構何時是“必須”而非“可選”的行為。 依賴管理的藝術: 隨著係統規模的擴大,組件間的依賴關係變得錯綜復雜。本書深入分析瞭依賴注入(Dependency Injection)作為一種解耦技術的深層意義,以及如何使用版本控製策略(如語義化版本控製)來安全地引入外部庫,避免“依賴地獄”。 處理技術債務: 技術債務並非洪水猛獸,而是一種權衡的結果。關鍵在於管理它。本書提供瞭一套實用的框架,用於識彆、量化並閤理地償還技術債務,確保其始終處於可控範圍,而不是成為係統癱瘓的隱患。 第四部分:人、團隊與知識的工程 軟件是人構建的,因此,工程實踐的成功最終取決於團隊的協作效率和知識的有效共享。 溝通架構: 組織結構往往會反映在軟件架構上(康威定律)。本書探討瞭如何設計團隊結構來支持預期的架構風格,以及如何在跨職能團隊中優化技術決策流程,確保信息的高效流動。 知識沉澱與傳承: 避免“知識孤島”。我們探討瞭文檔、代碼評審和結對編程在知識傳遞中的作用。重點是如何將隱性知識轉化為顯性的、可被係統性學習的資産,以應對人員流動帶來的風險。 本書的受眾 本書麵嚮有一定實踐經驗的軟件工程師、技術主管以及尋求優化其團隊交付流程的工程經理。它要求讀者不僅關注“如何寫齣能運行的代碼”,更要關注“如何設計齣能持續演進的係統”。它提供的是一套經過時間檢驗的、跨越具體技術的係統思考工具箱。
這本書最讓我感到驚喜的是,它擺脫瞭過去軟件管理領域中常見的“工程師視角”或“純粹業務視角”的局限,成功地搭建瞭一個跨越技術、管理和商業戰略的橋梁。閱讀過程中,我不斷地將書中的理論與我親身經曆過的幾次失敗的軟件發布會進行對照。比如,書中關於“風險管理”的章節,它並不是簡單地要求我們列齣風險清單,而是要求我們從“係統彈性”的角度去設計冗餘和降級方案,確保即使最壞的情況發生,核心業務也不會完全癱瘓。這與我之前參與的項目形成瞭鮮明對比,那些項目往往隻關注“成功路徑”的優化,一旦遇到意料之外的故障,整個係統就會像多米諾骨牌一樣倒塌。作者的洞察力在於,他將軟件開發視為一個在持續對抗熵增的過程中,尋求動態平衡的活動。因此,任何管理策略都必須著眼於如何構建這種“韌性”,而不是追求虛幻的“零缺陷”。對於那些肩負著復雜、長期項目的中高層管理者來說,這本書提供的視角是革命性的,它迫使你跳齣日常的救火狀態,去思考如何從根本上提升組織的“免疫力”。