目录

高级软件工程往年考题

简介:Advanced-software-engineering往年考题。复习用。非原创。

总体考纲

选择 填空 判断 问答题 编程大题(20分)

回忆版1

1.1 高质量需求的特点

  • 需求是可测试的
  • 是可解决冲突的,不同的利益相关者有不同的要求,解决潜在的冲突想法,同时需要考虑需求的优先级
  • 具备一些需求特征:正确的,无二义性的,完整的,可行的,无与主要目标不相关的需求,可测试的,可追溯的

1.2 有哪些需求类型

  • 功能需求:根据需要的活动描述需要的行为

  • 质量需求或非功能需求:描述软件必须具备的一些质量特征

  • 设计约束:设计决策,如平台或接口组件的选择

  • 流程约束:对可用于构建系统的技术或资源的限制

1.3 需求分析的两类基本方法

原型化方法(Prototyping)和建模的方法(Modeling)是整理需求的两类基本方法。

  • 原型化方法可以很好地整理出用户接口方式(UI,User Interface),比如界面布局和交互操作过程。

  • 建模的方法可以快速给出有关事件发生顺序或活动同步约束的问题,能够在逻辑上形成模型来整顿繁杂的需求细节。

1.4 用例满足的四个必要条件

  • 是不是一个业务过程?

  • 是不是由某个参与者触发开始?

  • 是不是显式地或隐式地终止于某个参与者?

  • 是不是为某个参与者完成了有用的业务工作?

1.5 统一过程的核心要义是什么

  • 统一过程(UP,Unified Process)的核心要义是用例驱动(Use case driven)、以架构为中心(Architecture centric)、增量且迭代(Incremental and Iterative)的过程。

  • 用例驱动就是用例建模得到的用例作为驱动软件开发的目标;以架构为中心的架构是后续软件设计的结果,就是保持软件架构相对稳定,减小软件架构层面的重构造成的混乱;增量且迭代体现在下图中。

增量

1.6 模块化的基本原理

模块化(Modularity)是在软件系统设计时保持系统内各部分相对独立,以便每一个部分可以被独 立地进行设计和开发。这个做法背后的基本原理是关注点的分离 (SoC, Separation of Concerns) 分解成易解决的小问题,降低思考负担。 每个模块只有一个功能,易于开发,并且bug会集中在少数几个模块内,容易定位软件缺陷,也更加容易维护。 软件设计中的模块化程度便成为了软件设计有多好的一个重要指标,一般我们使用耦合度 (Coupling)和内聚度(Cohesion)来衡量软件模块化的程度。

耦合度是指软件模块之间的依赖程度,一般可以分为紧密耦合、松散耦合和无耦合。一般在软件设计中我们追求松散耦合。

内聚度是指一个软件模块内部各种元素之间互相依赖的紧密程度。 理想的内聚是功能内聚,也就是一个软件模块只做一件事,只完成一个主要功能点或者一个软件特性。

1.7 本地化外部接口是什么含义

使用本地化外部接口来提高代码的适应能力。增强代码的抽象,可扩展能力,同时便于模块之间的调用。

本地化外部接口

1.8 接口的5个基本要素

  • 接口的目的;

  • 接口使用前所需要满足的条件,一般称为前置条件或假定条件;

  • 使用接口的双方遵守的协议规范;

  • 接口使用之后的效果,一般称为后置条件;

  • 接口所隐含的质量属性。

1.9 通用接口定义的基本方法

  • 参数化上下文。通过参数来传递上下文的信息,而不是隐含依赖上下文环境。
  • 移除前置条件。
  • 简化后置条件。

1.10 依赖倒置原则的含义及其应用价值(重要)

  • 依赖倒置原则:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象。其核心思想是:要面向接口编程,不要面向实现编程。

  • 应用价值:依赖倒置原则在模块化设计中降低模块之间的耦合度、加强模块的抽象封装、提高模块的内聚度上具有普遍的指导意义

1.11 MVC架构为什么更灵活以及MVVM架构为什么更智能(10分)

MVC即为Model-View-Controller(模型-视图-控制器)。只要软件的整体结构主要表现为MVC模式,我们就称为该软件的架构为MVC架构。

MVC中M、V和C所代表的含义如下:

  • Model(模型)代表一个存取数据的对象及其数据模型。

  • View(视图)代表模型包含的数据的表达方式,一般表达为可视化的界面接口。

  • Controller(控制器)作用于模型和视图上,控制数据流向模型对象,并在数据变化时更新视图。控制器可以使视图与模型分离开解耦合。

MVVM即 Model-View-ViewModel,MVVM模式和MVC模式一样,主要目的是分离视图(View)和模型(Model)。但MVVM视图可以独立于Model变化和修改,一个ViewModel可以绑定到不同的"View"上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。

MVC架构更加灵活。mvc的model和Controller可以自定义实现更加复杂的业务逻辑处理,mvvm做的程序的健壮性上不如mvc灵活、操作性较强,mvvm在遇见一些复杂的组件上,无论是灵活度还是执行性都不如mvc

mvvm架构更加智能。mvvm自动绑定机制可以大大减少我们写代码的数量,很方便,一切都趋于自动化,数据跟随页面UI变化。而在mvc里面,你需要去通过方法去获取这个组件对应的值。一定程度上减少了我们的代码量,提高了编程效率

1.12 执行视图、部署视图、分解视图

  • 分解视图:分解视图用软件模块勾划出系统结构,往往会通过不同抽象层级的软件模块形成层次化的结构。

  • 执行视图:展示了系统运行时的时序结构特点,比如流程图、时序图等。视图中的每一个执行实体称为组件。

  • 部署视图:将执行实体和计算机资源建立映射关系。

1.13 没有银弹的含义

没有银弹就是指解决不了软件中的根本困难,即软件概念结构的复杂性,无法达成软件概念的完整性和一致性,自然无法从根本上解决软件危机带来的困境。

1.14 简述v模型

V模型也是在瀑布模型基础上发展出来的,我们发现单元测试、集成测试和系统测试是为了在不同层面验证设计,而交付测试则是确认需求是否得到满足。也就是瀑布模型中前后两端的过程活动具有内在的紧密联系,如果将模块化设计的思想拿到软件开发过程活动的组织中来,可以发现通过将瀑布模型前后两端的过程活动结合起来,可以提高过程活动的内聚度,从而改善软件开发效率。这就是V模型

V模型

(个人理解)通俗来说,就是边开发边测试

1.15 团队强度和项目特点的关系

团队的基本要素

  • 团队规模

  • 团队的凝聚力

  • 团队协作的基本条件

小型的并充满动力的项目团队也可称为敏捷团队,他们具备成功软件项目团队的很多特征,并且能够避免产生问题的很多毒素。敏捷理念强调个人通过团队合作可以加倍的能力,这好似团队成功的关键因素。

项目失败最根本的原因是团队问题(缺乏有效的领导和管理、不能做出妥协、安排或不善于合作、缺少参与、拖拉与缺乏信息、质量低劣、功能多余、无效的组员互评)

1.16 简述敏捷宣言的核心思想

  • 个体和互动 高于 流程和工具

  • 工作的软件 高于 详尽的文档

  • 客户合作 高于 合同谈判

  • 响应变化 高于 遵循计划

尽管右项有其价值,我们更重视左项的价值。

1.17 编程大题:写一个menu里面自定义查找结点的测试代码(20分)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//回调函数
int SearchCondition(tLinkTableNode * pLinkTableNode, void * args)
{
    char * cmd = (char*) args;
    tDataNode * pNode = (tDataNode *)pLinkTableNode;
    if(strcmp(pNode->cmd, cmd) == 0)
    {
        return  SUCCESS;  
    }
    return FAILURE;	       
}


//执行回调函数
tLinkTableNode * SearchLinkTableNode(
    tLinkTable *pLinkTable, 
    int (*Conditon)(tLinkTableNode * pNode, void * args),  
    void * args)
{
    ...
    tLinkTableNode * pNode = pLinkTable->pHead;
    while(pNode != NULL)
    {    
        if(Conditon(pNode, args) == SUCCESS)
        {
            return pNode;				    
        }
        pNode = pNode->pNext;
    }
    return NULL;
}

int main()
{
    ...
    //传递回调函数
    SearchLinkTableNode(head, SearchCondition, (void*)cmd);
    
}

回忆版2

2.1填空题- git的指令

查看workspace状态 : git status

将workplace推到index git add -A

2.2 vscode快捷键

  • 选中某个文件编辑器 Ctrl + 1,2,3
  • 打开文件夹 Ctrl + O
  • 新建文件 Ctrl + N
  • 关闭文件 Ctrl + W
  • 编辑和保存文件 Ctrl + S
  • 调出VS Code命令管理,Ctrl + shift + P
  • 调出切换VS Code的终端,Ctrl + `
  • 文件资源管理器,Ctrl + shift + E
  • 源代码管理,Ctrl + shift + G
  • 跨文件搜索,Ctrl + shift + F
  • 启动和调试,Ctrl + shift + D
  • 查看错误和警告,Ctrl + shift + M
  • 管理扩展插件,Ctrl + shift + E

2.3 正则表达式考察深度到了捕获组

  • VS Code中,如果想将项目中所有的HTML标题标签中h改为大写H,搜索正则表达式<h(\d)>可以查找出所有标题标签,如<h1>、<h2>、<h3>、<h4>等,其中还定义了捕获组(\d)。

  • 替换的正则表达式<H$1>使用$1复用了搜索正则表达式中定义的捕获组(\d)。

  • 在Vim中,复用捕获组的方式进行替换的用法为:1,$s/(capture groups)/$1/g

  • 如果想在当前文件中将所有的HTML标题标签中h改为大写H则正则表达式为:$s/<h(\d)>/<H$1>/g

2.4 简答题- git 快速合并与-no-ff的区别

默认的合并方式为"快进式合并"(fast-forward merge),git merge会将分支里commit合并到主分支里,合并成一条时间线,合并时需要使用--no-ff参数可以关闭"快进式合并"(fast-forward merge)。

git merge –no-ff 可以保存你之前的分支历史。能够更好的查看 merge历史,以及branch 状态。

git merge 则不会显示 feature,只保留单条分支记录。

2.5 实现视图、部署视图、执行视图

  • 执行视图:展示了系统运行时的时序结构特点,比如流程图、时序图等。视图中的每一个执行实体称为组件。
  • 实现视图:描述软件架构与源文件之间的映射关系。
  • 部署视图:将执行实体和计算机资源建立映射关系。

2.6 异步调用(promise、await之类的)

  • Promise对象可以将异步调用以同步调用的流程表达出来,避免了通过嵌套回调函数实现异步调用。

  • ES6原生提供了Promise对象。所谓Promise对象,就是代表了未来某个将要发生的事件,通常是一个异步操作。Promise对象提供了一整套完整的接口,使得可以更加容易地控制异步调用。

  • ES6的Promise对象是一个构造函数,用来生成Promise实例。下面是Promise对象的基本用法。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
/*Promise对象实际上是对回调函数机制的封装,也就是通过then方法定义的函数与resolve/reject函数绑定,简化了回调函数传入的接口实现,在逻辑上也更加通顺,看起来像是个同步接口。*/

var promise = new Promise(function(resolve, reject) {
  if (/* 异步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});

promise.then(function(value) { // resolve(value)
  // success
}, function(value) { // reject(error)
  // failure
});

2.7 给代码写执行结果

2.8 里氏替换原则

子类可以扩展父类的功能,但不能改变父类原有的功能。

2.9 画时序图

注意画法即可,到时候灵活画

时序图