面试知识点——软件工程

软件过程

  • 质量属性:将系统的某些质量要素进行量化处理,建立质量特征,这些特征就是质量属性。
  • 质量模型:一些能够相互配合相互联系的质量属性的特征集。常见的质量属性有功能性、可靠性、易用性、效率、可维护性、可移植性。
  • 配置管理:用技术和管理的方法,来标识和说明配置项的功能及其物理特征,控制对这些特征的变更,记录和报告变更处理及其实现状态,并验证与需求规格的一致性。
  • 配置项:是至于配置管理之下的软件配置有关的各种项目,包括各类管理文档、软件文档、源码、可执行码等。
  • 配置管理的活动:1 标识配置项。给配置项确定唯一的标识,说明特征。2 版本管理.变更时更新版本号,管理不同的分支。3 变更控制。4 配置审计。5 状态报告。6 软件发布管理。
  • 变更控制:以一种可控的,一致的方式来处理变更,包括对变化的评估、批准或者验证、拒绝。变更控制并不是要限制变化,而是以一种可控的、严格的方式来执行变更。
  • 软件项目管理是应用方法、工具、技术以及人员能力来完成软件项目,实现项目目标的过程。
  • 三大核心要素:目标识别、状态跟踪、偏差纠正
  • 软件过程:(狭义)是为了实现一个或者多个事先定义的目标而建立起来的一组实践的集合,这组实践之间往往有一定的先后顺序,作为一个整体来实现事先定义的一个或者多个目标(成本、质量)。(广义)包括技术、人员以及狭义过程这
    3 部分。
  • 生命周期模型软件开发过程(即狭义软件过程)的概念很像.在很多场合,甚至也会直接以某个特定的生 命周期模型来指代某种软件开发过程或方法.例如最为常见的瀑布开发方法,既是指一种以单一线性顺序为特征的软件过程,同时也是指一种常见的生命周期模型.但是,这两者之间还是有一些细小的区别.1、首先,生命周期模型是对一个软件开发过程的人为划分.同样的软件开发过程,因为目的不一样,可能会被划分和命名成不同的生命周期模型.例如,一个单一顺序的软件开发过程可以划分成 V 模型.同样也可以划分成瀑布模型;2、其次,生命周期模型是软件开发过程的主框架,而不会给出某个阶段的内部具体细节.比如:在一个典型的瀑布模型中,会包含一个需求分析阶段;然而需求分析阶段的具体步骤和流程,则一般不会在 生命周期模型中给出描述;3、最后,生命周期模型往往不包括技术实践. 生命周期模型中往往只定义管理实践(例如,项目计划、风险分析等);而一些典型的技术类实践(例如,重构、测试驱动开发等)则不会出现在生命周 期模型的描述当中.
  • 软件过程多维视角:1 实践vs框架。2 团队vs个人。 3 发生变更之后再应对vs提前预防减少变更
  • 管同属于敏捷阵营,XP 方法关注工程实践,包括了重构、结对编程、持续集成 , SCRUM 方法 是一个包含很多管理实践的过程框架,包括固定的timebox、站立会议。
  • 迭代开发:增量式模式,螺旋式模型和原型法都具有迭代开发的特征,即将一个大型软件系统的开发过程视为一个逐步学习和交流的过程,软件系统的交付不是一次完成的,而是通过多个迭代周期逐步来完成交付。
  • 敏捷软件开发:强调在不确定的情况下,适应软件需求快速变化的,基于迭代式开发的软件开发方法和实践。
  • 敏捷体系分为五个层次:价值观、原则、方法、实践、工具
  • 主流敏捷方法:SCRUM、XP、Kanban。Scrum着重于项目管理,适合用于难以提前完全规划好的项目。极限编程着重于软件开发的最佳实践。看板是可视化工作流程,限定工作量、优化周期时间。
  • 开源软件开发方法:开源软件是一种源代码可以任意获取的计算机软件。伴随着网络而兴起的,这种方法依赖于分散在全球的开发者和使用者通过网络协作,常见的有Linux、eclipse、Facebook
  • 首先,DevOps的基础是敏捷软件开发、精益思想和看板方法,这是一种鼓励快速迭代,尽快向用户交付价值的软件过程。其次,它的微服务架构方式,帮助用户分解业务架构、解耦复杂应用系统。第三,大量虚拟化技术的使用,使得开发测试环境与生产环境几乎没有差别,新的功能模块封装在容器中,以类似集装箱形式快速部署到生产环境中。第四,一切皆服务的理念指导,不仅大大降低了开发部署和运维的难度,同时也降低了成本。第五,构建了强大的工具链,支持高水平自动化,代码从编写到部署上线,几乎不需要人工干涉。

需求开发

  • 获取需求的方式有:1 面谈,和用户进行问答的形式。 2 集体获取,通过用户们的讨论发现需求,例如专题讨论会。3 头脑风暴,是一种特殊的群体面谈方法。4 原型,通过一个有形的制品来增进用户与需求工程师之间的交流。
  • 需求工程的三个主要任务:第一个说明系统需要做什么和为什么需要做,也就是说明软件系统将备用的环境及其目标以及说明来达到这些目标的软件功能。第二个是将目标和功能反应到软件系统当中,映射为可行的软件行为,并进行准确的规格说明。第三个是处理目标和功能随着时间变化而发生的变动。
  • 需求的三个层次:第一个是业务需求,用于描述系统的宏观目标。第二个是用户需求,就是用户对系统所能够完成具体功能任务的期望。表现为整个系统的部分功能。第三个是系统级需,反映了一次与外界与系统的交互行为,或者是一个细节的实现。
  • 需求的类型:1 功能需求:和系统主要工作相关的需求。2 性能需求。一个系统在限定的约束下能够完成指定功能的程度.例如速度、内存使用程度等。3 质量属性.是一种隐式的需求,分为可靠性、可用性、安全性、可维护性、可移植性等。4 对外接口,指系统和环境中其他系统之间需要建立的接口。5 约束。指系统构造时需要遵守的约定,包括系统开发,运行环境以及问题域内相关的标准和商业规则。6 数据需求。
  • 怎么进行需求分析:
    目的:建立分析模型,达到开发者和用户对需求信息的共同理解。再依据共同的理解,发挥创造性,创建软件系统解决方案。
    (1)结构化分析方法。例如数据流图。
    (2)面向对象的分析方法。
    面向对象的分析方法的关键是识别问题域内的对象,分析它们之间的关系,并建立模型。包括用例图、类图、顺序图等。
    当我们拿到一个需求的时候我们要从用户、场景、问题、方案 来分析

软件设计

  • 软件设计:是指软件对象实现的规格说明和产生这个规格说明的过程,也就是以用户的需求为指引,在一定的客观约束条件下,通过分析、研究、建模等活动进行软件设计。
  • 软件设计的核心思想:分解和抽象。分解就是横向上将系统分割为几个相对简单的子系统以及各个子系统之间的关系,从而降低复杂度。抽象则是纵向上聚焦各个子系统的接口。
  • 软件设计的三个层次:高层设计:描述系统高层结构、关注点和设计决策。中层设计:更加关注组成构建的模块的划分、导入导出、过程之间的调用以及类之间的协作。低层设计:深入模块和类的内部,关注具体的数据结构,算法等。
  • 评价软件设计的依据:1 设计师自身从业经验,2 类似系统的设计,3 参考模型,4 设计原理,5 现有的体系结构风格
  • 常见的设计视角:逻辑视角,关注静态结构类型与实现的复用。依赖视角,关注互联分享。信息视角,关注持久化信息。接口视角,关注服务的定义服务的访问。
  • 软件体系结构:规定了系统部件与部件之间的交互,由部件,连接件、配置组成。
  • 软件体系结构风格:【1】mvc风格:将系统分为模型、视图、控制三个部件,其中模型封装了系统的数据和状态信息,提供数据服务。视图封装了用户交互。提供业务展现。控制封装了系统控制逻辑,根据用户行为调整系统状态以及业务实现。他的优点是,易开发,视图和控制的可修改。适用于网络开发。缺点是复杂性、模型修改困难。【2】面向对象:将系统组织为多个独立的对象,每个对象封装其内部的数据,并继续数据对外提供服务,不同的对象之间通过协作机制来共同完成系统的任务。优点是内部实现的可修改性、易开发易理解易分的结构组织,缺点是无法消除接口的耦合、标识的耦合。和副作用。【3】分层风格:将系统组织为层次式结构,每个层次被建立一个部件,不同的部件之间通常用程序调用的方式来进行连接,优点是设计机制清晰,易于理解,支持并行开发,更好的可复用性和内部可修改性,缺点是交互协议难以修改、性能损失,难以确定层次数量和粒度。
  • 体系结构设计的过程,1 分析关键需求和项目约束,2 选择体系结构风格,3 进行体系结构逻辑设计,4 依据逻辑设计进行物理设计,5 完善体系结构设计,6 定义构件接口,7 迭代过程3-6
  • 常见的集成策略:大爆炸适、增量式。增量式又分为自顶向下、自底向上和持续集成。自顶向下:先集成和测试上层模块,下层模块使用伪装的具有相同接口的桩,然后不断加入下层模块。自底向上:先集成和测试下册模块,上层模块使用伪装的具有相同接口的驱动,然后不断加入上层模块。持续集成:尽早集成和频繁集成,在开发之初就利用桩来开开始集成,每次完成一些任务之后就可以替换掉相应的组件。
  • 软件详细设计是以需求开发结果和软件体系设计结构结果为出发点。
  • 面向对象设计的两个过程,一:通过职责建立静态模型。抽象对象的职责,包括属性职责、方法职责。抽象类之间的关系,包括关联聚合组合继承。然后添加辅助类,例如接口类容器类。二:通过协作建立动态模型。抽象对象之间的协作,例如顺序图,状态图。明确对象的创建,然后选择合适的控制风格,例如集中式委托式分散式。
  • 模块就是一个相对独立的,能够实现一个功能的代码片段。
  • 模块化的原则是高内聚低耦合。每个模块的内部具有最大关联,模块之间具有最小关联。
  • 六种耦合:描述了两个模块之间的复杂程度。内容耦合是一个模块,直接修改了另一个模块的内容。公共耦合式是模块之间共享全局数据。重复耦合是模块之间有重复的代码。控制耦合是一个模块给另一个模块传递控制信息。印记耦合是共享一个数据结构,但只用了其中一部分。数据耦合是两个模块所有的参数都是同类型的数据项。
  • 七种内聚。描述了一个模块内部联系的紧密性。偶然内聚是模块执行多个完全不相关的操作。逻辑内聚是模块执行一系列相关的操作,但每个操作都要调用其他方模块来决定。时间内聚就是执行一系列与时间有关的操作。过程内聚是执行一系列步骤顺序有关的操作。通信内聚是执行一系列与步骤有关的操作,并把这些操作在相同的数据上进行。功能内聚是模块只执行一个操作和达到一个单一的目的。信息那句是模块进行许多操作,但每个操作的代码独立且具有相同的数据结构。
  • 信息隐藏:封装类的职责,隐藏职责的实现。预计将会发生的变更,抽象出接口,隐藏实现。使得一个模块内包含的信息(过程和数据)对于不需要这些信息的模块来说,是不能访问的。能够提高软件质量,减少信息外露,保持模块独立性,模块设计要求“高内聚,低耦合”。
  • 面向对象设计原则:
    A. 降低访问耦合
    接口分离原则:将一个统一的接口匹配为多个更独立的接口。
    迪米特法则:一个软件实体应当尽可能少的与与其他实体发生相互作用。
    面向接口编程:定义明确的契约,并按照契约组织和理解软件结构。
    B. 降低继承耦合
    里氏替换原则:子类能够替换父类而起同样的作用。
    组合代替继承:在不满足里氏替换原则时,用组合代替继承实现代码的复用。
    C.提高内聚
    单一职责原则:既信息内聚又功能内聚。
    集中信息与行为:将信息与访问信息的行为放在一个类中。
    D. 方便变更
    开闭原则:对扩展开放,对修改关闭。
    依赖倒置原:抽象不依赖于细节,高层不依赖低层,都依赖于抽象的接口。

软件实现

  • 软件构造:通过编码、验证、测试、调试等工作的结合,生产可工作的、有意义的软件的过程。
  • 软件构造主要包括:详细设计、编程、测试、调试、代码评审、集成与构件、构造管理。
  • 测试驱动开发:在编程前,优先完成该段代码的设计用例和测试框架。
  • 分析代码质量,要从易读性、易维护性、可靠性 三个角度分析。易读性:包括了格式、命名和注释。易维护性:包括高内聚低耦合、封装复杂决策。可靠性:包括契约式设计、防御式编程。
  • 表驱动编程:将复杂决策包装成决策表,通过查表获取表信息来进行编程。
  • 契约式设计,就是指一个函数或者方法,在满足前置条件的情况下开始执行,完成之后能够满足后置条件,那么这个函数方法就是正确可靠的,契约式设计分为两种编程方式:第一个是异常,第二个是断言。异常,是检查前置条件和后置条件,不满足就抛出异常。断言,就是assert前置条件,然后显示异常信息
  • 防御式编程是在与外界环境进行交互时,确保外界发生错误时,保护内部方法不受损害。
  • Mock object,本质上就是一个简单的桩,就是类级别的桩,用于将需要测试的方法独立出来。

软件测试

软件测试:利用测试工具,按照测试方法和测试流程,对产品进行功能和性能上的测试。要测试是否是正确实现了用户的需求和是否水使用了正确的技术手段来开发软件。从而尽可能早的发现缺陷,并且保证缺陷得以修复。

软件缺陷产生原因:编程错误、时间压力、设计、软件复杂程度、需求变更、缺乏沟通
缺陷是系统代码有问题;错误是系统执行了有缺陷的代码导致的状态;失败是软件功能失效。

测试用例:指对一特定的软件产品测试任务的描述。内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本的等,并形成规范文档。

软件测试的W模型和V模型:【V模型】的目的在于改进软件开发的效率和效果。V模型明确的标注了测试阶段和开发过程各阶段的对应关系。单元测试对应于详细设计、集成测试对应于概要设计,系统测试对应于需求和系统分析,验收测试对应于用户需求。只是把测试作为编码之后的一个阶段。【W模型】增加了验证和确认活动,W模型由两个V字模型组成,分别代表测试与开发过程。测试的对象就不仅仅是程序。测试和开发是一起进行的。这有利于在早期发现问题,比如,需求分析完成以后,经过测试,我们就可以尽早的找出不合理或者错误的需求,对需求进行的测试,我们也可以在早期就了解项目情况,及早制定相应的应对计划,减少后期的测试工作时间,从而加快项目的整体进度。

一、按是否查看程序内部结构分为:
1、黑盒测试(Black Box Testing)将测试对象看成一个黑盒子,完全基于输入和输出来判定测试对象的正确性。方法有:等价类划分、边界值分析、决策表、状态转换
2、白盒测试(White Box Testing)将测试对象看做透明,完全依照测试对象内部程序结构,来设计测试用例并进行测试。白盒测试包括:语句覆盖、条件覆盖、路径覆盖
黑盒测试的优点:测试效率高,可以检验需求的规格是否符合需求,缺点是覆盖率低,发现缺陷的数量比较少。
白盒的优点就是覆盖率高,发现缺陷多,缺点是测试开销大,不能够验证是否符合需求
二、按是否运行程序分为:
1、静态测试(static testing):测试不运行的部分,只是静态地检查程序代码、界面或文档可能存在的错误的过程。
2、动态测试(dynamic testing):动态测试是指通过运行软件来检验软件的动态行为和运行结果的正确性。
三、按阶段分为:
1、单元测试(Unit Testing):
单元测试是最微小规模的测试,测试的是某个功能或代码块。典型地由程序员而非测试员来做,因为它需要知道内部程序设计和编码的细节知识。
2、集成测试(Integration Testing):
在单元测试之后,测试多个单元的接口,通过大爆炸式或增量式集成策略对系统接口进行正确性检验。(增量式又分为自顶向下和自底向上)
3、系统测试(System Testing):
系统测试是将整个软件系统看做一个整体进行测试,包括对功能、性能,以及软件所运行的软硬件环境进行测试。
4、验收测试(Accept Testing):
验收测试是基于客户或最终用户的规格书的最终测试,或基于用户一段时间的使用后,看软件是否满足客户要求。一般从功能、用户界面、性能、业务关联性进行测试。
5、回归测试(Regression testing):
回归测试是指在发生修改之后重新测试先前的测试以保证修改的正确性。理论上,软件产生新版本,都需要进行回归测试,验证以前发现和修复的错误是否在新软件版本上再次出现。

敏捷测试:遵循敏捷宣言的一种测试实践
关注点:强调从客户角度进行测试、重点关注迭代测试新功能,不在强调测试阶段、尽早测试,不间断测试,具备条件即测试、强调持续反馈、预防缺陷重于发现缺陷

软件交付&维护

  • 软件维护:在软件交付之后,对软件进行修改的活动,从而达到修正缺陷,提高性能,适应环境的变化。维护包括了四种类型,分别是:完善性维护、适应性维护、修正性维护、预防性维护。
  • 软件演化生命周期模型:第一个阶段是初始阶段,进行第一个版本的软件产品开发。然后是演化阶段,对演化增量进行处理,以保持软件产品持续增值。然后是服务阶段,用户开始使用,开发者维护。然后逐步淘汰,用户仍然使用,开发者不再维护。然后停止,用户不使用,开发者不维护。
  • 逆向工程:分析目标系统,标识系统部件及其交互关系,使用其他形式或者更高层次的抽象来创建系统表现的过程,它的作用是理解遗留软件,并对其进行维护。
  • 再工程:对遗留软件系统进行分析和重新开发,利用新的技术来改善系统和促进线系统的再利用,它的作用是通过修改软件来处理遗留软件。
  • 增量迭代模型:在项目早期界定项目的目标和范围,将后续开发活动组织为多个迭代并行的瀑布式开发活动。优点是适应性好,并行开发缩短了开发时间,渐进交互能够加强用户反馈,降低开发风险。缺点是迭代的构建不能破坏已有的构件成分,然后需要完备清晰的项目前景。适用的范围是成熟稳定领域的大规模软件系统开发。
  • 演化模型:在早期明确系统的核心需求,建立一个核心系统交付给用户,依据用户的反馈,迭代并行的组织瀑布式的开发活动,逐渐精化系统。优点是适应性好,并行开发缩短了开发时间,进行交互加强了用户反馈,降低开发风险。缺点是项目范围不好把握,后续迭代容易蜕变为构建修复模式。适用范围是不稳定领域的大规模软件系统开发。
  • 螺旋模型:按照风险解决的方式来组织软件开发活动。优点就是能够降低风险,缺点是开发成本高,模型过于复杂,不利于管理。范围是高风险,大规模的软件系统
  • 原型模型:在真正的产品构造之前,通过向用户提供一个不完整的原型,用于解决需求不确定的问题,并采用逐步求精的思想安排后续的开发活动。原型模型又分为:演化式原型,就是原型会成为产品的一部分;抛弃式原型,就是原型不会出现在产品当中。原型模型应该更注重使用抛弃式原型。优点是渐进交互,加强了用户反馈,适用于较新颖的领域。缺点是开发成本高,如果舍不得抛弃原型会导致低质量。适用范围是存在大量不确定性的新领域。
  • 瀑布模型:按照软件生命周期模型将软件开发活动组织为:需求开发、软件设计、软件实现、软件测试、软件交付、软件维护等活动,并规定了他们自上而下相互衔接的开发活动次序。但瀑布模型允许出现反复和迭代。缺点是对文档的期望过高,对开发活动的线性预设,客户用户参与度不够,里程碑粒度过粗。适用的范围是需求明确、技术成熟、复杂度适中的工程。
  • 构建修复模型:开发人员依据个人分析和理解,直接构造软件的第一个版本,并提交给用户使用,使用后发现缺陷,然后再修改缺陷,直到所有的缺陷修复完成,然后进入维护阶段,他的缺点是随着系统复杂度的提升,开发活动无法有效的进行,然后质量低,可维护性低。适合软件规模小,质量要求低的软件。

你可能感兴趣的:(面试知识点——软件工程)