大家好,我是程序员柏风,AI 最全的 Vibecoding 学习地图 http://coderoadmap.cn 作者。
技术栈选型
这一课你将能做到
- 用结构化框架评估技术选型:从业务约束到团队能力,给出可辩护的结论
- 说清楚 Java/Spring、Go、Node.js 各自的甜蜜点,以及本站为什么是 Spring Boot
- 解释响应式编程解决的真正问题,并判断本站是否值得引入 WebFlux
为什么要学
「用什么技术栈」是每个新项目的第一道架构决策,也是最难以回头的决策之一。选错了,三个月后全员吐槽、一年后推倒重来。技术选型比拼的不是谁懂得多,而是谁能把「合适」论证清楚。
人话:选技术栈像选交通工具。法拉利(Go 极致性能)跑得快但维护贵、修车师傅难找;丰田(Java/Spring)不是最快,但皮实、配件遍地、会修的人多。你要先想清楚是跑赛道还是跑滴滴。
先建立图像
主流后端栈的定位地图:
性能 →
高 │ Go/Rust C++
│ (并发/云原生) (极致性能/系统级)
│
中 │ Java/Kotlin Node.js
│ (企业级/生态最全) (IO密集/前后端统一)
│
低 │ Python Ruby
│ (AI/脚本/胶水) (快速原型)
└─────────────────────────────
生态成熟度低 ←———→ 生态成熟度高
跟着做
步骤 1:结构化选型框架(七问法)
为本站选后端栈,依次回答:
| 问题 | 本站的答案 | 指向 |
|---|---|---|
| 1. 团队熟悉什么? | 3 人都是 Java 背景 | Java/Kotlin |
| 2. 业务类型? | CRUD 为主 + 事务 + 复杂查询 | 成熟 ORM 生态 |
| 3. 性能要求? | 万级日活,无极端并发 | 不需要 Go/Rust |
| 4. 招人难度? | 三线城市远程团队 | Java 简历最多 |
| 5. 生态依赖? | 需要支付、OSS、短信 SDK | 阿里云 Java SDK 最全 |
| 6. 长期维护? | 计划维护 5 年以上 | 选常青树不选新锐 |
| 7. 未来演进? | 可能拆微服务 | Spring Cloud 成熟 |
结论:Spring Boot 3 + Java 21。每条理由都可追溯。
步骤 2:Spring vs Go 的真实对比
维度 Spring Boot Go
──────────────────────────────────────────────────
启动速度 3-10s(可用 CRaC 优化) 毫秒级
内存占用 300MB+ 30MB+
并发模型 线程池(虚拟线程大幅改善) goroutine 原生轻量
开发效率 注解驱动,样板代码多但框架全 显式代码,简洁但轮子少
企业功能 事务/安全/批处理开箱即用 需要自行组装
适用场景 业务复杂的企业应用 基础设施/高并发中间件
Java 21 虚拟线程缩小了差距:
// 以前:线程池 200 个线程是瓶颈
// 现在:虚拟线程百万级,写法和同步代码一样
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
executor.submit(() -> {
// 阻塞 IO 不再浪费 OS 线程
return courseMapper.findById(id);
});
}
步骤 3:响应式编程的边界判断
// WebFlux 写法:全部链路非阻塞
@GetMapping("/courses/{id}")
public Mono<CourseDTO> get(@PathVariable long id) {
return courseRepo.findById(id) // R2DBC 非阻塞驱动
.flatMap(c -> reviewRepo.countByCourse(id)
.map(count -> new CourseDTO(c, count)));
}
判断要不要用的清单:
- 需要万级以上长连接(IM、推送)→ 值得
- 下游全是慢 IO(聚合多个外部 API)→ 值得
- 团队没接触过反应式,业务是普通 CRUD → 别用
- 数据库驱动不支持(MySQL 的 R2DBC 不如 JDBC 成熟)→ 别用
本站结论:用 MVC + 虚拟线程,获得 80% 的并发收益、5% 的心智负担。
讲清楚要点
- 选型第一原则是团队,不是性能:一个团队精通 Java 却选 Rust 做业务系统,性能收益会被开发效率和招聘成本完全吞掉。例外:性能是核心竞争力(基础设施、高频交易)。
- 生态成熟度决定隐性成本:报错能不能搜到答案?常用库有没有人维护?云平台 SDK 是否齐全?这些每天都在发生的小摩擦,累积起来远超框架本身的优劣。
- 警惕「技术简历驱动开发」:因为想学某个技术而在生产项目里用它,是对业务的不负责。学习用业余时间,生产用最稳妥的。
- Polyglot(多语言)要克制:微服务架构下每个服务可以不同语言,但每增加一种语言,CI/CD、监控、排障能力都要复制一套。中小团队最多两种主力语言。
- 版本策略是选型的一部分:Java 选 LTS 版本(8→11→17→21),Spring Boot 跟最新稳定版但延迟一个小版本升级,避免当试验品踩未发现的坑。
你可能会懵的地方
-
Go 性能这么好,为什么大厂核心业务还是 Java? 核心业务的瓶颈很少是语言性能,而是复杂业务的可维护性:事务、校验、规则引擎、报表,这些 Spring 生态打磨了 20 年。Go 的甜蜜点是基础设施(K8s、etcd、Docker 全是 Go)和高并发中间件。
-
Node.js 能做什么不能做什么? 能做:BFF 层、SSR、IO 密集 API、工具链。不能做:CPU 密集计算(单线程事件循环会被堵死)、复杂事务系统。本站的管理后台 BFF 可以用 Node,但订单核心不能。
-
Python 慢,为什么 AI 全用它? Python 本身慢,但 NumPy/PyTorch 的底层是 C/CUDA,Python 只是胶水。这印证了一个选型原则:语言慢不慢不重要,关键路径用什么实现才重要。
-
Kotlin 值得从 Java 迁移吗? Kotlin 与 Java 100% 互操作,空安全和协程是真香,Spring 官方一等支持。渐进迁移(新文件用 Kotlin)风险很低。但团队统一比语言优势更重要。
-
W3C/WHATWG 标准跟后端架构师什么关系? 前端技术栈选型同样属于架构决策:Web Components、Service Worker、HTTP 缓存语义都是标准定义的。架构师至少要知道「哪些是浏览器标准能力,哪些是框架私货」,这决定了技术锁定的程度。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 因为「听说快」选新语言 | 忽视生态和团队,隐性成本爆炸 | 七问法逐项打分,团队权重最高 |
| 微服务每个服务不同语言 | 运维和监控体系重复建设 | 主力语言 ≤ 2 种,例外要评审 |
| 为了高并发上 WebFlux | 调试困难,团队心智负担剧增 | 先试虚拟线程,收益不够再上响应式 |
| JDK 万年 Java 8 | 错过记录类、虚拟线程、GC 改进 | 跟随 LTS,新项目直接 21 |
| 引入没人会的新数据库 | 出故障无人能救 | 存储选型比语言更保守 |
卡点急救
- 老板拍脑袋要用新技术:不要硬顶。用七问法做对比表 + 2 周 Spike(技术预研)出原型,用数据让结论自己浮现。
- 选完发现踩坑,进退两难:评估迁移成本 vs 忍受成本。如果只是局部模块,用防腐层隔离后替换;如果是全局框架,做好「再忍一年,下个版本窗口迁移」的计划,写进 ADR。
- 团队一半想 Go 一半想 Java:看业务归属。基础设施层(网关、作业)可以 Go,业务层统一 Java。用边界化解争论,而不是争出唯一答案。
面试常问
-
如果让你重新设计你们系统的技术栈,你会怎么选? 这是考察复盘能力的题。好答案结构:1) 肯定现有选型在当时约束下的合理性;2) 指出 1-2 个今天会改的点并给出理由(如「现在会直接上 Java 21 虚拟线程,省掉之前的线程池调优」);3) 说明什么情况下会推翻整个选型(业务量 10 倍增长、团队重构)。切忌全盘否定现有栈——那说明你不理解当时的约束。
-
Java 虚拟线程和 Go goroutine 的区别? 相同:都是轻量级线程,由运行时调度到少量 OS 线程上。差异:goroutine 从语言诞生就存在,生态(channel、select)围绕它设计;虚拟线程是 Java 21 加入的,优势是对存量代码透明(synchronized 在 21 里已不钉住载体线程,老的阻塞代码直接获益)。Java 生态的迁移红利 vs Go 的原生简洁,这是两者的本质差异。
-
如何做技术选型汇报? 结构:候选方案(至少 3 个,包含「维持现状」)→ 评估维度和权重 → 每个维度打分和依据 → 风险和缓解措施 → 结论和回退方案。关键是「维持现状」也作为候选——防止为了变而变。
自测三问
- 用七问法评估:本站如果新增实时协作编辑功能,技术栈该怎么选?
- 为什么业务系统普遍不推荐 Rust,即使它性能最高?
- 虚拟线程让 Java 还需要 WebFlux 吗?各自还剩什么场景?
小结一句话
技术栈选型是约束条件下的最优解搜索:团队能力权重最高,生态成熟度决定隐性成本,性能只在成为核心竞争力时才拥有否决权。
延伸
- 《The Pragmatic Programmer》——「每年学一门新语言,但生产用你精通的」
- Java 21 虚拟线程 JEP 444
- ThoughtWorks 技术雷达——业界选型风向标
- 下一课:治理与方法论——TOGAF、敏捷与技术债管理。