第一章:软件开发概述
1.1软件与程序
1.1.1从程序到软件
- 计算机程序(简称程序)是为了解决某个特定问题而用程序设计语言描述的适合计算机处理的语句序列;
- 软件是能够完成预定功能和性能的可执行的程序和使程序正常执行所需要的数据,加上描述软件开发过程及其管理、程序的操作和使用的有关文档,即“软件=程序+数据+文档”
1.1.2软件类型
- 按功能:系统软件、支撑软件和应用软件。
- 按工作方式:实时处理软件、分时软件、交互式软件和批处理软件。
- 按服务对象的范围:项目软件(定制开发)和产品软件(通用软件)
- 其他:商业软件、开源软件、共享软件。
1.1.3程序设计与软件开发
程序=算法+数据结构 程序=算法+数据结构
- 数据结构指的是程序处理或应用的数据与数据之间的逻辑关系;
- 算法指的是解决特定问题的步骤和方法。
- 程序设计的核心就是选择和设计适合特定问题的数据结构。
1.2软件生存周期
孕育>诞生>成长>成熟>衰亡
1.2.1使用角度的软件生存周期
- 提出需求:用户根据需要,提出要解决的问题和需要的软件;
- 获取软件∶主要是对获取软件的最佳途径做出决策并选择最佳的供应商;
- 购买软件;
- 定制或开发软件;
- 租赁软件或租赁服务。
- 使用软件:获得软件之后,用户将操作软件使之为其服务。
1.2.2开发角度的软件生存周期
定义软件:
- 理解问题:用明确的语言描述软件要解决的问题、目标和范围;
- 可行性研究:从经济、技术、法律等方面分析软件开发的可行性;
- 需求分析:描述对软件系统的所有需求,即明确要软件做什么 。
开发软件:
- 软件设计:建立目标软件的解决方案,包括软件的结构和组成;
- 软件实现: 用程序语言实现设计方案,包括与其他系统的接口和集成;
- 软件测试:通过各种测试和评审技术,确认软件满足了指定要求。
维护软件:
- 软件交付:发布开发的软件,或者安装、部署到用户现场以便使用软件维护;
- 软件退役:对软件进行修改或对需求的变化做出响应终止对软件的技术支持和维护,软件停止使用。
1.3软件开发过程
1.3.1瀑布式开发过程
主要问题在于∶
阶段划分僵硬,每个阶段不能缺省,而且产生大量文档,增加了工作量;
开发是线性的,只有等到整个过程的末期才能见到开发成果——可运行软件,不利于快速响应变化的需求;
早期的错误要等到开发后期的测试阶段才能发现,可能带来严重的后果,增加了开发的风险。
1.3.2增量开发模型
增量开发模型的优点∶
- 1、在短时间内向用户提交一个可运行软牛,够足用户急用的一些功能。
- 2、由于每次只提交部分功能,用尸有较允分的时月子习迫应新的产品。
- 3、在开发过程中,需求的变化是不可避免的。增量开发模型的灵活性可以使软件适应需求变化。
- 4、有利于系统维护,因为整个系统是由一个个增量(部件)集成在一起的,当需求变更时,只变更部分部件,而不必影响整个系统。
增量模型存在以下风险∶
- 1、由于各个部件是逐渐开公二俱软Na称t育T的北的的部件不破坏已构造好的系统,这需要软件具备开放式的体系结构,否则系统将失去稳定的结构。
- 2、逐步增加部件的方式,很容易退化为边做边改模型,从而使软件过程的控制失去整体性。
- 3、在一个软件开发中如何一致地定义“增量”?如何界定它的工作量、需求范围、功能或特性?
1.3.3个体软件过程
1.4敏捷开发
敏捷开发是从20世纪90年代开始逐渐引起广泛关注的一组新型的软件开发方法。
更强调程序员团队与业务专家之间的紧密协作、面对面的沟通、频繁交付新的软件版本、紧凑而自我组织型的团队、能够很好地适应需求变化的代码编写和团队组织方法,更注重软件开发中人的作用。
所有敏捷开发方法都遵循下面12条原则。
- (1)最优先要做的是通过尽早地、持续地交付有价值的软件满足客户需要。
- (2)即使在开发后期也欢迎需求的变化,敏捷过程利用变化为客户创造竞争优势。
- (3)经常交付可以工作的软件,从几星期到几个月,时间越短越好。
- (4)业务人员和开发人员应该在整个项目过程中始终朝夕在一起工作。
- (5)要善于激励项目人员,给他们以所需要的环境和支持,并相信他们能够完成任务。
- (6 )在开发小组中最有效率、也最有效果的信息传达方式是面对面的交谈。
- (7)工作的软件是进度的主要度量标准。
- (8)责任人、开发者和用户应该维持长期、恒等的开发节奏。
- (9)对卓越技术与良好设计的不断追求将有助于提高敏捷性。
- (10)简单——尽可能减少工作量的艺术——至关重要。
- (11)最好的架构、需求和设计都源于自组织的团队。
- (12)每隔一定时间,团队都要总结、反省工作效率,然后相应地调整自己的行为。
敏捷开发也创造了一些新的技术或实践,如:结对编程、代码重构、测试驱动开发、持续集成。
- 结对编程:两个程序员在一个计算机上共同工作。一个人输入代码,另一个人审查他输入的每一行代码。两个程序员经常互换角色。
- 代码重构:指的是改变程序结构而不改变其行为,以便提高代码的可读性、易修改性等。例如,给变量重新命名,把一段代码提升为函数,把公共的属性和行为抽象成基类。
- 测试驱动开发TDD:在一个微循环开发中,首先确认并自动化进行一个失败的测试,然后编写足够的代码通过测试,在下一轮前重构代码。
- 持续集成:微软等公司的软件开发方法包括每日构造产品,持续集成比它更进一步,只要可能,就把新代码或变更的代码合并到应用程序,然后测试,确保每一步的工作都正确。
1.5软件构造
软件构造的重要性
构造占据了软件开发的大部分工作。
研究表明,构造占软件开发30%~80%的工作时间,构造是软件开发的中心活动。
- 把重心放在构造,能显著提升个体程序员的生产率。
- 构造的产品——源程序代码,常常是唯一准确的软件描述。
- 构造是确保唯一要完成的活动。