如何选择语言
团队、场景、遗留系统。
30 分钟
如何选择语言
「学 Rust 还是 Go?」不如先问 团队、场景、遗留、SLO、招聘。语言选型是 架构决策,应留下 ADR(Architecture Decision Record),而不是跟 hype。本节给出 可执行的决策树,衔接路线图 pick-a-backend-language 节点。
学习目标
- 用决策维度而非流行度选语言
- 起草简短 ADR 的结构
- 识别「一种语言打天下」与「理性 polyglot」的边界
决策维度
| 维度 | 问题 |
|---|---|
| 团队 | 谁会维护?能否招到? |
| 场景 | I/O?CPU?延迟?合规? |
| 遗留 | 已有 Rails/.NET/PHP 能否替换? |
| 生态 | 需要的 SDK、中间件、云厂商支持? |
| 运维 | 镜像大小、启动时间、可观测性成熟度? |
| 一致性 | 能否共用 Proto、CI、日志规范? |
简化决策树
新服务,团队 primarily Java?
├─ 是 → 默认 Spring Boot(java-fundamentals / spring-boot-essentials)
│ 除非:基础设施/网关/极致启动 → 考虑 Go
│ 除非:native 性能块 → Rust 库或 sidecar
├─ 全栈 JS 团队、BFF 为主 → nodejs-essentials
├─ AI/数据管线 → python-fundamentals
├─ Azure/.NET 存量 → C# ASP.NET Core
└─ CMS/WordPress 周边 → php-essentials,少动核心
重写遗留:先 strangler fig(边车、路由切流),勿 big bang 换语言。
ADR 模板(精简)
# ADR-007: 搜索服务使用 Go 实现
## 状态
Accepted
## 背景
Java 订单服务 QPS 足够;搜索读路径需 <20ms P99,容器密度要高。
## 决策
搜索索引 API 用 Go;与 Java 通过 gRPC(见 grpc-essentials)通信。
## 后果
+ 部署单元小、goroutine 适合 fan-out
- 团队需 Go on-call;Proto 变更要双语言 CI
与 git-essentials 一样:决策进 repo,不是口口相传。
反模式
- 简历驱动:「我们要上 Rust」却无性能证据
- 复制 Netflix:体量、组织不匹配
- 每服务一语言:运维与 shared library 爆炸
- 忽视 Java 虚拟线程:未 profile 就否定 JVM
与本站 track 的分工
| 需求 | 深挖 track |
|---|---|
| Java 业务与 Spring | java-fundamentals、spring-boot-essentials |
| 微服务治理 | spring-cloud-essentials |