高级软件工程-复习

高级软件工程复习

坐标国科大,下面是老师说的考试重点。

  1. Ruby编程语言的一些特征需要了解
  2. 要能读得懂Ruby程序
  3. Git的基本命令操作知道
  4. Rails的MVC工作机理需要清楚,Model, Controller, View各司什么职责明白
  5. BDD的User Story需要会,SMART要求能理解
  6. TDD的Rspec读得懂会补充
  7. 重点:最常用的几种设计模式知道、理解、会用;SOLID原则是什么?什么情况下是违背的。

SOA(Service Oriented Architecture)面向服务架构:所有组件都设计为服务、且服务可以组合的软件架构。

**特点:**一个服务直接访问另外一个服务的数据时可能出现不稳定。

image-20250105222415157

4

软件质量(Quality Assurance)

软件质量保障(QA):确保软件开发的质量,改进优化过程,提高效率。

一般通过测试来保证软件质量

image-20250105223053228

image-20250105223104016

image-20250105223612569

这个题的24,怎么选

提高开发者生产力:简洁性、合成、重用和工具

4种技术

  1. 通过表达的简洁化:语法更短更易读、抽象级别提高(高级程序设计语言、自动内存管理、动态脚本语言:计算反射和元编程)
  2. 程序合成(Program Synthesis):生成代码以适应情境和删除条件测试
  3. 重用 (Reuse):重用旧代码vs.编写新代码
    • 重用技术(按历史顺序排列)
      • 过程和函数-procedure, function
      • 标准化库(重用单一任务)-standard library
      • 面向对象编程-Object Oriented Porgramming: 重用和管理任务集合
      • 设计模式-Design Pattern: 实现可以不同, 但重用的是通用策略
  4. 自动化和工具 (Automation & Tools)

DRY-Don’t Repeat Yourself

在一个系统中,每一知识必须有一个单一的、明确的、权威的表示。

P&D软件过程模型

P&D: 计划与文档

  1. 编码前,项目经理制定计划
  2. 撰写计划各阶段的详细文档
  3. 根据计划来度量进展
  4. 项目的变更必须反映在文档中,并可能反映在计划中
瀑布模型螺旋模型Rational统一软件开发过程,RUP
image-20250105224414183image-20250105224447980image-20250105224610698
缺点:当客户看到开发出来的产品时,通常想要对软件产品进行改变,这时就会遇到麻烦。image-20250105224638912image-20250105224626865
image-20250105224545598image-20250105224620339

P&D需要大量的文件和计划,并依赖于经验丰富的经理。

image-20250105224840820

Aglie敏捷开发

个体与交互 vs过程 & 工具

工作软件vs全面文档化

客户协作vs合同谈判

响应变更vs遵从计划

image-20250105225016936

敏捷强调测试驱动开发(TDD)来减少错误,记录用户故事来验证客户需求,用速度来度量进展。

设计模式:捕捉/刻画重复出现问题的常见结构化解决方法。

Client/Server: 架构级设计模式,Web是C/S架构,面向请求/应答方式。

image-20250105225641483

Ruby/Rails框架中,Rails复杂管理防止篡改cookie

2

image-20250105230001028

三层架构:表示层-逻辑(应用)层-持久层

image-20250105230143422

image-20250105230215458

MVC(Model-View-Controller)

提倡痩视图和控制器、不要在视图中添加功能代码。

image-20250105230256794

image-20250105230313058

image-202501052316506832,比如嵌入式系统

在MVC中,用户可以进行的每个交互都是由控制器中的动作来处理的

Ruby语言中的方法(method)处理这种交互。

image-20250105230935122

image-20250105231000999

image-20250105231028015

Git

使用版本控制系统

命令说明
checkout从库中拷贝一个版本的代码
commit将代码写回仓库

Git基础

命令说明
git init创建仓库
git config配置仓库
git clone <url>获取一个仓库
image-20250105232206795将变更录入仓库
git log查看变更历史
git pushgit pull与远程仓库同步
git branch <branch_name>git checkout <branch_name>创建分支
git mergegit rebase (branch 1)在branch2上执行合并分支
git rest --hard <commit_id>回退
git revert <commit_id>撤销

Git配置

Cit配置配置用户信息配置文本编辑器查看配置信息
git config --global / -- localgit config --global user.name "John Doe"git config --global core.editor emacsgit config --list
git config --global user.email johndoe@example.com

Rails

Rails是使用Ruby语言建立的流行编程框架。

Ruby:现代动态脚本编程语言。

面向对象函数式自动内存管理动态类型mix-in闭包用于重用、元编程、程序合成

Rails遵守:(依赖于Ruby的语言特性:自省和元编程闭包模块(混合)

  1. 约定优于配置:命名遵守某些约定、不需要配置文件
  2. DRY:提取公共功能的开发原则:“在一个系统中,每一知识必须有一个单一的、明确的、权威的表示。”

CRUD: create, read, update, delete

Ruby->Database

ActiveRecord::Base子类化。–将模型连接到数据库+CRUD

image-20250106234738821

ActiveRecordcreate 方法是new方法与save方法的组合。

  • save!操作失败会抛出异常。

image-20250106234905336

Rails解决方案: 开发、测试和生产环境都有自己的数据库。

**迁移:**用脚本描述更改,可以跨数据库类型进行安全快速移植。

image-20250106235136067

# 创建迁移
rails generate migration CreateMovies# 将迁移应用于开发环境
rake db:migrate# 完成代码测试后,将迁移应用于生产环境,应用迁移还包括在数据库中记录哪些迁移脚本已经用过了
heroku rake db:migrate# 新模型,创建模型文件
app/models/model.rb# 更新测试数据库schema
rake db:test:prepare# 最终部署
heroku rake db:migrate

RUD

image-20250106235806802

Ruby->Routes

image-20250106235958231

image-20250107000020038


Ruby->Views

创建表单—

BDD(行为驱动设计)

BDD:在开发之前开发期间询问有关应用行为的问题,以减少误解。

需求以用户故事的方法记录。

image-20250107000422401

创建用户故事

SMART故事
SMART说明
Specific明确:每个场景可测试
Measurable可度量:已知合理输入,预期结果存在
Achievable可达成(理想情况:一个迭代下完成)
Relevant相关性(5个为什么)image-20250107000911118
Timeboxed时间框(知道何时放弃)

Cucumber测试

通过Cucumber,用户故事成为验收测试和集成测试用例

# 运行一个功能特征测试
cucumber filename# 运行所有测试
rake cucumber

绿:通过的步骤

黄:还未实现的

红:失败的–然后步骤是蓝色的

目标:使所有步骤通过

显式/隐式、命令式/声明式场景

显式需求:验收测试的一部分

隐式需求:显式需求的逻辑结果、集成测试

  1. 将电影列表
  2. 电影按时间顺序还是字母顺序排列?

**命令式场景:**初始用户故事,有许多步骤,指定逻辑顺序,直达所需结果。

如果很多用户故事是命令式,那就不DRY

**声明式场景:**描述状态而不是序列。(更少的步骤)

声明式步骤:描述应用程序应该处于的状态

命令式步骤:将当前状态改变表示为期望状态的步骤序列

TDD(测试驱动开发)

在代码本身之前,先为代码编写单元和功能测试

Rspec测试被称为specs或者例子

respec filename
# 运行测试

image-20250108090244624

单元测试-FIRST原则

FIRST说明
Fast(快)快速运行测试子集、因为将一直运行它们
Independent(独立)没有测试依赖于其他测试、远程可以以任何顺序运行任何子集
Repeatable(可重复)运行N次,得到相同的结果(以帮助隔离bug并启动自动化)
Self-checking(自检查)测试可以自动检测是否通过
Timely(及时)与被测试的代码同时编写(使用TDD需要先编写测试)

TDD周期:红-绿-重构

以“始终拥有工作代码”为目标。考虑代码应该完成的一件事(功能)

红:在失败的测试中记录/步骤这种想法

绿:编写尽可能简单的代码使测试通过

重构:与其他测试一起来提炼共性、改进代码。

继续完成代码应该做的下一件事。

接缝(Seam)

接缝:可以唉不改变源代码的情况下改变应用程序行为的位置。

对测试有用:将某些代码的行为与其所依赖的其他代码隔离开来。

image-20250108091402582

每个seam仅为测试中地某些特定行为提供足够地支撑。

Seam概念说明
存根(stub)类似should_receive,但没有期望;add_return可选地控制返回值.
模拟(mock)“特技替身”对象,常用于行为验证(让某方法被调用)、字其上为单个方法创建存根.

RSpec

image-20250108091820081

装置/工厂

从何获取真实对象?

装置(Fixture)工厂(Factory)
说明静态地将一些已知数据预加载到数据库表中只创建每次测试所需要的内容动态创建
需求每次测试之前,db需要擦除和重新载入根据测试需要,设置helper来快速创建带有默认属性的对象
赞成的原因真正的静态数据(e.g.永远不变的配置线性),恒容易在一个地方看到所有测试数据保持测试的独立性:不受它们不关心对象的影响
反对的原因可能会引入对装置数据的依赖复杂的关系可能很难建立(但可能表明代码耦合过紧)

测试覆盖、单元测试、集成测试

覆盖度量

覆盖度量说明
S0方法覆盖
S1调用覆盖
C0语句覆盖
C1分支覆盖
C1+判定覆盖:条件中的美国个子表达式
C2路径覆盖(苦难,价值如何有很大分歧)

image-20250108092733364

测试与调试

变异测试:在代码中引入故意的错误、是否会有一些测试失败?

模糊测试:1万只猴子向你的代码扔随机输入:1.发现了MS~20% bug,崩溃了~25%的Unix应用工具2.以应用程序不应该被使用的方式来测试它

DU-覆盖率:每一对<define x/use x>执行了吗?

黑盒测试/集成测试:不依赖于对应用程序结构的理解

白盒测试

代码坏味-SOFA

通过捕获哪些白哦是代码坏味的症状。

  1. Short:短的
  2. One:只做一件事
  3. Few:不多的参数
  4. Abstraction:一致的抽象级别

定量:ABC复杂度

Assignment,Brach,Condition赋值+分支+条件,检查ABC复杂度

Agile敏捷开发


P&D

image-20250108085726511

需求抽取:抽取非功能/功能需求

面谈、合作创建场景(快乐/悲伤路径流)、创建用例(UML描述)

需求文档(软件需求规范记录需求)

需求检查:有效性、一致性、完整性、可行性

PD维护

image-20250108111236483

PD中设计模式

将软件需求规范(SRS)分解为问题(任务):

  1. 对每个任务寻找匹配的设计模式、然后是子问题的某事
  2. 设计评审将有所帮助

P&D中测试方法

将软件需求规范(SRS)划分为编程单元、开发人员编写单元代码+执行编程测试。

**独立的质量保证(QA)**团队进行更改级别的测试:模块、集成、系统、验收测试。

QA集成选项

自顶向下自底向上三明治集成
从依赖关系图的顶部开始从依赖关系图的底部开始两全其美?
高级功能(UI)很快就能开始工作没有stub,吧所有的集成在一个模块中通过自底向上集成一些单元来减少stub构造
构建许多存根Stub让应用程序“工作”不能看到应用程序工作,知道所有的代码和集成完成通过自顶向下集成一些单元,让UI可操作

QA团队测试

QA团队进行系统测试:

  1. 完成的应用程序可以运行
  2. 测试非功能需求+功能需求

何时系统测试?–看机构的政策

  • 测试覆盖级别(C0类似)
  • 所有测试要输入好的/坏的数据

最后一步是:用户/客户验收测试(UAT)–确认&验证

性能

可以是验收测试的一部分。PD周期忽略了性能。

版本管理:

image-20250108094249320

SaaS

SaaS:Software as a Service

SaaS通过运行在客户端设备上的瘦程序(浏览器、APP),访问Internet上以服务形式提供的软件(包括数据)。

优点:

  1. 无需安装、不用担心硬件与OS差异
  2. 无需担心数据丢失(数据远程存储)
  3. 便于团队共享和分享数据
  4. 如果数据很大/频繁更改,在中心站点保存一份副本更简单
  5. 软件单一拷贝、单一部署硬件/软件环境

SaaS对基础设施的需求:

  1. 通讯::允许客户与服务互动
  2. 可扩展性:需求波动满足新服务快速引入、增加用户
  3. 可靠性:服务和通信7*24h可用

SaaS类的设计模式

GoF:结构化、创建型、行为型

image-20250108100846478

模式不是单独的类或者库,也不是完整的设计(更像是设计的蓝图)

image-20250108094922290

**元模式:**把变与不变的东西分开。

  1. 针对接口百年城而不是针对实现编程。
  2. 比起继承,更倾向组合和委托:委托是接口共享、继承是关于实现代码共享。

SOILD面向对象编程原则

动机:将变更的代价最小化。

image-20250108095424916

SOLID原则说明
单一职责(Single Responsibility, SRP)一个类应该有且只有一个改变的理由、每一项职责可能是变化的轴心、对一个轴的更改不应该影响其他轴。
开闭(Open/Close, OCP)类应该对功能扩展开发、对源代码修改关闭。–抽象工厂模式(提炼构造)
里氏替换(Liskov substitution)子类型可以i替代基类型。
依赖注入(injection of dependencied, DIP)需求:a依赖于b,但b的接口和实现可以改变,即使功能稳定; 解决方案:“注入”a和b所依赖的抽象接口
迪米特(Demeter,DP)只和朋友交谈而不是陌生人。1.用委托替换直接方法调用,2.将遍历与计算分离(Visitor模式),3.在不了解实现细节的情况下只关注重要事件 (Observer模式)
观察者模式Observer

实体Observer想hi到何时某些事情发生在实体Subject上。

image-20250108100413028

非功能需求

服务水平目标(SLO,service level oeject)

image-20250108094026951

考试回忆版

哈哈终于考完了,我为期1个多月的考试周终于宣告结束了。

考之前,一直在想,老师会不会根据给的题库然后做一些变动。但实际情况是:完全没有.

让我们说:谢谢老师!

此外,虽然老师给了部分的重点,但是还是和我自己复习的有一些出入,比如,我以为概念应该会考SOLID或者BDD/TDD,像单元测试的SMART,TDD周期的红-绿-重构这些。但其实都没考,反倒是后面出了一个SaaS的概念,但是考前就看了两眼,觉得不会考…

再一个有出入的就是,我以为会考点读Ruby程序给输出的题,毕竟简单,但也完全没有()

所以大家复习的时候,建议还是复习的全面一点,基本上给的题库要全部过一遍,然后根据老师给出重点,再过一遍重要的。因为如果万一没有命中的话,至少之前做过一遍,还是会有印象,至少不会是0分(?)

当然,要是有时间能够全面复习,那就太好辣!

很高兴你能看到这里~
获取考试试题,请到个人博客中找。就不放CSDN了~
Schwertlilien.blog<--------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/505824.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用 Maxwell 计算母线的电动势

三相短路事件的动力学 三相短路事件在电气系统中至关重要&#xff0c;因为三相之间的意外连接会导致电流大幅激增。如果管理不当&#xff0c;这些事件可能会造成损坏&#xff0c;因为它们会对电气元件&#xff08;尤其是母线&#xff09;产生极大的力和热效应。 短路时&#x…

Github出现复杂问题 无法合并 分支冲突太多 如何复原

目录 问题再现 解决思路 当然我所指的是在 main 分支开一个新的分支 删除本地文件夹 重新克隆 开一个新分支 切换分支 下载远程分支 文件覆盖 合并到主分支 ​​​​​​​问题再现 太复杂了 无法更改 编译器现状 全部崩溃了 无法更改 即使创建一个新的分支也无济于…

Jenkins触发器--在其他项目执行后构建

前言&#xff1a; jenkins中有多种触发器可用&#xff0c;可以方便的控制构建的启动 这里简单介绍下项目后构建的配置方法 1. 解释&#xff1a; Build after other projects are built Set up a trigger so that when some other projects finish building, a new build is…

CI/CD 流水线

CI/CD 流水线 CI 与 CD 的边界CI 持续集成CD&#xff08;持续交付/持续部署&#xff09;自动化流程示例&#xff1a; Jenkins 引入到 CI/CD 流程在本地或服务器上安装 Jenkins。配置 Jenkins 环境流程设计CI 阶段&#xff1a;Jenkins 流水线实现CD 阶段&#xff1a;Jenkins 流水…

计算机毕业设计Python机器学习农作物健康识别系统 人工智能 图像识别 机器学习 大数据毕业设计 算法

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

计算机网络之---物理层设备

什么是物理层设备 物理层设备是指负责数据在物理媒介上传输的硬件设备&#xff0c;它们主要处理数据的转换、信号的传输与接收&#xff0c;而不涉及数据的内容或意义。常见的物理层设备包括网卡、集线器、光纤收发器、调制解调器等。 物理层设备有哪些 1、网卡&#xff08;N…

HTML实战课堂之简单的拜年程序

一、目录&#xff1a; &#xfffc;&#xfffc; 一、目录&#xff1a; 二、祝福 三&#xff1a;代码讲解 &#xff08;1&#xff09;详细解释&#xff1a; 1.HTML部分 2. CSS部分 三、运行效果&#xff08;随机截图&#xff09;&#xff1a; 四、完整代码&#xff1a; 二、祝福…

【数据库系统概论】数据库恢复技术

目录 11.1 事务的基本概念 事务的定义 事务的开始与结束 事务的ACID特性 破坏ACID特性的因素 11.2 数据库恢复概述 11.3 故障的种类 1. 事务内部的故障 2. 系统故障 3. 介质故障 4. 计算机病毒 11.4 恢复的实现技术 如何建立冗余数据 数据转储 登记日志文件 11…

Ubuntu问题 -- 硬盘存储不够了, 如何挂载一个新的硬盘上去, 图文简单明了, 已操作成功

需求 我现在有一个ubuntu22.04操作系统的服务器, 但是当前硬盘不够用了, 我买了一个1T的SSD固态硬盘, 且已经安装在服务器上了, 我需要将这个硬盘挂载到当前ubuntu的某个目录上 开始 1. 确认新硬盘是否被系统识别 打开终端&#xff0c;输入以下命令查看系统识别到的硬盘&…

Linux第一个系统程序---进度条

进度条---命令行版本 回车换行 其实本质上回车和换行是不同概念&#xff0c;我们用一张图来简单的理解一下&#xff1a; 在计算机语言当中&#xff1a; 换行符&#xff1a;\n 回车符&#xff1a;\r \r\n&#xff1a;回车换行 这时候有人可能会有疑问&#xff1a;我在学习C…

JavaSE——网络编程

一、InetAddress类 InetAddress是Java中用于封装IP地址的类。 获取本机的InetAddress对象&#xff1a; InetAddress localHost InetAddress.getLocalHost();根据指定的主机名获取InetAddress对象&#xff08;比如说域名&#xff09; InetAddress host InetAddress.getByNa…

CompletableFuture // todo

相比较所有代码都在主线程执行&#xff0c;使用Future的好处&#xff1a;利用服务器多核、并发的优势。 不足&#xff1a; 开启没有返回值的异步线程&#xff1a; 1、runAsync 使用lambda表达式&#xff1a; 开启有返回值的异步线程&#xff1a; 1、supplyAsync 异步任务中的…

RabbitMQ基本介绍及简单上手

&#xff08;一&#xff09;什么是MQ MQ&#xff08;message queue&#xff09;本质上是队列&#xff0c;满足先入先出&#xff0c;只不过队列中存放的内容是消息而已&#xff0c;那什么是消息呢&#xff1f; 消息可以是字符串&#xff0c;json也可以是一些复杂对象 我们应用场…

跟着逻辑先生学习FPGA-第六课 无源蜂鸣器发声实验

硬件平台&#xff1a;征战Pro开发板 软件平台&#xff1a;Vivado2018.3 仿真软件&#xff1a;Modelsim10.6d 文本编译器&#xff1a;Notepad 征战Pro开发板资料 链接:https://pan.baidu.com/s/1AIcnaGBpNLgFT8GG1yC-cA?pwdx3u8 提取码:x3u8 1 知识背景 1.1 蜂鸣器简介 蜂鸣…

TensorFlow Quantum快速编程(高级篇)

五、实战:量子分类器应用 5.1 数据准备 在实战构建量子分类器时,数据准备是基石环节。选用鸢尾花数据集,这一经典数据集在机器学习领域应用广泛,其涵盖了三种鸢尾花品种的样本,每个样本包含花萼长度、花萼宽度、花瓣长度、花瓣宽度四个特征。鉴于本次构建二分类量子分类…

Mysql进阶篇

一&#xff1a;存储引擎 二&#xff1a;索引 2.1 索引概述 索引&#xff08;index&#xff09;帮助mysql高效获取数据的数据结构&#xff08;有序&#xff09;。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&…

通过gradle发布aar或jar携带sources-jar到maven nexus

找了很久&#xff0c;没有找到满意的。终于找到一个好的办法。 gradle7.x适用。比以前的写法简洁。 发布传统的jar工程 比如okhttp&#xff0c;fastjson等项目&#xff0c;纯java工程。 直接创建新文件publish.gradle: apply plugin: maven-publishProperties properties …

ELK日志分析实战宝典之ElasticSearch从入门到服务器部署与应用

目录 ELK工作原理展示图 一、ElasticSearch介绍&#xff08;数据搜索和分析&#xff09; 1.1、特点 1.2、数据组织方式 1.3、特点和优势 1.3.1、分布式架构 1.3.2、强大的搜索功能 1.3.3、数据处理与分析 1.3.4、多数据类型支持 1.3.5、易用性与生态系统 1.3.6、高性…

2025年VGC大众汽车科技社招入职测评综合能力英语口语SHL历年真题汇总、考情分析

早在1978年&#xff0c;大众汽车集团就开始了与中国的联系。1984年&#xff0c;集团在华的第一家合资企业—上汽大众汽车有限公司奠基成立&#xff1b;1991年&#xff0c;一汽-大众汽车有限公司成立&#xff1b;2017年&#xff0c;大众汽车&#xff08;安徽&#xff09;有限公司…

嵌入式C语言:二维数组

目录 一、二维数组的定义 二、内存布局 2.1. 内存布局特点 2.2. 内存布局示例 2.2.1. 数组元素地址 2.2.2. 内存布局图&#xff08;简化表示&#xff09; 2.3. 初始化对内存布局的影响 三、访问二维数组元素 3.1. 常规下标访问方式 3.2. 通过指针访问 3.2.1. 指向数…