软件工程复习资料.docx
- 文档编号:10405957
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:40
- 大小:990.23KB
软件工程复习资料.docx
《软件工程复习资料.docx》由会员分享,可在线阅读,更多相关《软件工程复习资料.docx(40页珍藏版)》请在冰点文库上搜索。
软件工程复习资料
第一章软件工程概述
一、软件危机
1.概念:
软件危机是指在计算机软件开发、使用与维护过程中遇到的一系列严重问题。
2.为什么会产生软件危机?
当软件开发技术的进步不能跟上硬件技术的进步,未能满足发展的要求,致使软件开发中遇到的问题找不到解决的办法,使问题积累起来,形成了尖锐的矛盾,因而导致了软件危机。
3.软件危机的表现:
⏹经费预算经常突破,完成时间一再拖延
⏹开发的软件不能满足用户要求
⏹开发的软件可维护性差
⏹开发的软件可靠性差
4.产生软件危机的原因:
⏹软件的规模越来越大,结构越来越复杂
⏹软件开发管理困难而复杂
⏹软件开发费用不断增加
⏹软件开发技术落后
⏹软件的生产方式、开发工具落后,生产率提高缓慢
⏹其它,如:
软件本身的特点、没有适当的文档资料、用户需求的不明确、缺乏好的开发方法和手段等
5.缓解软件危机的途径——软件工程
二、软件工程
1.软件工程定义
用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
2.软件工程三要素
⏹方法:
研究软件开发“如何做”的技术。
⏹工具:
研究支撑软件开发方法的环境。
⏹过程:
将方法、工具综合起来,以达到合理、及时进行计算机软件开发的目的。
3.目标
⏹付出较低的开发成本,达到要求的软件功能;
⏹取得较好的软件性能;
⏹开发的软件易于移植;
⏹需要较低的维护费用;
⏹能按时完成开发任务,及时交付使用;开发的软件可靠性高
(即在保证质量和效率的同时,尽量缩短开发期,降低成本,最终要高性能与可靠性。
目的是使软件生产规范化和工程化。
)
三、软件生存周期
1.定义
指从提出软件开发要求开始,直到该软件报废不用为止的整个时期。
这个时期又分为若干个阶段,对软件生产的管理和进度控制有重要作用,使软件的开发有相应的模式、流程、工序和步骤。
2.划分
可将软件生存周期划分为3个过程共8个阶段:
*3个过程是:
软件定义、软件开发、软件维护。
*8个阶段有:
问题定义、可行性研究、需求分析、总体设计、详细设计、编码和单元测试、综合测试、维护
3.各阶段的基本任务:
通常包括以下4类基本过程:
1.软件规格说明:
规定软件的功能及其运行环境。
2.软件开发:
产生满足规格说明的软件。
3.软件确认:
确认软件能够完成客户提出的要求。
4.软件演进:
为满足客户的变更要求,软件必须在使用的过程中演进。
四、软件工程过程
1.软件开发模型:
(软件生存周期模型、软件过程模型)
——软件开发全部过程、活动和任务的结构框架。
它能直观表达软件开发全过程,明确规定要完成的主要活动、任务和开发策略。
2.软件开发模型的几种类型:
⏹以软件需求完全确定为基础的瀑布模型;
⏹在开发初期仅给出基本需求的渐进式模型,如原型模型、螺旋模型、喷泉模型等;
⏹以形式化开发方法为基础的变换模型、基于四代技术的模型;基于知识的智能模型等等。
⏹基于知识的智能模型
Ø瀑布模型
基本思想:
根据软件生命周期各阶段的任务,从问题定义开始,逐步进行阶段性变换,就像瀑布一样从上流下来,称为瀑布型。
它规定了各阶段的任务和应提交的成果及文档,每一阶段的任务完成后,都必须对其阶段性产品(主要是文档)进行评审,通过后才能开始下一阶段的工作。
因此,它是一种以文档作为驱动的模型。
特点:
①阶段间具有顺序性和依赖性
②推迟实现的观点
③质量保证的观点。
缺点:
1)在开发初期就要给出全部的需求,是不大容易确定的。
2)这种预先定义需求的方法不能适应用户需求的不断变化。
3)开发周期长,承担的风险也比较大。
4)缺乏灵活性,对开发过程中很难发现的错误,只有在最终产品运行时才能暴露出来,从而使软件产品难以维护,不适应实际的开发过程。
适应的场合:
瀑布模型一般适用于功能、性能明确、完整、无重大变化的软件系统的开发。
例如操作系统、编译系统、数据库管理系统等系统软件的开发。
应用有一定的局限性。
Ø
增量模型
基本思想:
瀑布模型属于整体开发模型,而增量模型属于非整体开发模型。
开发软件时,把软件产品作为一系列增量构件来设计、编码、集成和测试,每个构件由若干个相互协作的模块组成,并且能完成相对独立的功能。
特点:
能在较短的时间内向用户提交可完成部分工作的产品;逐步增加产品功能,从而使用户有较充裕的时间学习和适应新产品,减少一个全新的软件给客户组织带来的冲击。
缺点:
要求软件工程师必须具有较高的技术水平,能设计出开放式的软件体系结构。
适应的场合:
瀑布模型适合于需求明确的软件项目,而增量模型适合于需求不明确的软件项目。
Ø螺旋模型
基本思想:
将瀑布模型和增量模型相结合,并加入了风险分析,沿螺旋线自内向外每旋转一圈便开发出更为完善的一个新的软件版本。
在每个螺旋周期内分为制定计划、风险分析、开发实施和用户评估四个步骤。
⏹制定计划:
确定目标、选定方案、弄清开发的限制条件
⏹风险分析:
评价方案、识别风险、消除风险。
⏹开发实施:
实施软件开发
⏹客户评估:
评价开发工作,提出修正建议。
特点:
⏹模型结合性
⏹过程迭代性
⏹减少了过多测试或测试不足带来的风险
缺点:
⏹开发过程复杂,给过程管理和控制带来难度
⏹使用该模型需要有相当丰富的风险评估经验和专门知识,要求开发队伍水平较高。
⏹适应的场合:
⏹吸收了软件工程“演化”的概念,适合于大型软件的开发
Ø喷泉模型
基本思想:
它是以用户需求为动力,以对象来驱动的模型,适合以面向对象的软件开发方法。
特点:
⏹各阶段相互重叠,反映了软件过程并行性的特点
⏹在开发过程有4个阶段,即分析、系统设计、软件设计和实现
⏹开发过程具有迭代性和无间隙性
缺点:
过程在喷泉模型中已被弱化
Ø快速原型模型
基本思想:
快速原型模型是针对瀑布模型的缺点提出来的。
在项目的早期就尽快生产出一个简化且便宜的原型版本。
即在软件开发初期先从用户的基本功能出发,开发构造系统的原型,并由系统使用者试用,从中发现需求的错误或遗漏的地方,从而确定需求并保证需求的有效性。
开发的途径:
1)仅模拟软件系统的人机界面和人机交互方式。
2)开发一个工作模型,实现软件系统中重要的或容易产生误解的功能。
3)利用一个或几个类似的正在运行的软件向用户展示软件需求中部分或全部功能。
特点:
⏹原型驱动性:
通过围绕原型来确认用户需求,反复修改最终得到用户确认的软件定义。
⏹过程的交互性和迭代性:
开发人员和用户之间不断评价原型而进行的一个交互过程,且不断改进和完善的迭代过程。
⏹允许用户完善对软件系统的需求,开发周期相对缩短、成本较低。
⏹是一种自外向内型的设计过程
缺点:
⏹是用户和设计人员交换最频繁的方法,频繁的需求变化会使开发进程难于管理和控制;
⏹这种模型对技术要求较高
适应的场合:
它适合于那些不能预先确切定义需求的软件系统的开发,更适合于那些项目组成员(包括分析员、设计员、程序员和用户)不能很好交流或通信有困难的情况。
Ø其它模型:
⏹变换模型——基于形式化规格说明语言及程序变换的软件开发模型。
⏹基于四代技术的模型——一种面向问题而非面向过程的语言。
✧应用题
假设你被任命为一家软件公司的项目负责人,你的工作是管理该公司已经被广泛应用的字处理软件个新版本开发。
由于市场竞争激烈,公司规定了严格的完成期限并且已经对外公布。
你打算采用哪种软件生命周期模型?
为什么?
第二章需求工程
一、为什么要进行需求分析?
⏹开发人员往往急于求成
⏹希望对开发进行指导
⏹希望开发人员对用户的要求理解
⏹希望用户理解开发人员
⏹测试部门有理可依——该阶段定义的标准将成为软件测试阶段的测试目标
二、基本任务和主要工作
1.基本任务:
准确的定义新系统目标,为了满足用户需要,回答系统必须“做什么”的问题。
2.主要工作:
1)问题识别。
双方确定对问题的综合需求。
2)分析与综合,导出软件的逻辑模型。
分析人员对获取的需求,进行一致性的分析检查,划分成各个子功能,确定系统的构成及主要成份,并用图文结合的形式,建立起新系统的逻辑模型。
3)编写文档。
最终结果是产生“需求规格说明书”、编写初步用户使用手册、编写确认测试计划、修改完善软件开发计划。
3.需求获取非常困难的主要原因有:
⏹用户需求的复杂性
⏹涉及各方面人员引起的交流障碍
⏹用户对需求陈述的不完备性和不一致性
⏹需求的易变性
4.需求分析的步骤
⏹分析系统的各种需求
⏹建立系统的逻辑模型
⏹修正开发计划
⏹开发原型系统
⏹验证软件需求的正确性
⏹编写软件需求规格说明书
Ø结构化分析方法(SA)
1.SA法的基本思想——“分解”和“抽象”
分解:
对于一个复杂的系统,为了将复杂性降低到可以掌握的程度,可以把大问题分解成若干小问题,然后分别解决。
抽象:
分解可以分层进行,即先考虑问题最本质的属性,暂把细节略去,以后再逐层添加细节,直至涉及到最详细的内容,这种用最本质的属性表示一个系统的方法就是“抽象”。
2.SA方法分析策略:
自顶向下逐步求精
3.SA法的步骤:
1调查了解当前系统的工作流程,建立当前系统的具体模型
2抽象出当前系统的逻辑模型,建立当前系统的逻辑模型
3对当前系统的逻辑模型进行分析,建立目标系统的逻辑模型
4完善目标系统,写出目标系统的软件需求规格说明书
5对软件需求规格说明书进行评审
4.SA法的优缺点
优点:
结构化分析方法是软件需求分析中公认的、有成效的、技术成熟、使用广泛的一种方法,它较适合于开发数据处理类型软件的需求分析。
该方法利用图形等半形式化工具表达需求,简明、易读,也易于使用,为后一阶段的设计、测试、评价提供了有利的条件。
缺点:
(1)SA方法的主要工具DFD体现了系统“做什么”的功能,但它仅仅是一个静态模型,不适合描述实时控制系统。
(2)对于一些频繁的人机交互的软件系统,DFD不适合描述人机界面系统的需求。
(3)描述软件需求的精确性有待提高。
ØSA法的描述方法
1.分层的数据流图(DFD图)
2.数据词典
3.判定表及判定树
4.描述加工逻辑的结构化语言
1.数据流图——基本图形符号:
✧应用题:
定货系统:
假设一家工厂的采购部每天需要一张定货报表,报表按需件编号排序,表中列出所有需要再次定货的零件。
对于每个需要再次定货的零件,应该列出下述数据:
零件编号、零件名称、定货数量、目前价格、主要供应者、次要供应者、零件入库或出库称为事务。
通过放在仓库中的CRT终端把事务报告给定货系统。
当某种零件的库存数量少于库存量临界值时就应该再次定货。
第一步:
从问题描述中提取数据流图的四种成分:
源点或终点、处理、数据存储、以及数据流。
(1)数据的源点/终点
采购员是数据终点,仓库管理员是数据源点。
(2)处理
①采购部需要报表→说明没有报表→要有一个“产生报表”的处理。
②零件库或出库(事务)→改变零件库存量→要有“事务加工”处理。
(3)数据流
①要求系统把定货报表送给采购部→“定货报表”是一个数据流。
②事务要从仓库送到系统中→“事务”是另一个数据流。
(4)数据存储
①当有五个事务发生时立即要处理,但每天只产生一次定货报表→说明“事务加工”与“产生报表”这两个处理在时间上的不匹配→因此,“产生定货报表的数据”是一个数据存储。
②零件库存量与库存量临界值均需保存→“库存清单数据”是一个数据存储。
组成数据流图的元素表:
成分
元素内容
源点/终点
1.采购员(终点)
2.仓库保管员(源点)
处理
1.产生报表
2.事务加工(处理事务)
数据流
1.定货报表
2.事务
数据存储
1.产生定货报表的数据信息
2.库存清单数据与库存临界值
第二步:
画数据流图:
(1)定货系统的基本系统模型(顶层数据流图):
(突出表明数据的源点和终点)
(2)定货系统的功能报表流图:
(0层数据流图)
(3)进一步分解“处理事务”功能后的数据流图:
(分层数据流图)
画数据流图的步骤:
◆画顶层的数据流图
列出系统的全部数据源点和终点,将系统加工处理过程作为一个整体,即可得到顶层数据流图。
顶层图描述了系统的输入与输出。
◆画各层的数据流图
对系统处理过程进行逐步分解和细化,针对每层画出数据流图
◆画系统的内部
将系统的输入和输出数据流用一连串加工连接起来
◆画出总的数据流图
将最终数据流图画出,注意不要太复杂,要根据实际情况进行布局。
参考的原则:
◆数据守恒(即每个加工至少应有一个输入数据流和一个输出数据流)
◆数据流图中各构成元素名称必须具有明确的含义且能够代表对应元素的内容或功能
◆父图与子图的“平衡”
◆应按照层次给每个加工编号,用于表明该加工所处的层次及上、下层的父图与子图的关系。
◆在父图中不要出现子图中涉及的局部数据存储文件
◆加工分解时,尽量将问题分解为大小均匀的几个部分
✧实例应用:
指出下列数据流图中存在的问题。
✧实例考务处理系统功能
①对考生送来的报名单进行检查;
②对合格的报名单编好准考证号后将准考证送给考生,并将汇总后的考生名单送给阅卷站;
③对阅卷站送来的成绩清单进行检查,并根据考试中心制定的合格标准审定合格者;
④制作考生通知单(含成绩及合格/不合格标志)送给考生;
⑤按地区进行成绩分类统计和试题难度分析,产生统计分析表。
三、数据词典(DD)
1.基本概念:
数据字典(DD):
是用来定义数据流图中的各个成分的具体含义的。
它以一种准确的、无二义性的说明方式为系统的分析、设计及维护提供了有关元素的一致的定义和详细的描述。
2.作用:
它和数据流图共同构成了系统的逻辑模型,是需求规格说明书的主要组成部分。
数据字典是为分析人员查找数据流图中有关名字的详细定义而服务的,因此也像普通字典一样,要把所有条目按一定的次序排列起来,以便查阅。
3.数据字典条目:
A.数据流条目:
给出某个数据流的定义,通常是列出该数据流的各组成数据项。
例如:
报名单=姓名+单位名+年龄+性别+课程名
常用符号:
=、+、[|]、{}、()、
B.文件条目 给出某个文件的定义,文件的定义通常是列出文件记录的组成数据流。
例如:
订单文件=订单编号+顾客名称+产品名称+订货数量+交货日期
C.数据项条目
数据项条目给出某个数据单项的定义,通常是数据项的值类型,允许的取值范围。
D.加工条目
加工类条目就是“加工小说明”。
一般应该单独列出。
✧实例数据字典例:
餐馆的电话服务如下:
可以拨分机号和外线号。
分机号是从7201~7299。
外线号先拨9,然后是市话号码或长话号码。
长话号码是以区号和市话号码组成。
区号是从100~300中任意的数字串。
市话号码是以局号和分局号组成。
局号可以是455、466、888、552中任意一个号码。
分局号是任意长度为4的数字串。
要求:
写出在数据字典中,电话号码的数据条目的定义(即组成)。
Ø判定表
✧实例判定表应用
例:
一图书销售系统,其中一加工为“优惠处理”,条件是:
顾客的营业额大于1000元,同时必须信誉好,或者虽然信誉不好,但是20年以上的老主顾。
✧实例用判定表表示教师课时津贴费规定。
⏹某校对各种不同职称教师,根据其是本校专职教师还是外聘兼职教师,决定其讲课的课时津贴费。
⏹本校专职教师每课时津贴费:
教授50元,副教授40元,讲师30元,助教20元。
外聘兼职教师每课时津贴费:
教授60元,副教授50元,讲师40元,助教30元。
⏹优点:
能够将复杂的问题按照各种可能的情况全部列举出来,简明并避免遗漏。
⏹缺点:
它不能表达顺序结构,也不能表达循环结构,所以判定表不适合做通用的设计工具。
✧实例判定树和判定表的应用
假设某航空公司规定,乘客可以免费托运重量不超过30公斤的行李。
当行李重量超过30公斤时,对国内乘客收费标准为:
头等舱的正常乘客超重部分每公斤收费4元,对其他舱的正常乘客超重部分每公斤收费6元;对外国乘客的收费标准为:
头等舱和其他舱的正常乘客超重部分每公斤收费都比国内正常乘客多一倍;而对残疾乘客收费标准为:
超重部分每公斤收费比国内外各舱正常乘客少一半。
用判定树表示与上述每种条件组合相对应的动作。
✧实例判定表画出以下问题的行为逻辑
人们往往根据天气情况决定出门时的行装;天气可能下雨,也可能不下雨;天气可能变冷,也可能不变冷。
如果天气要下雨,出门时带上雨伞;如果天气变冷,出门时要穿上大衣。
第三章软件设计SD方法
一、软件设计阶段任务
1.总体设计的任务:
回答“概括的说,系统应该如何实现”的问题。
2.具体过程:
–系统设计
–结构设计
–数据库设计
–编写总体设计文档
–审查和复审
二、软件设计的基本原理
⏹软件的模块化
⏹模块独立性
⏹抽象和逐步求精
⏹信息隐蔽和局部化
1.模块化准则:
模块:
构成程序的基本构件,在一个模块中,功能、状态和接口反映模块的外部特性,逻辑(即内部数据和程序代码)反映它的内部特性。
模块化:
解决一个复杂问题时自顶向下逐层把软件系统化分成若干模块的过程。
就是将系统划分成若干模块,每个模块完成一个特定的子功能,所有的模块按某种方法组装起来,成为一个整体,完成整个系统所要求的功能。
模块化是软件解决复杂问题所具备的手段。
2.模块间的关系:
软件结构表示软件的系统结构,它是软件模块间关系的表示,均表示为层次关系。
3.有关指标:
①深度:
表示软件结构中从顶层模块到最底层模块的层数。
②宽度:
表示控制的总分布。
③扇出数:
指一个模块直接控制下属的模块个数。
④扇入数:
指一个模块的直接上属模块个数。
4.软件独立性准则:
软件独立性的含义:
是指每个模块只完成系统要求的独立的子功能,并且与其它模块的联系最少且接口简单,是模块化、抽象和信息隐蔽的直接产物,又称为模块独立性准则。
独立:
模块完成独立的功能
符合信息隐蔽和信息局部化原则
模块间关联和依赖程度尽量小
思考回答:
为什么模块独立性很重要?
5.信息隐蔽:
指在设计和确定模块时,使得一个模块内包含的信息(过程或数据),对于不需要这些信息的其它模块来说,是不能访问的。
通过信息隐蔽,可以定义和实施对模块的过程细节和局部数据结构的存取限制。
三、结构化设计方法的启发式原则
⏹改进软件结构以提高模块独立性——力求降低耦合、提高内聚
⏹软件结构的模块规模应该适中——过大,可理解程度很低;过小,则开销大于有效操作
⏹深度、宽度、扇出和扇入都应适当——经验证明,一个设计好的软件结构,通常顶层扇出比较高,中层扇出比较少,底层有高扇入。
⏹模块接口简单清晰
四、模块独立程度的定性标准
1.内聚性
度量模块的内部特征,标志一个模块内各个元素彼此结合的紧密程度,也称块内联系。
2.耦合性
度量模块的外部特征,是对一个软件结构内不同模块之间互连程度的度量,也称块间联系。
每个模块只要完成独立的功能,与其它模块联系越少,则模块的独立性就越强。
通过模块与模块之间的耦合性和模块内部的内聚性来衡量模块的独立性。
3.模块的内聚
内聚度按其高低程度可分为七级,内聚度越高越好。
内聚性:
又称为块内联系,指模块的功能强度的度量,即一个模块内部各个元素彼此结合的紧密程度的度量。
•
(1)偶然内聚
•
(2)逻辑内聚
•(3)时间内聚
•(4)过程内聚
•(5)通信内聚
•(6)顺序内聚
•(7)功能内聚
内聚按紧密程度从高到低排列:
功能内聚、顺序内聚、通信内聚、过程内聚、时间内聚、逻辑内聚、偶然内聚。
4.模块的耦合
耦合度是对软件结构中模块间关联程度的一种度量,耦合度也可以分为七级。
•非直接耦合
•数据耦合
•控制耦合
•特征耦合
•公共环境耦合
•内容耦合
5.小结:
模块耦合越弱,则说明模块的独立性越强
①与内聚度正好相反,在设计软件时应追求尽可能松散耦合的系统。
因为对这类系统中任一模块的设计、测试和维护相对独立。
由于模块间联系较少,错误在模块间传播的可能性也随之变小。
②如何降低模块间的耦合度:
•尽量使用数据耦合;
•少用控制耦合;
•限制公共耦合的范围;
•坚决避免使用内容耦合。
6.软件独立性的度量标准是两个定性指标
一、结构化设计方法
SD(StructuredDesign)法与SA、SP法前后衔接,是结构化开发方法的核心。
它是以需求分析阶段产生的数据流图为基础,根据问题域的数据流定义一组不同的映射,把数据流图变换成软件结构。
2.作用
提供了方便的从数据流图到软件结构的变换。
3.目的
提出满足系统需求的最佳软件结构。
二、SD法的设计步骤
①对DFD图进行复审,必要时修改或细化;
②根据数据流图确定问题的类型,针对不同的类型分别进行分析处理;
③由DFD映射成初始SC图;
④改进SC图,直至得到符合要求的结构图。
1.变换分析步骤:
(1)在DFD上区分输入、变换中心和输出3个部分,标出它们之间的边界;
(2)画出初始的SC图框架,顶层是主控模块,下层(第一层)一般包括输入、输出、变换三个模块。
沿数据调用线标注数据流的名称。
(3)对输入、变换处理、输出这三个分支进行自顶向下的分解,画出各个分支所需要的全部模块。
(4)将初始的SC图的框架和各个分支所需要的全部模块结合起来,就构成了底层的软件结构图。
2.中心变换型的DFD图:
这类数据流图可看成是对输入数据进行转换而得到输出数据的处理。
DFD图具有较明确的输入流、变换中心和输出流可以明显分为“输入—处理—输出”三部分
3.事务分析步骤:
⏹
(1)在DFD图上划分接收、事务中心和发送3个部分,标出它们之间的分界;
⏹
(2)画出初始的SC图框架,将上述3个部分映射为事务控制模块、接收分支和动作发送分支。
如下图。
⏹(3)分解和细化接收分支和发送分支,画出各个分支所需要的全部模块。
⏹(4)将初始的SC图的框架和各个分支所需要的全部模块结合起来,就构成了底层的软件结构图。
4.混合流设计:
步骤:
(1)确定数据流图整体上的类型。
(2)标出局部的数据流图范围,确定其类型。
(3)按整体和局部数据流图的特征,设计软件结构图。
(4)最终软件结构图:
5.混合流设计2:
(1)最终软件结构图:
✧实例学校工资支付系统结构化分析如下请画出软件结构图
下图是工资支付系统,从它完整数据流图出发,请设计出工资支付系统的结构。
优化后的工资支付系统结构如图:
三、详细设计
1.结构化程序设计:
是一种典型的面向数据流的软件总体设计方法。
它采用自顶向下、逐步求精的设计方法和单入口和单出口的控制结构,且只包含顺序、选择和重复结构。
●基本要点:
(1)采用自顶向下、逐步求精的程序设计方法:
详细设计中某个模块内部处理过程仍然可以逐步求精,降低处理细节的复杂程度。
(2)使用三种基本控制结构构造程
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件工程 复习资料