软件危机是指在计算机软件的开发和维护过程中遇到的一系列问题
1、如何开发软件,以满足对软件日益增长的需求。
2、如何维护数量不断膨胀的已有软件。
1、对软件开发成本和进度的估计不准确。
2、用户对软件系统不满意。
3、软件产品质量差。
4、软件不可维护。
5、没有说明软件的文档。
6、软件成本逐年上升。
7、软件开发生产速率远不及计算机应用迅速普及的趋势。
客观:
1、软件缺乏可见性,管理和控制软件的开发过程相当困难。
2、软件维护意味着修正或修改原来的设计,这就使得软件较难维护。
3、软件规模庞大、逻辑性强、复杂度高。
主观:
软件专业人员对软件开发和维护仍有许多糊涂概念,采用了错误的技术和方法。
1、人们缺乏软件工程的指导,没有掌握正确的软件开发方法学,忽视问题的定义与分析,急于求成。
2、忽视软件需求分析。
3、错把软件开发当作程序编写。
4、轻视软件维护。
软件从定义、开发、使用、维护直至废弃的全过程。
主要分为问题定义、可行性研究、需求分析、总体设计、详细设计、编码和单元测试、综合测试、维护 8个阶段。
软件工程是指导计算机软件开发和维护的一门工程学科,采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间检验证明正确的管理技术同当前最好的技术方法结合,经济高效地开发出高质量的软件并维护它,这就是软件工程。
1993年IEEE给出软件工程的定义:
①、把系统的、规范的、可度量的途径应用于软件开发、运行和维护,也就是把工程应用于软件。
②、研究①中提到的途径。
1、技术可行性:现有技术能否实现本系统。
2、经济可行性:本系统的经济效益能否超过开发成本。
3、操作可行性:本系统的操作方式在客户组织内是否行得通。
1、复查系统规模和目标。
2、研究目前使用的系统。
3、导出新系统的高层逻辑模型。
4、进一步定义问题。
5、导出和评价供选择的解法。
6、推荐行动方针。
7、草拟开发计划。
8、书写文档提交审查。
数据字典是关于数据信息的集合,也就是对数据流图中元素的定义的集合。
1、必须理解并描述问题的信息域,建立数据模型。
2、必须定义软件应完成的功能,建立功能模型。
3、必须描述作为外部事件结果的软件行为,建立行为模型。
4、必须对描述信息、功能、行为的模型进行分解,用层次化的方法显示出更多细节。
1、访谈
2、面向数据流自顶向下求精
3、简易的应用规格说明技术
4、快速建立软件原型
结构化程序设计是进行以模块功能和处理过程设计为主的详细设计的基本原则。
思路是把一个复杂问题的求解过程分阶段进行,每一个阶段处理的问题都控制在人们易于理解并处理的范围内。
1、采用自顶向下逐步求精的程序设计方法。
2、采用三种基本控制结构构造程序。(顺序、选择、循环)
3、采用主程序员组的组织形式。
4、采用单入口单出口的模块形式。
1、改进软件结构,提高模块独立性。
2、模块规模应该适中。
3、深度、宽度、扇入和扇出适当。
4、模块的作用域应该在控制域之内。
5、力求降低模块接口的复杂程度。
6、设计单入口单出口的模块。
7、模块功能应该可以被预测。
1、模块化
模块是由边界元素限定的相邻程序元素的序列,并且有一个标识符代表它。
模块化就是把程序划分成独立命名可独立访问的模块。每个模块完成一个子功能,全部模块构成一个整体,完成特定的功能,满足用户需求。
2、抽象
抽象就是提取出事物的本质特性而暂时不考虑其他细节。
3、 逐步求精
集中精力解决主要问题而尽量推迟对问题细节的考虑。
4、信息隐藏和局部化
信息隐藏是指一个模块内包含得信息对于不需要这些信息的模块来说是不能访问的。
局部化是指把一些关系密切的软件元素物理地放的彼此靠近。
5、模块独立(最重要)
模块独立是模块化、抽象、信息隐藏和局部化的直接结果。每个模块完成一个相对独立的子功能,并且模块间的关系比较简单。
1、流图中线性无关的区域数。
2、边数 - 结点数 + 2。
3、判定结点数 + 1。
1、程序内部的文档
2、数据说明
3、语句构造
4、输入输出
5、效率
软件测试是为了发现程序中的错误而执行程序的过程。
目标是尽可能多地发现软件中存在的错误,并将测试结果作为纠错的依据。
1、单元测试 — 单元模块
2、集成测试 — 组装后的程序模块
3、确认测试 — 可运行的目标程序
4、系统测试 — 整个产品系统
又称为结构测试,测试者完全知道程序的结构和处理算法。按照程序内部的逻辑测试程序,检测程序中的主要通路能否按照预定要求正常工作。
语句覆盖:选择足够多的测试数据,使程序中的每条语句至少执行一次。
判定覆盖:每个判定表达式的每个分支都至少执行一次。
条件覆盖:判定表达式中的每个条件都取到各种可能的结果。
判定/条件覆盖:使得每个判定表达式中的条件都取到各种可能的结果,并且每个判定表达式也都能取到各种可能的结果。
条件组合覆盖:使得每个判定表达式中条件的组合取得各种可能的结果。
路径覆盖:使程序的每条路径都至少执行一次。
又称为功能测试,完全不考虑程序的内部结构和处理过程,是在程序接口进行的测试。
划分等价类、边界值分析。
软件维护是在软件在已经交付使用之后,为了改正错误或满足新的需要而修改软件的过程。
1、改正性维护:为了纠正使用过程中暴露出来的问题。
2、适应性维护:为了适应外部环境的变化。
3、完善性维护:为了改进原有软件。(占比最大)
4、预防性维护:为了改进将来的可维护性和可靠性。
尽可能模拟人类习惯的思维方式,使开发软件的方法与过程尽可能接近人类认识世界解决问题的方法与过程,也就是使描述问题的问题空间与实现解法的解空间在结构上尽可能一致。
1、认为客观事物由各种对象组成,任何事物都是对象,复杂的对象可以由简单的对象组合而成。
2、把所有对象划分成类,每个对象类都定义了一组数据和方法。
3、按照子类与父类的关系,把对象类组合成层次结构。
4、对象彼此之间仅能通过传递消息互相联系。
即:OO = objects + classes + inheritance + communication with messages 。
1、与人类习惯的思维方式一致。
2、稳定性好。
3、可重用性好。
4、较易开发大型软件产品。
5、可维护性好。
封装:私有的数据和方法不能被外界直接访问。
继承:下层的派生类自动具有上层基类的数据和方法。
多态:在类等级的不同层次中可以共享一个行为名,每个类按照自己的需求来实现这个行为。
重载
1、函数重载:参数类型不同的函数可以使用相同的函数名。
2、运算符重载:不同类型的参数可以使用相同的运算符。
类:类是对具有相同属性和行为的对象的描述。
实例:某个特定的类描述的具体对象。
消息:向对象发出的服务请求。
属性:类中定义的数据,也就是对客观事物性质的抽象。
方法:类中定义的服务,也就是对象所能执行的操作。
1、主题层 — 找出类与对象
2、类与对象层 — 识别结构
3、结构层 — 识别主题
4、属性层 — 定义属性
5、服务层 — 定义服务
1、模块化
2、抽象
3、信息隐藏
4、低耦合
5、高内聚
6、可重用
1、设计结果应该清晰易懂。
2、一般-特殊结构的深度适当。
3、设计简单的类。
4、使用简单的协议。
5、使用简单的服务。
6、把设计变动减至最小。
管理,就是通过计划、组织、控制等一系列活动,合理地配置并使用资源,达到既定目标的过程。
管理的核心:时间、成本、质量。
软件过程的特征是无序的,甚至是混乱的。几乎没有什么过程是经过定义的,项目能否成功完全取决于开发人员的个人能力。
软件机构建立了基本的项目管理过程,可跟踪成本、进度、功能和质量。已经建立起必要的过程规范,对新项目的策划和管理过程是基于以前类似项目的实践经验,使得有类似应用经验的软件项目能够再次取到成功。
软件机构已经定义了完整的软件过程,软件过程已经文档化和标准化。所有项目组都使用文档化、经过批准的过程来开发和维护软件。
软件机构对软件过程和软件产品都建立了定量的质量目标,所有项目的重要的过程都是可以度量的。
软件机构集中精力持续不断地改进软件过程。这一级的软件机构是一个以防止出现缺陷为目标的机构,它有能力识别软件过程要素的薄弱环节,并有足够的手段改进它们。