跳转至

7 指导实践的原则

说明

本文档由 AI 生成

这一章(Chapter 7: Principles that Guide Practice)非常有深度,它跳出了具体的“工具”和“语法”,转而探讨软件工程中的**“道”**(原则)。正如 PPT 开头引用的那句话所说,技术知识的半衰期很短,但工程原则却能贯穿整个职业生涯。

这一章的内容非常庞杂,涵盖了从宏观的**过程原则**到微观的**编码原则**,以及沟通、建模、测试等各个环节。

以下是为你整理的详细笔记:


📚 软件工程 Chapter 7: 指导实践的原则 (Principles that Guide Practice)

1. 指导过程的原则 (Principles that Guide Process)

这部分是宏观层面的管理哲学,适用于任何过程模型(无论是瀑布还是敏捷)。

  • 核心过程原则 (Core Process Principles):
    1. 保持敏捷 (Be agile): 无论采用何种模型,都应遵循敏捷的基本原则。
    2. 关注质量 (Focus on quality): 每个活动的出口条件都必须包含质量检查。
    3. 准备适应 (Be ready to adapt): 过程不是宗教,要根据问题、人员和项目的约束进行调整。
    4. 建立高效团队 (Build an effective team): 核心是人,建立自组织、互相信任的团队。
    5. 建立沟通机制 (Establish communication): 防止信息遗漏和协调失败。
    6. 管理变更 (Manage change): 必须建立机制来管理变更的请求、评估和实施。
    7. 评估风险 (Assess risk): 为可能出错的事情建立应急计划。
    8. 创造有价值的工作产品 (Create value): 只创建那些对后续活动有价值的工件。

2. 指导实践的通用原则 (Principles that Guide Practice)

这部分是技术层面的通用指导思想。

  • 通用技术原则 (General Technical Principles):
    1. 分而治之 (Divide and conquer): 即**关注点分离 (Separation of Concerns, SoC)**。
    2. 理解抽象 (Understand abstraction): 用简单的词汇表达复杂元素的含义。
    3. 追求一致性 (Strive for consistency): 熟悉的上下文能降低使用难度。
    4. 关注信息传递 (Focus on information transfer): 特别注意接口(Interface)的分析、设计、构建和测试。
    5. 有效的模块化 (Effective modularity): 将 SoC 哲学落地为具体的模块。
    6. 寻找模式 (Look for patterns): 利用设计模式解决反复出现的问题。
    7. 多视角表达 (Multiple perspectives): 从不同角度描述问题和解决方案。
    8. 考虑维护性 (Remember maintenance): 永远记住后面会有某人来维护这段代码。

3. 沟通原则 (Communication Principles)

沟通是项目失败最常见的原因,这些原则旨在提高沟通效率。

  • 关键点:
    • 倾听 (Listen): 专注于听,而不是构思回应。
    • 准备 (Prepare): 会前花时间理解问题。
    • 引导者 (Facilitator): 会议必须有领导来控制方向和解决冲突。
    • 面对面 (Face-to-face): 最佳方式,但最好有辅助材料(如图表)。
    • 记录 (Take notes): 指定记录员,记录所有重点和决策。
    • 协作 (Collaboration): 结合集体智慧达成共识。
    • 保持专注 (Stay focused): 模块化讨论,防止话题跳跃。
    • 可视化 (Draw a picture): 如果不清除,就画图。
    • 推进 (Move on): 达成一致就前进;无法达成一致也前进(搁置);功能不清除就前进(后续再议)。
    • 谈判 (Negotiation): 双赢,不是竞赛。

4. 计划原则 (Planning Principles)

计划是 roadmap,但不能僵化。

  • 核心原则:
    1. 理解范围 (Understand scope): 知道要去哪里。
    2. 客户参与 (Involve customer): 客户定义优先级。
    3. 迭代规划 (Iterative): 计划不是一成不变的。
    4. 基于已知估算 (Estimate based on known): 根据当前理解估算工作量和成本。
    5. 考虑风险 (Consider risk): 高风险需制定应急计划。
    6. 实事求是 (Be realistic): 人不可能每天 100% 高效工作(通常按 50-60% 计算)。
    7. 调整粒度 (Adjust granularity): 根据计划阶段调整细节层次。
    8. 定义质量保证 (Define quality): 计划中要包含如何保证质量。
    9. 容纳变更 (Accommodate change): 计划要能适应变更。
    10. 频繁跟踪 (Track frequently): 项目是一天一天拖后腿的,所以要一天一天地跟踪。

5. 建模原则 (Modeling Principles)

建模是为了理解复杂系统。

  • 模型分类:
    • 需求模型 (Requirements models): 描述客户需求(信息、功能、行为域)。
    • 设计模型 (Design models): 描述架构、UI、组件细节。
  • 敏捷建模 (Agile Modeling):
    • 轻装上阵 (Travel light): 不创建不必要的模型。
    • 简单 (Simplest): 用最简单的模型描述问题。
    • 适应变化 (Amenable to change): 模型要容易修改。
    • 明确目的 (Explicit purpose): 每个模型都要有明确目的。
    • 有用优于完美 (Useful > Perfect): 建立有用的模型,而不是完美的模型。
  • Living Modeling (活模型):
    • 利益相关者中心 (Stakeholder-centric): 针对特定任务。
    • 模型与代码紧耦合 (Models & code): 模型和代码要保持同步。
    • 双向信息流 (Bidirectional): 模型和代码之间要有双向同步。
    • 持久化 (Persistent): 模型信息要持久化以跟踪变更。

6. 需求建模原则 (Requirements Modeling Principles)

  • 必须表示并理解问题的信息域。
  • 必须定义软件执行的功能。
  • 必须表示软件对外部事件的行为。
  • 模型必须分层(或分层)揭示细节。
  • 分析任务应从本质信息向实现细节过渡。

7. 设计建模原则 (Design Modeling Principles)

  • 可追溯性 (Traceable): 设计应可追溯到需求模型。
  • 考虑架构 (Architecture): 始终考虑系统架构。
  • 数据与处理并重 (Data & Processing): 数据设计和处理功能设计一样重要。
  • 精心设计接口 (Interfaces): 内部和外部接口都要小心设计。
  • 以用户为中心 (User interface): 符合最终用户需求,强调易用性。
  • 功能独立 (Functionally independent): 组件级设计应功能独立。
  • 松耦合 (Loosely coupled): 组件之间应松耦合。
  • 易于理解 (Understandable): 设计表示应易于理解。
  • 迭代开发 (Iterative): 设计应迭代进行。
  • 不排斥敏捷 (Not preclude agile): 创建设计模型并不排斥使用敏捷方法。

8. 构建原则 (Construction Principles)

编码和测试是构建活动的核心。

  • 准备阶段 (Preparation):
    • 理解问题。
    • 理解基本设计原则。
    • 选择合适的编程语言和环境。
    • 创建单元测试。
  • 编码阶段 (Coding):
    • 遵循结构化编程实践。
    • 考虑结对编程。
    • 选择满足设计需求的数据结构。
    • 理解软件架构,创建一致的接口。
    • 保持条件逻辑尽可能简单。
    • 创建易于测试的嵌套循环。
    • 选择有意义的变量名。
    • 编写自文档化的代码。
    • 创建有助于理解的视觉布局(缩进、空行)。
  • 验证阶段 (Validation):
    • 适当进行代码走查 (Code walkthrough)。
    • 执行单元测试并修正错误。
    • 重构代码 (Refactor)。

9. 测试原则 (Testing Principles)

引用了 Al Davis 的原则。

  • 核心原则:
    1. 可追溯性: 所有测试都应可追溯到客户需求。
    2. 提前计划: 测试应在开始测试前很久就计划好。
    3. 帕累托原则 (Pareto): 80% 的错误可能来自 20% 的模块。
    4. 从小到大: 测试应从“小”(单元)开始,向“大”(系统)发展。
    5. 穷尽测试不可能: 不可能进行穷尽测试。
    6. 工作量匹配: 测试努力程度应与预期故障密度成正比。
    7. 静态测试有效: 代码审查等静态测试效果很好。
    8. 跟踪缺陷: 寻找缺陷模式。
    9. 包含正确用例: 包括证明软件行为正确的测试用例。

10. 部署原则 (Deployment Principles)

  • 管理期望: 必须管理客户对软件的期望。
  • 打包测试: 组装并测试完整的交付包。
  • 建立支持: 交付前必须建立支持机制。
  • 提供材料: 为最终用户提供适当的教学材料。
  • 先修复后交付: 对于有缺陷的软件,先修复,后交付。

💡 复习重点总结 (Key Takeaways for Exam)

  1. 核心思想: 理解为什么说“原则比工具更重要”(因为半衰期长)。
  2. 关键区分:
    • 需求模型 vs. 设计模型:前者描述“做什么”(信息、功能、行为),后者描述“怎么做”(架构、接口、组件)。
    • 敏捷建模 vs. 传统建模:敏捷强调“轻装上阵”、“有用优于完美”、“旅行轻便 (Travel light)”。
  3. 重要概念:
    • 关注点分离 (SoC)模块化 (Modularity) 是设计的基石。
    • Living Model (活模型):模型和代码紧密耦合,双向同步。
  4. 测试铁律: 记住测试的几个核心原则,特别是“测试应追溯到需求”、“穷尽测试不可能”和“帕累托原则”。
  5. 沟通技巧: 理解“倾听”、“引导者”和“可视化”的重要性。

这一章虽然概念多,但很多都是常识的提炼,理解了逻辑后记忆会很轻松。祝你复习顺利!

评论区

欢迎在评论区指出文档错误,为文档提供宝贵意见,或写下你的疑问