Skip to content

全栈工程师能力清单

作为全栈工程师,真正重要的不是“前端会一点、后端会一点”,而是能把一个真实业务功能从需求理解、页面交互、接口设计、数据存储、部署上线到线上排障完整闭环。

能力全景

全栈能力成长路线

基础能力语言、数据结构、网络、浏览器、Linux
->
业务开发前端体验、后端接口、数据库、缓存
->
工程交付测试、CI/CD、Docker、监控、日志
->
系统能力架构、安全、性能、稳定性、成本
->
产品思维需求拆解、沟通、取舍、复盘

1. 计算机基础

需要掌握:

  • 数据结构:数组、链表、栈、队列、哈希表、树、图。
  • 算法思维:排序、查找、递归、双指针、滑动窗口、动态规划基础。
  • 操作系统:进程、线程、内存、文件、I/O。
  • 网络:HTTP、HTTPS、TCP、DNS、WebSocket。
  • Linux:常用命令、进程查看、日志排查、权限、环境变量。

为什么重要:

项目出问题时,很多根因不在框架层,而在网络、并发、内存、I/O 或系统配置。全栈工程师要能跨层排查。

面试场景:

用户说页面偶尔打不开,你不能只看前端代码,还要能想到 DNS、网关、服务状态、接口超时、浏览器缓存和发布配置。

2. 前端工程能力

需要掌握:

  • HTML 语义化和可访问性。
  • CSS 布局、响应式、主题、动画基础。
  • JavaScript / TypeScript。
  • Vue、React 至少精通一个,熟悉另一个。
  • 状态管理、路由、表单、组件设计。
  • 前端性能优化和错误监控。
  • 构建工具:Vite、Webpack 基础。

项目能力:

  • 能设计可复用组件。
  • 能处理复杂表单和权限页面。
  • 能优化首屏、列表和交互卡顿。
  • 能处理 loading、empty、error、fallback 状态。
  • 能让页面在移动端和桌面端都可用。

面试场景:

一个后台表格页面支持筛选、分页、导出、批量操作、权限按钮,你要能讲清楚组件拆分、接口参数、状态管理和异常处理。

3. 后端 API 能力

需要掌握:

  • RESTful API 设计。
  • 请求参数校验。
  • 统一错误码。
  • 鉴权和授权。
  • 幂等设计。
  • 日志和 requestId。
  • 文件上传。
  • 异步任务和消息队列。
  • Node.js、Java、Go、Python 至少熟悉一门后端语言生态。

项目能力:

  • 能设计清晰的接口。
  • 能处理重复提交、接口超时、并发冲突。
  • 能把业务错误和系统错误区分清楚。
  • 能写出便于前端使用和排查的问题返回。

面试场景:

设计一个创建订单接口,你要考虑参数校验、库存扣减、事务、支付状态、重复提交、超时重试和日志追踪。

4. 数据库与缓存能力

需要掌握:

  • SQL 基础和表设计。
  • 索引、事务、锁、隔离级别。
  • 慢查询排查。
  • Redis 常见数据结构。
  • 缓存穿透、击穿、雪崩。
  • 数据迁移和备份。
  • 读写分离、分库分表基础概念。

项目能力:

  • 能根据业务设计表结构。
  • 能根据查询场景设计索引。
  • 能用缓存提升性能,但知道一致性风险。
  • 能排查慢 SQL 和连接池问题。

面试场景:

订单列表越来越慢,你要能从查询条件、索引、分页、返回字段、缓存和归档策略一起分析。

5. 网络与安全能力

需要掌握:

  • HTTPS 和 TLS 基础。
  • Cookie、Session、JWT。
  • CORS。
  • XSS、CSRF、SQL 注入。
  • 文件上传安全。
  • 密码加密存储。
  • 权限模型:RBAC、ABAC。
  • 限流、防刷、审计日志。

项目能力:

  • 能设计安全的登录态。
  • 能区分前端权限和后端权限。
  • 能处理敏感数据和日志脱敏。
  • 能识别高风险接口。

面试场景:

一个管理后台有管理员、运营、普通用户三种角色。你要能说明菜单权限、按钮权限、接口权限和数据权限分别怎么做。

6. DevOps 与部署能力

需要掌握:

  • Git 分支协作。
  • CI/CD 流程。
  • Docker 基础。
  • Nginx 反向代理和静态资源部署。
  • 环境变量和配置管理。
  • 日志收集。
  • 健康检查。
  • 灰度发布和回滚。
  • 云服务基础:对象存储、CDN、数据库、缓存、负载均衡。

项目能力:

  • 能把项目部署到线上。
  • 能区分开发、测试、生产环境。
  • 能处理发布失败、配置错误和回滚。
  • 能看日志定位问题。

面试场景:

新版本上线后部分用户白屏,你要能想到前端资源缓存、CDN、构建产物、环境变量、接口兼容和回滚策略。

7. 测试与质量保障

需要掌握:

  • 单元测试。
  • 组件测试。
  • 接口测试。
  • E2E 测试。
  • Mock 数据。
  • Code Review。
  • 静态检查:ESLint、TypeScript。
  • 回归测试清单。

项目能力:

  • 能判断哪些地方必须测。
  • 能为核心业务补自动化测试。
  • 能用类型和规范减少低级错误。
  • 能上线前整理风险点。

面试场景:

支付、登录、权限、订单状态流转这类核心功能,不能只靠手点测试,要有接口测试、边界测试和回归用例。

8. 可观测性和排障能力

需要掌握:

  • 前端错误监控。
  • 后端日志。
  • requestId 链路追踪。
  • 指标监控:QPS、错误率、延迟。
  • 慢查询日志。
  • 告警策略。
  • 事故复盘。

项目能力:

  • 能知道线上系统现在是否健康。
  • 能从用户反馈定位到具体请求。
  • 能把问题从前端、网关、后端、数据库一路串起来。
  • 能复盘并补监控、测试或降级。

面试场景:

用户说“刚才提交失败了”,你要能通过用户 ID、时间、requestId、前端日志、后端日志找到失败原因。

9. 系统设计和架构思维

需要掌握:

  • 单体和微服务。
  • 同步和异步。
  • 消息队列。
  • 缓存策略。
  • 限流降级。
  • 数据一致性。
  • 高可用。
  • 扩展性。
  • 成本控制。

项目能力:

  • 能先做简单可落地的方案。
  • 能知道什么时候需要拆服务、加缓存、加队列。
  • 能说明架构取舍,而不是盲目堆技术。

面试场景:

设计一个通知系统,你要能讲清楚站内信、邮件、短信、队列、失败重试、用户订阅、频率限制和监控。

10. AI 时代的全栈能力

需要掌握:

  • LLM API 调用。
  • Prompt 设计。
  • Function Calling / Tool Calling。
  • RAG 基础。
  • 向量数据库。
  • AI 成本和 token 管理。
  • AI 输出安全。
  • 流式输出体验。
  • AI 功能评估。

项目能力:

  • 能把 AI 能力接入现有业务。
  • 能设计流式对话体验。
  • 能处理 AI 失败、超时、幻觉和降级。
  • 能用 AI 提升开发效率,但不盲目信任输出。

面试场景:

给客服系统加一个 AI 助手,你要能说明知识库如何接入、权限怎么隔离、低置信度怎么转人工、回答如何引用来源、成本如何控制。

11. 产品和沟通能力

需要掌握:

  • 需求澄清。
  • 任务拆分。
  • 优先级判断。
  • 技术方案表达。
  • 风险提前暴露。
  • 和产品、设计、测试、后端沟通。
  • 写文档和复盘。

项目能力:

  • 能把模糊需求拆成可开发任务。
  • 能主动发现边界情况。
  • 能在质量、速度和复杂度之间做取舍。
  • 能解释技术方案对业务的影响。

面试场景:

产品说“做一个简单的导出功能”,你要追问数据量、权限、字段、格式、是否异步、是否需要下载记录,而不是直接开写。

12. 推荐学习顺序

如果现在基础还不稳,可以按这个顺序:

  1. JavaScript / TypeScript
  2. Vue 或 React
  3. HTTP、浏览器、前端工程化
  4. Node.js 或一门后端语言
  5. SQL、Redis、接口设计
  6. 登录鉴权、安全基础
  7. Docker、Nginx、CI/CD
  8. 日志、监控、线上排障
  9. 系统设计
  10. AI 应用开发

如果已经能做业务项目,可以按这个顺序提升:

  1. 补数据库和缓存深度。
  2. 补网络和安全。
  3. 补部署和监控。
  4. 补系统设计。
  5. 补真实项目复盘表达。
  6. 把 AI 能力接入自己的项目。

13. 面试自检清单

面试前问自己:

  • 我能不能从 0 到 1 做一个登录系统?
  • 我能不能设计一个列表查询并优化性能?
  • 我能不能解释一次线上故障怎么排查?
  • 我能不能设计一个上传大文件功能?
  • 我能不能讲清楚 JWT、Cookie、Session 的取舍?
  • 我能不能说明 SQL 索引为什么没命中?
  • 我能不能部署一个前后端项目?
  • 我能不能给项目加日志、监控和告警?
  • 我能不能把一个需求拆成前端、后端、数据库任务?
  • 我能不能讲一个真实项目中的技术难点?

如果这些问题都能用项目例子讲清楚,全栈面试会稳很多。

14. 按能力模块整理的高频面试问题与参考答案

这一节可以当作面试前的快速自测。每个问题下面都配了参考答案,复习时建议先遮住答案自己说一遍,再对照补充项目经历。

计算机基础

从浏览器输入 URL 到页面展示,中间发生了什么?

浏览器先解析 URL,查 DNS 得到服务器 IP,然后建立 TCP 连接。HTTPS 会多一步 TLS 握手。接着浏览器发送 HTTP 请求,服务端返回 HTML、CSS、JS 等资源。浏览器解析 HTML 生成 DOM,解析 CSS 生成 CSSOM,执行 JS,最后布局、绘制并展示页面。

项目里排查白屏时,我会按 DNS、证书、静态资源、JS 报错、接口失败和路由配置逐层看。

TCP 三次握手和四次挥手分别解决什么问题?

三次握手用于建立可靠连接,确认双方发送和接收能力都正常。四次挥手用于安全关闭连接,因为 TCP 是全双工通信,双方都要分别关闭发送通道。

面试里不必死背报文名,但要说清楚:握手是建立连接,挥手是释放连接。

HTTP、HTTPS、WebSocket 分别适合什么场景?

HTTP 适合普通请求响应,例如查询列表、提交表单。HTTPS 在 HTTP 上增加 TLS 加密和身份校验,生产环境基本都应该使用。WebSocket 适合双向实时通信,例如聊天、协作编辑、实时通知、监控面板。

普通业务接口用 HTTPS,实时推送再考虑 WebSocket。

进程和线程有什么区别?

进程是资源分配的基本单位,线程是 CPU 调度的基本单位。一个进程可以包含多个线程,线程共享进程内存。进程隔离性更好,线程通信更方便,但线程共享数据时更容易出现并发问题。

后端服务排查 CPU、内存、线程池和连接池问题时,这些概念很有用。

什么是阻塞 I/O 和非阻塞 I/O?

阻塞 I/O 是操作没有完成前,当前线程会一直等待。非阻塞 I/O 是操作不能立即完成时先返回,程序可以继续做别的事,再通过轮询、事件通知或回调处理结果。

Node.js 常见优势就是事件驱动和非阻塞 I/O,适合高并发 I/O 密集型场景。

你在项目里用过哪些 Linux 命令排查问题?

常用命令包括 top 看资源占用,ps 看进程,lsof -i :port 看端口,tail -f 看日志,greprg 搜日志,curl 测接口,df -h 看磁盘,free -m 看内存。

回答时最好结合真实场景,比如用 tail -f 和 requestId 查一次接口报错。

如何查看一个服务是否正在监听某个端口?

可以用 lsof -i :5173netstatss 查看端口监听情况。还可以用 curl http://127.0.0.1:port/health 看服务是否真的响应。

只看到进程还不够,还要确认端口、健康检查和日志都正常。

递归和迭代有什么区别?什么时候递归会有风险?

递归是函数调用自己,适合树结构、分治问题。迭代通常通过循环完成。递归代码更直观,但层级太深可能导致栈溢出,也可能有重复计算问题。

处理深层菜单、树形权限、评论楼层时,要注意递归深度和性能。

哈希表为什么查询快?会有什么冲突问题?

哈希表通过哈希函数把 key 映射到数组位置,理想情况下查询接近 O(1)。冲突是不同 key 映射到同一个位置,常见解决方式有链地址法和开放寻址。

前端对象、Map,后端缓存 key,本质上都能看到哈希思想。

如何分析一个接口偶尔超时,是网络问题还是服务问题?

先看调用链路:前端请求耗时、网关日志、后端接口日志、数据库慢查询、缓存、第三方服务。再看是否有 requestId 串起来。如果服务端处理时间短但前端耗时长,可能是网络或网关;如果后端日志显示处理慢,就继续查 SQL、锁、连接池、CPU 和第三方接口。

前端工程

如何设计一个可复用的表格组件?

表格组件应该抽象列配置、数据源、分页、排序、筛选、loading、empty、错误状态、批量选择和操作列。业务差异通过插槽或 render 函数扩展,组件内部不要绑定具体业务接口。

好的边界是:通用表格管展示和交互,业务页面管请求和业务动作。

一个页面首屏加载很慢,你会怎么排查?

先用 Network 和 Performance 判断瓶颈,是资源下载慢、JS 执行慢、接口慢还是渲染慢。资源慢就拆包、压缩、CDN、图片懒加载;JS 慢就减少首屏依赖和长任务;接口慢就并行请求、缓存或接口优化。

优化后要看 LCP、JS 包体积、接口耗时和白屏时间。

大列表渲染卡顿,你会怎么优化?

优先减少 DOM 数量,比如分页、虚拟列表、懒加载。其次减少列表项复杂度,避免在渲染中做复杂计算,保持 key 稳定,避免给子组件传不稳定对象或函数。

如果一次渲染几千条数据,虚拟列表通常最有效。

防抖和节流有什么区别?在项目中分别用在哪里?

防抖是连续触发后只执行最后一次,适合搜索框输入、表单校验、窗口 resize。节流是固定时间内最多执行一次,适合滚动、拖拽、按钮频繁点击。

搜索联想用防抖,滚动加载更多用节流。

如何处理前端权限路由和按钮权限?

登录后拉取用户信息和权限,根据权限生成菜单和动态路由。按钮可以通过权限组件或指令控制展示。但前端权限只负责体验,接口权限和数据权限必须后端校验。

刷新页面后要能重新恢复权限路由,这是面试常见追问点。

如何设计一个复杂表单,包括联动、校验、回显和提交?

我会按业务区块拆分表单状态,把联动逻辑放到 computed、watch 或独立 Hook/composable 中。校验规则集中管理,接口回显时做字段映射,提交前做格式转换和重复提交保护。

复杂表单最重要的是规则可维护,不要把所有逻辑堆进模板。

前端如何统一处理 loading、empty、error 状态?

可以为请求封装统一状态,也可以在页面层约定数据状态。列表页通常有 loading、empty、error、success 四种状态。错误状态要提供重试,空状态要告诉用户下一步能做什么。

这类细节能体现工程成熟度。

如何做前端错误监控和错误上报?

要捕获 JS 运行时错误、Promise 未处理错误、资源加载失败、接口异常和框架错误边界。上报内容包括页面 URL、用户信息、时间、错误栈、浏览器、版本号和 requestId。

不能记录敏感信息,例如 token、密码、身份证。

TypeScript 在项目中解决了哪些真实问题?

TypeScript 可以提前发现字段名错误、接口类型变化、组件 props 使用错误和重构影响范围。它对多人协作和大型项目很有帮助。

回答时可以举例:接口字段从 name 改成 username,类型能帮你定位所有影响点。

Vite 和 Webpack 的主要区别是什么?你更关注哪些构建指标?

Vite 开发环境利用原生 ESM,启动和热更新更快;生产构建通常基于 Rollup。Webpack 更成熟,生态和复杂配置能力强。关注指标包括 dev 启动速度、HMR 速度、产物体积、chunk 拆分、构建时间和首屏加载。

后端与 API

如何设计一个 RESTful API?

用资源表达路径,用 HTTP 方法表达动作。比如 GET /users 查询用户列表,POST /users 创建用户,PATCH /users/:id 更新用户,DELETE /users/:id 删除用户。还要有统一鉴权、参数校验、错误码和日志。

RESTful 的重点是语义清晰、稳定、可维护。

GET、POST、PUT、PATCH、DELETE 如何区分?

GET 查询资源,POST 创建或提交动作,PUT 通常整体替换资源,PATCH 局部更新资源,DELETE 删除资源。GET 不应该产生副作用,POST 可能产生副作用。

不要简单说 POST 比 GET 安全,没有 HTTPS 时都可能被窃听。

如何设计统一错误码?

错误返回建议包含 codemessagedetailsrequestIdcode 给程序判断,message 给用户或开发者看,requestId 用来查日志。

不要所有错误都返回 200,也不要只返回字符串。

如何设计登录接口和刷新 token 机制?

登录接口校验账号密码,密码要哈希比对。登录成功返回短期 access token 和长期 refresh token。access token 过期后,用 refresh token 换新 token。退出登录或风险发生时,refresh token 要能失效。

敏感场景还要有登录失败限流和审计日志。

JWT、Session、Cookie 怎么选?

Session 是服务端保存会话,客户端用 Cookie 存 session id,适合传统 Web。JWT 自包含,适合前后端分离和分布式,但主动失效更麻烦。Cookie 是浏览器存储和自动携带机制,可以配置 HttpOnlySecureSameSite

项目里常见方案是短期 access token + refresh token。

如何保证创建订单接口的幂等性?

可以使用幂等 key、唯一索引、订单状态机和事务。客户端提交时带 idempotencyKey,后端先检查这个 key 是否处理过,处理过就返回已有结果。

前端禁用按钮只能改善体验,后端幂等才是兜底。

如何防止重复提交?

前端按钮 loading 时禁用,后端使用幂等 key、唯一约束、状态判断或分布式锁。支付、下单、审批这类场景一定要后端兜底。

文件上传接口怎么设计?大文件怎么办?

小文件可以直接上传。大文件用分片上传、断点续传、失败重试、上传进度、文件 hash 校验。后端或对象存储负责合并分片,并保存文件 metadata。

还要校验文件类型、大小、权限和安全风险。

接口超时你会怎么处理?

先看是客户端超时、网关超时、服务处理慢还是第三方接口慢。对耗时任务可以改异步任务,先返回任务 ID,再轮询或推送结果。服务端要排查慢 SQL、锁等待、连接池、线程池和外部依赖。

如何设计接口日志,方便线上排查?

日志至少记录 requestId、用户 ID、接口路径、方法、状态码、耗时、错误栈和关键业务 ID。敏感信息要脱敏。前端、网关、后端最好都带同一个 requestId。

数据库与缓存

如何设计用户表、订单表、评论表?

用户表关注账号、密码哈希、状态、角色、创建时间。订单表关注订单号、用户、金额、状态、支付状态、创建时间和更新时间。评论表关注文章或资源 ID、用户 ID、内容、父评论 ID、状态和时间。

表设计要考虑查询场景、唯一约束、索引和软删除。

索引是什么?哪些字段适合建索引?

索引用来加速查询,本质是额外数据结构。适合高频 where、join、order by 字段,例如用户 ID、订单号、状态、创建时间。索引会增加写入和存储成本,不是越多越好。

为什么索引会失效?

常见原因包括对索引字段使用函数、隐式类型转换、前置模糊查询、联合索引不满足最左前缀、返回数据量太大、条件选择性差等。

排查时用 EXPLAIN 看执行计划。

事务 ACID 是什么?

ACID 是原子性、一致性、隔离性、持久性。原子性保证一组操作要么都成功要么都失败;一致性保证数据状态正确;隔离性处理并发事务影响;持久性保证提交后数据不会丢。

下单、转账、库存扣减都需要认真设计事务。

事务隔离级别有哪些?分别解决什么问题?

常见隔离级别有 Read Uncommitted、Read Committed、Repeatable Read、Serializable。隔离级别越高,一致性越强,并发性能可能越低。它们主要处理脏读、不可重复读和幻读。

慢 SQL 怎么排查?

先看慢查询日志,再用 EXPLAIN 看执行计划。检查索引是否命中、扫描行数是否过大、是否排序或临时表、是否锁等待、返回字段是否过多。必要时优化索引、改写 SQL、分页、归档或加缓存。

Redis 常见数据结构有哪些?分别适合什么场景?

String 适合缓存和计数器,Hash 适合对象字段,List 适合简单队列,Set 适合去重,Sorted Set 适合排行榜,Bitmap 适合签到,HyperLogLog 适合 UV 估算。

缓存穿透、击穿、雪崩是什么?怎么解决?

穿透是查询不存在数据,解决方式是缓存空值、布隆过滤器、参数校验。击穿是热点 key 过期,大量请求打到数据库,解决方式是互斥锁、热点 key 不过期、提前刷新。雪崩是大量 key 同时失效,解决方式是过期时间加随机值、多级缓存、限流降级。

缓存和数据库如何保证一致性?

常见做法是先更新数据库,再删除缓存,并设置过期时间兜底。大多数业务接受最终一致性。强一致场景要谨慎使用缓存,或走数据库事务和明确的同步机制。

分页查询数据量很大时,offset 分页有什么问题?

offset 越大,数据库需要跳过的数据越多,性能越差。数据实时变化时还可能出现重复或漏数据。大数据量或无限滚动更适合 cursor 分页。

网络与安全

什么是跨域?CORS 怎么配置?

协议、域名、端口任意不同就是不同源。浏览器同源策略会限制跨域请求。CORS 由服务端设置响应头,比如 Access-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-Headers

生产环境不要随意设置 *,尤其是带凭证请求。

XSS 是什么?项目里怎么防?

XSS 是恶意脚本注入页面并执行。防护方式包括输出转义、避免渲染不可信 HTML、设置 CSP、Cookie 使用 HttpOnly、过滤用户输入。

框架插值通常会转义,但 v-htmldangerouslySetInnerHTML 要特别谨慎。

CSRF 是什么?项目里怎么防?

CSRF 是攻击者诱导用户浏览器带着登录态向目标网站发请求。防护方式包括 CSRF Token、SameSite Cookie、校验 Origin / Referer、关键操作二次确认。

SQL 注入是什么?怎么防?

SQL 注入是把恶意 SQL 拼进查询语句。防护方式是参数化查询、ORM 参数绑定、输入校验、最小权限账号和隐藏数据库错误细节。

HTTPS 为什么安全?TLS 大概做了什么?

HTTPS 通过 TLS 提供加密传输、身份认证和完整性校验。TLS 会协商密钥,验证证书,之后使用对称加密传输数据。

HttpOnly 防止 JS 读取 Cookie,降低 XSS 窃取风险。Secure 只允许 HTTPS 发送。SameSite 限制跨站请求携带 Cookie,降低 CSRF 风险。

密码为什么不能明文存储?应该怎么存?

明文存储一旦数据库泄露,用户密码全部暴露。应该使用安全哈希算法加盐存储,例如 bcrypt、scrypt、Argon2。登录时比对哈希,不需要解密。

如何设计 RBAC 权限模型?

RBAC 包括用户、角色、权限。用户绑定角色,角色绑定权限。权限可以分菜单、按钮、接口、数据范围。前端控制展示,后端控制真实访问。

如何做接口限流和防刷?

可以按 IP、用户 ID、接口、API key 维度限流。算法包括固定窗口、滑动窗口、令牌桶、漏桶。登录、短信、搜索、AI 调用都需要考虑限流。

文件上传有哪些安全风险?

风险包括上传脚本文件、伪造 MIME、超大文件打爆存储、病毒文件、公开访问私有文件。要做类型校验、大小限制、权限控制、随机文件名、私有桶、扫描和下载鉴权。

DevOps 与部署

一个前后端项目如何部署到生产环境?

前端构建静态资源,部署到 Nginx、CDN 或对象存储。后端构建镜像或产物,部署到服务器或容器平台。配置环境变量,连接数据库和缓存,配置反向代理、HTTPS、日志、监控和健康检查。

Nginx 在项目中一般做什么?

Nginx 可托管静态资源、反向代理、负载均衡、HTTPS 终止、gzip 压缩、缓存、路由 fallback。前端 history 路由刷新 404,通常需要 fallback 到 index.html

Docker 解决了什么问题?

Docker 把应用和运行环境打包,减少环境不一致问题,方便部署、扩容、回滚和迁移。

Dockerfile 如何减小镜像体积?

使用更小基础镜像,多阶段构建,只复制必要文件,清理缓存,合理利用 layer,不把源码、测试文件和密钥放进生产镜像。

环境变量应该如何管理?

不同环境使用不同配置,敏感信息不要写进代码或提交 Git。生产环境密钥应由部署平台、密钥管理服务或环境变量注入。

CI/CD 一般包含哪些步骤?

拉代码、安装依赖、静态检查、测试、构建、生成产物、部署、健康检查、通知。生产可能还需要审批、灰度和回滚。

什么是蓝绿部署、灰度发布和回滚?

蓝绿部署是两套环境切流量,回滚快但资源成本高。灰度是让一部分用户先用新版本,逐步放量。回滚是恢复到上一个稳定版本。

生产发布后白屏,你会怎么排查?

看控制台错误、资源 404、CDN 缓存、构建产物、环境变量、路由 fallback、接口跨域、版本兼容。如果影响大,先回滚或切旧版本。

如何区分开发、测试、预发、生产环境?

不同环境有不同域名、数据库、配置、日志级别和权限。预发应尽量接近生产。生产环境权限最严格,数据最敏感。

如何设计健康检查接口?

健康检查接口应快速返回服务是否可用,可以检查应用进程、数据库、缓存和关键依赖。也要区分存活检查和就绪检查,避免服务未准备好就接流量。

测试与质量

哪些功能必须写自动化测试?

登录、支付、权限、订单状态流转、核心表单、数据迁移、关键接口都应该优先测试。普通展示页可以少测,核心链路必须保证。

单元测试、集成测试、E2E 测试有什么区别?

单元测试测单个函数或组件,集成测试测多个模块协作,E2E 测完整用户流程。核心业务通常三者结合。

如何测试登录、支付、权限这类核心功能?

要覆盖成功、失败、边界、过期、无权限、重复提交、异常回调等场景。支付还要测试幂等、回调重试和状态流转。

Mock 数据在前后端协作中有什么作用?

Mock 可以让前端在后端接口未完成时先开发,也可以稳定测试异常状态。最终仍要和真实接口联调。

Code Review 主要看什么?

看需求是否实现、逻辑是否正确、边界情况、错误处理、安全风险、性能问题、可读性、测试和是否影响其他模块。

如何防止线上回归问题?

建立回归测试清单,核心链路自动化测试,CI 中跑 lint 和测试,灰度发布,监控错误率,发布后观察指标。

TypeScript、ESLint、Prettier 分别解决什么问题?

TypeScript 解决类型和重构安全,ESLint 解决代码规范和潜在错误,Prettier 解决格式统一。

你如何保证重构后的功能没有被破坏?

先补测试和用例,确认重构范围,逐步替换,保持外部接口不变,跑自动化测试和回归测试,必要时灰度发布。

如何设计回归测试清单?

按核心业务流程、历史 bug、高风险模块、权限角色、浏览器或设备、异常场景整理。每次发布根据影响范围选择执行。

如何衡量一个项目的代码质量?

可以看可读性、模块边界、重复度、测试覆盖、类型安全、错误处理、性能、可维护性、线上故障率和新人接手成本。

可观测性和排障

用户反馈“页面打不开”,你怎么排查?

先确认用户、时间、页面 URL、设备和网络。看前端资源是否加载、控制台是否报错、接口是否失败、网关和后端是否正常、是否是发布或 CDN 缓存问题。

用户反馈“提交失败”,你怎么定位是哪一层出问题?

拿用户 ID、时间和 requestId 查前端日志、接口请求、后端日志和数据库。判断是参数校验、鉴权、业务错误、服务异常还是第三方接口失败。

什么是 requestId?为什么重要?

requestId 是一次请求的唯一标识,可以串联前端、网关、后端和数据库日志。没有它,线上问题排查会很困难。

前端错误日志应该记录哪些信息?

记录错误信息、堆栈、页面 URL、用户 ID、浏览器、设备、版本号、时间、接口 requestId。敏感信息要脱敏。

后端日志应该记录哪些信息?

记录 requestId、用户 ID、接口路径、方法、状态码、耗时、业务 ID、错误栈、依赖调用耗时。不要记录密码和 token。

如何监控接口错误率和延迟?

按接口统计 QPS、错误率、平均耗时、P95/P99 延迟。设置阈值告警,结合日志和 trace 定位问题。

如何排查内存上涨或服务重启?

看监控曲线、进程日志、GC、内存快照、最近发布、流量变化和是否有对象未释放。服务重启还要看 OOM、健康检查和容器事件。

如何排查数据库连接池耗尽?

看连接池配置、慢查询、事务是否未释放、连接是否泄露、并发量是否突增。要记录 SQL 耗时并确保连接 finally 释放。

如何做线上事故复盘?

复盘包括时间线、影响范围、根因、处理过程、恢复方式、暴露的问题和后续改进。重点不是追责,而是补监控、测试、流程和预案。

线上问题应该先定位根因还是先恢复服务?

如果影响用户,应先止血,比如回滚、降级、扩容、切流量。服务恢复后再完整定位根因。

系统设计

如何设计一个登录系统?

包括注册、登录、密码哈希、登录态、token 过期刷新、权限校验、退出登录、失败限流和审计日志。前端处理表单校验,后端负责真正鉴权和授权。

如何设计一个博客系统?

核心有文章列表、详情、后台发布、分类标签、搜索、评论。数据表包括用户、文章、分类、标签、评论。内容型站点可以用 SSG 或 SSR,后台接口要做权限和 XSS 防护。

如何设计一个短链接系统?

长链接生成短码,短码映射长链接。短码可用自增 ID 转 Base62 或随机码去重。跳转接口要高性能,可加缓存。访问统计异步写入。

如何设计一个文件上传系统?

小文件直传,大文件分片上传、断点续传、秒传、进度展示。文件存对象存储,数据库保存 metadata。要做权限、大小、类型和安全校验。

如何设计一个通知系统?

设计通知模板、接收人、渠道、发送队列、失败重试、已读未读、频率限制和用户订阅。实时通知用 WebSocket,邮件短信走异步队列。

如何设计一个评论系统?

需要评论表、父评论 ID、资源 ID、用户 ID、状态、时间。要考虑楼中楼、分页、审核、删除、敏感词、通知和防刷。

如何设计一个权限系统?

用用户、角色、权限建模。权限分菜单、按钮、接口、数据范围。前端控制展示,后端控制真实访问。复杂系统还要考虑组织架构和资源归属。

如何设计一个搜索功能?

简单搜索用数据库 like 或全文索引,复杂搜索用 Elasticsearch。要考虑分词、排序、高亮、过滤、权限和数据同步。AI 场景可以结合向量检索。

如何设计一个订单系统?

核心包括订单创建、库存扣减、支付、取消、退款、状态流转。要考虑事务、幂等、支付回调、超时关闭、日志和异常补偿。

如何从单体应用演进到模块化或微服务?

先按业务边界模块化,解决代码耦合和部署问题。只有当团队规模、部署频率、性能瓶颈或业务边界需要时,再拆微服务。拆分后要处理服务通信、配置、监控、链路追踪和数据一致性。

AI 时代的全栈能力

如何把 AI 助手接入一个已有业务系统?

先明确场景,是问答、总结、搜索还是自动操作。再设计模型调用、Prompt、权限、RAG 或工具调用、流式输出、错误降级、日志和评估。AI 不能绕过原有权限系统。

RAG 和微调怎么选?

知识经常变化、需要引用来源、企业私有知识问答优先 RAG。输出格式、风格或稳定任务模式可以考虑微调。很多项目会组合使用。

企业知识库问答经常答错,你怎么排查?

先看检索结果是否正确,再看文档切分、embedding、top-k、hybrid search、rerank、权限过滤和 Prompt。不要一上来就怪模型。

AI 回复有幻觉,如何降低风险?

要求模型基于资料回答,检索不到就拒答,输出引用来源,高风险场景转人工,加规则校验和评估集。

如何设计流式输出体验?

后端使用流式响应,前端逐步渲染内容。要支持取消、超时、错误提示、重试和最终状态落库。流式输出能降低用户等待感。

Function Calling 适合什么场景?

适合让模型生成结构化参数,由后端执行工具,例如查订单、查知识库、创建工单、调用业务接口。后端必须做鉴权、参数校验和审计。

Agent 调错工具怎么办?

限制工具权限,优化工具描述和 schema,给工具返回结构化结果,限制最大步骤数,高风险操作人工确认,记录 trace 方便回放。

AI 调用成本突然升高怎么排查?

看调用量、输入 token、输出 token、模型类型、重复请求、上下文长度和缓存命中率。优化方式包括裁剪上下文、缓存、小模型路由、限流和配额。

如何评估 AI 功能是否真的有效?

准备评估集,统计准确率、忠实度、引用正确率、拒答能力、格式合规、延迟和成本。线上收集用户反馈和 bad case 回流。

AI 输出涉及敏感信息时怎么处理?

输入和输出都要做敏感信息检测,日志脱敏,权限过滤,高风险输出拦截。模型不能看到用户无权访问的数据。

产品和沟通

产品需求不清楚时,你会问哪些问题?

问目标用户、业务目标、核心流程、边界情况、验收标准、优先级、时间限制、数据来源、权限和异常处理。

需求临时变化,你如何处理?

先评估影响范围,包括前端、接口、数据库、测试和上线风险。再和产品确认优先级和延期范围。必要时拆成当前版本和后续版本。

技术方案和产品目标冲突时怎么办?

先理解产品目标,再解释技术成本和风险,提供多个方案和取舍。不要只说做不了,要给可落地替代方案。

你如何拆分一个复杂需求?

按页面、接口、数据表、权限、异常、测试和上线步骤拆。先做核心链路,再做优化和扩展。

你如何和后端约定接口?

提前约定 URL、方法、参数、返回结构、错误码、鉴权、分页、排序、字段含义和 mock 数据。联调时用接口文档和 requestId 排查问题。

你如何和设计师确认交互细节?

确认不同状态:默认、hover、loading、empty、error、disabled、移动端适配、超长文本、权限隐藏和异常提示。

你如何评估任务时间?

先拆任务,再估前端、后端、数据库、联调、测试和上线时间。对不确定项单独说明风险,并预留联调和回归时间。

你如何向非技术同事解释技术风险?

用业务影响解释,比如“这个改动会影响所有登录用户,如果没有灰度,出问题会导致无法登录”。少用术语,多说影响、成本和备选方案。

你如何做项目复盘?

复盘目标、结果、时间线、做得好的地方、问题、根因、改进措施和负责人。重点是形成下次能避免问题的机制。

你如何证明自己的方案带来了收益?

用指标对比,例如接口耗时降低、错误率下降、首屏时间减少、人工操作减少、发布失败率降低。没有量化指标时,也要说明风险降低或维护成本下降。

## 15. 面试回答建议

回答全栈问题时,不要停在单点知识。

例如面试官问:

如何优化一个很慢的列表页?

初级回答可能是:

加防抖、加分页、加缓存。

更好的全栈回答是:

  1. 我会先定位慢在哪里,是接口慢、数据库慢、网络慢,还是前端渲染慢。
  2. 如果接口慢,我会看日志、SQL、索引、返回字段和分页方式。
  3. 如果前端慢,我会看渲染节点数量、组件重渲染、图片资源和 JS 包体积。
  4. 如果用户频繁筛选,我会加防抖、请求取消和 loading 状态。
  5. 如果数据读多写少,可以加缓存,但要说明缓存一致性策略。
  6. 最后用监控数据验证优化效果,比如接口 P95、首屏时间和错误率。

这类回答会让面试官感觉你真的做过项目,而不是只背过知识点。

Built with VitePress and GitHub Pages.