---
name: fullstack
description: 全栈开发出题：前后端协作边界与 BFF、鉴权与会话、API 设计、部署与 DevOps 基础、全链路性能与监控。岗位或简历出现全栈、Full Stack、Node.js 后端 + 前端、独立负责整条功能链路时加载。
keywords: [全栈, fullstack, full stack, 全栈工程师, bff, node.js, next.js, nestjs, express, restful, graphql, jwt, oauth, docker, 前后端分离]
layer: domain
---

## 岗位职责与考察重点

全栈工程师的定义在不同公司差异很大：初创公司和外企里通常是"一个人把功能从数据库到页面做完并上线"，大厂里更多是"前端为主、能写 BFF 和轻后端"或"后端为主、能改页面"。真实面试里最常被问的不是两边各自多深，而是"边界怎么划"：接口谁定、数据在哪一层聚合、鉴权在哪一层做、出了问题从哪端开始查。面试官最在意三件事：一是有没有独立交付过完整链路（需求、接口、数据、部署、监控），二是遇到跨端问题（比如接口慢、登录态丢失、缓存不一致）能否在前后端之间正确归因而不是甩锅，三是知不知道自己在哪一侧薄弱以及怎么补。

校招侧重基础扎实和动手：HTTP 与浏览器基础、能用 Node/Next/Spring 等搭一个带登录和 CRUD 的小系统并说清每一层做什么；社招侧重工程判断：BFF 该不该建、SSR 还是 CSR、JWT 还是 session、微服务还是单体、监控告警怎么配、线上故障怎么定位。这个方向简历最常见的问题是"什么都会一点"但每样都答不到排查层，所以要用具体故障场景把候选人逼到某一层深挖。

## 主题

### 前后端协作边界与接口契约
- 阶梯：接口文档谁写、什么时候定 → OpenAPI/TypeScript 类型共享、mock 与契约测试如何让两端并行 → 上线后前端发现字段语义和文档不一致，怎么防止再发生 → 契约先行的成本（改动慢）与灵活性之间怎么按团队规模取舍
- 好题：一个列表页需要用户信息、订单、推荐三个服务的数据，前端说"给我一个接口"，后端说"你自己调三个"，你会怎么定？这个决定在数据量翻十倍、字段频繁变更时分别会遇到什么问题？
- 危险信号：只会说"前后端分离"；接口靠口头约定和 Postman 截图；没做过接口变更的兼容处理
- 期望信号：区分面向资源的 API 与面向页面的 API；提到版本、默认值、字段废弃策略；有用 schema 生成类型或做契约测试的经历；能说清"聚合放哪一层"的判断依据

### BFF 与数据聚合层
- 阶梯：BFF 是什么、和网关有什么区别 → 聚合、裁剪、缓存、鉴权放 BFF 哪些合适哪些不合适 → BFF 变成"胖中间层"、逻辑重复、一个页面改动要动三层，怎么治理 → 多端（Web/小程序/App）一套 BFF 还是各自一套，团队边界怎么划
- 好题：你们的 Node BFF 上线半年后 P99 从 80ms 涨到 600ms，请求量没大变，你怀疑什么？怎么定位是下游慢、串行调用还是 BFF 自身（事件循环阻塞、内存泄漏）？
- 危险信号：把 BFF 当万能层塞业务逻辑；下游多个接口串行 await 却不知道；不知道 Node 单线程阻塞的表现
- 期望信号：并行请求与超时熔断；按端拆 BFF 的边界理由；用 trace 看串行/并行；对 Node 事件循环延迟有监控概念

### 鉴权与会话管理
- 阶梯：cookie session 与 JWT 各自怎么工作 → 无状态 token 怎么做注销与续期、refresh token 的存储与轮换、CSRF 与 XSS 对两种方案的影响差异 → 用户报"隔一会儿就掉登录"或"换设备后老设备没被踢下线"，怎么排查 → 单体、多域名、第三方登录（OAuth2/OIDC）场景下方案怎么选，安全与体验怎么平衡
- 好题：你的应用前端在 app.example.com、API 在 api.example.com，用 JWT 放在哪、怎么防 XSS 拿走 token、怎么实现"修改密码后所有设备下线"？如果换成 session 方案这三个问题分别怎么变？
- 危险信号：JWT 存 localStorage 且说"没问题"；不知道 JWT 无法主动失效；把 SameSite、HttpOnly、Secure 混为一谈；OAuth 授权码流程说不清 code 换 token 在哪一侧做
- 期望信号：HttpOnly cookie + SameSite + CSRF token 的组合；短期 access token + 可撤销 refresh token；黑名单/版本号实现强制下线；知道 PKCE 用在哪

### API 设计：REST、GraphQL 与 RPC
- 阶梯：REST 资源建模与状态码语义 → 分页（offset vs cursor）、过滤、批量、幂等键的设计 → GraphQL N+1、over-fetching 解决了什么又带来了什么（缓存难、复杂度攻击）→ 内部服务用 gRPC/tRPC、对外用 REST 的组合怎么定，什么时候不该上 GraphQL
- 好题：设计一个"批量导入 1 万条商品"的接口，要考虑幂等、部分失败、进度查询与超时。同步还是异步？状态怎么存？客户端断网重试会发生什么？
- 危险信号：所有接口都是 POST 且返回 200 带 code；分页只会 offset；说 GraphQL 就是"前端想要什么拿什么"却没提 dataloader 与限深
- 期望信号：幂等键与去重表；长任务改异步 + 任务 ID 轮询或推送；错误响应结构统一；对 GraphQL 有明确的适用场景判断

### 渲染策略：SSR / CSR / SSG / 流式
- 阶梯：SSR 与 CSR 的差别与各自首屏指标 → hydration 做什么、为什么会不一致（时间、随机数、用户态）→ SSR 页面 TTFB 高、服务端 CPU 打满、缓存击穿怎么排查 → 按页面类型选渲染模式，SEO、个性化、成本三者取舍
- 好题：电商商品页要 SEO、又有个性化推荐和实时库存，你怎么拆哪部分 SSR、哪部分客户端拉取、哪部分静态化并配缓存？活动期间流量十倍时哪一段最先出问题？
- 危险信号：认为 SSR 一定更快；不知道 hydration 错误怎么来的；所有页面一个模式
- 期望信号：区分 TTFB/FCP/LCP/TTI 谁受影响；静态壳 + 动态岛的思路；CDN 缓存与 stale-while-revalidate；服务端渲染的并发与内存代价

### 数据层与 ORM 使用
- 阶梯：ORM 解决什么、隐藏了什么 → N+1、隐式事务、连接池耗尽的成因 → 接口偶发 500，日志显示 "too many connections" 或查询超时，怎么从应用层排查 → 什么时候绕过 ORM 写 SQL，读写分离与缓存该由哪一层做
- 好题：用 Prisma/TypeORM/SQLAlchemy 写的列表接口，本地 50ms、线上 3s，数据量差一百倍，你怎么定位？拿到执行计划后可能看到什么、分别怎么改？
- 危险信号：不知道 ORM 生成了什么 SQL；不会看执行计划；连接池大小随便填
- 期望信号：打印 SQL 与 explain；索引与分页改法；连接池与实例数的乘积概念；缓存放 BFF 还是服务层的理由

### 构建、部署与 DevOps 基础
- 阶梯：前后端各自怎么打包、产物是什么 → Docker 多阶段构建、环境变量与配置注入、镜像层缓存 → 部署后"本地好的线上不行"怎么排查（环境变量、时区、依赖版本、构建产物差异）→ 单机 Docker Compose、云托管（Vercel/云函数）、K8s 三种方案对团队的成本与上限
- 好题：你要把一个 Next.js + Node API + Postgres 的项目从"手动 scp 到服务器"改成可重复的部署流程，CI 里跑什么、镜像怎么分层、数据库迁移放在哪一步、回滚怎么做？
- 危险信号：靠 SSH 上服务器 git pull；数据库迁移手工执行；不知道 CI 和 CD 的区别；镜像里塞进 node_modules 的 devDependencies 且不觉得有问题
- 期望信号：多阶段构建与 .dockerignore；迁移与代码版本绑定并可回滚；健康检查与零停机发布；对不同托管方案的适用规模有判断

### 全链路性能定位
- 阶梯：用户说"页面慢"你先看什么 → 前端（资源、渲染、请求瀑布）、网络（DNS/TLS/CDN）、后端（接口、DB、外部依赖）各自的观测手段 → 只有部分用户慢、只有某个时段慢、只有首次慢，分别指向哪里 → 优化顺序怎么排：先修最大头还是先修最便宜的
- 好题：运营反馈"下午两点后页面明显变慢"，前端监控 LCP 正常、接口 P99 升高但平均正常，你按什么顺序缩小范围？哪些指标能让你区分是慢 SQL、下游依赖还是资源争抢？
- 危险信号：只会加缓存；不区分平均值与 P99；不看 waterfall 就说"后端慢"
- 期望信号：从 RUM/浏览器 timing 切到服务端 trace；用 traceId 串起前后端；找到慢的那一段再看它的下钻指标；有"一次优化前后对比数据"

### 缓存与一致性（跨端视角）
- 阶梯：浏览器缓存、CDN、BFF 内存缓存、Redis、DB 缓存分别缓什么 → 缓存 key 设计、失效策略、穿透与雪崩 → 用户改了资料后有的页面更新了有的没更新，怎么查是哪一层缓存 → 多层缓存的一致性代价与"允许多久不一致"的业务谈判
- 好题：用户修改头像后，个人页更新了但评论区还显示旧头像，且过一小时才恢复。请列出可能的缓存层，你怎么定位是哪一层、怎么修，并说明修完后要不要保留那层缓存。
- 危险信号：所有东西都塞 Redis；HTTP 缓存头一问三不知；把"缓存更新"和"缓存删除"当一回事
- 期望信号：按数据变化频率与容忍度分层；Cache-Control/ETag 的使用；写后删 + 短 TTL 的兜底；有从 URL 上加版本号解决静态资源缓存的经验

### 监控、日志与故障响应
- 阶梯：上线后你怎么知道系统健康 → 前端错误上报、后端结构化日志、指标、trace 各自回答什么问题 → 半夜告警"错误率升高"你先看哪三个面板、怎么判断影响面与是否回滚 → 告警阈值怎么定才不会噪音太多或漏报，谁 on-call
- 好题：你负责的功能上线后用户反馈"偶尔报错"，但后端日志没有 5xx。可能原因有哪些（前端异常、网络、CORS、第三方脚本、灰度差异）？你需要哪些数据才能不靠猜？
- 危险信号：只有 console.log；出问题先重启；不知道自己的错误率基线是多少
- 期望信号：前后端共用 traceId；错误按版本/浏览器/接口维度聚合；有 SLO 或至少有基线；能说出一次真实故障的时间线

### 安全基础（全栈视角）
- 阶梯：XSS/CSRF/SQL 注入的本质区别 → 输入校验放哪一层、输出编码、CSP、参数化查询 → 安全扫描报了一个"敏感信息泄露"，怎么从前端打包、接口返回、日志三处排查 → 安全投入的优先级：先修什么、什么可以接受风险
- 好题：你的富文本编辑器允许用户发帖，前端做了过滤，安全团队仍然打出了存储型 XSS，可能漏在哪？修复方案里哪些放后端、哪些放前端、CSP 能兜住多少？
- 危险信号：认为前端校验够了；接口按 ID 查数据不做归属校验（越权）；把密钥打进前端包
- 期望信号：服务端校验为准；白名单式富文本清洗；越权检查在数据访问层；环境变量与构建时注入的区分

### 前后端类型与代码共享
- 阶梯：为什么想共享类型与校验逻辑 → monorepo、共享包、schema 驱动代码生成 → 共享包一改全站构建、版本地狱、循环依赖怎么治 → 共享的收益和耦合的成本，哪些该共享哪些坚决不共享
- 好题：你们前后端各维护一套 DTO 与校验规则，经常对不上。给出一个统一方案，说明改动流程、发布顺序、老版本客户端怎么兼容。
- 危险信号：把后端实体直接暴露给前端；没有版本策略；monorepo 就是"放一个仓库"
- 期望信号：schema（zod/OpenAPI）为唯一事实来源；生成而非手写；兼容期字段可选；工具链（构建缓存、affected 检测）的认知

## 好题 / 坏题对比

- 坏：说说 JWT 和 session 的区别。
- 好：前端在 app 域、API 在 api 域，用 JWT 你会存哪、怎么防 XSS 拿走、怎么实现"改密码后全设备下线"？如果换 session，这三个问题分别怎么变？哪一种你会推荐给一个 5 人团队并说明理由。

- 坏：什么是 BFF？有什么好处？
- 好：你的 Node BFF 上线半年后 P99 从 80ms 涨到 600ms 但请求量没变，你怀疑哪些原因？怎么用 trace 区分是下游慢、串行 await 还是事件循环被阻塞？如果是串行，改并行后有哪些新风险？

- 坏：SSR 和 CSR 有什么区别？
- 好：商品页要 SEO、有个性化推荐和实时库存，你怎么拆哪部分服务端渲染、哪部分客户端拉、哪部分静态化配缓存？大促流量十倍时哪一段先崩、你会提前做什么？

## 项目结合钩子

- 简历出现"独立完成前后端" → 追接口文档在哪、怎么测、部署到哪、出过什么线上问题、怎么发现的；只能讲功能不能讲事故的降一档
- 简历出现 BFF / 中间层 → 追它聚合了几个下游、有没有超时熔断、最慢的接口是哪个、为什么不让前端直接调
- 简历出现登录 / 鉴权模块 → 追 token 存哪、怎么续期、怎么强制下线、第三方登录用的哪个流程、有没有处理过 CSRF
- 简历出现 Next.js / Nuxt / Remix → 追哪些页面 SSR 哪些 CSR、hydration 报过什么错、部署在哪、服务端渲染的成本谁付
- 简历出现 Docker / CI/CD → 追镜像多大、构建多久、迁移怎么跑、回滚过没有、环境变量怎么注入
- 简历出现"性能优化 X%" → 追指标是什么、在哪测的、优化前后数据、是前端还是后端改动、有没有对照
- 简历出现 GraphQL → 追为什么选它、N+1 怎么解决、限深与复杂度控制、缓存怎么做、后悔过没有
- 简历出现 monorepo / 共享类型 → 追共享了什么、一次改动影响面怎么控制、构建时间、有没有循环依赖

## 出题原则

- 用一个跨端故障场景逼候选人选边深挖：先问"你先查前端还是后端、为什么"，再顺着他选的那一侧追到排查层，防止"两边都懂一点"的浮面回答。
- 每个架构选择都要追"团队规模与阶段"：BFF、微服务、GraphQL、K8s 对 3 人团队和 300 人团队答案不同，只会说"最佳实践"而不结合规模的是危险信号。
- 部署与监控必问：全栈的核心价值是端到端交付，没上过线、没看过监控面板、没处理过故障的候选人无论代码多熟都要标记。
- 不考具体框架 API 细节的时效性（某版本的路由写法），考的是"这一层为什么存在、坏了怎么查"。
