参考:
- 《程序员面试笔试宝典》(何昊、叶向阳)
标准的软件开发过程:
1)可行性分析:要确定开发目标和总要求,一般要考虑技术是否可行,收益是否可行、用户操作是否可行,是否有法律风险。战略专家→《可行性分析报告》
2)需求分析:领域专家+系统架构师→《需求分析说明书》
3)设计:概要设计(结构)+详细设计→设计说明书、业务用例文档、技术用例文档
4)编码与实现:接口文档、关键算法文档
5)测试:贯穿整个开发过程。白盒/黑盒测试→单元测试报告、集成测试报告、系统测试报告
6)运行与维护:修改、维护、再开发
常见的软件开发过程模型:
1)瀑布模型
瀑布模型将软件生命周期划分为可行性分析、需求分析、设计、代码实现、测试、安装与维护6个基本活动,并且规定了它们自上而下的固定次序,形如瀑布流水,逐层下落。上一个环节完成后,进行验证,如果验证通过,则该结果可以作为下一环节的输入并继续进行,否则需要返回修改。它的优点 是有按阶段划分的检查点,开发者每次只需要关注一个阶段,可以保证最终按时交付,缺点是:a)大量文档 b)用户只有在开发末期才能看到结果,难以调整 c)早期的错误(比如设计上的)要在最后才能发现,导致放大问题。
2)原型模型
原型模型是增量模型的一种形式。在开发真实系统之前,首先要构建一个简单的系统模型,实现客户与系统的交互。客户在使用过程中,不断发现问题,进而细化系统要求。开发者在已有模型的基础上,通过调整原型来满足客户需求,进而开发出客户满意的系统。它的重点是必须快速建立原型,并快速修改。
3)螺旋模型
综合了瀑布模型与原型模型的特点,强调风险分析。每一轮原型都要做风险分析,因此缺点是要求客户接受风险分析,因此需要相关知识,也需要用户参与平价,同时过多的迭代次数也会增加开发成本和时间。
4)增量模型
软件被视作一些列的构件来设计、实现、集成和测试。每次交付的是部分可运行的子系统。优点是较好地适应用户需求的变化;缺点是每次加入新子系统时,可能破坏已构建好的部分;也容易破坏整体性。第一个增量是核心产品。
5)RUP模型
Rational Unified Process,是Rational公司提出的一个通用框架。每个阶段都可以分解、迭代,每一个迭代都是完整的开发循环,都会产生可运行版本。
横轴是时间组织,纵轴是开发中的活动。前者常用属于有cycle,phase,iteration,milestone;后者有activity,artifact,worker,workflow.
1)初始阶段Inception:以需求分析为主,建立整体结构,确定项目边界,结束时候milestone是生命周期目标里程碑,用于评价项目基本的生存能力。
2)细化阶段Elaboration:设计及确定体系结构,制定工作计划与资源要求。结束时候的milestone是生命周期结构里程碑,为系统的结构建立了管理基准并使项目能在构建阶段中进行衡量。
3)构建阶段Construction:构建产品并继续演进需求、结构、计划直到提交。它的milestone是初始功能里程碑,决定了是否可以在测试环境中部署。
4)交付阶段Transition:交付客户,综合测试。milestone是产品发布里程碑。
几种模型的比较
模型 | 特点 | 适用范围 |
---|---|---|
瀑布模型 | 分阶段,每个阶段完成后有评审,允许反馈,要求提前确定需求 | 需求定义完善,不易变更的系统 |
原型模型 | 不需要完备定义,支持用户参与,能适应用户需求的变化 | 需求复杂、动态变化、难以确定的系统 |
螺旋模型 | 综合了瀑布和原型,引进了风险分析 | 需求难以获取和确定,开发风险较大 |
增量模型 | 增量式开发,允许开发活动并行 | 技术风险较大,用户需求较为稳定的系统 |
RUP模型 | 可改造、扩展和建材,可设计、开发、维护 | 复杂、需求不确定的系统,开发组拥有丰富的软件开发和管理经验 |
敏捷开发
是将一个大项目分成多个相互联系,但也可以独立运行的小项目并分别完成,在此过程中软件一直处于可使用状态。强调团队合作及与业务专家之间的协作、面对面交流、频繁交付新软件、紧凑而自我组织型的团队、能很好地适应需求变化的代码编写和团队组织方法,更注重软件开发中人的作用。
常见的敏捷开发方法:
自适应软件开发Adaptive Software Development、水晶方法Crystal Method、特性驱动开发Feature Driven Development、动态系统开发方法Dynamic Systems Development Method、极限编程Extreme Programming
敏捷开发的12条原则:
1)按优先级安排,尽早、持续地交付有价值的软件给用户。通过用户故事来罗列需求,虽然编写文档但是工作重点在口头交流
2)即使到了系统开发的后期,也欢迎改变需求
3)经常性地交付可以工作的软件
4)开发期间,业务人员和开发人员要一起工作
5)激励个人构建项目,提供必须的环境和支持
6)采用面对面交谈
7)使用可以工作的软件作为首要的进度度量标准
8)敏捷过程要保持可持续的开发进度
9)不断地关注优秀的技能、设计
10)简单的方式完成
11)使用自组织团队。管理者不发号指令,而是让团队自己寻找最佳工作方式
12)每隔一段时间,团队要反思如何梗有效地工作,改进工作
UML中最常用的图:类图、对象图、用例图、交互图(时序图、协作图)、状态图、活动图、构件图、部署图
SCM(Software Configuration Management)
软件配置管理贯穿于整个软件生命周期,是一种标识、组织和控制修改的技术,用于界定软件的组成项目,对每个项目的变更进行管控,并维护不同项目之间的版本关联,使得项目可以被追溯。包括标识、版本控制、变更控制、配置审计、配置报告几个部分
常见工具:SourceSafe, CVS,ClearCase
使用SCM的好处:
1)解决了由于经费和时间有限带来的问题,减少升级次数
2)使得开发过程得到规范化管理,节约人力和时间
3)能有效管理人员流动,减少人工错误
4)避免了未经测试的软件加入到产品中
5)使得用户与开发商之间能有效沟通,保障用户的利益
6)使得软件生产规模化、构件化,降低成本
CMMI (Capability Maturity Model Integration)
由美国国防部、美国国防工业协会、卡内基梅隆大学共同开发的一项标准。CMMI共有5个级别,级别越高,风险越低,效率和质量越高。
1)初始级
也称无政府状态anarchy或混乱状态chaos。指没有规范过程的项目
2)可重复级
有需求管理、项目规划、项目监督与控制,也有审查等,可以保证项目实施取得成功
3)定义级
不仅对项目实施有整套的管理措施,也能将其制度化,因此可以在不同类的项目上取得成功
4)管理级
在定义级的基础上还实现了数字化管理,能通过量化实现流程的稳定。
5)优化级
在管理级的基础上,能主动改善流程,能根据实际不断调整软件生产过程以求达到最佳。
如何提高软件质量?
软件质量不是一个纯技术问题,而是一个系统的工程性问题。包括:
1)符合目标:开发者是否在做客户要求做的事情
2)符合需求:软件产品是不是在做客户需要做的事情
3)符合实际需求:包括客户明确说的和隐含的
提升软件质量的方向:
1)规范产品开发过程
2)做好需求分析→面向对象设计、UML等
3)做好设计
4)加强规范:编程规范、版本控制
5)全面的质量控制:每个步骤上做严格的验证与确认
6)加强文档管理
7)加强代码管理:走读、评审
8)进行简单的度量分析活动
9)进行软件测试:全流程的测试,包括开发前期的静态测试