高级软件工程往年考题
![/notes-%D1%8D%D0%B4%D1%91/featured-image.png /notes-%D1%8D%D0%B4%D1%91/featured-image.png](/notes-%D1%8D%D0%B4%D1%91/featured-image.png)
简介: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)的过程。
-
用例驱动就是用例建模得到的用例作为驱动软件开发的目标;以架构为中心的架构是后续软件设计的结果,就是保持软件架构相对稳定,减小软件架构层面的重构造成的混乱;增量且迭代体现在下图中。
![增量](img\增量.png)
1.6 模块化的基本原理
模块化(Modularity)是在软件系统设计时保持系统内各部分相对独立,以便每一个部分可以被独 立地进行设计和开发。这个做法背后的基本原理是关注点的分离 (SoC, Separation of Concerns) 分解成易解决的小问题,降低思考负担。 每个模块只有一个功能,易于开发,并且bug会集中在少数几个模块内,容易定位软件缺陷,也更加容易维护。 软件设计中的模块化程度便成为了软件设计有多好的一个重要指标,一般我们使用耦合度 (Coupling)和内聚度(Cohesion)来衡量软件模块化的程度。
耦合度是指软件模块之间的依赖程度,一般可以分为紧密耦合、松散耦合和无耦合。一般在软件设计中我们追求松散耦合。
内聚度是指一个软件模块内部各种元素之间互相依赖的紧密程度。 理想的内聚是功能内聚,也就是一个软件模块只做一件事,只完成一个主要功能点或者一个软件特性。
1.7 本地化外部接口是什么含义
使用本地化外部接口来提高代码的适应能力。增强代码的抽象,可扩展能力,同时便于模块之间的调用。
![本地化外部接口](img/本地化外部接口.png)
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模型](img\V模型.png)
(个人理解)通俗来说,就是边开发边测试
1.15 团队强度和项目特点的关系
团队的基本要素
-
团队规模
-
团队的凝聚力
-
团队协作的基本条件
小型的并充满动力的项目团队也可称为敏捷团队,他们具备成功软件项目团队的很多特征,并且能够避免产生问题的很多毒素。敏捷理念强调个人通过团队合作可以加倍的能力,这好似团队成功的关键因素。
项目失败最根本的原因是团队问题(缺乏有效的领导和管理、不能做出妥协、安排或不善于合作、缺少参与、拖拉与缺乏信息、质量低劣、功能多余、无效的组员互评)
1.16 简述敏捷宣言的核心思想
-
个体和互动 高于 流程和工具
-
工作的软件 高于 详尽的文档
-
客户合作 高于 合同谈判
-
响应变化 高于 遵循计划
尽管右项有其价值,我们更重视左项的价值。
1.17 编程大题:写一个menu里面自定义查找结点的测试代码(20分)
|
|
回忆版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对象的基本用法。
|
|
2.7 给代码写执行结果
2.8 里氏替换原则
子类可以扩展父类的功能,但不能改变父类原有的功能。
2.9 画时序图
注意画法即可,到时候灵活画
![时序图](img/时序图.png)