高级软件工程复习笔记

必备技能

  • Typing: 打字,你懂我意思吧?
  • Visual Studio Code: 准确来说,它是一个编辑器(专注于代码理解+编辑器+调试)而不是一个 IDE. 但是,其进程隔离的插件模型、remote development 使得它非常好用。。
    • LSP, Language Server Protocol, LSP 协议是多语言支持的基础。
    • remote development, VSCRD, 它在远程工作环境中开一个 VSCode 工作区,然后用本地的 VSCode 连接工作。
  • GIt 版本控制:一种分布式版本控制系统。
  • Vim
  • 正则表达式

工程化编程实战

从 hello.c 开始:

#include 
int main() {
	printf("Hello world\n");
    return 0;
}

上述代码打印一个Hello world.

如果想让上述代码永久运行,则需要:

#include 
int main() {
	while(1) {
		printf("Hello world\n");
	}
    return 0;
}

添加上循环后,则会已知输入 Hello world.

下一步,如何让该代码接受我们输入的参数?可以这样修改:

#include 

int main() {
    char cmd[128];
    while(1) {
        scanf("%s", cmd);
        printf("%s", cmd);
    }
    return 0;
}

此时,输入什么就会输出什么。

接下来一步,如何让程序再接受特定指令时,输入指定的命令?以下代码给出了输入 help, quit 两种指令的反馈:

#include 
#include 

int main() {
    char cmd[128];
    while(1) {
        scanf("%s", cmd);
        if( strcmp(cmd, "help") == 0) {
            printf("tips!\n");
        }
        else if( strcmp(cmd, "quit") == 0) {
            exit(0);
        }
        else {
            printf("wrong cmd!\n");
        }
    }
    return 0;
}

模块化,指软件系统设计时保持系统内部各个部分相互独立,每个模块只实现一个单一的功能目标。

  • 耦合度:软件模块之间的依赖程度。
  • 内聚度:软件模块内部的各个元素的依赖程度。

软件设计中的一些基本方法:

  • KISS( Keep It simple & Stupid) 原则:一行代码/一块代码/一个函数/一个函数模块只做一件事。
  • 不要和陌生人说话原则
  • 先写伪代码的代码结构会更好

消费者重用:软件开发者在项目中重用已有的一些软件模块代码,以加快项目进度。

接口:定义一组 API 函数来约定软件模块之间的沟通方式。包含接口的目的、接口使用条件、使用接口双方遵守的规范、使用接口后的效果、接口的质量属性。

微服务:通过模块化的思想垂直划分业务功能。

RESTful API: REST 即 RE presentation State Transfer, 表现层状态转化,即有表现层就有背后的信息尸体,信息尸体就是 URI 代表的资源。状态转化就是通过 HTTP 协议定义四个表示操作方式的动词:GET, POST, DELETE, PUT.

线程:操作系统能够进行运算调度的最小单位,包含在进程之中。

多线程 CPU: 在一个 CPU 上支持同时运行多个指令流。而多核 CPU 是指一块芯片上集成了多个 CPU 核。

函数系统调用堆栈:每一个线程都独自拥有一个函数调用堆栈空间,其中函数参数和局部变量都存储在函数调用堆栈空间中。
全局变量是多线程共享的。

可重入函数:可由多于一个任务并发使用,而不必担心数据发生改变。

线程安全:

可重入函数不一定是线程安全,不可重入函数一定不是线程安全。

用例建模的基本步骤:(其中步骤一到步骤三是计划阶段,第四步是增量实现阶段)

  1. 从需求表述中找出用例,往往是动名词短语表示的抽象用例。
  2. 描述用例开始和结束的状态,用 TUCBW 和 TUCEW 表示的高层用例。
  3. 对用例按照子系统或者不同的方面进行描述,描述用例与用例、用例与角色之间的上下文关系,并画出用例图;
  4. 进一步逐一分析用例与角色的详细交互过程,完成一个两列的表格将角色和待开发软件系统之间从从离开时到用例结束的所有交互步骤都列举出来扩展用例。

面向对象分析涉及的基本概念:

  • 对象,Object
  • 属性,Attribute
  • 继承关系,Inheritance Relationship
  • 聚合关系,Aggregation Relationship
  • 关联关系,Association Relationship

MongoDB: 是一个通用的、基于文档的、分布式的数据库、为云计算时代的现代应用开发者而生。

瀑布模型:把整个软件开发过程划分为了需求、设计、编码、测试和部署五个阶段。

统一过程:其核心要义是用例驱动、以架构为中心、增量和迭代的过程。

多态:polymorphism, 接口的不同方式实现方式

回调函数:clallback, 它是一个面向过程的概念,是代码执行过程中的一种特殊流程。

闭包:将函数作为返回值,该函数所需的上下文环境也作为返回的函数对象的一部分,则该函数是一个闭包。

lamda 函数:函数式编程中的高阶函数。

设计模式:它的本质是面向对象设计原则的实际运用总结出的经验模型。

常用的设计模式:

  • 单例模式,single, 某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,如数据库实例。
  • 原型模式,prototype, 将对象作为原型,通过对其赋值而克隆出多个和原型类似的新实例。
  • 建造者模式,Builder, 将一个复杂对象分解为多个相对简单的部分,之后按照不同的需要分别构建它们,最后构建成该复杂对象。
  • 代理模式,Proxy, 为某对象提供一种代理以控制对该对象的访问。
  • 适配器模式,Adapter, 将一个类的接口转化成为客户希望的另一个接口,使原本由于接口不兼容而不能一起工作的那些类能一起工作。
  • 装饰模式,Decorator, 在不改变现有对象结构的情况下,动态地给对象增加一些止血,即增加其额外的功能。
  • 外观模式,Facede, 为复杂的子系统提供一个一致的接口,使这些子系统更加容易被访问。
  • 享元模式,Flyweight, 运行共享技术来高效地支持大量细粒度对象的复用。
  • 策略模式,Strategy, 定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。
  • 命令模式,Command, 将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分开。
  • 中介者模式:定义一个中介对象来简化原有对象之间的交互关系,降低耦合度。
  • 观察者模式:多个对象之间存在一对多的依赖关系,当一个对象的状态发生改变时,把这种对象的通知给其他多个对象,从而改变其他对象的行为。

模版方法:定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重新定义该算法的某些特定步骤。

职责链:为了避免请求发送者和多个请求处理者耦合,将所有请求的处理者通过前一个对象记住其下一个对象的引用而连成的一条链。

设计模式的原则:

  • 开闭原则:软件对扩展开放,对修改关闭。
  • Liskov 替换原则:集成必须确保超类所拥有的性质在子类中依旧成立。
  • 依赖倒置原则:高层模块不应该依赖底层模块,二者都应该依赖其抽象。
  • 单一职责原则:一个类有切只有一个引起它变化的原因,否则类应该被拆分。
  • 迪米特罚则:如果两个实体无需通信,那么就不应该发生直接的相互调用。
  • 合成复用原则:软件复用时,尽量先使用组合或聚合关系实现。

MVC 架构:Model-View-Controller, Model 代表一个存储数据的对象,View 为可视化接口,Controller 作用域 Model 和 View 上,控制数据流流向。

MVVC 架构:Model-View-ViewModel,

软件危机:其根本问题在于软件概念结构的复杂性。

DevOps: 一组过程、方法与系统的统称,用于促进软件方法、技术运营和质量保障部分之间的沟通,协作与整合。它可以看作开发、技术运营、质量保障三者的交集。

你可能感兴趣的:(高级软件工程复习笔记)