Software process
a set of structured activities to produce software.
includes: required specification, development(analysis, design, implementation), validation (test), evolution.
- required specification: what should this system do? a complete desc of the problem and environment constraints. contains: system function, future extension, documentation amount, time and preformance response
- analysis: create a conceptual model.
- design: implementable model (architecture, components of this system).
- implementation: implementation of interfaces.
- testing: unit, functional, integration, system, acceptance. test and implementation should run in parallel.
- deployment: install, run and test on real environment.
- evolution: corrective, adaptive, perfective, preventive.
process models
a abstraction of process. activities must be modelled to be managed.
waterfall
易于管理 monitor,结构化很好。前面的模块必须完成才能跳到下一个,也就要求我们在最初设计的时候对需求很清楚,但是很难不遇到一些问题,很难按照正常流程正常走。
evolutionary development
交互性的活动,及时的反馈。核心需求能很好的满足,但是扩展性很差,结构性很差,缺少过程中的可见性。适合小型项目。
rational unified process
inception: 分析项目可行性。
elaboration: 分析风险,架构。
construction: iterative 迭代开发到 beta 版本为止。
transition: 交付到客户手中。
通用的完整流程,动态。但是开销大了。
Agile Software Development
现代软件开发流程:敏捷开发。
Rapid software development 快速开发:争取每一版都交一个可以交付的东西给客户。
敏捷开发:系统在一次一次迭代小增量过程中建立而成。specification, design, implementation, testing 并行。专注于代码,轻量级代码频繁发布,维护简单。
Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration over contract negotiation
Responding to change over following a plan
敏捷开发需要程序员之外的项目经理,运营,测试……
敏捷开发重视价值,不要设计没价值的东西。实践一定要解决文分体,文档一定要有对应受众,不要过度设计系统。
敏捷开发注重 steer而不是percise prediction。由customer priorities 和 programmer estimates of feature difficulty 共同制定不断迭代的计划。
开发原则:
• Emphasis on simple design and refactoring.
• Removing duplication.
• Increasing cohesion.
• Reducing coupling
常见的敏捷开发方法:如极限开发 Extreme Programming.
- 每天构建几次新版本
- 每两周给用户提交一版增量
- 需求由用户描述
- 程序员Pair programming(两个人坐一起一起开发,效率差不多,而且对彼此代码更加了解)
- 先开发测试单元,再写代码
- 测试过了才算构建完成
Test Driven Development (TDD):
- Define both an interface and a specification.
- 先写test后写code。
- 基于增量设计测试 Incremental。
- 每次构建后自动化测试 Automated。
- 客户参与测试 User involvement,测试包括程序员单元测试(unit test),客户确认测试(acceptance test,看是否符合需求)。
敏捷开发的问题:
-
客户易失去积极性 customers interests.
-
团队成员未必喜欢团队开发。
-
多方利益相关,prioritising change is difficult.
-
难维持简洁性,maintaining simplicity.
-
频繁变化,合同设计困难 contract。
适用于多变的,客户要求明确的中小型系统。