软件工程概论
众所周知,随着计算机技术的发展和日趋成熟,计算机软件技术在整个计算机科学技术领域越来越占据极其重要的作用。由此可见,掌握计算机软件技术基础意义深远。
软件工程是指用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,指导计算机软件的开发和维护的工程学科。
那么,什么是计算机软件呢?计算机软件,是指计算机运行所需的各种程序及相关资料的总和。它包括系统软件(例如,操作系统中的DOS、Unix、Linux及Windows等,以及语言开发系统中的C、C++、VB、以及最新出现的Java、J2EE、ASP、PHP等和测试工具软件)和应用软件两大类。下面就主要从软件技术的发展领域和趋势、软件危机、技术审查和管理复审、软件质量的评价、需求分析、总体设计、软件检验等七大方面做以阐述。
一、 软件技术的发展领域和趋势
目前,按照计算机软件分支学科的内容划分,软件技术的主要发展范畴是:软件工程技术、程序设计技术、软件工具环境技术、系统软件技术、数据库技术、实时软件技术、网络软件技术、还有与实际工作相关的软件技术等八大领域。而且,国外主要在系统软件、数据库、软件工具三个方面去的了很大的成果。在国内,软件技术主要在软件工程、软件工具环境、并行处理算法、软件形式化处理方面取得了一系列的成果。另外,汉字系统的研制、面向对象技术的研究、网络互连技术、多媒体技术、文字处理与排版方面都有所进展。
而且,计算机软件技术的发展趋势主要集中在:1)软件工程技术方面,各种软件开发方法的评价、比较、条理化剪裁,以及新思想和策略的进一步完善,软件过程模型的规范化和形式化的软件组合技术,软件的定性评估和定量测量,软件开发工具的实用性、通用性等,使软件工程方法真正成为人们构造软件过程中所接受的理论、原则、规范和方法。2)在程序设计技术方面:主要研究面向对象的方法及其与面向过程和逻辑方法的结合。3)在软件工具环境相关的技术方面:统一的规范和接口标准、支持软件开发全过程及各阶段的各种工具的研制以及如何将它们统一集成到CASE环境之中.
二、软件危机
软件危机是指在计算机软件开发过程中遇到的一系列问题,如开发周期延长,成本增加、可靠性降低等。软件危机以以下诸多问题为表征:
(1) 对软件成本、开发成本和开发进度的估计常常不很准确;
(2) 用户对“已完成的”软件系统不满意的现象经常发生;
(3) 软件产品的质量往往不可靠;
(4) 软件常常是不可维护的;
(5) 软件通常没有适当的文档资料;
(6) 软件成本在计算机系统总成本中所占的比例连年上升;
(7) 软件开发生产率的提高速度远远跟不上计算机应用的普及和发展的趋势。 解决软件危机的途径主要有:
(1) 技术支持,包括:①有关的软件工程技术、程序设计方法、程序设计技术等;②计算机硬件知识、相关应用领域的知识、有关软件开发历史的知识等。
(2) 管理支持,即在开发软件过程中如何组织和管理众多的各类人员协同作业。
三、技术审查和管理复审
技术审查是指在软件生存周期的每个阶段,从技术的角度对软件开发过程中使用的技术进行全面审查,以保证软件质量的过程。管理复审是指在软件生存周期的每个阶段,从管理角度对软件开发过程进行复审,是对工程进行管理和控制的手段。两者的目的都是为了尽早发现错误并改正错误。因为软件的错误有积累放大效应和不同时改错所需代价不同两个特点。
四、软件质量的评价
明显地,软件工程的最终目标是获得高质量的软件。那么软件质量的好坏怎么评价呢?一般来说,倾向于从可维护性、可靠性、可理解性和效率四方面对软件作较全面的评价。1)、可维护性(Maintainability):软件在运行阶段尚需不断“修正”,因为软件虽经测试但还不可避免地隐含着各种错误,这些错误在运行阶段会逐步暴露出来,因而就要进行排错。2)、可靠性(Reliability):可靠性通常包括正确性(Correctness)和健壮性(Robustness)这两个相互补充的方面。3)、可理解性(Understandability):可理解性通常是指简单性和清晰性。毋庸置疑,正确性对系统正常发挥作用是完全必要的。4)、效率(Efficiency):效率是指系统能否有效地使用计算机资源,如时间和空间等。这一点以前一直是着重强调的,这是由于过去硬件价格昂贵造成的结果。由于硬件价格近年来大幅度下降,所以效率已不像以前那样举足轻重了。
五、需求分析
首先,要对软件项目进行可行性研究,从技术角度对目标系统进行可行性分析,以确定目标系统是否有可行的解;再者,还要从成本/效益角度对目标系统进行可行性分析,以确定目标系统是否值得去解,并形成有关目标系统的高层逻辑模型的报告。从而了解需求分析的目的与任务。
那么主要的分析方法的方法就有需求分析和结构化分析两大类。需求分析就是指在可行性研究的基础上,明确在用户的业务环境中,软件系统应该“做什么”。这么就需要双方共同的理解明确地表达成一份书面文档,即需求说明书。另一种结构化分析也叫SA方法。SA方法采用了“分解”和“抽象”这两个基本手段。此类方法的描述方式主要是:一套分层的数据流图、一本数据词典、一组小说明和补充材料。
数据流图主要用来描述目标系统的逻辑模型。其四种基本成分是数据流(用箭头表示)、加工(用圆表示)、文件(用直线段表示)和数据流的源点或终点(用方框表示)。它的优点是直观、容易理解,容易被一组人同时进行审查。
除了前面讨论的工作之外,需求分析阶段还应完成下列工作:确定设计限制、确定验收准则和编写“初步用户手册”等。
六、总体设计
总体设计主要有以下四种方法:
1)、模块化设计方法 :是把一个较大的软件系统分解成许多较小的具有特定功能的模块,由它们共同完成软件系统的整体功能。
2)、结构化设计(SD)方法:是将系统设计成由相对独立、单一功能的模块组成的结构。特点是:模块之间是相对独立的,每个模块可以独立地被理解、编程、测试、排错和修改,从而简化了研制工作得。
3)、Parnas方法:Parnas法主张设计时先估计到整个生命期可能发生的种种情况,以便事先采取相应的措施来提高软件的可靠性和可维护性。主要有提高可靠性的技术──防护性检查和提高可维护性的技术──信息隐蔽两种技术。
4)、Jackson方法:Jackson方法的目标是获得简单清晰的设计方案,主张程序结构与问题结构相对应,其设计原则是:使程序结构同数据结构相对应。
当然总体设计还要完成其他的工作,例如:设计文档和概要设计复查等。最后还要进行详细设计和编程工作。
七、软件检验
软件检验主要有动态检验和静态检验两种方式。
1)、动态检验是指借助于程序的运行,从不同角度观察程序运行的行为,以发现其中的错误。主要有黑盒法和白盒法。黑盒法是指测试人员将程序看成一个“黑盒”,也就是说,他不关心程序内部是怎样做的,而只想检查程序是否符合它的“功能说明”。白盒法是指测试人员必须了解程序的内部结构,此时,测试用例是根据程序的内部逻辑结构来设计的。
其中,黑盒法主要有等价类划分法、边界值分析法、错误推测法、因果图分析法和场景分析法五种方法。其优点是应用面广,而且不需要测试人员知道软件内部的逻辑结构和实现方法,熟悉软件需求分析规格说明书或用户需求报告相对容易些,准备工作时间相对短,同时对于一些不提供源代码的项目也同样适用。缺点是:很难做到测试技能与各种业务熟悉度紧密结合,而且缺陷的定位有时不够准确,甚至误导开发人员。实用的白盒测试覆盖技术有四种,即语句覆盖、条件覆盖、分支覆盖、循环覆盖和组合覆盖。它的优点是白盒测试方法深入到了程序内部,测试粒度到达某个模块、某个函数甚至某条语句,能从程序具体实现的角度发现问题;白盒测试方法是对黑盒测试方法的最有力补充。
2)、静态检验是指用人工阅读文档和程序,从中发现错误,或用一些辅助工具来完成这种工作,也称为评审。
测试过程通常可以分三步进行:模块测试、联合测试、系统测试。
简言而之,软件工程的目的就是在给定成本、进度的前提下,开发出具有可开发性、有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性并且满足用户需求的软件产品。
软件工程概论
众所周知,随着计算机技术的发展和日趋成熟,计算机软件技术在整个计算机科学技术领域越来越占据极其重要的作用。由此可见,掌握计算机软件技术基础意义深远。
软件工程是指用工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,指导计算机软件的开发和维护的工程学科。
那么,什么是计算机软件呢?计算机软件,是指计算机运行所需的各种程序及相关资料的总和。它包括系统软件(例如,操作系统中的DOS、Unix、Linux及Windows等,以及语言开发系统中的C、C++、VB、以及最新出现的Java、J2EE、ASP、PHP等和测试工具软件)和应用软件两大类。下面就主要从软件技术的发展领域和趋势、软件危机、技术审查和管理复审、软件质量的评价、需求分析、总体设计、软件检验等七大方面做以阐述。
一、 软件技术的发展领域和趋势
目前,按照计算机软件分支学科的内容划分,软件技术的主要发展范畴是:软件工程技术、程序设计技术、软件工具环境技术、系统软件技术、数据库技术、实时软件技术、网络软件技术、还有与实际工作相关的软件技术等八大领域。而且,国外主要在系统软件、数据库、软件工具三个方面去的了很大的成果。在国内,软件技术主要在软件工程、软件工具环境、并行处理算法、软件形式化处理方面取得了一系列的成果。另外,汉字系统的研制、面向对象技术的研究、网络互连技术、多媒体技术、文字处理与排版方面都有所进展。
而且,计算机软件技术的发展趋势主要集中在:1)软件工程技术方面,各种软件开发方法的评价、比较、条理化剪裁,以及新思想和策略的进一步完善,软件过程模型的规范化和形式化的软件组合技术,软件的定性评估和定量测量,软件开发工具的实用性、通用性等,使软件工程方法真正成为人们构造软件过程中所接受的理论、原则、规范和方法。2)在程序设计技术方面:主要研究面向对象的方法及其与面向过程和逻辑方法的结合。3)在软件工具环境相关的技术方面:统一的规范和接口标准、支持软件开发全过程及各阶段的各种工具的研制以及如何将它们统一集成到CASE环境之中.
二、软件危机
软件危机是指在计算机软件开发过程中遇到的一系列问题,如开发周期延长,成本增加、可靠性降低等。软件危机以以下诸多问题为表征:
(1) 对软件成本、开发成本和开发进度的估计常常不很准确;
(2) 用户对“已完成的”软件系统不满意的现象经常发生;
(3) 软件产品的质量往往不可靠;
(4) 软件常常是不可维护的;
(5) 软件通常没有适当的文档资料;
(6) 软件成本在计算机系统总成本中所占的比例连年上升;
(7) 软件开发生产率的提高速度远远跟不上计算机应用的普及和发展的趋势。 解决软件危机的途径主要有:
(1) 技术支持,包括:①有关的软件工程技术、程序设计方法、程序设计技术等;②计算机硬件知识、相关应用领域的知识、有关软件开发历史的知识等。
(2) 管理支持,即在开发软件过程中如何组织和管理众多的各类人员协同作业。
三、技术审查和管理复审
技术审查是指在软件生存周期的每个阶段,从技术的角度对软件开发过程中使用的技术进行全面审查,以保证软件质量的过程。管理复审是指在软件生存周期的每个阶段,从管理角度对软件开发过程进行复审,是对工程进行管理和控制的手段。两者的目的都是为了尽早发现错误并改正错误。因为软件的错误有积累放大效应和不同时改错所需代价不同两个特点。
四、软件质量的评价
明显地,软件工程的最终目标是获得高质量的软件。那么软件质量的好坏怎么评价呢?一般来说,倾向于从可维护性、可靠性、可理解性和效率四方面对软件作较全面的评价。1)、可维护性(Maintainability):软件在运行阶段尚需不断“修正”,因为软件虽经测试但还不可避免地隐含着各种错误,这些错误在运行阶段会逐步暴露出来,因而就要进行排错。2)、可靠性(Reliability):可靠性通常包括正确性(Correctness)和健壮性(Robustness)这两个相互补充的方面。3)、可理解性(Understandability):可理解性通常是指简单性和清晰性。毋庸置疑,正确性对系统正常发挥作用是完全必要的。4)、效率(Efficiency):效率是指系统能否有效地使用计算机资源,如时间和空间等。这一点以前一直是着重强调的,这是由于过去硬件价格昂贵造成的结果。由于硬件价格近年来大幅度下降,所以效率已不像以前那样举足轻重了。
五、需求分析
首先,要对软件项目进行可行性研究,从技术角度对目标系统进行可行性分析,以确定目标系统是否有可行的解;再者,还要从成本/效益角度对目标系统进行可行性分析,以确定目标系统是否值得去解,并形成有关目标系统的高层逻辑模型的报告。从而了解需求分析的目的与任务。
那么主要的分析方法的方法就有需求分析和结构化分析两大类。需求分析就是指在可行性研究的基础上,明确在用户的业务环境中,软件系统应该“做什么”。这么就需要双方共同的理解明确地表达成一份书面文档,即需求说明书。另一种结构化分析也叫SA方法。SA方法采用了“分解”和“抽象”这两个基本手段。此类方法的描述方式主要是:一套分层的数据流图、一本数据词典、一组小说明和补充材料。
数据流图主要用来描述目标系统的逻辑模型。其四种基本成分是数据流(用箭头表示)、加工(用圆表示)、文件(用直线段表示)和数据流的源点或终点(用方框表示)。它的优点是直观、容易理解,容易被一组人同时进行审查。
除了前面讨论的工作之外,需求分析阶段还应完成下列工作:确定设计限制、确定验收准则和编写“初步用户手册”等。
六、总体设计
总体设计主要有以下四种方法:
1)、模块化设计方法 :是把一个较大的软件系统分解成许多较小的具有特定功能的模块,由它们共同完成软件系统的整体功能。
2)、结构化设计(SD)方法:是将系统设计成由相对独立、单一功能的模块组成的结构。特点是:模块之间是相对独立的,每个模块可以独立地被理解、编程、测试、排错和修改,从而简化了研制工作得。
3)、Parnas方法:Parnas法主张设计时先估计到整个生命期可能发生的种种情况,以便事先采取相应的措施来提高软件的可靠性和可维护性。主要有提高可靠性的技术──防护性检查和提高可维护性的技术──信息隐蔽两种技术。
4)、Jackson方法:Jackson方法的目标是获得简单清晰的设计方案,主张程序结构与问题结构相对应,其设计原则是:使程序结构同数据结构相对应。
当然总体设计还要完成其他的工作,例如:设计文档和概要设计复查等。最后还要进行详细设计和编程工作。
七、软件检验
软件检验主要有动态检验和静态检验两种方式。
1)、动态检验是指借助于程序的运行,从不同角度观察程序运行的行为,以发现其中的错误。主要有黑盒法和白盒法。黑盒法是指测试人员将程序看成一个“黑盒”,也就是说,他不关心程序内部是怎样做的,而只想检查程序是否符合它的“功能说明”。白盒法是指测试人员必须了解程序的内部结构,此时,测试用例是根据程序的内部逻辑结构来设计的。
其中,黑盒法主要有等价类划分法、边界值分析法、错误推测法、因果图分析法和场景分析法五种方法。其优点是应用面广,而且不需要测试人员知道软件内部的逻辑结构和实现方法,熟悉软件需求分析规格说明书或用户需求报告相对容易些,准备工作时间相对短,同时对于一些不提供源代码的项目也同样适用。缺点是:很难做到测试技能与各种业务熟悉度紧密结合,而且缺陷的定位有时不够准确,甚至误导开发人员。实用的白盒测试覆盖技术有四种,即语句覆盖、条件覆盖、分支覆盖、循环覆盖和组合覆盖。它的优点是白盒测试方法深入到了程序内部,测试粒度到达某个模块、某个函数甚至某条语句,能从程序具体实现的角度发现问题;白盒测试方法是对黑盒测试方法的最有力补充。
2)、静态检验是指用人工阅读文档和程序,从中发现错误,或用一些辅助工具来完成这种工作,也称为评审。
测试过程通常可以分三步进行:模块测试、联合测试、系统测试。
简言而之,软件工程的目的就是在给定成本、进度的前提下,开发出具有可开发性、有效性、可靠性、可理解性、可维护性、可重用性、可适应性、可移植性、可追踪性和可互操作性并且满足用户需求的软件产品。