7 指导实践的原则¶
说明
本文档由 AI 生成
这一章(Chapter 7: Principles that Guide Practice)非常有深度,它跳出了具体的“工具”和“语法”,转而探讨软件工程中的**“道”**(原则)。正如 PPT 开头引用的那句话所说,技术知识的半衰期很短,但工程原则却能贯穿整个职业生涯。
这一章的内容非常庞杂,涵盖了从宏观的**过程原则**到微观的**编码原则**,以及沟通、建模、测试等各个环节。
以下是为你整理的详细笔记:
📚 软件工程 Chapter 7: 指导实践的原则 (Principles that Guide Practice)¶
1. 指导过程的原则 (Principles that Guide Process)¶
这部分是宏观层面的管理哲学,适用于任何过程模型(无论是瀑布还是敏捷)。
- 核心过程原则 (Core Process Principles):
- 保持敏捷 (Be agile): 无论采用何种模型,都应遵循敏捷的基本原则。
- 关注质量 (Focus on quality): 每个活动的出口条件都必须包含质量检查。
- 准备适应 (Be ready to adapt): 过程不是宗教,要根据问题、人员和项目的约束进行调整。
- 建立高效团队 (Build an effective team): 核心是人,建立自组织、互相信任的团队。
- 建立沟通机制 (Establish communication): 防止信息遗漏和协调失败。
- 管理变更 (Manage change): 必须建立机制来管理变更的请求、评估和实施。
- 评估风险 (Assess risk): 为可能出错的事情建立应急计划。
- 创造有价值的工作产品 (Create value): 只创建那些对后续活动有价值的工件。
2. 指导实践的通用原则 (Principles that Guide Practice)¶
这部分是技术层面的通用指导思想。
- 通用技术原则 (General Technical Principles):
- 分而治之 (Divide and conquer): 即**关注点分离 (Separation of Concerns, SoC)**。
- 理解抽象 (Understand abstraction): 用简单的词汇表达复杂元素的含义。
- 追求一致性 (Strive for consistency): 熟悉的上下文能降低使用难度。
- 关注信息传递 (Focus on information transfer): 特别注意接口(Interface)的分析、设计、构建和测试。
- 有效的模块化 (Effective modularity): 将 SoC 哲学落地为具体的模块。
- 寻找模式 (Look for patterns): 利用设计模式解决反复出现的问题。
- 多视角表达 (Multiple perspectives): 从不同角度描述问题和解决方案。
- 考虑维护性 (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,但不能僵化。
- 核心原则:
- 理解范围 (Understand scope): 知道要去哪里。
- 客户参与 (Involve customer): 客户定义优先级。
- 迭代规划 (Iterative): 计划不是一成不变的。
- 基于已知估算 (Estimate based on known): 根据当前理解估算工作量和成本。
- 考虑风险 (Consider risk): 高风险需制定应急计划。
- 实事求是 (Be realistic): 人不可能每天 100% 高效工作(通常按 50-60% 计算)。
- 调整粒度 (Adjust granularity): 根据计划阶段调整细节层次。
- 定义质量保证 (Define quality): 计划中要包含如何保证质量。
- 容纳变更 (Accommodate change): 计划要能适应变更。
- 频繁跟踪 (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 的原则。
- 核心原则:
- 可追溯性: 所有测试都应可追溯到客户需求。
- 提前计划: 测试应在开始测试前很久就计划好。
- 帕累托原则 (Pareto): 80% 的错误可能来自 20% 的模块。
- 从小到大: 测试应从“小”(单元)开始,向“大”(系统)发展。
- 穷尽测试不可能: 不可能进行穷尽测试。
- 工作量匹配: 测试努力程度应与预期故障密度成正比。
- 静态测试有效: 代码审查等静态测试效果很好。
- 跟踪缺陷: 寻找缺陷模式。
- 包含正确用例: 包括证明软件行为正确的测试用例。
10. 部署原则 (Deployment Principles)¶
- 管理期望: 必须管理客户对软件的期望。
- 打包测试: 组装并测试完整的交付包。
- 建立支持: 交付前必须建立支持机制。
- 提供材料: 为最终用户提供适当的教学材料。
- 先修复后交付: 对于有缺陷的软件,先修复,后交付。
💡 复习重点总结 (Key Takeaways for Exam)¶
- 核心思想: 理解为什么说“原则比工具更重要”(因为半衰期长)。
- 关键区分:
- 需求模型 vs. 设计模型:前者描述“做什么”(信息、功能、行为),后者描述“怎么做”(架构、接口、组件)。
- 敏捷建模 vs. 传统建模:敏捷强调“轻装上阵”、“有用优于完美”、“旅行轻便 (Travel light)”。
- 重要概念:
- 关注点分离 (SoC) 和 模块化 (Modularity) 是设计的基石。
- Living Model (活模型):模型和代码紧密耦合,双向同步。
- 测试铁律: 记住测试的几个核心原则,特别是“测试应追溯到需求”、“穷尽测试不可能”和“帕累托原则”。
- 沟通技巧: 理解“倾听”、“引导者”和“可视化”的重要性。
这一章虽然概念多,但很多都是常识的提炼,理解了逻辑后记忆会很轻松。祝你复习顺利!
评论区
欢迎在评论区指出文档错误,为文档提供宝贵意见,或写下你的疑问