内容简介
本書的特色是,對於會影響專案成敗的諸多變數(如規模、複雜度、風險、顧客的要求、人力、時間、壓力……)進行動態分析;有許多例子可證明,若能在“控制點”上做好管理的工作,就可防止危機發生,或是不讓危機繼續惡化下去。溫伯格特別強調,“動作要早,動作要小”是保持軟體過程都在控制之中的關鍵。
内页插图
目录
致臺灣讀者
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)作为一种解耦技术的深层意义,以及如何使用版本控制策略(如语义化版本控制)来安全地引入外部库,避免“依赖地狱”。 处理技术债务: 技术债务并非洪水猛兽,而是一种权衡的结果。关键在于管理它。本书提供了一套实用的框架,用于识别、量化并合理地偿还技术债务,确保其始终处于可控范围,而不是成为系统瘫痪的隐患。 第四部分:人、团队与知识的工程 软件是人构建的,因此,工程实践的成功最终取决于团队的协作效率和知识的有效共享。 沟通架构: 组织结构往往会反映在软件架构上(康威定律)。本书探讨了如何设计团队结构来支持预期的架构风格,以及如何在跨职能团队中优化技术决策流程,确保信息的高效流动。 知识沉淀与传承: 避免“知识孤岛”。我们探讨了文档、代码评审和结对编程在知识传递中的作用。重点是如何将隐性知识转化为显性的、可被系统性学习的资产,以应对人员流动带来的风险。 本书的受众 本书面向有一定实践经验的软件工程师、技术主管以及寻求优化其团队交付流程的工程经理。它要求读者不仅关注“如何写出能运行的代码”,更要关注“如何设计出能持续演进的系统”。它提供的是一套经过时间检验的、跨越具体技术的系统思考工具箱。
这本厚重的书刚拿到手,封面设计就透露着一股老派的严谨感,没有时下流行的花哨图案,只有沉稳的字体和清晰的排版,让人感觉它不是一本“快餐式”的管理读物,而是一部需要坐下来,沏上一壶好茶,慢慢研读的案头书。我最欣赏的是它整体的“系统化”倾向,它不满足于给出几个孤立的“最佳实践”,而是试图构建一个完整的思考框架。比如,它花了大篇幅去讨论“需求波动”如何影响整个开发周期的稳定性和成本结构,这在国内很多同类书籍中是很少见的,那些书往往更侧重于流程的表层优化,比如如何写更清晰的用户故事。这本书则深入到哲学的层面,探讨了“不确定性”本身就是软件工程的固有属性,管理者必须学会与之共舞,而不是徒劳地试图消灭它。这种底层逻辑的重塑,对于那些总想用线性思维去套用敏捷或瀑布模型的团队来说,无疑是一剂强心针,它提醒我们,工具和方法论是次要的,底层的心智模型才是决定成败的关键。阅读过程中,我常常需要停下来,结合自己团队最近遇到的瓶颈去反思,那些曾经被我视为“突发状况”的事件,放在作者构建的系统图景中,其实都有迹可循,只是我缺乏一个足够广阔的视野去预判它们的位置和影响。