什么是软件?
软件是程序、文档和数据的集合:
- 程序是能够完成预定功能和性能的可执行的指令序列;
- 文档是开发、使用和维护程序所需要的图文资料;
- 程序是使程序能够适当地处理信息的数据结构。
什么是软件危机?
软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。
产生软件危机的原因是什么?
一方面与软件本身的特点有关,另一方面也和软件开发与维护的方法不正确有关。
- 软件本身的特点方面:
- 软件不同于硬件,它是计算机系统中的逻辑部件而不是物理部件;
- 软件不同于一般程序,显著特点为规模庞大,程序复杂性随着程序规模的增加呈指数上升。
- 开发与维护方面:
- 错误的观念与认识:软件开发就是写程序并设法使之运行,轻视软件维护等;
- 正确的认识:程序只是完整的软件产品的一个组成部分,编写程序所需的工作量通常只占软件开发全部工作量的10%~20%。
消除软件危机的途径是什么?
- 彻底消除在计算机系统早起发展阶段形成的“软件就是程序、程序就是软件”的错误观念;
- 充分认识到软件开发不是某种个体劳动的神秘技巧,而应该是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目;
- 推广使用在实践中总结出来的开发软件的成功的技术和方法,研究探索更有效更好的技术和方法。
- 应该开发和使用更好的软件工具。
什么是软件工程?
软件工程包括技术与管理两方面的内容,是指导计算机软件开发和维护的一门工程学科,其采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它。
软件工程的本质特性是什么?
- 关注与大型程序的构造;
- 中心课题是控制复杂性;
- 软件经常变化;
- 开发软件的效率非常重要;
- 和谐地合作是开发软件的关键;
- 软件必须有效地支持它的用户;
- 在软件工程领域中通常由具有一种文化背景的人为具有另外一种文化背景的人创造产品。
软件工程的基本原理是什么?
- 用分阶段的生命周期计划严格管理;
- 坚持进行阶段评审;
- 实行严格的产品控制;
- 采用现代程序设计技术;
- 能清楚地审查结果;
- 开发人员少而精;
- 承认不断改进软件工程实践的必要性。
软件工程方法学
在软件生命周期全过程中使用的一整套技术方法的集合成为方法学,也称为范型。软件工程方法学包括3个要素:方法、工具和过程,目前最广泛使用的软件工程方法学分别是传统方法学和面向对象方法学。
传统方法学:
也称为生命周期方法学或结构化范型,主要采用结构化技术来完成软件开发的各项任务。
特点:
- 把软件生命周期的全过程依次划分为若干个阶段,然后顺序地完成每个阶段的任务;
- 各个阶段完成后进行严格的技术审查和管理复审,通过后才可进入下一阶段,否则返工,返工完成再进行审查;
- 各个审查阶段都应交出一份“最新式的”高质量的文档资料,以反应当前软件开发的情况,以此保证在软件开发工程结束时有一个完整准确的软件配置交付使用。
优点:
- 将开发阶段分成若干个阶段,每个阶段的任务相对独立且比较简单,便于组员之间分工协作,降低软件开发的整体难度;
- 每个阶段都采用科学的管理技术和良好的技术方法,从技术和管理两个角度进行严格审查,合格之后才开始下一阶段的工作,使得开发过程有条不紊,保证了软件质量且提高了软件的可维护性。
面向对象方法学:
以数据为主线,将数据和对数据的操作紧密地结合起来。在面向对象程序设计中,将数据(即属性)和对数据的操作(即方法)封装在一个类中,这就是把数据与对数据的操作结合起来。
要点:
- 把对象(object)作为融合了数据及在数据上的操作行为的统一的软件构件。
- 把所有对象都划分成类(class)。
例如Java中的面向对象思想,一个类包含类的属性(数据)与方法(对数据的操作)。 - 按照父类(基类)与子类(派生类)的关系,把若干个相关类似组成一个层次结构的系统(类等级)。在面向对象思想中,子类自动拥有父类中定义的所有属性(数据)和方法(对数据的操作),即继承。
- 对象彼此间仅能通过发送消息互相联系。
特点:
- 面向对象方法的出发点和基本原则比较切合人类实际的思维方式,使得开发方法与过程尽量接近人类的认识世界、解决问题的方法与过程,从而使描述问题的问题空间(问题域)与实现解法的解空间(求解域)在结构上尽可能保持一致;
- 面向对象方法在概念和表示方法上的一致性,保证了在各项开发活动之间的平滑过渡。面向对象方法普遍进行的对象分类过程,支持从特殊到一般的归纳思维过程,同时通过建立类等级而获得的继承性,支持从一般到特殊的演绎思维过程。
优点:
- 通过面向对象方法开发软件,使得软件产品成为为许多较小的、基本独立的对象的集合,每个对象相当于一个微型程序,大部分的对象可与现实世界中的实体相对应,降低了软件产品的复杂性,有利于提高软件的可理解性,简化了开发和维护工作。
- 由于对象是相对独立的实体,可在今后的软件开发中重复使用,由此增加了软件的重用性。
对比表格
区别 | 传统方法 | 面向对象方法学 |
---|---|---|
特征 | 要么面向数据,要么面向行为 | 将数据和对数据的操作紧密结合起来 |
特性 | 模块化、结构化 | 继承性、多态性、可重用性,对象+类+继承+用消息通信 |
设计方法 | 自顶向下 | 反复迭代的渐进演化 |
适用范围 | 小到中型规模,需求稳定 | 大型软件,需求模糊或随时间变化而变化 |
软件生命周期
软件生命周期由软件定义、软件开发、运行维护组成,软件定义时期包括问题定义、可行性研究、需求分析,软件开发时期包括总体设计、详细设计、编码和单元测试,运行维护时期包含改正性维护、适应性维护、完善性维护和预防性维护。
软件定义时期
- 问题定义:要解决什么问题?
问题性质、工程目标和工程规模; - 可行性研究:对于上一个阶段确定的问题有行得通的解决办法吗?
研究问题的范围,探索问题是否值得去解,是否有可行的解决办法; - 需求分析:为了解决这个问题,目标系统必须做什么?(需求工程)
确定目标系统必须具备哪些功能。
软件开发时期
- 总体设计:概括地说,应该怎样实现目标系统?
- 设计出若干方案,权衡利弊择最优;
- 制定实现最佳方案的详细计划;
- 设计程序的体系结构,确定程序由哪些模块组成以及模块间的关系。
- 详细设计(模块设计):应该怎样具体地实现这个系统呢?
设计出程序的详细规格说明,确定实现模块功能所需要的算法和数据结构,类似于“工程蓝图”。 - 编码和单元测试:程序模块还有什么问题吗?
写出正确的容易理解、容易维护的程序模块,即将详细设计的结果用高级程序设计语言“翻译”成程序模块,并仔细地进行功能测试。 - 综合测试:软件系统能够正常运行吗?
通过各种类型的测试及相应的调试使软件达到预定的要求,最基本的测试是集成测试和验收测试:集成测试由开发人员完成,验收测试由用户或者在用户的参与下完成。
——-前两个阶段称为系统设计,后两个阶段称为系统实现。
运行维护时期
软件维护:通过各种必要的维护活动使得系统持久地满足用户的需要,具有以下分类:
1. 改正性维护:诊断和改正正在使用过程中发展的软件错误;
2. 适应性维护:修改软件以适应环境的变化;
3. 完善性维护:根据用户的要求改进或扩充软件使之完善;
4. 预防性维护:修改软件,为将来的维护活动预先做准备。