软件工程学

目录

 软件工程学概述

 可行性研究

 需求分析

 形式化说明技术

 总体设计

 详细设计

 实现—编码、测试

 维护

 面向对象方法学引论

 面向对象分析

 面向对象设计

 面向对象实现

 软件项目管理


软件工程学概述

  1. 软件危机:
    是指在计算机软件开发和维护过程中遇到的一系列严重问题,包括如何开发软件、如何维护已有软件。
  2. 软件危机产生的原因:
    与软件本身、软件开发和维护的方法都有关系,软件开发进展不同、质量难以评价、程序规模导致复杂性。
  3. 什么是软件:
    软件是程序、数据以及相关文档的完整集合,程序是完成预定功能的可执行指令序列,数据是程序处理信息的数据结构,文档是开发、使用和维护程序所需要的图文资料。
  4. 软件工程:
    指导计算机软件开发和维护的一门工程学科,采用工程的概念原理、技术和方法来开发和维护软件,把经过时间考验而证明正确的管理技术和当前能够得到最好的技术方法结合起来,以经济地开发出高质量的软件并有效地维护它。
  5. 软件工程学3要素:
    方法、工具、过程。方法是完成软件开发的各项技术方法;工具是使用方法的支撑环境;软件过程是为了获得高质量软件所需要的一系列任务的框架,它规定了各项任务的工作步骤,通常使用生命周期模型描述软件过程。
  6. 面向对象方法学:
    把数据和行为同等重视,以数据为主线,把数据和操作紧密结合起来。包含4个要点:对象、类、继承、消息通信
  7. 软件生命周期:
    软件定义、软件开发、软件维护3个时期组成,每个时期可以进一步细分为不同阶段。
    软件定义——又称为系统分析,由系统分析员实现,分为问题定义、可行性研究、需求分析3个阶段。
    软件开发——包括系统设计(总体设计、详细设计)、系统实现(编码和单元测试、综合测试)
    软件维护——使软件持久满足用户的不同时期、不同功能的需求。
  8. 传统的瀑布模型的特点:
    ①前后阶段之间有严格的顺序性和依赖性;
    ②推迟编码实现,确保前期设计过程扎实;
    ③每个阶段都必须完成规定的文档,每个阶段结束前都要对所有完成的文档进行评审;
  9. 实际的瀑布模型——带“反馈环”:
    传统的模型过于理想化,常常会在后面阶段中发现前面阶段的错误,需要沿着反馈线返回到前面的阶段,再回到后面的阶段继续任务。
     
  10. 瀑布模型的优缺点:
    优点:文档驱动型,强迫开发人员使用规范的方法,每个阶段编写文档并评审,使得软件维护容易实现、减低维护成本。
    缺点:产品交付前,用户只能通过文档了解产品,不切实际,使用户很难全面认识自己的产品,不满足用户的需要。
  11. 快速原型模型:
    快速建立最终产品的一个部分功能的原型产品,通过用户试用并给出修改意见。
    优点:不带反馈环,线性开发,快速,可以获取用户的真正需求。
  12. 增量模型:
    将软件产品作为一系列增量构件来设计、编码、集成和测试,第一个增量构件往往是最核心的功能模块。
    优点:瀑布模型和快速原型都是一次性把满足所有需求的产品交付,但是增量模型是分批提交。在开发的早期使投资获得明显回报、较易维护。
    缺点:当增量构建集成时,必须保证不破坏以开发的产品。甚至构件最终根本无法集成。
  13. 螺旋模型:
    风险驱动型,及时识别和分析风险,使用原型和其他方法尽量降低风险,适用于内部开发的大规模软件项目(只有内部开发的项目,才能在风险过大时方便中止项目)
    缺点:只有在开发人员具有风险分析和排除风险的专门知识时,该模型才能获得成功。
  14. 喷泉模型:
    面向对象,“喷泉”体现了面向对象的迭代和无缝特性


     
  15. 极限编程(eXtreme Programming,XP)
    敏捷过程:由软件专家联合起草的在软件开发过程中的优秀价值观,具有对变化和不确定性的更快速、更敏捷的反应。
    敏捷过程的适用范围:商业竞争环境下的小型项目的有限资源和有限开发时间。
    极限编程便是敏捷过程中的一个,指把好的开发实践应用到极致。如:客户作为开发团队的成员、结对编程、测试驱动开发、持续集成

 可行性研究

  1. 在软件开发的早期为什么要进行可行性研究?应该从哪些方面研究目标系统的可行性?
    确定问题是否有可行的解,是否值得去解,避免时间、人力等资源的浪费。
    从技术可行性、经济可行性、操作可行性
  2. 系统流程图:
    在可行性研究时,概括出现有系统的逻辑模型;在设计阶段将构想出新系统的逻模型转化为物理模型。系统流程图就是概括地描绘物理系统的工具,表达数据在系统各部件之间的流动情况。
  3. 数据流图:
    描绘数据在软件中流动和被处理的逻辑过程,在数据流图中必须描绘出所有可能的数据流向。包括4种成分:源点或终点、处理、数据流、出局存储。数据存储和数据流都是数据,仅仅是所处的状态不同,一个是静态,一个是动态。
     * :表示数据流之间的“与“关系
     +:表示数据流之间的“或”关系
    ⊕:表示数据流之间的”互斥“关系(只能存在一个)
  4. 数据字典:
    数据字典是关于数据的信息的集合,对数据流图中包含的所有元素的定义的集合,给人提供关于数据的描述信息。
    数据流图和数据字典构成系统的逻辑模型,说明系统的规格信息。

     

 需求分析

  1. 为什么要进行需求分析?通常对软件系统有哪些需求?
    确定系统必须完成哪些工作,对目标系统提出完整、准确、清晰、具体的要求。在需求分析结束前,应该写出软件需求规格说明书,以书面形式描述软件需求。
    包括功能需求、性能需求、可靠性和可用性需求、出错处理需求、接口需求等
  2. 怎样与用户有效地沟通以获取用户的真实需求?
    传统的访谈、面向数据流自顶向下求精的结构化分析方法、面向团队的简易的应用规格说明技术、快速建立软件原型(是最准确、最有效和最强大的需求分析技术)
  3. 结构化分析方法:
    就是面向数据流自顶向下逐步求精进行需求分析的方法。需求分析过程应该建立3种模型,数据模型(E-R图)、功能模型(数据流图)、行为模型(状态转换图)
  4. 数据模型的3种成分:
    实体、属性、联系
  5. 数据规范化:
    为了减少数据冗余,避免出现插入、删除异常,通常需要把数据结构规范化。使用”范式“定义消除冗余的程度。
    1NF:冗余程度最大,属性不可再分
    2NF:满足1NF并且非主属性对码是完全函数依赖
    3NF:满足1NF并且非主属性对码不是传递依赖或部分依赖,大多数场合已经适用
     
  6. 状态转换图:
    通过描绘系统的状态及引起状态转换的事件,来表示系统的行为。
  7. 从哪些方面验证需求分析的正确性:
    一致性:所有需求必须是一致的,任何一条需求不能和其他需求互相矛盾
    完整性:需求必须是完整的,规格说明书应该包括用户需要的每一个功能或性能
    现实性:现有的硬件和软件技术可以实现
    有效性:必须证明需求是正确有效的,确定能解决用户面对的问题。

形式化说明技术

  1. 对比形式化和非形式化的优缺点: 
    非形式化:如使用自然语言描述需求规格说明书。可能存在矛盾、二义性、含糊性、不完整性及抽象层次混乱等问题。
    形式化:如有限状态机。使用数学描述需求,消除了二义性、可以使用数学方法验证;但是难以学习,对问题的时序、控制和行为等方面的需求表示不够。

 总体设计

  1. 为什么在详细设计前进行总体设计?
    可以站在全局高度上,花较少成本,从较抽象的层次上分析对比多种可能的系统实现方案和软件结构,从中选出最佳方案和最合理的软件结构,从而用较低成本开发出较高质量的软件系统。
  2. 总体设计的2个阶段:
    系统设计阶段:确定系统的具体实现方案
    结构设计阶段:确定软件结构,程序由哪些模块组成,以及模块间的关系。
    (过程设计阶段:属于详细设计,确定每个模块的处理过程)
  3. 软件设计中的设计原理
    ①模块化:把程序划分为独立命名且可独立访问的模块,每个模块完成一个子功能,最后把这些模块集成为一个整体。优点:结构清晰方便理解阅读、便于测试和调试、提高软件的可靠性和可修改性、有助于组织管理。
    ②抽象:抽出事物的本质特性而暂时不考虑细节,并用层次的方式自顶向下由抽象到具体。优点:简化了软件的设计和实现,提高了软件的可理解性和可测试性,使软件易于维护。
    ③逐步求解:为了能集中精力解决主要问题而尽量推迟对问题细节的考虑。Miller法则:一个人在任何时候都只能把注意力集中在(7±2)个知识点上。求精是细化过程,与抽象互补,提供越来越多的细节描述。
    信息隐藏:使得一个模块内包含的信息对于不需要这些信息的模块来说,是不能访问的。
    局部化:指把一些关系密切的软件元素物理相邻,局部化有利于信息隐藏。
    模块独立:模块独立是模块化、抽象、信息隐藏和局部化的直接结果。
  4. 模块的独立的2个定性标准度量:
    内聚:衡量一个模块内部各个元素互相联系的紧密程度。
    耦合:衡量不同模块间互相联系的紧密程度。
    高内聚、低耦合
  5. 耦合:
    ①数据耦合:两个模块交换的信息仅仅是数据,属于低耦合。
    ②控制耦合:交换的信息中有控制信息,属于中等程度耦合。
    ③特征耦合:被调模块需要使用作为参数传递进来的部分数据时,可以使用的数据多于实际需要的数据,导致对数据的访问失去控制,不安全。
    ④公共环境耦合:多个模块通过一个公共数据环境相互作用时。
    内容耦合:一个模块访问另一个模块的内部数据。一个模块不通过正常入口而转到另一个模块内部;两个模块有部分程序代码重叠;一个模块有多个入口,耦合程度最高
    设计原则:尽量使用数据耦合,少用控制耦合和特征耦合,限制公共环境耦合的范围,完全不用内容耦合。
  6. 内聚:
    内聚和耦合都是模块化设计的有利工具,实践证明内聚更为重要,应该重点提高模块的内聚程度。
    偶然内聚:低内聚,如果一个模块完成一组任务,这些任务间即使有关系,关系也很松散。如代码重复部分用函数实现。
    逻辑内聚:低内聚,如果一个模块完成的任务在逻辑上属于相同或相似的一类。如一个模块产生各种类型的全部输出。
    时间内聚:低内聚,如果一个模块包含的任务必须在同一段时间内执行。如模块完成各种初始化工作。
    过程内聚:中内聚,如果一个模块内的处理元素是相关的,而且必须以特定次序执行。
    通信内聚:中内聚,如果模块中所有元素都使用同一个输入数据或产生同一个输出数据。
    顺序内聚:高内聚,如果一个模块内的处理元素和同一个功能密切相关,而且这些处理必须顺序执行。
    ⑦功能内聚:最高内聚,如果模块内所有处理元素都属于一个整体,完成一个单一的功能。

 详细设计

  1. 详细设计的目标以及逻辑基础:
    目标是确定应怎样具体地实现所要求的系统,得出对目标系统的精确描述。
    逻辑基础是结构程序设计技术。
  2. 结构程序设计的定义:
    结构程序设计是尽可能少用GO TO 语句的程序设计方法。最好仅在检测出错误时才使用GO TO 语句,而且应该总是使用前向GO TO 语句。
  3. 3种基本控制结构:
    顺序、循环(DO_WHILE)、选择(IF_THEN_ELSE)
  4. 程序流程图:
    优点:历史最悠久、使用最广泛、对控制流程的描绘很直观,便于初学者掌握。
    缺点:
    ①诱使程序员过早地考虑程序的控制流程而不是全局结构;
    ②程序员可能会用箭头随意控制转移,不符合结构程序设计的精神
    ③程序流程图不易表示数据结构
  5. 盒图的特点:
    ①没有违背结构程序设计的精神
    ②功能域明确,很容易确定局部和全局数据的作用域
    ③不可能任意转移控制
    ④容易表现嵌套关系和模块的层次结构

实现—编码、测试

  1. 软件测试的目的和时期:
            目的:在软件投入运行之前,尽可能发现软件中的错误,它是对软件规格说明、设计和编码的最后复审。
            单元测试:通常在编写出每个模块后就做必要的测试,模块的编写者和测试者是同一个人,编码和单元测试属于软件生命周期的同一阶段。
            综合测试:对软件进行全面的综合测试,是一个独立的阶段,由专门的测试人员承担这项工作。(因为心理学告诉我们,由程序的编写者自己进行测试是不恰当的,可能不承认错误)
    调试:通过测试发现软件中的错误以后必须诊断并改正错误,是测试阶段最困难的工作。
  2. 软件测试的两种方法:
            ①黑盒测试:把程序看成一个黑盒子,完全不考虑程序内部结构和处理过程。假定已知产品的功能,黑盒测试是在程序接口进行的测试,只检测产品的功能是否能按照规格说明书的规定正常使用,又称为功能测试。
            ②白盒测试:把程序看成装在一个透明的白盒子里,测试者完全知道程序的结构和处理过程,检查产品内部的动作是否按照规格说明书的规定正常运行,又称为结构测试。
  3. 大型软件系统的测试过程:

    ①模块测试:保证每个模块作为一个单元能正确运行,又称为单元测试。
    ②子系统测试:把经过单元测试的模块集成为一个子系统来测试,主要测试模块间接口的协调和通信。
    ③系统测试:把经过测试多个子系统集成为一个完整的系统来测试。
    ④验收测试:在用户和实际数据的参与下,把系统软件作为单一的实体进行测试,又称为确认测试。

  4. 白盒测试中的逻辑覆盖有哪些?
    ①语句覆盖:使程序中每条语句至少执行一次;很弱的覆盖
    ②判定(分支)覆盖:不仅每条语句至少执行一次,而且每个判定的每个分支都至少执行一次;比语句覆盖强,仍然不高。
    ③条件覆盖:不仅每个语句至少执行一次,而且使判定表达式中的每个条件都取到各种可能的结果。比判定覆盖强。
    ④判定/条件覆盖:因为判定覆盖不一定包含条件覆盖,条件覆盖不一定包含判定覆盖。所以判定/条件覆盖同时满足两种覆盖标准,使判定表达式的每个条件都取到各种可能的值,而且每个判定表达式也都取到各种可能的结果。有时判定/条件覆盖不一定比条件覆盖强。
    ⑤条件组合覆盖:使得每个判定表达式中条件的各种可能组合都至少出现一次。逻辑覆盖更强。满足条件组合覆盖一定满足判定/条件、条件、判定覆盖,但是不一定满足路径覆盖。
    ⑥点覆盖:使得执行路径至少经过流图的每一个结点一次,等价于语句覆盖。
    ⑦边覆盖:使得执行路径至少经过流图的每一条边一次,等价于判定覆盖。
    ⑧路径覆盖:使得每条可能的路径都至少执行一次(如果由环,则每个环至少经过一次)

  5. 白盒测试的控制结构测试:
    基本路径测试:保证程序中的每条语句至少执行一次,而且每个条件在执行时都将分别取真、假两种值。
    条件测试:检查程序中的每个条件中的错误。
    循环测试:专注于测试循环结构的有效性,分为简单循环、嵌套循环、串接循环。

  6. 黑盒测试技术方案:
        ①等价划分:把程序的输入域划分为若干个数据类,每个数据类选取一组数据(有效等价类、无效等价类)作为测试用例。力图设计出能发现若干类程序错误的测试用例,从而减少必须设计的测试用例的数目。
        ②边界值分析:使程序运行在边界附近,着重测试输入/输出等价类的边界。
        (等价划分和边界值分析都是孤立地考虑单个测试用例,而没有考虑多个输入数据的组合效应。)
        ③错误推测:依靠测试人员的经验和直觉,列举出程序中可能有的错误和容易发生错误的特殊情况,并选择测试方案。选择输入组合利用判定树或判定表为工具,为判定表的每一列设计至少一个测试用例。

  7. 白盒测试和黑盒测试的区别?
    白盒测试:测试的早期;测试程序的内部逻辑;通常为单元测试,测试员与程序员是同一人。
    黑盒测试:测试的后期;测试程序的功能;通常为确认测试,测试会有用户的参与。
     

  8. 什么是软件的可靠性呢?什么是软件的可用性?
    可靠性:是指程序在给定的时间间隔内,按照规格说明书的规定成功运行的概率。可靠性随着给定时间间隔的加大而减少。
    可用性:程序在给定的时间点,按照规格说明书的规定成功运行的概率。

维护

  1. 什么是软件维护?软件维护的4项活动?
    软件生命周期的最后一个阶段,保证软件在交付后的相当长的时间内能够正常运行。
    改正性维护:在程序的使用期间,由用户发现并反馈给维护人员。
    适应性维护:为了使用环境变化适当地修改软件
    完善性维护:用户提出新功能或修改已有功能
    预防性维护:为了改进未来地可维护性或可靠性,预先打好基础。
  2. 软件的可维护性?它的决定因素?
    软件的可维护性:指维护人员能够理解、改正、改进这个软件的难易程度。
    决定因素:可理解性、可测试性、可修改性、可移植性、可重用性。
     
  3. 软件开发过程中,应该采用哪些措施来提高软件产品的可维护性?
    提高可理解性:模块化、结构化设计、使用高级程序设计语言
    提高可测试性:良好的文档。
    提高可修改性:高内聚低耦合、局部化、信息隐藏
    提高可移植性:把因为环境变化将会修改的程序局限在少数模块,减少修改。
    软件重用技术能从根本上提高软件可维护性,面向对象的软件技术是最成功的软件重用技术。

面向对象方法学引论

  1. 传统方法学和面向对象方法学的区别?
        传统方法仅描述了实体的静态属性,没有动态行为;面向过程设计,以算法为核心,将数据和过程分离,忽略了数据和操作之间的联系。
        与传统方法相比,面向对象是一种以数据为主线的,把数据和处理相结合的方法,它不是被动等待外界对它施加操作,而是作为主体发消息主动请求别的对象施加操作。
  2. 什么是面向对象方法学?它有哪些优点?
    面向对象方法学:
    对象+类+继承+消息传递,把分析、设计和实现结合在一起。
    优点:

        ①与人类习惯的思维一致,自然表达现实世界
        ②稳定性好,当系统的功能需求变化时不会引起软件结构的整体变化
        ③可重用性好,灵活适用提高生产率。
        ④可维护性好,易于理解、测试和调试、修改等。

  3. 什么是“对象”?它与传统的数据有什么异同?
    对象是描述该对象属性的数据以及对数据施加的所有操作封装的统一体。
    对象的特点有:以数据为中心,对象是主动的、实现数据封装、对象之间是并行的、模块独立性好

  4. 什么是“类”?
    类是对具有相同数据和相同操作的一组对象的描述,类是支持继承的抽象数据类型,而对象就是类的实例。

  5. 什么是“封装(encapsulation)”?
    把数据和实现操作的代码集中存放在对象内部,外界不能直接访问和修改这些数据和代码,外界通过该对象提供的接口进行访问。

  6. 什么是“继承(inheritance)”?
    继承是子类自动地共享全部基类中定义的数据和方法的机制。
    子类也可以有自己的特性。继承具有传递性。在程序执行期间,对对象某一性质的查找是从当前层次逐层向上进行的。

  7. 什么是“多态性(polymorphism)”?
    多态性是指子类对象可以在不同层次使用同名的方法,然而不同层次中的每个类却各自按照自己的需要来实现这个具体行为。

  8. 什么是“重载(overload)”?
    函数重载是指在同一作用域内若干个参数特征不同的函数可以使用相同的函数名。如fun(int a ); fun (float a);
    运算符重载是指在同一个运算符施加不同类型的操作数。如 1+'a' ; 1.0+1;

  9. 什么是模型?开发软件为何需要建模?
        模型是为了理解事物而作出的一种抽象,是对事物的一种无歧义的书面描述。模型可以帮助人们更加透彻地理解问题,方便后续解决问题。
        建模:对于特别复杂而不能直接理解的系统,需要使用建模减少系统的复杂程度,方便开发人员处理信息。

  10. 用面向对象方法开发软件时需要建立3种模型:
    对象模型:描述系统数据结构
    动态模型:描述系统控制结构
    功能模型:描述系统功能

  11. 什么是对象模型?建立对象模型时主要使用哪些图形符号?
    对象模型表示静态的、结构化的系统的“数据”结构,它是对对象和对象之间联系的映射。
    通常使用UML的类图来建立对象模型。类图描述类与类之间的静态关系,是一种静态模型。
    类图中的属性/服务的可见性有3种:公有的(public)、私有的(private)、保护的(protected)
    类与类之间的关系有4种:关联、泛化(继承)、依赖、细化。

  12. 什么是动态模型?建立动态模型时主要使用哪些图形符号?
    动态模型表示瞬时的、行为化的系统的“控制”结构,规定了对象模型中的对象的合法变化序列。各个对象相互触发就形成了系列的变化序列。
    通常使用UML的状态图来建立状态模型。状态图描绘对象的状态、触发事件和对象的响应。

  13. 什么是功能模型?建立功能模型时主要使用哪些图形符号?
    功能模型表示变化的系统的“功能”性质,指明系统“应该做什么”,直接反应用户需求。
    通常使用数据流图来建立功能模型,也可以使用UML的用例图;用例图中的元素包括系统、行为者、用例、用例间的关系。
    用例是行为者可以感受到的、系统的一个完整功能,用例是一个类,代表了一类功能。

  14. 什么是用例模型?为什么要使用用例模型代替功能模型?
        使用UML的用例图进行需求分析和建立功能模型的系统称为用例模型,用例模型描述的是外部行为者所理解的系统功能,是开发者和用户对需求规格所达成的共识。
        当软件系统的用户数量庞大时,每个用户只知道自己如何使用系统,没有人能准确知道系统的整体运行情况,使用用例模型代替功能模型能更好地获取用户需求,它回答了“系统应该为每个用户做什么”。

面向对象分析

  1. 3个模型4个子系统5个层次:
    面向对象开发时3种模型:对象模型、动态模型、功能模型
    目标系统的4个组成子系统:人机交互子系统、问题域子系统、任务管理子系统、数据管理子系统。
    大型、复杂的对象模型的5个层次组成:主题层、类与对象层、结构层、属性层、服务层
  2. 什么是分析模型?
        分析模型是系统分析员同用户及专家交流时有效的通信手段 ,一个好的分析模型应该正确全面反映问题的本质属性,且不包含与问题无关的内容、不涉及具体实现。

面向对象设计

  1. 面向对象设计应该遵循哪些准则?
    抽象:类是一种抽象数据类型,对外提供开放的公共接口,外界可以使用接口对数据进行操作,支持过程抽象、数据抽象、参数抽象。
    模块化:对象就是模块,它把数据结构和操作紧密结合
    可重用:重用已有的类、新建可以重用的类,提高开发的生产率和软件质量。
    信息隐藏:封装实现,类结构分离了外部接口与内部实现。
    强内聚低耦合:模块之间相互影响降到最低,模块内元素之间紧密结合。

     
  2. 为什么说类构件是目前比较理想的可重用软构件?它有哪些重用方式?
        类构件满足可重用软构件所要求的特点,因为类构件同样具有模块独立性强,高度可塑性,接口清晰、简明、可靠的特点。
        重用方式:实例重用、继承重用、多态重用

面向对象实现

  1. 软件测试的经典策略?
           从“小型”测试开始,逐步过渡到“大型测试”,即从单元测试开始,逐步进入集成测试,最后进行确认测试和系统测试。
            
  2. 测试面向对象软件时,单元测试、集成测试、确认测试有哪些新特点?
        面向对象的单元测试中,最小测试单元变为了封装起来的类和对象,不能再像传统一样孤立地测试单个操作,应该把操作看成类的一部分,测试整个类。
        面向对象的集成测试中,因为层次间的控制结构已经不存在,所以传统的一次集成没有意义,应该基于线程测试(把某个事件响应的所有类集成起来并测试)、基于使用测试(首先测试独立类,再测试依赖类)。
        面向对象的确认测试中,和传统差不多,检查用户可见的动作和输出。

软件项目管理

  1. 软件规模的估算方法有哪些?
        代码行定量估算、功能点技术
  2. 进度计划管理方法有哪些?
        估算开发时间、Gantt图、工程网络图、估算工程进度、关键路径、机动时间。
  3. 什么是软件质量?影响软件质量的因素有哪些?
    软件质量是软件与明确的、隐含的需求相一致的程度。
        正确性、健壮性、效率、安全性、可用性、可理解性、可维护性、可移植性、可测试性、可重用性等。
  4. 什么是软件质量保证?有哪些措施?
        软件质量保证(software quality assurance,SQA):正式技术复审(走查、审查)、软件测试程序正确性证明。复审主要用于在编码之前对各阶段产生的文档的质量进行检查;基于执行的软件测试是在编码之后进行的,是确保软件质量的最后一道防线;程序的正确性证明使用数学方法严格验证程序是否与规格说明一致。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值