III. 团队项目管理与敏捷开发

2025 年 3 月 3 日

本篇笔记总结了软件工程中团队项目管理与敏捷开发的核心概念。首先,介绍了软件项目管理的四个关键要素(人员、产品、过程、项目)以及主要干系人角色,并探讨了团队领导者的 MOI 模型和不同的软件团队结构。随后,分析了团队协调与沟通的重要性,并强调了避免团队“毒性”的必要性。接着,笔记详细介绍了敏捷开发的核心理念,包括敏捷宣言、敏捷原则、敏捷团队的特点以及敏捷开发过程的关键实践,如极限编程(XP)、Scrum 和动态系统开发方法(DSDM)。最后,讨论了敏捷建模和敏捷统一过程(AUP),强调了敏捷方法在软件开发中的灵活性和高效性。(由 gpt-4o 生成摘要)

Ch.31 Project Management Concepts

1. The Four P's

在软件项目管理中,有四个关键要素(被称为 四个 P(The Four P's)),它们共同决定着项目的成败。

  • 人员(People):这是项目成功的最重要的因素。
  • 产品(Product):指的是要构建的软件本身。
  • 过程(Process):指为了完成软件工程工作而采用的一系列框架活动和软件工程任务。
  • 项目(Project):指的是使产品成为现实所需完成的所有工作。

2. Stakeholders

干系人(Stakeholder) 是指所有受到项目影响或者对项目有影响的个人或组织。主要的软件项目干系人包括:

  • 高级管理者(Senior manager):他们定义业务问题,这些问题通常对项目有重大影响。高级管理者的支持和决策对项目的资源分配和方向具有重要意义。
  • 项目经理(Project manager) / 技术经理(technical manager):负责计划、激励、组织和控制进行软件工作的实践者。
  • 实践者(Practitioner):提供工程化产品或应用所需的技术技能,包括程序员、设计师、测试人员等。
  • 顾客(Customer):包括提出软件需求的人员和对结果有间接兴趣的其他相关方。
  • 最终用户(End-user):软件发布投入生产使用后与之交互的人员。

3. The MOI Model

MOI 模型(The MOI Model) 概括了优秀的 团队领导者(Team Leader) 需要具备的三个关键能力:

  • 激励(Motivation):鼓励技术人员尽最大能力进行生产(通过“push or pull”)。
  • 组织(Organization):塑造现有流程(或创建新流程),使最初的概念转化为最终产品。
  • 想法或创新(Ideas or innovation):鼓励人们即使在为特定的软件产品或应用程序建立的界限内工作时,也能创造并感到有创造力。团队领导者需要营造鼓励创新的氛围,激发团队成员的创造潜力,从而产生更具竞争力的软件产品。

4. Software Team Structure

选择软件项目团队结构时,必须考虑以下因素:

  • 要解决的问题的难度。
  • 最终程序的大小(以代码行或功能点计)。
  • 团队将保持在一起的时间(团队 寿命(lifetime))。
  • 问题可以 模块化(modularized) 的程度。
  • 要构建的系统的所需质量和 可靠性(reliability)
  • 交付日期的 严格性(regidity)
  • 项目所需的社交性(沟通程度)。

4.1. Organizational Paradigms

组织范式(Organizational Paradigm) 描述了不同的团队组织结构和管理风格。Constantine 提出了四种组织范式:

  • 封闭范式(closed paradigm):按照传统的等级权威结构组织团队,强调集中控制和层级管理。
  • 随机范式(random paradigm):结构松散地组织团队,并依赖于团队成员的 个人自驱力。这种范式鼓励创新和自由。
  • 开放范式(open paradigm):试图以一种方式组织团队,使其实现与封闭范式相关的一些控制,但也实现了使用随机范式时发生的许多创新。——试图在控制和创新之间找到平衡,是综合了前两个。
  • 同步范式(synchronous paradigm):依赖于问题的自然划分,并组织团队成员在问题的各个部分上工作,团队成员之间几乎没有积极的沟通。同步范式适用于问题可以被清晰地分解为独立模块的项目,各模块可以并行开发。

4.2. Avoid Team "Toxicity"

团队“毒性(Toxicity)”指的是阻碍团队有效工作并导致项目失败的负面因素。应该努力避免以下团队“毒性”:

  • 疯狂的工作氛围,使得团队成员浪费精力,失去对工作目标的关注。
  • 个人冲突、业务目标不明确、技术难题等导致团队成员之间产生 矛盾(friction)挫折(frustration)
  • 分散的(fragmented)协调不良的(poorly coordinated) 程序” 或定义不明确或选择不当的流程模型,成为完成任务的障碍。流程混乱、缺乏规范、流程模型不适合项目特点都可能导致团队工作效率低下。
  • 角色定义不清导致项目成员缺乏 责任感(accountability),并随之而来引发 互相指责(finger-pointing)
  • 持续和反复的失败,这将导致团队成员的信心丧失,士气(morale) 低落。

5. Agile Teams

敏捷团队(agile team) 是一种适应性强、高效协作的团队模式,特别适用于需求变化频繁的项目。敏捷团队具有以下特点:

  • 团队成员之间必须相互信任。
  • 技能的分布必须适合问题,团队成员之间能够形成互补的技能组合。
  • 为了保持团队凝聚力,可能必须将特立独行者排除在团队之外。
  • 团队是“自组织”的:
    • 自适应(adaptive) 的团队结构:敏捷团队的结构可以根据项目需要灵活调整。
    • 使用随机 / 开放 / 同步范式的元素,敏捷团队综合了这些范式的优点。
    • 成员拥有高度的 自主权(autonomy)

6. Team Coordination & Communication

有效的 团队协调与沟通(Team Coordination & Communication) 是项目成功的关键保障。团队可以使用多种沟通方式:

  • 正式的、非个人方法(formal & impersonal approaches):包括软件工程文档、工作产品、技术备忘录、项目里程碑、进度表和项目控制工具(第 23 章)、变更请求和相关文档、错误跟踪报告、和存储库数据(第 26 章)。这些方法主要用于记录和传递项目信息,例如需求文档、设计文档、代码、测试报告等。
  • 正式的、人际程序(formal & interpersonal procedures):侧重于应用于软件工程工作产品的质量保证活动(第 25 章)。这些包括状态审查会议以及设计和代码检查。例如:评审会议、代码审查、走查等,这些方法主要用于确保软件质量。
  • 非正式的、人际程序(informal & interpersonal procedures):包括用于信息传播和问题解决的小组会议以及“需求和开发人员的搭配”,如头脑风暴等。
  • 电子通讯(electronic communication):包括电子邮件、电子公告板,以及扩展的、基于视频的会议系统,这些方法可以打破时间和空间的限制,方便团队成员远程沟通。
  • 人际网络(interpersonal networking):包括与团队成员和项目外部人员的非正式讨论,他们可能拥有有帮助的经验或见解。

7. The Product Scope

产品范围(The Product Scope) 定义了软件系统需要实现的功能和特性,它必须在管理和技术层面都是明确和可理解的。产品范围需要从以下几个方面进行描述:

  • 背景(Context):要构建的软件如何适应更大的系统、产品或业务背景?由此产生什么约束? 理解软件的背景有助于确定其边界和约束条件。
  • 信息目标(Information objectives):软件作为输出产生哪些客户可见的数据对象?需要哪些数据对象作为输入? 明确输入和输出数据对象有助于定义软件的功能和数据处理流程。
  • 功能和性能(Function and performance):软件执行什么功能将输入数据转换为输出?是否需要解决任何特殊的性能特征? 定义软件的功能和性能指标,有助于指导软件设计和开发。

7.1. Problem Decomposition

问题分解(Problem Decomposition) 有时也称为 分区(partitioning)问题细化(problem elaboration)

  • 一旦定义了范围,其可以被分解为 组成功能(constituent functions)、用户可见的 数据对象(data objects)、一组 问题类(problem classes)……
  • 分解过程将持续进行,直到定义了所有功能或问题类为止。
  • 目的:将复杂的问题分解为更小、更易于管理和解决的子问题。

8. The Process

项目的 过程(process) 框架的搭建需要考虑以下要素:

  • 项目 特点(characteristic)
  • 确定所需的 严谨程度(degree of rigor)
  • 为每个软件工程活动定义 任务集(task set)——任务集包含以下内容:
    • 软件工程任务(software engineering task):为了完成特定的软件工程活动而需要执行的具体任务,如需求分析、设计、编码、测试等等。
    • 工作产品(work product):可交付物,包括需求文档、源代码、测试用例等等
    • 质量保证点(quality assurance point):如测试或。
    • 里程碑(milestone):项目进展过程中的重要事件或时间节点。

Melding the Problem and the ProcessMelding the Problem and the Process

9. The Project

项目在以下情况下会陷入困境...

  • 软件人员不了解客户的需求。
  • 产品范围定义不明确。
  • 变更管理不善。
  • 选择的技术发生变化。
  • 业务需求发生变化或定义不明确。
  • 截止日期 不切实际(unrealistic)
  • 用户抵制。
  • 赞助(sponsorship) 丢失或未正确获得。
  • 项目团队缺乏具有适当技能的人员。
  • 管理人员(和实践者)没有从最佳实践中吸取教训。

9.1. Common-Sense Approach to Projects

对项目采取 常识性方法(Common-Sense Approach to Projects),可以有效地提高项目成功率。这包含以下几个关键原则:

  • 良好的开端(Start on the right foot):努力(非常努力)理解要解决的问题,然后设定切合实际的目标和期望。项目启动阶段至关重要,需要充分理解客户需求,明确项目目标和范围。
  • 保持动力(Maintain momentum):项目经理必须提供激励措施,以最大限度地减少人员流动,团队应强调其执行的每项任务的质量,高级管理层应尽一切可能不干涉团队的工作。保持团队稳定、重视质量、减少外部干扰,都有助于项目保持良好势头。
  • 跟踪进展(Track progress):对于软件项目,当工作产品(例如,模型、源代码、成套测试用例)被生产出来并作为质量保证活动的一部分获得批准(使用正式技术评审)时,就会跟踪进展。通过定期跟踪项目进展,及时发现和解决问题,确保项目按计划进行。
  • 做出明智的决定(Make smart decisions):本质上,项目经理和软件团队的决定应该是“保持简单”。在项目决策过程中,应优先考虑简单有效的方案,避免过度设计和复杂化。
  • 进行事后分析(Conduct a postmortem analysis):为每个项目建立一致的机制,以吸取经验教训。项目结束后,应进行回顾和总结,提炼经验教训,为后续项目提供借鉴。

9.2. To Get to the Essence of a Project

Barry Boehm 提出了以下五个 W 和两个 H,以帮助抓住项目的核心要点:

CN EN
为什么要开发系统? Why is the system being developed?
将要完成什么? What will be done?
何时完成? When will it be accomplished?
谁负责? Who is responsible?
他们在组织结构中的位置在哪里? Where are they organizationally located?
如何在技术和管理上完成这项工作? How will the job be done technically and managerially?
每种 资源(resource)(例如,人员、软件、工具、数据库)需要多少? How much of each resource (e.g., people, software, tools, database) will be needed?

9.3. Critical Practices

以下是一些关键实践(Critical Practices),可以显著提高软件项目成功率:

CN EN
系统的风险管理 Formal risk management
经验成本和进度估算 Empirical cost and schedule estimation
基于度量的(metrics-based) 项目管理 Metrics-based project management
挣值(earned value) 跟踪 Earned value tracking
针对质量目标的 缺陷跟踪(defect tracking) Defect tracking against quality targets
以人为本的项目管理 People aware project management

Ch.5 Agile Development

1. Agile Development

1.1. The Manifesto for Agile Software Development

由 Kent Beck 提出的敏捷软件开发 宣言(manifesto) 的核心价值观是:

  • 个体与互动(Individuals and interactions) 胜过 流程与工具(processes and tools)
  • 可工作的软件(Working software) 胜过 完善的文档(comprehensive documentation)
  • 客户合作(Customer collaboration) 胜过 合同谈判(contract negotiation)
  • 响应变化(Responding to change) 胜过 遵循计划(following a plan)

1.2. What is "Agility"?

敏捷(Agility) 意味着:

CN EN
所有 干系人(stakeholder) 之间有效的沟通 Effective communication among all stakeholders
将客户融入团队 Drawing the customer onto the team
组织团队使其能够掌控工作 Organizing a team so that it is in control of the work performed
进而实现:快速、增量式的软件交付(逐步交付软件,而不是一次性交付所有功能) Yielding... Rapid, incremental delivery of software

Agility and the Cost of ChangeAgility and the Cost of Change

2. Agile Process

典型的 敏捷开发过程(Agile Process) 具有以下特点:

CN EN
根据客户的需求描述驱动敏捷开发 Is driven by customer descriptions of what is required (scenarios)
必须认识到计划是短期的,承认计划需要不断调整和迭代,不能奢求直接得到长期计划 Recognizes that plans are short-lived
通过高度强调构建活动来迭代地开发软件——每个迭代周期都需要包含设计、编码和测试环节,确保都能产生可工作的版本 Develops software iteratively with a heavy emphasis on construction activities
将软件分解成多个“软件增量”并交互给客户 Delivers multiple software increments
随着变化而适应——能够根据项目进展和客户需求灵活调整方向 Adapts as changes occur

3. Agility Principles

敏捷开发遵循以下 12 条 敏捷开发原则(Agility principles)

CN EN
最重要的目标是通过尽早和持续交付有价值的软件来满足客户。 Our highest priority is to satisfy the customer through early and continuous delivery of valuable software.
欢迎需求变化,即使在项目后期。敏捷过程 利用(harness) 变化来为客户创造竞争优势。 Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.
经常交付可工作的软件,交付周期从几周到几个月不等,倾向于较短的周期。 Deliver working software frequently, from a couple of weeks to a couple of months, with a preference to the shorter timescale.
业务人员和开发人员必须在整个项目中每天一起工作。 Business people and developers must work together daily throughout the project.
围绕积极主动的个人构建项目。为他们提供所需的环境和支持,并信任他们能够完成工作。 Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.
与开发团队进行信息传递的最有效方法是 面对面(face-to-face) 的交谈 The most efficient and effective method of conveying information to and within a development team is face-to-face conversation.
可工作的软件是衡量进度的 主要指标(primary measure) Working software is the primary measure of progress.
敏捷过程提倡 可持续的(sustainable) 开发。发起人、开发者和用户应该能够 无限期地(indefinitely) 保持稳定的节奏。 Agile processes promote sustainable development. The sponsors, developers, and users should be able to maintain a constant pace indefinitely.
持续关注技术卓越和良好设计有助于提高敏捷性。 Continuous attention to technical excellence and good design enhances agility.
简洁(simplicity) 至关重要,应最大限度地减少工作量。 Simplicity - the art of maximizing the amount of work not done - is essential.
最好的架构、需求和设计来自 自组织的(self-organizing) 团队。 The best architectures, requirements, and designs emerge from self-organizing teams.
团队 定期(at regular intervals) 反思如何变得更有效率,并据此调整自身的行为。 At regular intervals, the team reflects on how to become more effective, then tunes and adjusts its behavior accordingly.

4. Human Factors

在敏捷开发中,人为因素(Human Factors) 至关重要。开发过程应该去 适应(mold) 人和团队的 需求(need)。以下是敏捷团队成员和团队必须具备的关键特质:

  • 能力(Competence):团队成员需要具备完成工作所需的专业技能和知识。
  • 共同目标(Common focus):团队成员需要对项目目标有统一的认识和认同。
  • 协作(Collaboration):团队成员之间需要密切合作,共同解决问题。
  • 决策能力(Decision-making ability):团队需要拥有自主决策的能力,快速响应变化。
  • 模糊问题解决能力(Fuzzy problem-solving ability):面对不确定性和模糊性,团队需要能够灵活应变,找到解决方案。
  • 相互信任和尊重(Mutual trust and respect):团队成员之间需要相互信任和尊重,营造积极和谐的工作氛围。
  • 自组织(Self-organization):团队需要具备自组织能力,自主管理和分配任务。

5. Agile Progress Examples

5.1. Extreme Programming

极限编程(Extreme Programming, XP) 是最广泛使用的一种敏捷开发过程,最初由 Kent Beck 提出。

  • XP Planning
    • 从创建 用户故事(user stories) 开始——用户故事是描述用户需求的一种简洁方式。
    • 敏捷团队评估每个用户故事并分配成本。
    • 用户故事被分组形成 可交付的(deliverable) 增量。
    • 做出 交付日期(delivery date)许诺(commitment)
    • 使用 项目速度(project velocity) 帮助定义后续增量的交付日期——项目速度指每个迭代周期内需要完成的工作量。
  • XP Design
    • 遵循 KIS 原则(Keep It Simple, KIS),保持设计简单。
    • 鼓励使用 类-职责-协作卡(Class-Responsibility-Collaboration card, CRC card)(第 8 章)。
    • 对于困难的设计问题,使用小型的设计 原型(prototype) 来探索和验证设计方案的可行性,称作“spike solutions”。
    • 鼓励 重构(refactoring),通过迭代改进内部程序设计。
  • XP Coding
    • 建议在开始编码之前,为用户故事构建 单元测试(unit test)
    • 鼓励 结对编程(pair programming)
  • XP Testing
    • 每天执行所有单元测试——可以使用 持续集成(Continuous Integration, CI) 工具。
    • 验收测试(Acceptance test):由客户定义,用于评估软件是否满足客户的需求。

Adaptive Software DevelopmentAdaptive Software Development

5.2. Industrial XP

工业极限编程(Industrial Extreme Programming, IXP) 是 XP 的扩展和增强版本,更加注重管理、客户角色和技术实践。其包含六个新的实践:

  • 准备度评估(Readiness assessment):在项目开始前评估团队和组织的敏捷开发准备程度。
  • 项目社区(Project community):强调建立积极协作的项目社区,包括所有利益相关者。
  • 项目章程(Project chartering):制定清晰的项目目标、范围和愿景。
  • 测试驱动管理(Test driven management):使用测试结果来驱动项目管理和决策。
  • 回顾(Retrospectives):定期回顾和总结项目经验,持续改进。
  • 持续学习(Continuous learning):鼓励团队成员持续学习和提升技能。

5.3. Scrum

Scrum 最初由 Schwaber 和 Beedle 提出,其显著特点包括:

  • 将大的开发工作划分为一个一个小的 包(packets)
  • 测试和文档在产品构建过程中持续进行,贯穿始终。
  • 通过 待办事项列表(backlog) 划出若干段的开发周期,称为 “冲刺(sprints)”。
  • 使用非常简短的会议形式,有时甚至可以站着进行。
  • 每一个冲刺周期结束后的都向客户交付 演示(demo)

5.4. Dynamic Systems Development Method

动态系统开发方法(Dynamic Systems Development Method, DSDM) 由 DSDM 联盟推广,其大多数方面与 XP 相似,并有以下九条指导原则:

CN EN
用户的积极参与 至关重要(imperative) Active user involvement is imperative.
DSDM 团队必须 被授权(empowered) 进行自主决策 DSDM teams must be empowered to make decisions.
重点是产品的频繁交付 The focus is on frequent delivery of products.
验收的基本标注是对业务的 符合程度(fitness) Fitness for business purpose is the essential criterion for acceptance of deliverables.
迭代和增量开发是实现精确业务解决方案的必要条件 Iterative and incremental development is necessary to converge on an accurate business solution.
开发期间的所有变更都是 可逆的(reversible) All changes during development are reversible.
需求在较高层次上基线化——即不必太过详细,可以在迭代过程中进行细化 Requirements are baselined at a high level
测试贯穿整个 生命周期(life-cycle)——必须在每个阶段都进行 Testing is integrated throughout the life-cycle.

80% 原则(80 percent rule):通常,一个应用程序的 80% 经常在 20% 的时间内交付,而另外 20% 的部分则需要剩余的 80% 的时间。

6. Agile Modeling

敏捷建模(Agile Modeling) 最初由 Scott Ambler 提出,包括以下原则:

  • 以目标为导向进行建模(Model with a purpose):建模应该服务于特定的目标,例如沟通、理解或设计。
  • 使用多种模型(Use multiple models):根据需要选择合适的模型,例如用例图、类图、流程图等。
  • 轻量级建模(Travel light):避免过度建模,只创建必要的模型,保持模型的简洁和实用性。
  • 内容比表示形式更重要(Content is more important than representation):模型的目的是传达信息,内容比模型的具体表示形式更重要。
  • 了解模型和用于创建模型的工具(Know the models and the tools you use to create them):熟练掌握建模技术和工具。
  • 局部适应(Adapt locally):根据具体项目和团队情况,灵活调整建模方法。

7. Agile Unified Process

敏捷统一过程(Agile Unified Process, AUP) 是一种简化的 Rational Unified Process (RUP) 的敏捷版本,包含以下活动:

  • 建模(Modeling):理解需求,设计系统架构和组件。
  • 实现(Implementation):编写代码,构建软件组件。
  • 测试(Testing):单元测试、集成测试、系统测试等,确保软件质量。
  • 部署(Deployment):将软件部署到目标环境。
  • 配置(configuration)项目管理(project management):版本控制、配置管理、项目计划、进度跟踪等。
  • 环境管理(Environment management):搭建和维护开发、测试和部署环境。

评论

TABLE OF CONTENTS

Ch.31 Project Management Concepts
1. The Four P's
2. Stakeholders
3. The MOI Model
4. Software Team Structure
4.1. Organizational Paradigms
4.2. Avoid Team "Toxicity"
5. Agile Teams
6. Team Coordination & Communication
7. The Product Scope
7.1. Problem Decomposition
8. The Process
9. The Project
9.1. Common-Sense Approach to Projects
9.2. To Get to the Essence of a Project
9.3. Critical Practices
Ch.5 Agile Development
1. Agile Development
1.1. The Manifesto for Agile Software Development
1.2. What is "Agility"?
2. Agile Process
3. Agility Principles
4. Human Factors
5. Agile Progress Examples
5.1. Extreme Programming
5.2. Industrial XP
5.3. Scrum
5.4. Dynamic Systems Development Method
6. Agile Modeling
7. Agile Unified Process

© 2018-2025 memset0.

All rights reserved.

Source Code

Built with Gatsby.js


Made with ❤️ in China