第一章软件工程学概述1.软件危机的典型表现:①对软件开发成本和进度的估计常常很不准确;②用户对已完成的软件系统不满意的现象经常发生;③软件产品的质量往往靠不住;④软件常常是不可维护的;⑤软件通常设有适当的文档资料;⑥软件成本在计算机系统中成本中所占的比例逐年上升;⑦软件开发生产率提高的速度,远远跟不上计算机应用迅速普及深入的趋势。软件产品“供不应求”2.产生软件危机的原因:一方面与软件本身的特点有关,另一方面和软件开发与维护的方法不正确有关导致软件危机的主要原因有:①软件日益复杂和庞大;②软件开发管理困难和复杂;③软件开发技术落后;④生产方式落后;⑤开发工具落后;⑥软件开发费用不断增加3.软件工程的定义:1993年IEEE给出的定义:①把系统的,规范的,可度量的途径应用于软件开发、运行和维护过程,也就是把工程应用于软件;②研究①中提到的途径。4.软件工程的7条基本原理:①用分阶段的生命周期计划严格管理;②坚持进行阶段评审;③实行严格的产品控制;④采用现代程序设计技术;⑤结果应能清楚的审查;⑥开发小组的人员应该少而精;⑦承认不断改进软件工程实践的必要性。5.软件生命周期①问题定义;②可行性研究;③需求分析;④总体设计;⑤详细设计;⑥编码和单元测试;⑦综合测试。6.软件过程的定义软件过程是为了获得高质量的软件所需要完成的一系列的任务框架,它规定了完成各项任务的工作步骤。7.瀑布模型——传统的软件生存期模型特点:各个阶段的顺序性和依赖性;划分逻辑设计和物理设计,尽可能推迟程序的物理实现;每个阶段必须完成规定的文档,对其中问题通过复审及早发现,及早解决。优点:可强迫开发人员采用规范的方法;严格规定了每个阶段必须提交的文档;要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证;缺点:“强调文档驱动”,系统可能不满足客户的需求。8.快速原型模型优点:克服瀑布模型的缺点,减少由于软件需求不明确带来的开发风险。这种模型适合预先不能确切定义需求的软件系统的开发。缺点:所选的开发技术和工具不一定符合主流的发展;快速建立起来的系统结构加上连续的修改可能会导致产品质量的低下,使用这个模型的前提是要有一个展示性的产品原型,因此在一定程度上可能会限制开发人员的创新。9.增量模型:优点:能在较短时间内向用户提交可完成部分工作的产品,逐步增加产品功能可以使用户有充裕的时间学习和适应新的产品,从而减少一个全新的软件可能给客户组织带来的冲击。10.螺旋模型——风险驱动优点——迭代演化11.喷泉模型——无缝衔接,迭代开发第二章可行性研究1.定义:可行性研究的目的就是用最小的代价在尽可能短的时间内确定问题是否能够解决2.技术可行性、经济可行性、操作可行性3.数据流图(数据的源点/终点、变化数据的处理、数据存储、数据流)4.数据字典:(数据流、数据流分流、数据存储、处理)4种类型:顺序、选择、重复、可选5.货币的时间价值:第三章需求分析1.基本任务:准确的回答“系统必须做什么”这个问题2.简易的应用规格说明书的基本流程:①初步的访谈,通过用户对基本问题的回答,初步确定待解决的问题的范围和解决方案;②开发者和用户分别写出“产品需求”;③开发者和用户开会讨论,共同创建一张意见一致的组合列表;④把与会者分成更小的小组,每个小组的工作目标是为每张列表中的项目制定小型规格说明,小型规格说明是对列表中包含的单词或短语的准确说明;⑤每个小组向全体与会者展示他们制定的小型规格说明书,讨论,以创建出意见一致的确认标准;⑥由一名或多名与会者根据会议成果起草完整版的软件需求规格说明书。3.状态图:初态、终态、中间状态4.验证软件需求的正确性:一致性、完整性、现实性、有效性第五章总体设计总体设计的目的就是回答“概括的说,系统应该如何实现”1.模块:①模块不能无限制的分割;②当模块数目增加时每个模块的规模将减小,开封单个模块需要的成本确实减少了,但是随着模块数目增加,设计模块的间接口所需要的工作量也增加。2.模块独立:高内聚,低耦合内聚度最高:功能内聚最低:偶然内聚耦合度最高:内容耦合最低:数据耦合耦合度低——高非直接耦合、数据耦合、标记耦合、控制耦合、外部耦合、公共耦合、内容耦合3.深度、宽度、扇入、扇出4.变换流:单输入、单输出数据流:单输入、多输出第六章详细设计详细设计的目标是确定应该怎样具体的实现多要求的系统1.过程设计的工具:程序流程图、盒图、PAD图、判定表、判定树、过程设计语2.PAD图的优点:①使用表示结构化控制结构的PAD符号所设计出来的程序必然是结构化程序;②PAD图所描绘的程序结构非常清晰;③用PAD图表现的程序逻辑,易读,易懂,易记;④容易将PAD图转换为高级语言源程序;⑤PAD图支持自顶向下,逐步求精方法的使用。3.环行复杂度:①V(G)=E-N+2(E是流图中变得条数,N是结点的个数);②V(G)=P+1(P是流图中判定节点的数目)——判定指的是简单判定第七章实现1.测试的目的G.Myers的基本观点①测试是为了发现程序中的错误而执行程序的过程;②好的测试方案极可能发现迄今为止未发现的错误的测试方案;③成功的测试是发现了至今为止尚未发现的错误的测试。测试和调试的区别:测试是找出程序中存在的错误;而调试是不仅找出错误并改正错误,并且在改正的过程中不引入新的错误。2.测试准则:①所有的测试都要追溯到用户需求;②应在测试之前就制定出测试计划;③把Pareto原理应用到软件测试中;④应先进行小规模测试,再逐步进行“大规模”测试;⑤穷举测试是不可能的;⑥为了达到最佳的测试效果,应该有第三方独立的进行测试工作;⑦应确保测试用例的完整性和有效性;⑧应保存所有的测试用例和出错记录,直到软件不用为止。3.黑盒和白盒的区别:①黑盒可以把程序看作一个黑盒子,完全不考虑程序的内部结构和处理过程,只检测程序功能是否按照规格说明书的规定正常使用,检测是否适当的接收输入信息并且产生正确的输出信息;②白盒测试可以把程序看做装在一个透明的白盒子里,测试者完全知道程序的结构和处理算法,检测程序中的主要通路是否都能按照预定要求正确工作;③黑盒和白盒测试互相补充,缺一不可。白盒用于早期测试,而黑盒用于测试晚期。4.测试:单元测试、集成测试、系统测试、确认测试5.集成测试:渐增式、非渐增式6.渐增式:自顶向下、自底向上7.自顶向下:深度优先、广度优先8.回归测试:就是用于保证由于调试或其他原因引起的变化,不会导致非预期的软件行为或额外错误的测试活动9.Alpha和Beta的区别:①环境不同:Alpha是在开发环境下,Beta是在用户环境下;②Alpha有热指导,Beta无人指导;③Alpha的错误有开发人员记录,Beta而又用户自行记录;④Alpha受控,Beta而不受控;⑤主持部门不同:Alpha有测试部门,Beta而由发行部主持10.循环测试:1,2,3,m,n-1,n,n+111.设计题:等价划分、因果图、边界值分析(三选一)12.软件可靠性和可用性软件可靠性是程序在给定的时间间隔内,按照规格说明书的规定成功的运行的概率;软件可靠性是程序在给定的时间点,按照规格说明书的规定成功的运行的概率;13.系统的稳态可用性:14.植入错误法:分别测试法:第八章维护所谓软件维护就是在软件已经交付使用之后,为了改正错误或满足新需要而修改软件的过程1.完善性维护50%左右改正性维护17%左右适应性维护20%左右预防性维护4%左右2.决定软件的可维护性因素:可理解性、可测试性、可修改性、可移植性、可重用性3.①修改代码副作用②修改数据副作用③修改文档资料的副作用第九章面向对象方法学引论1.OO=objects+classes+inheritance+communicationwithmessages2.面向对象方法学的优点:①与人类习惯的思维方法一致;②稳定性好;③可重性好;④较易开发大型软件产品;⑤可维护性好3.对象模型——类图动态模型——状态图功能模型——用例图第十章面向对象分析复杂问题的对象模型的5个层次:主题层、类与对象层、结构层、属性层、服务层第十一章面向对象设计1.设计问题域子系统、设计人机交互式子系统、设计任务管理子系统、设计数据库子系统2.类构件的重用方式:实例重用、继承重用、多态重用3.子系统之间的两种交互方式:客户-供应商关系、平等伙伴关系第十二章面型对象的实现1.面型对象的集成测试:基于线程的测试、基于使用的测试2.测试单个类的方法主要有随机测试、划分测试、基于故障测试第十三章软件项目管理1.开发同一个软件的时候,如果把项目持续时间延长一些,则可以降低完成项目所需的时间。2.COCOMO2模型:①应用系统组成模型:主要用于构建原型的工作量②早期设计模型:适用于体系结构设计阶段③后体系结构模型:适用于完成体系结构设计之后的软件开发阶段3.Brooks规律:向一个已经延期的项目增加人力,只会使得它更加延期。4.软件项目的开发时间最多可以减少到正常开发时间的75%,如果要求一个软件系统的开发时间过短,则开发成功的概率几乎为0.5.关键路径——计算题6.人员组织:民主制程序员组、主程序员组、现代程序员组7.软件质量保证(SQA)的措施:基于非执行的测试、基于执行的测试、程序正确性证明8.软件配置管理的作用:①标识变化②控制变化③确保适当的实现了变化④向需要知道这类信息的人报告变化9.基线:已经通过了正式复审的规格说明书或中间产品,它可以作为进一步开发的基础,并且只有通过正式的变化控制过程才能改变它。10.能力成熟度的5个等级:低到高:初始级、可重复级、已定义级、已管理级、优化级