CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
软件架构师入门/课时/技术栈选型
RawBlame
课时目录12 节

软件架构师入门

  1. 01软件架构是什么
  2. 02架构师软技能
  3. 03设计模式与原则
  4. 04架构风格
  5. 05数据架构
  6. 06API 与集成
  7. 07安全架构
  8. 08云与设计模式
  9. 09网络基础
  10. 10技术栈选型
  11. 11治理与方法论
  12. 12综合练习

技术栈选型

Java/Go/.NET 与响应式。

30 分钟

技术栈选型

这一课你将能做到

  1. 用结构化框架评估技术选型:从业务约束到团队能力,给出可辩护的结论
  2. 说清楚 Java/Spring、Go、Node.js 各自的甜蜜点,以及本站为什么是 Spring Boot
  3. 解释响应式编程解决的真正问题,并判断本站是否值得引入 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% 的心智负担。

讲清楚要点

  1. 选型第一原则是团队,不是性能:一个团队精通 Java 却选 Rust 做业务系统,性能收益会被开发效率和招聘成本完全吞掉。例外:性能是核心竞争力(基础设施、高频交易)。
  2. 生态成熟度决定隐性成本:报错能不能搜到答案?常用库有没有人维护?云平台 SDK 是否齐全?这些每天都在发生的小摩擦,累积起来远超框架本身的优劣。
  3. 警惕「技术简历驱动开发」:因为想学某个技术而在生产项目里用它,是对业务的不负责。学习用业余时间,生产用最稳妥的。
  4. Polyglot(多语言)要克制:微服务架构下每个服务可以不同语言,但每增加一种语言,CI/CD、监控、排障能力都要复制一套。中小团队最多两种主力语言。
  5. 版本策略是选型的一部分: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
引入没人会的新数据库出故障无人能救存储选型比语言更保守

卡点急救

  1. 老板拍脑袋要用新技术:不要硬顶。用七问法做对比表 + 2 周 Spike(技术预研)出原型,用数据让结论自己浮现。
  2. 选完发现踩坑,进退两难:评估迁移成本 vs 忍受成本。如果只是局部模块,用防腐层隔离后替换;如果是全局框架,做好「再忍一年,下个版本窗口迁移」的计划,写进 ADR。
  3. 团队一半想 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 个,包含「维持现状」)→ 评估维度和权重 → 每个维度打分和依据 → 风险和缓解措施 → 结论和回退方案。关键是「维持现状」也作为候选——防止为了变而变。

自测三问

  1. 用七问法评估:本站如果新增实时协作编辑功能,技术栈该怎么选?
  2. 为什么业务系统普遍不推荐 Rust,即使它性能最高?
  3. 虚拟线程让 Java 还需要 WebFlux 吗?各自还剩什么场景?

小结一句话

技术栈选型是约束条件下的最优解搜索:团队能力权重最高,生态成熟度决定隐性成本,性能只在成为核心竞争力时才拥有否决权。

延伸

  • 《The Pragmatic Programmer》——「每年学一门新语言,但生产用你精通的」
  • Java 21 虚拟线程 JEP 444
  • ThoughtWorks 技术雷达——业界选型风向标
  • 下一课:治理与方法论——TOGAF、敏捷与技术债管理。
加载本节练习…
← 上一课网络基础下一课 →治理与方法论