软件工程笔记(完整版)
- 格式:docx
- 大小:80.63 KB
- 文档页数:7
可编辑修改精选全文完整版一、单选题(共20题,40分)1、使用数据流图,并不断细化的需求获取方法是()。
(2.0)A、简易的应用规格说明B、面向数据流自顶向下逐步求精C、访谈D、快速原型法正确答案: B2、Z语言是以()为基础的形式化规格说明语言。
(2.0)A、微积分B、概率C、图形D、一阶谓词演算正确答案: D3、HIPO是指(2.0)A、层次输入处理输出图或表B、层次功能结构图C、功能结构图D、输入处理输出图或表正确答案: A4、高铁调用系统最适宜采用()方法。
(2.0)A、有穷状态机B、 Petri网C、 Z语言D、一阶线性时态逻辑正确答案: B5、假设学生年龄的成绩输入范围为18-25,则根据等价类划分技术,下列划分正确的是()。
(2.0)A、可划分为2个有效等价类,2个无效等价类B、可划分为1个有效等价类,2个无效等价类C、可划分为2个有效等价类,1个无效等价类D、可划分为1个有效等价类,1个无效等价类正确答案: B6、用于并发系统,解决定时问题的形式化方法是()。
(2.0)A、 VDMB、 Z语言C、 Petri网D、一阶线性时态逻辑正确答案: C7、软件生命周期中所花费费用最多的阶段是(2.0)A、需求分析B、软件总体设计C、软件维护D、软件实现正确答案: C8、软件质量保证措施SQA不包括:(2.0)A、复审或评审B、软件测试C、程序正确性证明D、软件代码编写正确答案: D9、希望确定软件实现的功能是否与需求规格说明书一致,需进行()。
(2.0)A、单元测试B、有效性测试C、确认测试D、集成测试正确答案: C10、总体设计不包括:(2.0)A、体系结构设计B、数据库设计C、模块内算法设计D、逻辑数据结构设计正确答案: C11、关于类和对象的说法,正确的是(2.0)A、一个类只能有一个角色B、类的命名必须用动词C、类的所有对象都具有相同的属性和操作D、类是对象的实例,对象是类的抽象正确答案: C12、数据字典的基本功能是(2.0)A、数据库设计B、数据通信C、数据定义D、数据维护正确答案: C13、软件需求规格说明的内容不应该包括(2.0)A、主要功能B、算法的描述C、用户界面及其运行环境D、软件性能正确答案: B14、增量模型在添加新的模块时,有一个要求是()(2.0)A、需要更多的测试B、有足够的开发人员C、软件体系结构开放D、各个模块都要进行评审正确答案: C15、在软件详细设计过程中不采用的工具是(2.0)A、判定表B、PDLC、程序流程图D、DFD正确答案: D16、软件测试方法中,黑盒测试方法和白盒测试方法是常用的方法,其中黑盒测试方法主要用于测试(2.0)A、结构合理性B、软件外部功能C、程序正确性D、程序内部逻辑正确答案: B17、耦合是模块之间的相对独立性的度量。
软件工程笔记软件工程是一门关于构建和维护软件系统的学科。
在这门学科中,我们需要掌握一系列的原理和方法,以确保软件的质量和可靠性。
本文将对软件工程的基本概念和常用工具进行笔记总结,帮助读者更好地理解并应用软件工程的知识。
一、软件生命周期软件开发的过程可以被看作是一个生命周期,其中包含了多个阶段。
常见的软件生命周期模型有瀑布模型、迭代模型和敏捷模型等。
1. 瀑布模型瀑布模型是最经典的软件开发模型之一,它将软件开发过程划分为需求分析、设计、编码、测试和维护五个阶段。
开发团队需逐个完成这些阶段,且每个阶段的结果是固定的,即前一阶段的输出作为后一阶段的输入。
2. 迭代模型迭代模型是在瀑布模型基础上发展而来的一种软件开发模型。
该模型将整个开发过程划分为多个迭代周期,每个迭代都包含需求分析、设计、编码、测试和维护等阶段。
每个迭代的输出可作为下一次迭代的输入,以此循环进行。
3. 敏捷模型敏捷模型强调快速迭代和反馈,鼓励团队协作和灵活性。
开发团队通过短周期的迭代,不断交付可用的软件版本,并根据用户反馈进行调整和改进。
敏捷开发方法有Scrum、XP等。
二、需求工程需求工程是软件工程的重要环节,它包括需求获取、需求分析、需求规格和需求验证等过程。
1. 需求获取需求获取是指通过各种技术手段和方法,从用户、领域专家和相关文档中获取软件系统的需求信息。
常用的需求获取技术包括访谈、问卷调查、原型设计和场景分析等。
2. 需求分析需求分析是对获取的需求进行理解和分类的过程。
分析人员需要识别出用户的需求,确定需求的优先级和约束条件,并将其转化为可操作的规格说明。
3. 需求规格需求规格是将需求写入规范文档的过程。
通常采用的规格化方法有自然语言、用例和面向对象建模等。
4. 需求验证需求验证是确保规格所描述的需求能够满足用户期望的过程。
常用的验证方法包括检查列表、原型演示和用户评审等。
三、软件设计软件设计是将需求转化为软件结构和组件的过程。
自考软件工程02333 笔记一、概述软件工程作为一门新兴的学科,旨在指导和管理软件开发过程中的各种活动,以便按时、按质、按成本地完成软件工程项目。
本课程通过系统地介绍软件工程的基本理论、基本方法、基本技术和实践应用,以培养学生的软件工程思维和实际操作能力。
二、课程要求1. 了解软件工程的基本概念、基本原理和基本方法;2. 掌握软件工程项目的开发过程和管理过程;3. 掌握软件工程开发过程中的基本工具和技术;4. 了解软件工程应用领域的发展趋势与前沿技术。
三、课程内容1. 软件工程概述软件工程的定义、历史、发展、意义、主要任务等;2. 软件生命周期软件生命周期模型、活动、任务、文档、质量保证;3. 需求工程需求获取、需求分析、需求规格说明、需求验证等;4. 软件设计结构化设计、面向对象设计、界面设计、数据库设计等;5. 软件构建编码规范、程序设计、测试、集成等;6. 软件测试测试基本概念、测试方法、测试工具、测试用例设计等;7. 软件维护软件维护的类型、需求、过程、技术等;8. 软件质量管理质量计划、质量保证、缺陷管理、度量与分析等;9. 项目管理项目计划、进度管理、成本管理、风险管理等;10. 软件工程发展趋势软件工程的前沿技术、新兴趋势及应用领域。
四、学习方法1. 认真听课,理清教学内容;2. 多做习题,巩固理论知识;3. 积极参与讨论,提升理论水平;4. 关注实践应用,培养实际操作能力;5. 及时总结,形成完整的软件工程知识体系。
五、考试重点1. 考试内容:对软件工程的基本概念、基本原理、基本方法和实践应用的掌握程度;2. 考试形式:闭卷考试,以选择题、简答题、计算题形式出题;3. 考试要求:理论与实践相结合,注重分析和解决实际问题的能力。
六、学习建议1. 认真学习课本内容,了解软件工程的基本理论和方法;2. 多参加实验课和讨论班,加强理论与实践的结合;3. 多做习题,熟悉考试题型和内容要点;4. 关注软件工程的发展趋势,了解前沿技术和新兴应用。
软件工程知识点第一章软件工程概述一、软件的定义和特性(P2—P3)定义:软件=程序+数据+文档程序:按照事先设计的功能和性能要求执行的指令或语句序列数据:程序能正常操纵信息的数据结构文档:描述程序操作和使用的文档特性:(1)软件是一种逻辑实体,具有抽象性,不是一般的物理实体;(2)软件的成产与硬件存在某些相同点,但有根本上的不同,软件开发是人的智力的高度发挥,而不是传统意义上的制造,它更依赖于开发人员的素质,智力,人员和组合,合作和管理;(3)软件维护与硬件维修有着本质的差别,软件维护没有硬件维护那样有可替换的标准零件;(4)软件在运行和使用期间没有硬件那样的机械磨损,老化问题,但存在退化问题;(5)基于构件的开发方法由于其自身的特点越来越受到人们的重视,这些技术可以减少开发时间、提高质量,并提高复用水平。
* 掌握P4图1-2(b)软件失效率曲线二、计算机软件的发展经历了几个阶段?各有何特征?(P1—P2)共经历了四个阶段特征:第一阶段——程序规模小且主要采用个体工作方式,开发的系统大多采用批处理技术第二阶段——引入人机交互的概念,实时系统出现,产生了第一代数据库管理系统,程序编制采用了合作的工作方式,出现了早期的软件危机第三阶段——分布式系统出现,嵌入式系统得到广泛应用,低成本硬件第四阶段——强大的桌面系统和计算机网络迅速发展时期,面向对象技术得到广泛应用,人工智能技术和专家系统开始应用于软件。
三、什么是软件危机?其产生的原因是什么?定义:软件危机是指由于落后的软件生产方式无法满足迅速增长的计算机软件应用需求,从而导致软件开发与维护过程中出现一系列严重问题的现象。
(P4)原因:(P5)(1)用户对软件需求的描述不准确、不全面,甚至有错误,以及在开发过程中,不断提出或者修改需求;(2)用户和开发人员对软件需求的理解存在差异,导致所开发的软件产品和用户需求不一致;(3)大型软件项目需要组织一定的人力共同完成,各类人员的信息交流不及时、不准确,有时还可能产生误解,软件开发人员对大型软件缺少开发经验,管理人员缺少相应的管理经验;(4)软件开发人员不能有、独立自主的处理大型软件的全部关系和各个分支,因此容易产生疏漏和错误;(5)开发技术落后,缺乏有效的方法学和工具方面的支持,过分依赖程序设计人员在软件开发过程中的技巧和创造性,加剧软件产品的个性化(6)软件产品的特殊性和人类智力的局限性,导致人们无法处理“复杂问题”,因为软件是逻辑产品,软件开发进展情况较难衡量、软件开发质量难以评价、管理和控制软件开发过程相当困难。
第一章软件工程概述1.软件危机(software crisis):是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。
即“两低一高”问题:质量低、效率低、成本高。
软件危机也成为“软件萧条(depression)”或“软件困扰(afflication)”2.软件危机主要表现1)开发成本和进度估计不准2)用户对“已完成的”软件系统不满意3)软件质量往往靠不住4)软件常常是不可维护的5)软件通常没有适当的文档资料6)软件成本逐年上升7)软件开发生产率滞后于硬件和计算机应用普及的趋势3.产生软件危机的原因1)与软件本身的特点有关a. 软件不同于硬件,是逻辑部件而不是物理部件缺乏可见性难于测试管理和控制开发过程困难不会因使用时间过长而被“用坏”难以维护b.软件不同于一般程序,规模庞大,而且程序复杂性随着程序规模的增加而呈指数上升2)和软件开发与维护的方法不正确有关a.对软件开发和维护有关的错误认识和作法忽视软件需求分析的重要性认为软件开发就是写程序轻视软件维护b. 对软件开发过程与方法的认识与应用软件开发要经历一个漫长的时期(编程占10-20%)程序仅是完成软件配置的一个组成部分软件开发方法要有利于软件维护4.软件的特点(1)软件是无形的(intangible)(2)软件副本的大批量生产轻而易举(3)软件业是劳动密集型的(4)一个没有经过充分训练的软件开发人员很容易编写出难以理解和修改的软件(5)软件本身很容易修改。
但由于它的复杂性,又很难正确地修改。
(6)软件不像其他的工业产品那样会因使用而磨损,随着反复修改,它的设计会逐渐退化5.消除软件危机的途径1)对计算机软件的正确认识2)认识到软件开发不是个体劳动的神秘技巧,而是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目3)推广使用成功的软件开发技术和方法4)开发和使用更好的软件开发工具总之, 为了消除软件危机,既要有技术措施(方法和工具),又要有必要的组织管理措施。
软件⼯程导论知识点总结(整理)《软件⼯程导论》课后习题答案第⼀章软件⼯程概论1.什么是软件危机?软件危机是指在计算机软件的开发和维护过程中所遇到的⼀系列严重问题。
这些问题表现在以下⼏个⽅⾯:(1)⽤户对开发出的软件很难满意。
(2)软件产品的质量往往靠不住。
(3)⼀般软件很难维护。
(4)软件⽣产效率很低。
(5)软件开发成本越来越⼤。
(6)软件成本与开发进度难以估计。
(7)软件技术的发展远远满⾜不了计算机应⽤的普及与深⼊的需要。
2.为什么会产⽣软件危机?(1) 开发⼈员⽅⾯,对软件产品缺乏正确认识,没有真正理解软件产品是⼀个完整的配置组成。
造成开发中制定计划盲⽬、编程草率,不考虑维护⼯作的必要性。
(2) 软件本⾝⽅⾯,对于计算机系统来说,软件是逻辑部件,软件开发过程没有统⼀的、公认的⽅法论和规范指导,造成软件维护困难。
(3) 尤其是随着软件规模越来越⼤,复杂程度越来越⾼,原有软件开发⽅式效率不⾼、质量不能保证、成本过⾼、研制周期不易估计、维护困难等⼀系列问题更为突出,技术的发展已经远远不能适应社会需求。
3.怎样克服软件危机?(1) 充分吸收和借鉴⼈类长期以来从事各种⼯程项⽬中积累的⾏之有效的有效原理、概念、技术与⽅法,特别是吸取⼏⼗年来⼈类从事计算机硬件研究和开发的经验教训。
在开发软件的过程中努⼒作到良好的组织,严格的管理,相互友好的协作。
(2) 推⼴在实践中总结出来的开发软件的成功的技术和⽅法,并研究更好、更有效的技术和⽅法,尽快克服在计算机系统早期发展阶段形成的⼀些错误概念和作法。
(3) 根据不同的应⽤领域,开发更好的软件⼯具并使⽤这些⼯具。
将软件开发各个阶段使⽤的软件⼯具集合成⼀个整体,形成⼀个很好的软件开发⽀环环境。
总之为了解决软件危机,既要有技术措施(⽅法和⼯具),⼜要有必要的组织管理措施。
4.构成软件项⽬的最终产品:应⽤程序、系统程序、⾯向⽤户的⽂档资料和⾯向开发者的⽂档资料。
5.什么是软件⽣存周期?软件⽣存周期是指从软件定义、开发、使⽤、维护到淘汰的全过程。
1.软件是计算机系统内中与硬件相互依存的另一部分,是包含程序、数据及其相关文档的完整集合,即软件=程序+数据+相关文档。
2.软件按照功能可划分为:系统软件、支持软件、应用软件。
按照规模划分:微型软件、小型软件、中型软件、大型软件和超级软件。
3.软件危机:对软件开发成本的估计不准确,造成开发成本超出预算;开发进度不能保证,交付时间一再拖延;“已完成”的软件不能满足用户需求;软件产品质量没有保证,运算结果出错、操作死机等现象屡屡发生;软件没有适当的文档资料,或文档与最终交付的软件产品不相符,软件的可维护程度非常低;软件开发生产率赶不上硬件的发展和人们需求的增长。
4.软件工程的层次化结构:工具层,方法层,过程、技术层,质量保证层。
5.软件工程是用工程、科学和数学的原则与方法研制、维护计算机软件的有关技术和管理方法。
6.实现软件开发工程化、系统化的方法是软件生命周期法,主要划分为软件项目的准备阶段、开发阶段和运行维护阶段。
软件项目的准备阶段的主要任务是调查和分析:调查用户需求,分析软件系统项目的主要目标和开发该系统的可行性。
开发阶段:①需求分析②软件设计(概要设计、详细设计)③编码④测试运行维护阶段:改正性维护、适应性维护、完善性维护、预防性维护。
7.软件项目的开发模型:瀑布模型、原型模型、螺旋模型。
8.面向对象(对象:是现实世界中个体或者事物的抽象表示,是它的属性和相关操作的统一封装实体。
类、继承、消息)面向对象=对象+类+继承+消息9.需求分析的任务是将用户的需求转变为软件的功能和性能的描述。
软件从外部可以看作黑盒子(功能)计算机所处理的数据域描述为数据内容(数据项)、数据结构(数据线的组织形势)和数据流(数据通过系统的变化方式)。
10.软件的物理模型要给出处理功能和数据结构的实际表示形式,逻辑模型是设备类型和数据结构的存储方式。
11.需求分析步骤:调查研究,获取需求、分析建模,提炼需求、编写需求说明,描述需求、分析评审,验证需求。
软件工程(简要知识点)软件生命周 期:软件定义 软件开发问题定义(确定题目) 可行性研究 需求分析 概要设计 系统设计 详细设计系统实现编码和单元测试 综合测试运行维护:主要任务是使软件持久地满足用户的需要一、. 软件过程五个模型对比(瀑布模型、快速原型、增量、螺旋、喷泉模型) 二、可行性研究: 1、任务:用最小的代价在尽可能短的时间内确定问题是否能够解决。
2、四个方面:技术、经济、操作可行性、法律 3、数据流图四种成分:1、源点/终点 2、处理 3、数据存储 4、数据流 三、需求分析: 1、任务:确定系统必须完成哪些工作,对目标系统提出完整、清晰、具体的要 求。
2、结构化方法就是面向数据流自顶向下逐步求精进行需求分析的方法。
3、实体联系图:1、数据对象 2、属性 3、联系(1:1、1:N、M:N) 四、总体设计: 1.任务:回答“概括的说,系统应该如何实现”,用比较抽象概括的方式确定系 统如何完成预定的任务,也就是说应该确定系统的物理配置方案,并且进而确定 组成系统的每个程序结构。
2. 系统设计阶段(确定系统具体实施方案)、结构设计阶段(确定软件结构) 3.模块独立:内聚和耦合 4. 耦合表示一个软件结构内各个模块之间的互连程度,应尽量选用松散耦合的 系统5. 内聚 (Cohesion): 一个模块内各元素结合的紧密程度6.面向数据流的设计方法:变换流和事务流 五、详细设计: 1.任务:确定应该怎样具体的实现所要求的系统,也就是说经过这个阶段的设计 工作应该得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译 成用某种程序设计语言书写的程序。
2.过程设计的工具(程序流程图、盒图、PAD 图、判定表、判定树) 七、测试: 1、单元测试:又称模块测试。
每个程序模块完成一个相对独立的子功能,所以 可以对该模块进行单独的测试。
由于每个模块都有清晰定义的功能,所以通常 比较容易设计相应的测试方案,以检验每个模块的正确性。
1.软件危机的概念,内容,原因及消除的途径;软件危机的概念:软件危机是指在计算机软件的开发和维护过程中遇到的一系列严重问题;概括地说,软件危机包含两方面问题:如何开发软件,以满足对软件日益增长的需求;如何维护数量不断膨胀的已有软件;软件危机产生的原因:软件本身的复杂性、难衡量的特点;2.软件开发与维护的方法不正确;消除软件危机的途径:1对计算机软件应当有一个正确的认识;2应当有组织、有计划、通过严格的管理手段进行软件的开发;3及时总结软件开发的成功技术和方法并加以推广;4开发和使用更好的软件工具;总之,为了解决软件危机,既要有技术措施,又要有必要的组织管理措施;2.软件工程的定义,基本原理;定义:软件工程是指导计算机软件开发和维护的一门工程学科;基本原理:软件工程的7条基本原理:1用分阶段的生命周期计划严格管理2坚持进行阶段评审3实行严格的产品控制4采用现代程序设计技术5结果应能清楚地审查6开发小组的人员应该少而精7承认不断改进软件工程实践的必要性3.软件工程方法学的基本概念、内容;基本概念:把在软件生命周期全过程中使用的一整套开发和管理技术方法的集合成为软件工程方法学,也称为范型;软件工程方法学包含3个要素:方法、工具和过程;内容:目前使用得最广泛地软件工程方法学,分别是传统方法学和面向对象方法学;传统方法学也称为生命周期方法学或结构化范型;4.软件生命周期的具体内容,每一个阶段的任务是什么结合具体的工程例子来理解做软件项目主要分那几个个阶段;①问题定义:确定要求解决的问题是什么②可行性研究:决定该问题是否存在一个可行的解决办法③需求分析:深入了解用户的要求,在要开发的目标系统必须做什么问题和用户取得完全一致的看法;④概要设计:概括回答怎样实现目标系统;概要设计又叫逻辑设计、总体设计、高层设计;⑤详细设计:把解法具体化,设计出程序的详细规格说明;详细设计也叫模块设计、底层设计;⑥编码和单元测试:编写程序的工作量只占软件开发全部工作量的10%-20%;⑦综合测试:软件测试的工作量通常占软件开发全部工作量的40%-50%;⑧软件维护:软件维护的费用通常占软件总费用的55%-70%;①②③为软件定义时期,④⑤⑥⑦为软件开发阶段;④⑤为系统设计,⑥⑦为系统实现;5.理解几个典型软件过程的内容及其优点与缺点:瀑布模型、增量模型、快速原型模型、螺旋模型、喷泉模型等;瀑布模型内容:瀑布模型是带“反馈环”的;优点:1可强迫开发人员采用的规范的方法结构化技术;2严格地规定了每个阶段必须提交的文档;3要求每个阶段交出的所有产品都必须经过质量保证小组的仔细验证;缺点:瀑布模型是由文档驱动的;1开发过程一般不可逆,否则代价太大;2实际的项目开发过程很难严格按照模型进行;3客户往往很难清楚地给出所有需求,而该模型却要求如此;4软件的实际情况必须到项目开发的后期客户才能看到,这要求客户有足够的耐心;快速原型模型是快速建立起来的可以在计算机上运行的程序,它所能完成的功能往往是最终产品能完成的功能的一个子集;不带反馈环优点:软件产品的开发基本上是线性顺序进行的;1可以得到比较良好的需求定义,容易适应需求的变化;2有利于开发与培训的同步;3开发费用低、开发周期短且对用户更友好;缺点:1客户与开发者对原型理解不同;2准确的原型设计比较困难;3不利于开发人员的创新;增量模型也称为渐增模型;使用增量模型开发软件时,把软件产品作为一系列的增量构件来设计、编码、集成和测试;优点:在较短时间内可以向用户提交可完成部分工作的产品,逐步增加产品功能可以使用户有比较充裕的时间学习和适应新产品,从而减少一个全新的软件可能给客户组织带来的冲击;1人员分配灵活,刚开始不用投入大量资源;2如果核心产品很受欢迎,则可增加人力实现下一增量;3可先发布部分功能给客户,对客户起到镇定剂的作用;缺点:1并行开发构件有可能遇到不能集成的风险,软件必须具备开放式的体系结构2增量模型的灵活性可以使其适应这种变化的能力大大优于瀑布模型和快速原型模型,但也很容易退化为边做边改模型,从而使软件过程失去整体性;螺旋模型的基本思想是使用原型及其他方法来尽量降低风险;理解这种模型的一种简便方法是把它看做在每个阶段之前都增加了风险分析过程的快速原型模型;优点:1设计上的灵活性,可以在项目的每个阶段进行变更;2以笑得分段来构建大型系统,使成本计算变得简单容易;3客户始终参与每个阶段的开发,保证项目不偏离正确的方向一击项目的可控性;4随着项目的推进,客户始终掌握项目的最新信息,从而他能够和管理层有效地交互;缺点:1采用螺旋模型需要具有相当丰富的风险评估经验和专门知识,在风险较大的项目开发中,如果未能够及时标示风险,势必造成重大损失;2过多的迭代次数会增加开发成本,延迟提交时间;喷泉模型:喷泉模型与传统的结构化生存期比较,具有更多的增量和迭代性质,生存期的各阶段可以相互重叠和多次反复,而且项目的整个生存期中还可以嵌入子生存期;就像水喷上去又可以落下来,可以落在中间,还可以落在底部;6.了解可行性研究中的任务和过程;用最小的代价在尽可能短的时间内确定问题是否能够解决;不是解决问题,而是确定问题是否值得去解决;可行性研究的根本任务:对以后的行动方案提出建议;实质:一次大大压缩简化了的系统分析和设计;任务:1.初步确定项目的规模,目标,约束和限制;2.在澄清了问题定义之后,分析员应该导出系统的逻辑模型;3.从系统逻辑模型出发,探索若干种可供选择的主要解法即系统实现方案;4.对每种解决方法都要研究它的可行性;技术可行性、经济可行性、操作可行性过程:1.复查系统规模和目标访问关键人员,描述目标系统的限制和约束;2.研究目前正在使用的系统:现有系统的问题;3.导出新系统的高层逻辑模型;4.进一步定义问题;5.导出和评价供选择的解法;6.推荐行动方针;7.草拟开发计划;8.书写文档提交审查;7.掌握系统流程图的概念和方法,会从具体的案例中抽象出系统流程图p388.掌握数据流图的概念和方法,会从具体的案例中画出0层数据流图和功能级数据流图P409.掌握数据字典的内容、方法、用户和实现p47内容:数据字典由4类元素定义组成;1数据流;2数据流分量即数据元素;3数据存储;4处理;定义数据的方法:数据字典中的定义就是对数据自顶向下的分解;由数据元素组成数据的方式只有下述3种基本类型:顺序选择重复用途:作为分析阶段的工具;实现:P4910.了解成本/效益分析方法p50货币的时间价值投资回收期:就是使累计的经济效益等于最初的投资费用所需的时间纯收入:整个生存周期之内的累计经济效益折成现在值-投资;投资回收率:现在的投资额P和估算出的将来每年的收益Fn,假设系统的使用寿命为n年;11.了解需求分析过程中任务是什么.p471.确定对系统的综合要求功能需求;指定系统必须提供的服务性能需求;指定系统必须满足的定时约束或容量约束可靠性和可用性需求;应定量指定出错处理需求;指环境错误,非系统本身的错误;2.分析系统的数据要求接口需求;常见的接口需求有:用户接口需求、硬件接口需求、软件接口需求、通信接口需求; 约束;常见的约束有:精度;工具和语言约束;设计约束;应该使用的标准;应该使用的硬件平台;逆向需求;说明软件系统不应该做什么;将来可能提出的要求;3.导出系统的逻辑模型;用数据流图、实体-联系图、状态转换图、数据字典和主要的处理算法描述这个逻辑模型;4.修正系统开发计划;用数据流图、实体-联系图、状态转换图、数据字典和主要的处理算法描述这个逻辑模型;12.理解面向数据流自顶向下逐步求精的方法和意义;p59结构化分析方法就是面向数据流自顶向下逐步求精进行需求分析的方法;通过可行性研究已经得出了目标系统的高层数据流图,需求分析的目标之一就是把数据流和数据存储定义到元素级;方法:为了达到这个目标,通常从数据流图的输出端着手分析,这是因为系统的基本功能是产生这些输出,输出数据决定了系统必须具有的最基本的组成元素;意义:1对数据流图细化之后得到一组新的数据流图,不同的系统元素之间的关系变得更清楚了; 2对这组新数据流图的分析追踪可能产生新的问题,这些问题的答案可能又在数据字典中增加一些新条目,并且可能导致新的或精化的算法描述;3随着分析过程的进展,经过提问和解答的反复循环,分析员越来越深入具体地定义目标系统,最终得到对系统数据和功能要求的满意了解;13.理解分析及建模的意义,需求分析中应该建立哪三种模型有哪些工具来帮助建立这些模型14.需求分析需要建立三种模型:1.数据模型:实体-联系图E-R数据对象即实体之间的关系2.功能模型:数据流图DFD系统对数据进行变换的功能3.行为模型:状态转换图系统的各种状态行为模式及状态之间的转换15.掌握实体关系E-R图的概念,内容和实现方法,能结合具体实例建立实体关系图;P6216.掌握状态图的概念,内容,实现方法和作用;p6517.掌握层次方框图、warnier图、IPO图的概念,内容和作用p6818.有穷状态机的概念和内容;Petri的概念;P77有穷状态机:状态集、输入集、转换函数、初始态、终态集Petri:P8219.总体设计是做什么总体设计的过程是怎样的P9120.总体设计的目标是将需求分析阶段定义的系统模型转换成相应的软件结构,以规定软件的形态及各成分间的层次关系、界面及接口要求;总体设计通常由两个过程组成:系统设计阶段,确定系统的具体实现方案;结构设计阶段,确定软件结构;典型的设计过程包括:1.设想选择的方案2.选取理想的方案3.推荐最佳方案4.功能分解5.设计软件结构6.设计数据库7.制定测试计划8.书写文档9.省查和复审21.掌握软件设计的几个设计原理,理解他们的内容和意义;p941模块化就是把程序划分成独立命名且可独立访问的;2抽象;3逐步求精;4信息隐藏和局部化;5模块独立;它有两个定性标准度量:内聚和耦合;22.掌握耦合和内聚的概念和内容,理解这些原理对设计有哪些指导意义;耦合:耦合是对一个软件结构内不同模块之间互连程度;内聚:内聚标志着一个模块内各个元素彼此结合的紧密;耦合是影响软件复杂程度的一个重要因素;设计时力争做到高内聚,并且能够辨认出低内聚的模块,有能力通过修改设计提高模块的内聚程度并且降低模块间的耦合程度,从而获得较高的模块独立性;23.耦合包含了哪些类型每个类型的具体内容是什么由低到高24.1非直接耦合:就是没有耦合;2数据耦合:就是参数传递耦合,它属于低级别耦合;3标记耦合:标记耦合指两个模块之间传递的是数据结构;4控制耦合:它属于中级别耦合,比如调度程序与进程之间的耦合,就是控制耦合;5外部耦合:属于高级别耦合6公共耦合:指通过一个公共数据环境相互作用的那些模块间的耦合;7内容耦合:属于最高级别耦合,例如,一个模块利用分支或跳转技术,转入到另一个模块中去执行,就是内容耦合;25.启发性规则的内容及部分概念;1.改进软件结构提高模块独立性2.模块规模应该适中3.深度、宽度、扇出和扇入都应适当4.模块的作用域应该在控制域之内5.力争降低模块接口的复杂程度6.设计单入口单出口的模块7.模块功能应该可以预测26.层次图、HIPO图和结构图的内容;p10227.掌握面向数据流的设计方法,怎样用变换分析法基于数据流图设计出软件总体结构了解其中涉及到的概念,结合例子理解具体是怎么做的;p104概念:面向数据流的设计方法把信息流映射成软件结构,信息流决定了映射的方法,信息流有两种类型:1、信息沿输入通路进入系统,同时由外部形式变换成内部,进入系统的信息通过变换中心,经过加工处理以后再沿输出通路变换成外部形式离开软件系统;当数据流图具有这些特征时,这种信息流就叫做变换流;2、数据沿输入通路到达一个处理T,这个处理根据输入数据的类型在若干个动作序列中选出一个来执行;这类数据流应该划为一类特殊的数据流,称为事务流;28.详细设计是做什么p117详细设计阶段的根本目标是确定应该怎样具体地实现所要求的系统,即经过这个阶段的设计工作,应该得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某些程序设计语言书写的程序;29.什么是结构程序设计p117结构程序设计是尽可能少用GOTO语句的程序设计方法,最好仅在检测出错误时才使用GOTO语句,而且应该总是使用前向GOTO语句;30.人机界面设计问题包含哪些p1221、系统响应时间;2、用户帮助设施;3、出错信息处理;4、命令交互31.掌握设计过程中用到的工具:程序流程图的概念,内容和方法;盒图的概念、内容和方法;会结合实例使用这些工具;掌握PAD图的概念和内容;掌握判定表的概念和内容;要结合实例来掌握它们;P12432.结合Jackson图来掌握面向数据结构的设计方法;p13033.如何度量程序算法的复杂性p13634.掌握几种测试:单元测试、集成测试、确认测试、白盒测试技术和黑盒测试技术;掌握它们的概念,内容和方法;P14635.理解软件维护的定义、特点和维护过程;P189定义:在软件已交付使用之后,为了改正错误或满足新的需要而修改软件的过程;特点:1结构化维护与非结构化维护差别巨大2维护的代价高昂3维护的问题很多维护过程:1、维护组织2、维护报告3、维护的事件流4、保存维护记录5、评价维护活动;36.掌握面向对象方法学的要点,理解面向对象方法学的优点;P203四个要点:对象、类、继承、消息优点:1、与人类习惯的思维方法一致2、稳定性好3、可重用性好4、较易开发大型软件产品5、可维护性好6、掌握面向对象的概念;37.掌握面向对象的概念;P209对象对象的形象表示,对象的定义,对象的特点其他概念类,实例,消息,方法,属性,封装,继承,多态性,重载38.面向对象建模是建立哪三个模型它们的具体内容是什么P21539.1、描述系统数据结构的对象模型类图:表示静态的、结构化的系统的“数据”性质;它是对模拟客观世界实体的对象彼此间的关系的映射,描述了系统的静态结构;2、描述系统控制结构的动态模型状态转换图:动态模型表示瞬时的,行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列;3、描述系统功能的功能模型用例图,数据流图:功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么”,因此更直接地反映了用户对目标系统的需求;40.建立对象模型的内容是什么P235建立对象模型,需要定义一组图形符号,并且规定一组组织这些符号以表示特定语义的规则;也就是说,需要用适当的建模语言来表达模型,建模语言由记号即模型中使用的符号和使用记号的规则语义、语法和语用组成;41.掌握用UML提供的类图来建立对象模型的方法;理解类图的定义、基本符号和具体内容;类图建立对象模型的方法:1、定义类2、定义属性3、定义服务4、定义类与类之间的各种关系关联、泛化、依赖和细化;类图的定义:类图描述类与类之间的静态关系;类图是一种静态模型,它是创建其他UML图的基础;基本符号:UML中类的图形符号为长方形,用两条横线把长方形分成上、中、下3个区域下面两个区域可省略3个区域分别放类的名字、属性和服务;42.能结合实例掌握类图中类与类之间的关系:关联、泛化继承、依赖和细化;能根据实例情况正确判断出类与类之间的具体关系类型;关联:关联表示两个类的对象之间存在某种语义上的联系;泛化继承:UML中的泛化关系就是通常所说的继承关系,它是通用元素和具体元素之间的一种分类关系;具体元素完全拥有通用元素的信息,并且还可以附加一些其他信息;泛化关系指出类与类之间存在“一般-特殊”关系;泛化可进一步分成普通泛化和受限泛化;依赖:描述两个模型元素类、用例等之间的语义连接关系:其中一个模型元素是独立的,另一个模型元素不是独立的,它是依赖于独立的模型元素,如果独立的模型元素改变了,将影响依赖于它的模型元素;细化:当对同一个事物在不同抽象层次上描述时,这些描述之间具有细化关系;43.动态模型的概念、内容;P223概念:动态模型表示瞬时的、行为化的系统的“控制”性质,它规定了对象模型中的对象的合法变化序列;内容:动态模型是基于事件共享而互相关联的一组状态图的集合;44.功能模型的概念、内容和建立功能模型的方法;P224概念:功能模型表示变化的系统的“功能”性质,它指明了系统应该“做什么”,因此直接地反应用户对目标系统的需求;内容:功能模型由一组数据流图组成;用例图也是进行需求分析和建立功能模型的强有力工具;方法:创建用例模型的工作包括:定义系统,寻找行为者和用例、描述用例,定义用例之间的关系,确认模型;其中,寻找行为者和用例是关键;45.掌握用例图的概念、内容和方法;P224概念:用例图包括模型元素有系统、行为者、用例和用例之间的关系;内容:系统、用例、行为者、用例之间的关系;方法:创建用例模型的工作包括:定义系统,寻找行为者和用例、描述用例,定义用例之间的关系,确认模型;其中,寻找行为者和用例是关键;46.掌握面向对象分析的基本过程:三个子模型与5个层次;P232三个子模型:静态结构对象模型交互次序动态模型数据变换功能模型复杂问题大型系统的对象模型通常由5个层次组成:主题层、类与对象层、结构层、属性层和服务层;47.结合实例来掌握面向对象分析过程中建立对象模型的方法包含哪些步骤;P231 1.首先,系统分析员要对需求文档进行分析;发现和改正需求文档中的歧义性、不一致性,剔除冗余的内容,挖掘潜在的内容,弥补不足,从而使需求文档更完整、更准确;2.然后,是需求建模;系统分析员根据提取的用户需求,即用面向对象观点建立对象模型、动态模型和功能模型;3.最后,是需求评审;通过用户、领域专家、系统分析员和系统设计人员的评审,并进行反复修改后,确定需求规格说明;48.结合实例来掌握面向对象分析过程中建立动态模型的方法包含哪些步骤;P24749.结合实例来掌握面向对象分析过程中建立功能模型的方法包含哪些步骤;P25350.能结合实例画事件跟踪图P24951.能结合实例画类的状态图P25052.能结合实例画出0层数据流图与功能级数据流图;P42。
1 软件和软件工程概念软件的组成部分之一;在软件开发中,编程只是软件开发过程的一个阶段。
2.在结构化程序设计时代,程序最小的单位是函数及子程序,程序和数据是分别的。
程序的最小单位是类。
3.软件的特性:形态特性、智能特性、开发特性、质量特性、生产特性、管理特性、环境特性、维护特性、废弃特性、应用特性。
4.软件的分类:系统软件;应用软件;支撑软件;可复用软件。
5.什么是软件工程?(课后题)软件工程是指导计算机软件开发和维护的工程学科。
接受工程的概念、原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它。
6.可以用功能性、牢靠性、易用性、效率、可维护性和可移植性六个特性衡量软件的质量。
功能性是指软件所实现的功能达到它的设计规范和满意用户需求的程度。
可移植性是指软件从某一环境转移到另一环境时所作努力得程度。
7.软件生存期由软件定义、软件开发和运行维护三个时期组成。
开发时期通常由概要设计、详细设计、编码和测试四个阶段组成。
开发过程中的典型文档包括:项目支配、软件测试支配、软件设计说明书、用户手册。
8.需求分析的基本任务?(1)建立分析模型,了解系统的各种需求微小环节。
(2)基于分析结果,编写出软件需求规格说明或系统功能规格说明,确认测试支配和初步的系统用户手册,并提交管理机构进行分析评审。
2 软件工程方法和工具1.面对对象方法的动身点和基本原则,是尽量模拟人类习惯的思维方式,使开发软件的方法和过程尽可能接近人类相识问题和解决问题的方法和过程,从而使描述问题的问题空间和其解空间在结构上尽可能一样。
2.形式化方法的主要特点是:(课后题)(1) 软件需求规格说明被细化为用数学记号表达的详细的形式化规格说明;(2) 设计、实现和单元测试等开发过程由一个变换开发过程代替。
通过一系列变换将形式的规格说明细化成为程序。
3.面对对象 = 对象 + 类 + 继承 + 消息通信。
软件工程基础知识点总结软件工程是一门关于软件开发过程管理和使用工程原理、方法和技术的学科。
在软件工程领域,有一些基础知识点是非常重要的,下面是对软件工程基础知识点的总结。
1.软件生命周期软件生命周期是指软件从开始到结束的整个过程,包括需求分析、设计、编码、测试、部署、维护等阶段。
软件开发者需要了解整个生命周期,以便能够有效地进行软件开发和管理。
2.需求工程需求工程是软件工程的第一个阶段,包括需求获取、需求分析、需求规格说明等活动。
需求工程的目标是明确软件的功能和非功能需求。
3.软件设计软件设计是软件工程的核心环节,包括结构设计、数据设计、接口设计等。
软件设计的目标是制定一个高效、可靠、易于理解和维护的软件结构。
4.编码与调试编码是将软件设计转化为实际可执行的程序代码的过程。
调试是指在编码过程中发现和修复程序中的错误。
编码和调试是软件工程中非常重要的环节,对于软件的功能和性能起着决定性的作用。
5.软件测试软件测试是为了发现并修复软件中的错误和缺陷。
软件测试包括单元测试、集成测试、系统测试等。
软件测试是提高软件质量和可靠性的关键步骤。
6.软件配置管理软件配置管理是指对软件配置项(源代码、文档、二进制文件等)进行版本控制和配置管理的活动。
软件配置管理可以帮助开发者协同工作、追踪问题和管理变更。
7.软件项目管理软件项目管理包括项目计划、进度跟踪、资源管理、风险管理等活动。
软件项目管理可以帮助开发团队高效地完成软件开发项目,提高项目的成功率。
8.软件工程方法和技术软件工程方法和技术是软件开发过程中使用的工具和方法。
例如面向对象分析和设计、结构化分析和设计、敏捷开发等。
掌握并应用合适的方法和技术可以提高软件开发的效率和质量。
9.软件质量管理软件质量管理是指对软件开发过程和产品质量进行监控和管理的活动。
软件质量管理包括质量计划、质量控制、质量评估等。
软件质量管理可以保证软件开发过程的高效和软件产品的质量。
10.软件工程伦理和职业责任软件工程伦理和职业责任是软件工程领域的重要方面。
现代软件工程如何高效构建软件读书笔记现代软件工程:如何高效构建软件读书笔记1. 引言软件工程是一门涉及软件开发、维护和演化的学科,随着科技的发展,软件在我们生活和工作中的重要性不断增加。
然而,开发出高质量、高性能、高可靠性的软件并非易事,需要合理的方法和技术。
本文将探讨现代软件工程的基本理念,并提供一些建议,帮助读者高效构建软件。
2. 现代软件工程的基本理念现代软件工程强调高度自动化的开发流程、团队协作和持续改进。
以下几个方面是构建高效软件的关键:2.1 敏捷开发敏捷开发是一种以人为本的方法,强调团队协作和快速交付。
通过将开发过程分解为短期的迭代周期,可以灵活地应对需求变更,并快速验证设计和实现的正确性。
采用敏捷开发有助于提高团队成员的合作效率和开发速度。
2.2 自动化测试测试是确保软件质量的关键环节。
现代软件工程注重自动化测试,通过编写测试脚本和使用自动化测试工具,可以快速、准确地检测代码中的错误和缺陷。
自动化测试可以提高软件的稳定性和可靠性,并减少人工测试的工作量。
2.3 持续集成和部署持续集成和部署是一种通过自动化流程将代码集成到主干分支,并持续交付软件的方法。
通过构建自动化流水线,可以实现快速开发和交付高质量软件的目标。
持续集成和部署可以减少手动操作的错误,并确保每次变更都能被快速地测试和验证。
2.4 软件度量和质量保证软件度量和质量保证是衡量软件质量的重要手段。
通过收集和分析软件度量数据,可以评估软件的可维护性、可靠性和性能等方面。
质量保证手段如代码评审、代码覆盖率分析等,可以帮助发现潜在的问题并提高软件的质量。
3. 高效构建软件的建议记录如下高效构建软件的建议,供读者参考:3.1 确定清晰的目标和需求在开发软件之前,要确保明确了解用户需求和预期目标。
清晰的目标和需求有助于团队的有效合作,并为软件的设计和实现提供指导。
3.2 采用适当的开发方法论根据项目的特点和需求,选择合适的开发方法论,如敏捷、瀑布或混合模型。
软件危机:计算机软件的开发和维护过程中所遇到的一系列严重问题。
包含下述两方面的问题:1.如何开发软件,以满足对软件日益增长的需求;2.如何维护数量不断膨胀的已有软件。
软件工程:指导计算机软件开发和维护的一门工程学科。
采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济的开发出高质量的软件并有效的维护它。
软件生命周期:由软件定义、软件开发和运行维护3个时期组成,每个时期又进一步划分成若干个阶段。
P11软件定义时期:a.问题定义 b.可行性研究 c.需求分析;软件开发时期:a.总体设计 b.详细设计 c.编码和单元测试 d.综合测试;运行维护时期;可行性研究:确定问题是否值得去解决。
通过分析几种主要的可能解法的利弊,从而判断原定的系统规模和目标是否现实,系统完成后能带来的效益是否大到值得投资开发这个系统的程度。
可行性研究实质上是要进行一次大大压缩建华了的系统分析和设计的过程,也就是在较高层次上以较抽象的方式进行的系统分析和设计的过程。
P35性能需求:系统必须满足的定时约束或容量约束,通常包括速度、信息量速率、主存容量、磁盘容量、安全性等方面的需求。
P56耦合:对一个软件结构内不同模块之间互连程度的度量。
P97数据耦合:两个模块彼此之间通过参数交换信息,且交换的信息仅仅是数据。
详细设计:确定应该怎样具体地实现所要求的系统。
通过一个阶段的设计工作,得出对目标系统的精确描述,从而在编码阶段可以把这个描述直接翻译成用某种程序设计语言书写的程序。
P117等价类划分:一种黑盒测试技术,通过把程序的输入域划分成若干个数据类,据此导出测试用例。
P172多态性:有许多形态。
在类等级的不同层级中可以共享一个行为的名字,然而不同层次中的每个类却各自按自己的需求来实现这个行为。
P214继承:能够直接获得已有的性质特征,而不必重复定义他们。
回归测试:重新执行已经做过的测试的某个子集,以保证程序的变化没有带来非预期的副作用。
软考初级程序员笔记一、软考初级程序员笔记开篇软考初级程序员的考试可不容易呢,但咱不怕,笔记搞起来就完事儿啦。
二、编程语言部分(一)C语言C语言是基础中的基础呀。
它的基本数据类型有整型、浮点型这些。
整型就像整数一样,比如1、2、3啥的。
浮点型呢,就是有小数点的数啦,像3.14。
变量的定义也很重要哦,得先声明类型,然后才能使用,就像int num;这样,这里的num就是一个整型变量啦。
函数也是C语言的大头。
函数就像是一个小盒子,你把数据放进去,它给你处理好了再吐出来。
比如说一个简单的加法函数:cint add(int a, int b) {return a + b;}这个函数就可以把传进去的两个整数加起来然后返回结果。
(二)Java语言Java就比较高级一点啦。
它有面向对象的特性呢。
类和对象的概念要搞清楚哦。
类就像是一个模板,对象就是根据这个模板做出来的具体东西。
比如说我们定义一个简单的类:javaclass Dog {String name;int age;public Dog(String name, int age) { = name;this. this.age = age;}}这里的Dog就是一个类,我们可以根据这个类创建很多个不同名字和年龄的狗狗对象。
三、数据结构部分(一)数组数组是一种很常用的数据结构呢。
它就像是一排小格子,每个格子里可以放东西。
比如说我们定义一个整型数组:int[] arr = {1, 2, 3};这个数组就有三个元素,分别是1、2、3。
通过下标可以访问数组里的元素,要注意下标是从0开始的哦,所以arr[0]就是1啦。
(二)链表链表就和数组不太一样啦。
链表的每个元素都包含数据和指向下一个元素的指针。
链表在插入和删除元素的时候比较方便。
比如说我们有一个简单的单向链表的节点定义:javaclass ListNode {int val;ListNode next;ListNode(int val) {this.val = val;}}四、算法部分(一)排序算法1. 冒泡排序冒泡排序就像是水里的泡泡一样,大的泡泡会慢慢浮到上面。
第一章软件危机:软件危机是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。
软件危机的表现:(1)软件开发进度和成本难以控制。
(2)软件产品难以满足用户的需求。
(3)软件质量难以得到保证。
(4)软件产品难以进行维护。
(5)软件的文档资料难以管理。
(6)软件产品的生产率难以得到提高。
软件危机出现的原因:一方面是软件自身特点,另一方面是开发软件和使用软件的人员。
(1)对软件开发缺乏正确的理论指导。
(2)软件开发人员与用户缺乏充分的交流。
(3)对软件开发过程缺乏整体认识。
(4)对软件产品缺乏有效一致的质量评价标准。
软件工程发展的四个阶段:(1)传统软件工程阶段:用工程化思想指导软件项目开发逐步为业界所理解和接受。
(2)面向对象软件工程阶段:这一阶段的发展是以“对象”为基础展开的。
(3)过程工程的软件工程阶段:提出对软件项目管理的计划,实施,监控,成本核算,质量保证以及软件配置的技术和过程,逐步形成了过程软件工程,并衍生出群体过程和个体过程两个子类。
(4)构建工程的软件工程阶段:重视发展软件体系结构,软件设计模式,系统交互性,标准化等领域的重用,积极提倡基于软构件的开发方法。
软件工程的概念:应用计算机科学理论和技术以及工程管理原则和方法,按预算和进度,实现满足用户要求的软件产品和定义,开发,发布和维护的工程或进行研究的学科。
软件工程三要素:方法,工具,过程。
简答第一大题衡量软件质量的因素:(1):可理解性:它对软件体系结构,数据程序的描述清晰和易于掌握的程度。
(2)功能性:它是软件所实现的功能和达到的性能与满足用户实际需求的程度(3)安全性:它是软件具有的自身保护能力的程度。
(4)可靠性:它是软件在给定的时间、空间、外部环境等条件下,按照设计须有,成功运行的能力。
(5)有效性。
它是软件能充分利用计算机时间、空间、宽带等资源的能力。
(6)可扩充性;它是软件在功能或性能发生变化时,系统改变的容易程度。
《软件⼯程——实践者的研究⽅法》读书笔记这周我读了《软件⼯程——实践者的研究⽅法》,这是⼀本⽐较理论的书,看起来略有⼀些乏味。
其中谈到很多项⽬质量管理,开发模式相关的东西,感觉都太泛泛了。
因为⽐较缺乏实战经验,书中⼜很少讲实际例⼦,因此这些内容并没有给我留下太多印象。
但书中花了好⼏章的篇幅⽤于讲软件测试,这部分内容我很感兴趣。
如何开发出没有bug 或 bug 很少的程序⼀直我想探究的问题。
PL 领域有很多相关的研究⽤于保证程序正确性和代码质量,例如:模型检查、程序分析、程序证明等。
这些⽅法代价太⾼,⼀般只⽤于⼗分重要的⼯程中,例如核反应堆控制系统,动车控制系统等。
普通的软件⼯程很难⽤到这些⽅法。
对于普通软件⼯程来说,测试是很好的保障软件正确性的⽅法。
测试的种类有很多,有单元测试、回归测试、压⼒测试、alpha 测试、beta 测试等。
不同的测试的侧重点不⼀样,有的是针对软件安全性,有的是针对软件正确性,有的是针对软件易⽤性。
在看了这些软件⼯程的书之后,我对保证软件正确性这个问题有了⼀些新的想法。
在程序中,类型可以⽤来约束程序⾏为,保证函数调⽤是安全的。
但⽬前的类型只是描述了这个东西是什么,却很少有关于这个东西性质的描述。
例如在 Int 类型,只描述了它是整数类型,⽽这个整数类型具体映射到解空间是什么东西,却没有涉及。
它可以是⼀个计数器,可以是⼀个素数,可以是⼀个年份等等。
⽽且,这些具体在解空间中的语义,有时候还有⼀些约束条件,例如:计数器通常需要是正数,素数必须满⾜定义等。
在程序验证中,这种类型叫做 “精化类型”(refinement type)。
但是学术界⽤这种⽅法,通常是⽤来表⽰霍尔逻辑,并且交给 SMT Solver 进⾏约束求解,这种基于验证的⽅法前⾯已经提到,代价太昂贵。
因此,我们可以⽤测试、运⾏时断⾔来保证精化类型的约束满⾜。
第一章软件工程概述1. 软件危机(software crisis) :是指在计算机软件的开发和维护过程中所遇到的一系列严重问题。
即“两低一高” 问题:质量低、效率低、成本高。
软件危机也成为“软件萧条(depression)”或"软件困扰(aflication) ”2. 软件危机主要表现1) 开发成本和进度估计不准2) 用户对“已完成的”软件系统不满意3) 软件质量往往靠不住4) 软件常常是不可维护的5) 软件通常没有适当的文档资料6) 软件成本逐年上升7) 软件开发生产率滞后于硬件和计算机应用普及的趋势3. 产生软件危机的原因1) 与软件本身的特点有关a. 软件不同于硬件,是逻辑部件而不是物理部件缺乏可见性难于测试管理和控制开发过程困难不会因使用时间过长而被“用坏” 难以维护b. 软件不同于一般程序,规模庞大,而且程序复杂性随着程序规模的增加而呈指数上升2) 和软件开发与维护的方法不正确有关a. 对软件开发和维护有关的错误认识和作法忽视软件需求分析的重要性认为软件开发就是写程序轻视软件维护b. 对软件开发过程与方法的认识与应用软件开发要经历一个漫长的时期(编程占10-20%) 程序仅是完成软件配置的一个组成部分软件开发方法要有利于软件维护4. 软件的特点(1) 软件是无形的( intangible )(2) 软件副本的大批量生产轻而易举(3) 软件业是劳动密集型的(4) 一个没有经过充分训练的软件开发人员很容易编写出难以理解和修改的软件(5) 软件本身很容易修改。
但由于它的复杂性,又很难正确地修改。
(6) 软件不像其他的工业产品那样会因使用而磨损,随着反复修改,它的设计会逐渐退化5. 消除软件危机的途径1) 对计算机软件的正确认识2) 认识到软件开发不是个体劳动的神秘技巧,而是一种组织良好、管理严密、各类人员协同配合、共同完成的工程项目3) 推广使用成功的软件开发技术和方法4)开发和使用更好的软件开发工具总之,为了消除软件危机,既要有技术措施(方法和工具),又要有必要的组织管理措施。
6. 对工程”的理解:大事情,施工的过程,工程学科。
施工的过程:分析设计实现维护7. 软件的概念经典定义:软件=程序+文档+数据软件是计算机程序及其有关的数据和文档的完整集合。
计算机程序是能够完成功能的可执行的指令序列数据是程序能适当处理的信息,具有适当的数据结构软件文档是开发、使用和维护程序所需要的图文资料8. 软件工程的概念概括地说,软件工程是指导计算机软件开发和维护的工程学科。
采用工程的概念、原理、技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够得到的最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它,这就是软件工程。
目标:项目成功(BFC,Better、Faster、Cheaper)9. 软件工程的本质特征(1)软件工程关注于大型程序的构造(2)软件工程的中心课题是控制复杂性(3)软件经常变化(4)开发软件的效率非常重要(5)和谐地合作是开发软件的关键(6)软件必须有效地支持它的用户(7)在软件工程领域中通常由具有一种文化背景的人替具有另一种文化背景的人创造产品10. 软件工程的基本原理(1)用分阶段的生命周期计划进行严格管理(2)坚持进行阶段评审(3)实行严格的产品控制(4)采用现代程序设计技术(5)结果应能清楚地审查(6)开发小组的人员应该少而精(7)承认不断改进软件工程实践的必要性11. 软件工程方法学通常把在软件生命周期全过程中使用的一整套技术的集合称为方法学(methodology),也称为范型(paradigm)。
1)传统方法学(结构化方法学):SA,SD,SP,ST2)面向对象方法学:OOA,OOD,OOP,OOTS:结构化,structuredOO:面向对象,Object Orie ntedA :分析,AnalysisD:设计,Desig nP:编程,Programmi ngT:测试,Test12. 软件工程方法学三要素,这就是方法、工具和过程。
其中:1)方法是完成软件开发任务的技术方法,回答“如何做”的问题;2)工具是为方法的运用提供自动的或半自动的软件支撑环境;3)过程规定了完成各项任务的工作阶段、工作内容、产品、验收的步骤和完成准则。
第二章软件过程1. 过程(process): IS09000把过程定义为,把输入转化为输出的一组彼此相关的资源和活动。
2. 软件过程(Software Process):是为了获得高质量软件所需要完成的一系列任务的框架(Framework),它规定了完成各项任务的工作步骤。
3. 软件生命周期软件生命周期由软件定义、软件开发、和运行维护三个时期组成,每个时期又可进一步划分成若干个阶段。
(三个时期八个阶段)三个时期八个阶段:三个时期:软件定义、软件开发、运行维护八个阶段:(1 )问题定义(2).可行性研究(3).需求分析(4).概要设计(5).详细设计(6)•编码和单元测试(7).综合测试(8).软件维护4. 软件开发模型(在课本的14 —33页,了解一下)1)瀑布模型(Waterfall)2)快速原型模型Prototype3)增量模型(In creme ntal Models)4)喷泉模型5)螺旋模型6)统一过程(rational unified process,RUP)7)敏捷过程8)极限编程(extreme programming,XP)9)能力成熟模型(capability maturity model,CMM )第三章结构化的分析(SA)1. 需求分析:发现、求精、建模、规格说明、复审的过程。
发现:获取需求,完备、正确、有效求精:细节建模:形式化描述规格说明:详述复审:批准2. 需求分析的准则1)必须理解和表示问题的信息域,根据这条准则应该建立数据模型。
2)必须定义软件应完成的功能,这条准则要求建立功能模型。
3)必须表示作为外部事件结果的软件行为,这条准则要求建立行为模型。
4 )必须对描述信息、功能和行为的模型进行分解,用层次的方式展示细节。
3. 需求获取的方法1)访谈正式的:事先准备好的非正式的访谈:开放的,头脑风暴,情景分析2)面向数据流自顶向下求精3)简易的应用规格说明技术4)快速建立软件原型4. 分析建模结构化分析实质上是一种创建模型的活动。
通过需求分析而建立的模型必须达到下述的三个基本目标:描述用户的需求。
为软件设计工作奠定基础。
定义一组需求,一旦开发出软件产品之后,就可以用这组需求为标准来验收该产品。
5. 模型(Model):是为了理解事物而对事物作出的一种抽象,是对事物的书面上的无歧义文字或图形的描述.5.1.模型是对问题的简化。
52 要从多个角度认识事物。
6. 分析模型:数据模型(实体联系图)、功能模型(数据流图)、行为模型(状态转换图)7. 需求分析成果:软件需求规格说明8. 实体-联系图(ER 图,entity-relationship diagram)(P41,要求会画)(1)数据模型的主要成分:数据对象,数据对象的属性,数据对象彼此间相互连接的关系数据对象:对软件必须理解的复合信息的抽象。
属性:定义了数据对象的性质。
联系:数据对象彼此之间相互连接的方式称为联系,也称为关系。
类型:一对一联系、一对多联系、多对多联系。
联系也可以有属性。
(2)实体-联系图的符号表示:实体属性联系9. 数据流图(DFD,Data Flow Diagram):描绘信息流和数据从输入移动到输出的过程中所经受的变换(书本P43—47,要会画)10. 数据字典(DD:,Data Dictionary):是关于数据的信息的集合,是对数据流图中包含的所有元素的定义的集合(书本P49—51,要会画)11. 状态转换图(SD,State Diagram):通过描绘系统的状态及引起系统状态转换的事件,来表示系统的行为。
用于建立行为模型。
状态:是任何可以被观察到的系统行为模式。
状态规定了系统对事件的响应方式事件:是在某个特定时刻发生的事情,是引起系统做动作或(和)转换状态的控制信息。
(书本P47—49)层次化如何设计:必须依据原理、原则、规则、准则模块:是由边界元素限定的相邻的程序元素的序列,而且有一个整体标识符来代表它。
模块化:就是把程序划分成可独立命名且独立访问的模块,每个模块完成一个子功能, 把这些模块集成起来构成一个整体,可以完成指定的功能满足用户的需求。
(1) 一组相邻元素 (2) 一个边界(3) 一个名字(标识符ID )Why 模块化?1) 降低复杂度 2) 有利于团队分工协作 How to 模块化?性能环境 功能 数据 (五大需求)四大设计三型两化三型两化第四章结构化设计— C/S,B/S构件之间的接口接口过程人一机接口ProcessProcedure (步骤)行为模型功能模型 数据模型 系统化将来架构Meyer模块化5标准1)模块可分解性(降低复杂性)2)模块可组装性(可重用,reuse)3)模块可理解性(易于维护)4)模块连续性(副作用小)5)模块保护性(屏蔽异常)抽象(abstract):抽出事物的本质特征,而暂时不考虑它们的细节「找共性,略特性I抓主要,略次要有效降低模块数量逐步求精:为了集中精力解决主要问题而尽量推迟对问题细节的考虑。
大 ------- ►小粗 ------- ►细Miller法则:一个人在任何时候都只能把精力集中在7± 2个知识块上。
7 ± 2「全局变量信息隐藏Y局部变量「块内:高内聚,一个模块只做一件事模块独立V 「参数少、块间:低耦合,KIS(keep it simple )J l 类型简单结构化设计原理:1)模块化2)抽象3)信息隐藏4)逐步求精启发原则:1)改进软件结构提高模块独立性2)模块规模应该适中(LOC<30 LOC:lines of code note>code3)深度、宽度、扇出和扇入都应当适中(7± 2原则)4)模块的作用域应该在控制域之内5)力争降低模块接口的复杂度(接口KIS)6)设计单出口单入口的模块7)模块的功能应该可以预测设计结果描述工具:建模工具-软件工具工具•建模工具开发工具IPO 图(In put Process Output):描述模块(总体)。