晋升失败后,我靠搞懂 Springboot 底层把命续上了

半个架构师
2025-12-17 03:41
阅读 1818

作者:某上市大厂技术中台打工人,坐标深圳南山科技园,日常用 VSCode 写代码,插件装得比头发还多。主业是缝合微服务,副业是帮前端同事查 undefined


去年 Q4 的晋升答辩,我挂了。

不是差一点,是“建议明年再战”那种挂。HR 邮件写得委婉,但字里行间透着“你连 P7 的边都没摸到”。那天晚上,我坐在工位上盯着屏幕上刚修完的线上告警——一个因为前端传了个 null 导致 Springboot 后端直接 NPE 崩掉的服务——突然觉得,自己就像那个被 @RequestBody 反序列化失败的对象:结构完整,但没人愿意解析。

说好的“综合能力”呢?

我们公司晋升,尤其是技术岗,早就不是“会写 CRUD 就能升”的年代了。HR 系统里那几个字——“技术深度、业务影响力、综合能力”——每个都像产品经理画的饼,看起来香,咬一口全是空气。

我的 case 很典型:

  • 前端?会调 API,会看控制台报错,甚至能改两行 React(虽然改完要测三天)。
  • Springboot?天天用,起步就 @SpringBootApplication,配置文件堆成山,但问起自动装配原理,只能支支吾吾说“好像用了 SPI?”
  • 综合?项目按时交付、没出 P0 事故、文档写了八篇……但评委一句“缺乏技术前瞻性”,直接把我钉在耻辱柱上。

最讽刺的是,同期一个做内部低代码平台的兄弟升上去了。他主要工作是把拖拽组件和生成 SQL 拼在一起——而我,天天在搞什么“高并发缓存穿透优化”、“分布式事务一致性校验”,结果被说“太垂直,缺乏横向赋能”。

被逼到墙角,只能钻底层

挂完晋升那周,我请了两天假。不是躺平,是去图书馆翻《Spring 源码深度解析》。说真的,以前觉得看源码是“表演型学习”,但那次真被刺痛了——原来我一直活在 Springboot 的“舒适区”里,像个只会按微波炉按钮的厨子,连火怎么点都不知道。

于是我干了件蠢事:从零手写一个简化版 Springboot Starter

目标很明确:搞懂 @EnableAutoConfiguration 到底怎么把一堆 Bean 自动塞进容器的。过程中踩的坑,简直能写本《程序员崩溃实录》:

// 你以为这样就能自动配置?
@Configuration
public class MyRedisAutoConfiguration {
    @Bean
    public RedisTemplate redisTemplate() {
        return new RedisTemplate(); // 实际还要 setConnectionFactory...
    }
}

结果启动直接报错:

No qualifying bean of type 'org.springframework.data.redis.connection.RedisConnectionFactory' available

我:???
Springboot 不是号称“约定优于配置”吗?怎么连 ConnectionFactory 都不给我配?

后来才明白,自动配置是有条件的RedisAutoConfiguration 本身依赖 LettuceConnectionConfigurationJedisConnectionConfiguration,而这些又依赖 spring.redis.host 是否配置。我没配,自然跳过。

那一刻,我悟了:所谓“综合能力”,不是你会多少框架,而是你能不能在框架崩掉时,知道它为什么崩

前端?别笑,他们也在卷

说到前端,我们组有个 UI 工程师小王,去年也挂了晋升。他做的后台管理系统,用户体验极佳,连测试妹子都说“点起来很顺滑”。但评委问他:“如何保证首屏加载在 1s 内?Webpack 分包策略是什么?Vite 和 Webpack 在 DevServer 上的本质区别?”

他答不上来。
其实他平时只用 Vue CLI,根本没碰过构建工具底层。

这让我意识到:前后端都在被“综合”绑架。前端不能只会写 <template>,后端不能只会 @Autowired。公司要的是“T 型人才”——但现实是,很多人连那一横都没画直,就被要求画整张地图。

于是我和小王组了个“反卷学习小组”。每周三晚上,他教我 React Fiber 架构,我给他讲 Spring 的 Bean 生命周期。有次他问我:“你们 Java 怎么处理循环依赖?” 我脱口而出:“三级缓存啊!” 他愣住:“缓存?不是应该报错吗?”

你看,认知差才是最大的技术债

把“综合”变成武器

今年 Q2,我们接了个新需求:做一个实时数据看板,前端用 WebSocket 推送,后端用 Springboot + Redis Stream 做消息管道。

这次我不再只写业务逻辑。我干了三件事:

  1. 主动设计容灾方案:Redis 挂了怎么办?降级到本地队列 + 重试机制。
  2. 输出通用 Starter:把 WebSocket 连接管理、心跳检测、断线重连封装成 spring-boot-starter-realtime,其他团队直接引入。
  3. 和前端共建协议规范:用 JSON Schema 定义消息格式,自动生成 TS 类型定义,避免“字段名大小写不一致”这种祖传 Bug。

上线那天,运维大哥拍我肩膀:“这次日志打得挺全啊,TraceID 链路都串起来了。”
测试妹子发来消息:“压测 5k 并发,P99 < 200ms,牛!”

最重要的是——这次没人再说我“太垂直”

晋升不是终点,但心态得调整

上周五晚上,我又在加班。不是修 Bug,是在给新来的实习生 review 代码。他写了个 Springboot Controller,参数校验全靠 if (xxx == null)

我笑了笑,贴了段代码给他:

@PostMapping("/user")
public ResponseEntity<?> createUser(@Valid @RequestBody UserDTO dto) {
    // ...
}

// DTO 里
@Data
public class UserDTO {
    @NotBlank(message = "用户名不能为空")
    private String username;
    
    @Min(value = 18, message = "年龄需满18岁")
    private Integer age;
}

他眼睛一亮:“原来还能这样!”

那一刻,我突然释怀了。
晋升失败不可怕,可怕的是你从此只写“能跑就行”的代码

现在回头看,去年的失败反而成了转折点。我不再盲目追新框架,而是沉下来搞懂手里的工具。VSCode 里那些插件——比如 Spring Boot Tools、Java Decompiler——终于不只是摆设。

给同样卡在“综合”上的兄弟几点建议

误区 正确姿势
“我会用就行” 问一句:如果它崩了,我能修吗?
“业务忙,没时间学底层” 每天抽 30 分钟,读一段核心源码(比如 ApplicationContext.refresh()
“综合=会很多语言” 综合=能打通技术链路,从前端请求到 DB 存储全链路可控
“晋升看运气” 晋升看证据——你的技术决策、文档沉淀、跨团队影响,都要可量化

最后送大家一句我在工位贴的便签:

不要做 API 的搬运工,要做系统的建筑师。

今年的晋升名单还没出。但我知道,就算再挂,我也不会再对着一个 NPE 崩溃到想砸电脑了——因为我已经知道,NullPointerException 的栈轨迹里,藏着整个世界的真相。

(完)


P.S. 如果你在深圳,对 Springboot 底层或前端工程化感兴趣,欢迎约咖啡。不过别聊晋升,我怕我又emo了。

评论 0

最热最新
暂无评论
半个架构师Lv.1
0
影响力
0
文章
0
粉丝