八股文

React

Fiber

以前react的DOM修改是一个不可中断任务,,会阻塞进程,出了fiber之后,就被拆成了异步执行的小任务,在dom中执行,每次执行完小任务,看有没有优先级更高的

生命周期

  • 挂载
  • 更新
  • 卸载

类组件有生命周期函数

函数组件通过effect模拟生命周期

hook

  • useref:可变值不造成重新渲染
  • Usestate:管理一种状态,简单变量
  • useReducer:管理状态,函数更新
  • uselayouteffect:浏览器渲染前执行
  • Useeffect:浏览器渲染后执行
  • Usememo:缓存计算数据
  • Usefunction:缓存函数

上下文传递

创建一个上下文对象,用上下文组件包裹需要接收的组件,接收值

diff

类似于一个嵌套字典,每个节点都有key,每次触发更新了,就会看新旧节点的key更新不一样的地方,增加或删除增增加的key或者是减少的key

函数

  • 纯函数:相同输入相同输出
  • 箭头函数:简洁,没有thisprototype (原型,可以共享方法,和向上查找上级对象的共享方法),arguments(接收未定义的传递值),没有自己的this,继承外层的this
  • 普通函数
  • 闭包:函数内部引用了外部变量

”…”在react的用处

展开数组和字典之类的

什么是react

  • 组件化
  • 虚拟dom
  • 单向数据流:向子组件传递数据只能自上而下,不能反着修改数据,可以保证数据流的清晰
  • jsx写法

类组件和函数组件的区别

类组件:需要集成react的父类,手动调用render渲染

函数组件:直接用函数写

Javascript

事件循环

同步代码 > 微任务(加急) > 宏任务(异步数组)

前端请求方式

  • axios:第三方库,自动序列化,错误处理
  • fetch:原生自带

异步发展

版本控制

请求类型

常规HTTP请求

轮询:需要不断建立新的连接并销毁服务器,压力大,实时性较低

sse:基于http协议标准请求类型,只需要建立一次连接,服务器到客户端单向通道,浏览器会自动管理状态

websocket:WS协议,原生需要手动管理状态

webpack

构建,打包,分割,压缩

Vite

开箱即用的脚手架,高效热加载和构建

Threejs

3d库

创建场景->创建相机->创建渲染器->创建几何体_使用材质或使用外部模型->将模型添加到场景中->设计模型动画

ECharts

数据可视化库

初始化->创建一个option对象->渲染

swup

监听站内跳转,拉取目标HTML,解析出规则配置需要替换的容器,通过实现局部跳转和动画

esm和commonjs

都是模块化系统

  • esm:编译时确定,静态加载
  • commonjs:运行时确实,动态加载

Dom

  • 真实:由浏览器维护的一个文档对象,由于渲染引擎所以更新代价高,document对象
  • 虚拟:由内存维护的一个js对象
  • bom:浏览器操作,window对象

mvvm

数据变化自动更新ui

react

state更新 -> 虚拟dom diff 对 ->局部更新

包管理器

  • npm:扁平化的 node_modules
  • pnpm:全局储存,其他项目通过硬链接,只链接显示声明的直接依赖,避免幽灵依赖
  • bun:类似于PNPM,增加了缓存字节码依赖库文件

渲染方式

CSR 客户端渲染:返回一个HTML空壳加js,在客户端生成dom

SSR 服务端渲染:在服务器上构建渲染好了html,返回客户端,在客户端进行水合(html匹配+事件监听+客户端需要执行的js代码)

SSG:在构建的时候生成静态的HTML文件

CSS

Tailwind CSS

定义了很多原始类方便快速开发

响应式布局

媒体查询器可以实现不同的布局

类选择器可以实现不同配色

计算机基础概念

异步和多线程

异步:先执行后面的任务

多线程:多个线程同时进行

并发和并行

并发:任务切片交替执行

并行:任务同时执行

函数式编程和命令式编程

函数式编程是组合,不同功能的函数为主,命令式编程是写清楚流程为主

垃圾回收机制

  • 引用计数:给每一个对象都分配一个计数,到零就回收
  • GC:就是从根集(栈,堆,寄存器)出现标记存活对象,回收不可达对象

组件化

拆分为可复用对象

序列化和反序列化

数组,字典等和Json,套接字等转换

微服务

就是无状态的单服务,不会让局部影响全局

消息队列

分为生产者 队列 消费者

Socket

实现tcp和udp较为底层的编程方式

Nginx

反向代理:配置好了自动转发网络请求

正向代理:要指定转发后的目标

  • 负载均衡:

    upstream(后端服务组)

  • 负载均衡:根据实际连接的错误数量

    网关

Docker

容器管理

  • docker compose:多个容器编排
  • dockerfile:定义怎么构建容器

蓝绿发布

  • 部署双服务,新服没问题的时候通过nginx和dns切换

BFF层

为不同的前端层适配具体的后端

Git

版本控制

分布式管理:多人修改智能合并检测冲突

去中心:每个电脑都有存档

ci/cd

自动构建/部署

RPC

http协议,实现的远程调用函数协议,强调函数

cros

  • cros响应头
  • 后端代理
  • nginx反向代理
  • 改浏览器参数,关闭这个

计算机性能优化

  • 微服务架构:所有前端页面设计为无状态服务,部署在多台服务器上
  • 数据分库
  • 读写分离:设计数据库多重架构
  • 热点缓存:利用Redis这种将热点数据缓存到内容中实现快速读写,cdn缓存
  • 消息队列
  • 事件驱动:类似于钩子
  • 异步+等待动画
  • dns负载均衡
  • 流量转发
  • nginx负载均衡

Restful api

http协议,利用请求协议和状态码表达语义,强调资料

TCP

syn丢失

服务端没响应或丢失syn,客户端会重发

大量重连高并发下会导致雪崩效应

Nodejs

中间件的原理是什么

洋葱模型,可以利用next语法提前执行后面的中间件

Nextjs

文件路由机制

  • App Router:新
  • Pages Router :旧

sql

流程

链接/权限-> 语法解析/检测 - >优化器 ->执行器 ->返回

行:具体的数据,单向链表

页:双向链接,记录了最大值和最小值

叶子节点:叶子的末端,实际储存了数据

非叶子节点:非叶子节点,存储后面的地址

聚集索引:索引和数据一块

非聚集索引:索引和数据分开

联合索引:最左前缀原则,中间不能跳过,(a,b,c)可以a或a+b,不能b或a+c;创建索引虽然读快了,但是写入会因为维护索引变慢

视图:创建了虚拟表格,包装了查询命令,实际没有优化性呢

子查询:操作语句嵌套一个查询语句

链接:把多个表关联起来

慢日志:记录了超过执行时间的SQL语句的日志

子查询:数据库子查询就是通过 in 语法实现先查询一遍,再用查询的数据作为当前数据查询的限制条件

数据库缓存:数据库缓存缓存的是 sql 语句,redis 缓存的是业务数据命中率更高更好把控

索引

b树:分层索引结构,通过比较分层,每层节点既存了数据,也存了下一层的索引

b+树:动态平衡分层,非叶子节点不存储数据,所有叶子位于同一层,自动平衡

红黑树:是二叉树,通过动态调整维持数的大致平衡

hash索引:hash计算直接定位

事务

保证了多条SQL语句的一致性,修改前会先把修改记录和数据 记录进undolog,如果需要回滚,通过undolog回滚

四大特性

  • 原子性:要不全成功要不全失败

  • 持久性:磁盘储存

  • 隔离性:类似git的分支和快照,不影响真正的数据

  • 一致性:其他三个保证这个

    隔离级别

  • 读未提交:会读取其他事务改未提交,回滚导致数据不一致

  • 读已提交:会读取最新数据,会多次更新,导致一个事务内的数据不一致

  • 可重复读:innerdb默认,同一个事务内读的时候是基于undolog的快照读到的一致性

  • 串行读:强制事务顺序执行

Redis

传统数据都是储存在硬盘中的,所以速度处理较慢,Redis是储存在内存中的,所以说读写速度快,可以同时处理更多的数据,它也提供了快照和追加日志两种持续性机制

缓存雪崩:加随机tts,避免大量缓存同时失效

一致性:用缓存肯定要接受一部分的误差,用TTS可以保证一个合理的误差

布隆过滤器:预热一遍,将数据利用三种 hash 算法算出n个不同的数,取余,将数组的对应位置标记为 1,如果数组够长,误判概率就会下降

Supabase

提供了数据库和边缘函数,通过rls实现行级安全策略,每次访问数据时,会自动校验身份信息(JWT),Supabase会将校验好的用户身份传递给postgresql,(RLS)权限校验,在数据库层面校验某个用户可以对哪些数据进行哪些操作

rust

堆栈

栈:后进先出,所有数据都有固定大小和固定,编译器自动管理

堆:在堆区找到一块区域,把它标记为已使用,并返回该区域地址,需要手动管理

数据类型

  • 数字

  • 字符和字符串

  • 布尔

  • 占位符()

  • 数组类型

    类型可变长度同一类型
    array
    vec
    Tuple
  • kv类型

    • hashmap
  • 函数

  • 结构体

  • 枚举

  • 迭代器:有点像数组,链式组合只能一个一个取出来

  • 泛型:其他任意的一种数据类型,在rust中可以施加约束

特征

鸭子接口的感觉

Trait:可以定义它有什么特征,比如定义生物会呼吸 impl:实现具体特征,比如一些是靠的肺,一些是靠的腮,一些是靠的皮肤

孤儿规则不能为外部的库实现特征

不过可以用一个结构体包装,绕过这个规则

RUST生命周期

类似于作用域,决定了他活多久,不标注可以默认推断,也可以通过标注显示告诉编译器不同引用的约

所有权

  • 一个变量(堆数据)只有一个所有者
  • 离开了作用域,就会被丢弃

借用

变量默认不可变

  • 可变引用:只能一个,可以修改
  • 不可变引用:可以多个只读

模式匹配

  • If-else
  • match

错误处理

  • panic:直接终结整个程序
  • option:这个数据结构只会返回数据或空
  • result:这个数据结构返回正确或错误

智能指针

  • Box<T>:Rust流行的智能指针可以分配堆对象
  • Rc<T>Arc<T>:两者都是实现引用技术,后者具有原子性
  • cell<T>Recell<T>:保持数据的可变性,把借用检查推从编译期迟到了运行期,前者只能用于栈的简单变量,后者一般用于堆的复杂变量

其他

  • 变量解构:可以把数组,字典这种类型的变量一个表达式赋值到多个变量
  • 变量遮蔽:后面的变量会把前面相同的变量名覆盖
  • 忽略变量:前面加一个短横线代表不使用

Agent应用

Transformer

分词:根据词典

权重:

训练学习出来的

一开始随机数

反向传播:计算本次要变化的方向(类似于多了就减少,少了就增多)

梯度下降:应用反向传播的计算的的方向

每个词和另外的词有多种权重

graph LR
    A[分词] --> B[词嵌入
  每个词的向量]
    B --> C[位置编码
  调整向量,类似于增加点随机数]
    C --> D[多头注意力]
    subgraph D [多头注意力]
        D1[将分词按照多种关系
  权重多次分别计算]
    end
    D --> E[残差+归一化<
  把前面的多种权重结果
    按照算法修正为一个]
    E --> F[前馈网络
  升维降维,类似于
    中译英译中]
    F --> G[输出]
    A[分词] --> B[词嵌入
  每个词的向量]
    B --> C[位置编码
  调整向量,类似于增加点随机数]
    C --> D[多头注意力]
    subgraph D [多头注意力盒子]
        D1[将分词按照多种关系
  权重多次分别计算]
    end
    D --> E[残差+归一化
  把前面的多种权重结果
    按照算法修正为一个]
    E --> F[前馈网络
  升维降维
  类似于中译英译中]
    F --> G[输出]

rag

加上外部知识库先检索

ReAct 模式

思考+行动交替执行

Function Calling / Tool Use

工具函数不同平台名称不同

MCP

一套ai上下文协议

Embedding

将数据向量的过程

skill

提示词+可选脚本

workflow

有点像命令式编程,定义了一套工作流程

如何降低首字节

  • 缓存
  • 多个LLM并发返回最先返回的
  • 通过服务器组件构成比较快的网络服务,减少QOS的影响
  • 流式回复

如何评估Agent的效果

任务的成功率和Agent的幻觉率

Linux

如何检测网络问题

查看现在带宽使用情况

cpu使用情况

dns配置

Vibecoding

在建立好文档库

  • 项目技术选型
  • 功能模块
  • 功能实现决策

在agents.md写好项目级的Agent约束和行为规范

  1. 需求对齐和约束

    • 功能需求
    • 性能
    • 可扩展性
    • 持久性
    • 成本
    • 根据已有架构和用户,实现的风险分析
    • 时间
    • 异常处理
    • 安全
    • 验收标准
  2. 确定架构选择和技术选型和接口功能等具体细节

  3. 设计接口,写测试用例

  4. 实现代码和检测

    • 代码规范检测
    • 类型检测
    • 单元检测(写好的单个模块测试)
    • 集成检测(多个模块联动测试)
    • E2E 测试(用自动化工具运,提前写好用户操作路径的检测)
  5. 新Agent 代码审查+探测测试(可能能找到一些,异常问题)

  6. 代码格式化

  7. 人工代码审查+复测

  8. 部署验证

  9. 人工复测

GO

基础类型

  • 数组:固定长度

  • 切片:固定长度的数组

  • 结构体 *结构体标签:在类型后面添加的字符串,键值对形式用空格分割;用于 json 或 sql 执行器等知道在某些情况的用法

GMP

Goroutine:go语言的最小执行单元

Machine:操作系统线程

Processor:调度器,有单独的调度器和全局调度器

是go语言实现的一套更轻量的线程管理器,实现线程复用

同一时刻 M和P 一一对应,一个M只执行一个G

G的切换策略 : 时间过长,阻塞状态,主动让出

P在某个M阻塞的时候,P会被摘下来绑定其他M

M的G获取顺序

  1. 绑定的队列

  2. 全局队列

  3. 其他队列偷一半

  4. 休眠

原子操作

所有操作必须同时成功或失败

单个操作安全规则

信道

进程内通信,可以通过包级(全局)变量通信

异常

panic:终止整个重新

recover:捕获异常

Defer

延迟执行队列后进先出

Context

链式的生命周期管理器

GC

碎片:内存不连续出现的内存碎片

SWT:暂停程序运行

GC都需要在暂停程序运行时

  • 标记清除

标记存活对象,将未标记对象清理,可能产生碎片

  • 标记整理

标记存活对象,将存活对象压缩到一块区域(在同一块内存),清理未标记对象

  • 标记复制

标记存活对象,将存活对象复制到另一块内存,释放整个旧区域

屏障技术:更新已经扫描过的变化

三色标记:不断检查保证都是黑色

  • 白色:对象未被 检查

  • 灰色:已经发现,引用未被检查完

  • 黑色:检查完了