如果你的团队最近出现了一句很耳熟的决策——"以后招聘只考虑资深工程师,Junior 一律不招",那你大概率也听过这句英文观点:Not hiring junior engineers won't solve the problem you think you have。翻译过来非常直白:不招初级工程师,解决不了你以为它能解决的问题。这句话不是一句政治正确的口号,也不是为 Junior 群体辩护,它背后有一套完整的技术管理逻辑。
很多技术负责人把"团队质量"等同于"成员平均资历",认为只要每个人都是 Senior,代码质量就会自动变好,交付速度就会自动变快,线上事故就会自动减少。但现实往往相反:一个全员资深的团队,短期的执行力可能很强,长期却会陷入救火循环、知识单点、技术债失控和一个更隐蔽的问题——组织失去了自我进化的能力。
这篇文章我会从工程管理的实际视角,把这个问题拆开讲清楚:为什么只招资深工程师是一个危险的资源错配;初级工程师在组织里承担的到底是什么角色;如何用一套可落地的招聘、培养和配套机制建立健康的人才梯队;最后用数据和代码告诉你,怎样验证人才梯队建设到底有没有效果。
1. 这篇文章真正要解决的问题
很多团队在业务进入稳定期之后,会做一次"人才升级":消灭低绩效,压缩成本,把校招名额变成社招名额,把招聘标准从"愿意学习"改成"三年以上经验、大厂背景、独立负责过核心模块"。表面上看,这是在提升团队质量。但从工程组织演进的视角看,这更像是在用当下的人员确定性,换走未来的组织确定性。
这篇文章要解决的核心问题是:当你决定"只招资深工程师"时,你到底在解决什么问题?
如果你以为你在解决"代码质量差",那么答案是无效的。代码质量取决于设计和评审机制,不取决于写代码的人是谁。如果你以为你在解决"交付慢",答案也是无效的。交付慢通常是架构耦合度高、需求拆分不合理、测试基础设施薄弱造成的,而不是执行者能力不够。如果你以为你在解决"没有人能负责核心模块",这个目标局部成立,但代价是你把整个团队变成了一群互不相让的"专家",知识和责任高度集中,任何一个人的离开都会让系统变得脆弱。
真正应该被解决的问题是:如何让团队具备持续交付、持续改进、持续吸纳新人的能力。这个能力靠的不是清一色的 Senior,而是一个有梯度的工程师结构。
读完这篇文章,你会得到几个可操作的东西:一份 Junior 工程师的招聘 JD 模板,一份面试评估表,一份入职培养计划,一套代码评审机制,还有一个用 Git 历史分析团队知识集中度的 Python 脚本。它们不是理论,是可以直接拿去改用的实践工具。
2. 为什么只招资深工程师的团队会越来越疲惫
先做一个思想实验。假如你有一个三人团队,全部由资深工程师组成,经验丰富、技术扎实,每个人都手都能独立负责一个模块。这种情况下,团队最需要解决的问题是什么?是协调,是分工,是共识。
资深工程师最擅长的是解决复杂度,但团队里一定有大量低于复杂度阈值的重复工作。谁来改配置项?谁来修一个影响面很小但很耗时的边缘 bug?谁来整理接口文档?谁来维护测试用例?谁来处理线上告警的初步排查?这些工作如果由资深工程师做,产出是合格的,但成本是巨大的。更麻烦的是,资深工程师在做这些低杠杆工作时,还不会主动说"这活儿太简单了我不干",于是资源错配被隐形化了。
这种状态下,团队会进入一个典型的恶性循环:
- 高级人员把大量时间花在事务性工作上,真正需要资深判断的架构设计和关键技术决策被挤压;
- 核心模块永远只有最初写它的那一两个人最懂,其他人不敢碰,也不愿意碰;
- 代码评审变成形式,因为 Reviewer 和 Author 水平相近,评审变成了互相确认,而不是真正检查和知识转移;
- 没有 Junior 在下面兜底,所有的 bug 修复、需求开发、方案评审全部压在少数人身上,形成"救火式加班"。
这里有一个容易被忽略的组织学常识:当团队里全是高水平的执行者时,团队水平的下限被抬高,但上限并没有被抬高。真正的上限取决于团队的协作机制、知识共享程度和架构抽象能力。而这些能力恰恰需要有人"不会",需要有人"提问",需要有人"犯错",倒逼整个团队把隐性知识显性化。
如果只看表面,你可能会误以为"资深团队"效率很高,因为每个人都看起来很有经验、很忙。但你如果把时间拉长到一年,你会看到另一种结果:核心工程师的离职风险上升,因为他们发现自己的工作内容有 60% 是不需要经验也能完成的;技术文档依然空缺,因为大家都默认"看代码就懂了";新业务需要扩展时,团队发现唯一能带队的那个人正被一堆线上问题缠住。
一个健康的技术团队,不应该是全员高配,而应该是能力分层、责任分层、知识持续流动。资深工程师的价值在于做那些"只有资深才能做的事",而不是把所有事情都做完。
3. 初级工程师的真正价值:不止是分摊工作量
很多人对初级工程师的理解是:便宜,听话,能干活,但需要有人管。如果只从这个角度看,Junior 就是"低成本劳动力",那么砍掉 Junior 似乎只是多花点钱的问题。但这个理解严重低估了初级工程师在组织中的杠杆作用。
初级工程师的真正价值,在于他们天然是团队知识体系的"探针"。
他们刚进入团队,对业务不熟,对代码不熟,对流程不熟,所以他们会问出很多资深工程师已经忘记的问题:"这个函数为什么这么写?""这个配置为什么在环境变量里而不是配置文件里?""这个模块的负责人是谁?""上线流程为什么要有这一步?"这些问题中有相当一部分是低质量的,但也有一部分会准确地暴露团队知识的盲区:文档缺失、命名混乱、流程冗余、模块边界不清。
如果没有 Junior,这些盲区会一直存在,直到某个关键时刻变成事故。有了 Junior,它们会在日常工作中被不断提出、被解决、被固化下来。
初级工程师还承担着一个更重要的角色:让 Senior 变成更好的 Senior。带新人是一个极其有效的知识抽象过程。当你需要向一个没有上下文的人解释一个系统时,你被迫把经验从"我知道怎么做"抽象为"我怎么让别人也知道怎么做"。这个过程会暴露你的知识缺口,也会强化你的表达能力和系统思考能力。很多资深工程师在带过一两个 Junior 之后,对系统架构的理解反而更清晰了,原因是"教是最好的学"。
当然,初级工程师的价值不是自动发生的,它依赖一个前提:团队里有足够的结构和机制去承接他们。如果没有导师、没有任务拆分、没有评审流程、没有可运行的最小开发环境,Junior 的加入确实会让团队短期效率下降。但这不能证明"不该招 Junior",只能证明你的团队基础设施还不具备培养人才的条件。
所以,真正的问题不是"要不要招 Junior",而是"你愿不愿意为了建立人才梯队,去完善那些本来就应该存在的工程机制"。
4. 算清成本账:只招资深并不会更省钱
讨论招聘策略时,最终都会回到成本。很多管理者的逻辑是:一个资深工程师能干两个初级工程师的活,开两个初级工程师的钱雇一个资深工程师,单位成本更低,产出更高。这个逻辑只有在"工作量完全线性可加"的假设下才成立,但现实工程中几乎没有这种场景。
真实情况是,资深工程师的产出优势高度依赖任务性质。面对一个复杂系统设计或者一个疑难线上故障,资深工程师的效率可能是 Junior 的十倍;但面对一个边界清晰的普通需求、一段接口联调、一批测试用例补充,资深工程师的效率可能只是 Junior 的 1.2 倍。如果团队中的高复杂度任务占比不到 30%,那么全员资深其实是巨大的资源浪费。
下面用一个小脚本模拟这个成本账。假设资深工程师月薪 50000,初级工程师月薪 15000,资深工程师每月产出 1 个标准单位,初级工程师每月产出 0.4 个标准单位,同时每个初级工程师需要消耗资深工程师 10% 的时间做辅导。对比两种人力方案:3 个资深工程师,与 1 个资深工程师加 2 个初级工程师。
# 文件路径:team_cost_model.py def annual_cost(senior_salary, junior_salary, senior_count, junior_count): return (senior_count * senior_salary + junior_count * junior_salary) * 12 def capacity_per_month(senior_count, junior_count): # senior 月产出 1 个单位,junior 月产出 0.4 个单位 # 每个 junior 需要消耗 senior 10% 的时间做辅导 senior_units = senior_count * 1.0 - junior_count * 0.1 junior_units = junior_count * 0.4 return max(0, senior_units) + junior_units senior_salary = 50000 junior_salary = 15000 cost_all_senior = annual_cost(senior_salary, junior_salary, senior_count=3, junior_count=0) cost_mixed = annual_cost(senior_salary, junior_salary, senior_count=1, junior_count=2) cap_all_senior = capacity_per_month(senior_count=3, junior_count=0) cap_mixed = capacity_per_month(senior_count=1, junior_count=2) print("3 资深方案年成本:", cost_all_senior) print("1 资深 + 2 初级方案年成本:", cost_mixed) print("3 资深方案月产出单位:", cap_all_senior) print("1 资深 + 2 初级方案月产出单位:", cap_mixed) # 单位成本对比 print("3 资深方案单位成本:", round(cost_all_senior / (cap_all_senior * 12), 2)) print("混合方案单位成本:", round(cost_mixed / (cap_mixed * 12), 2))把脚本跑起来,你会看到两个方案的年成本和三组关键数值。如果只看年成本,3 资深方案明显更高;如果看单位成本,混合方案在模型里往往更低,即使把辅导成本也算进去。这里的参数是示意性的,你完全可以用你所在城市的真实薪资和实际产出系数替换,但结论方向是稳定的:当团队的高复杂度任务占比不高时,全员资深是性价比最低的结构。
这个模型还没有算另外两笔隐性成本:招聘成本与留任成本。资深工程师在市场上是稀缺资源,招聘周期长、竞争激烈,入职后由于习惯差异,融入风险也不低。初级工程师则更容易通过校招和实习渠道找到,招聘周期短,对第一份工作的忠诚度通常更高。如果一个组织把资源全部压在稀缺人才上,它实质上是在用高成本维持一个脆弱的抗风险结构。
5. 从团队诊断入手:你缺的是人才结构,不是招聘数量
在动手招聘之前,先别急着写 JD。先回答一个问题:你的团队现在到底缺什么?是缺执行人手,还是缺知识断层,还是缺架构设计能力?这三种缺口对应的解法完全不同。
缺执行人手时,你需要的是补齐基础开发力量,这时候 Junior 是很好的选择,但要确保任务拆分足够清晰;缺知识断层时,你需要的是建立文档、评审和知识共享机制,这时候招再多 Senior 也没用,因为问题出在信息流动而不是人员数量;缺架构设计能力时,你可能确实需要一位资深架构师,但只招一位是不够的,还要让他在团队内建立设计评审流程,把能力传导出去。
更实用的做法是先做一次团队诊断。核对你当前的团队是否出现了下面这些征兆:
| 诊断项 | 健康表现 | 风险表现 |
|---|---|---|
| 核心模块知识集中度 | 多数模块至少有两个人能讲清楚 | 每个模块只有一个灵魂人物 |
| 文档覆盖率 | 新成员能通过文档完成开发环境搭建 | 新人只能靠问人了解系统 |
| 代码评审质量 | 评审中会出现实质技术讨论 | 评审基本都是 LGTM |
| 任务类型分布 | 重复性工作由工具或低阶成员处理 | 资深成员大量处理琐事 |
| 晋升通路 | 有明确的能力标准和成长路径 | Junior 没有晋升希望 |
| 事故复盘 | 复盘中会补全机制缺口 | 复盘会变成追责会 |
如果诊断出三项以上风险,说明你的问题不是"缺资深",而是"组织基础设施不健全"。这时候引入 Junior,反而是一个推动基础设施建设的契机。
这里要特别说明:不是所有团队都适合大规模引入 Junior。如果是早期创业公司,产品方向还在剧烈变化,核心架构三天两头调整,这时候引入大量 Junior 会让团队不堪重负。更稳妥的做法是前期以资深为主,打磨出一套稳定的工程规范,再逐步开放 Junior 名额。引入 Junior 的节奏应该是"先建机制,再进人",而不是反过来。
6. 完整示例:Junior 工程师招聘与培养的关键模板
6.1 招聘 JD 模板
很多团队写 Junior 岗位 JD 时,习惯照抄 Senior 的要求,只是把年限改成"一到三年",结果候选人要么不敢投,要么投进来之后被大量要求吓跑。Junior 岗位的 JD 应该突出三个关键词:基础扎实、学习能力、沟通意愿。下面是一个可以直接参考改写的模板:
# 招聘职位:初级后端工程师(Junior Backend Engineer) ## 你会在团队中做什么 - 在资深工程师的指导下,负责业务接口的设计、开发与测试; - 参与线上问题排查,学习从日志到根因的完整分析方法; - 参与代码评审,阅读并理解团队核心模块的实现; - 与产品、测试协作,将需求拆解为可执行的技术任务。 ## 我们希望你具备 - 计算机相关基础知识扎实:数据结构、操作系统、网络; - 至少熟悉一门后端语言,能写清晰可读的代码; - 理解常见 Web 服务的请求链路,知道 HTTP、数据库、缓存的基本概念; - 遇到问题能先独立搜索、验证,再带着上下文提问; - 愿意接受 review 意见,并能对不理解的地方主动追问。 ## 加分项 - 有个人项目或开源项目经历; - 写过单元测试; - 有过用 Docker 部署应用的经验。 ## 我们不要求 - 不要求多年一线大厂经验; - 不要求熟悉公司内部技术栈,入职后有完整的上手文档和导师; - 不要求第一天就能独立交付大型需求,前两个月以学习和小型任务为主。这个 JD 的价值在于明确划定了"我们要求什么、我们不要求什么"。它向候选人传递的信息是:这里不是一个用岗位要求吓人的团队,而是一个愿意投入资源培养新人的团队。
6.2 面试评估表模板
面试 Junior 时,评价重点不是"现在能干什么",而是"学习速度和反馈速度"。如果你用面 Senior 的标准去面 Junior,很多优秀候选人在第一轮就会被误杀。建议使用分维度评估表,而不是让面试官凭感觉打分:
candidate: name: "候选人姓名" position: "junior-backend-engineer" interview_date: "2025-01-10" dimensions: coding_basic: score: 7 note: "能写出可运行的排序算法,但边界条件考虑不全" debugging: score: 6 note: "能通过日志定位到方法级,但不熟悉断点调试" learning_ability: score: 8 note: "能复述上一轮面试中刚学习到的知识点,提问有针对性" communication: score: 7 note: "表达清晰,能承认不知道,并且主动追问" risks: - "需要补语言基础集合框架知识" - "调试工具使用较少,可能需要一周上手时间" hire_recommendation: "建议录取,成长潜力大于当前熟练度" mentor_suggestion: "建议安排擅长 Debug 引导的导师"这个 YAML 格式可以直接落到招聘系统或飞书文档里。每一轮面试官都需要填写四个维度中的至少两个,并给出具体证据,而不是只写"这个人不错"。
6.3 入职培养计划模板
Junior 入职后的前四周是决定留存率的关键期。如果第一周就扔进大业务需求,第三天就想让他提交大型 PR,结果往往是一份质量堪忧的代码加上一段很低的自尊心。更合理的做法是把前四周设计成一个个小里程碑,每个里程碑都有明确产出和评审节点:
{ "mentor_rotation": [ { "week": 1, "goal": "熟悉开发环境与代码规范", "task": "提交第一个文档型 PR,跑通本地开发链路" }, { "week": 2, "goal": "理解核心业务链路", "task": "画出订单模块时序图并找 mentor 评审" }, { "week": 3, "goal": "独立修复 P3 级别 bug", "task": "在测试环境验证并补充回归用例" }, { "week": 4, "goal": "独立完成一个小需求", "task": "从方案设计到发布全流程,需要 senior 二次评审" } ], "definition_of_done": [ "代码通过 CI 且测试覆盖率达到项目要求", "关键逻辑有注释或设计说明", "PR 有至少一位资深工程师 review 合入", "本地运行和预发布环境验证通过", "上线后观察 24 小时无异常" ] }这份培养计划的核心不是"让 Junior 产出多少代码",而是让他建立起完整的工程闭环意识:从能跑通环境,到看懂链路,到独立修复一个问题,再到完整交付一个需求。每一步都有导师参与,但每一步都要求 Junior 自己动手。这是把新人培养成稳定生产力最快的方式。
7. 配套机制:让 Senior 和 Junior 都能加速的工程实践
引进 Junior 之后,如果不想让团队效率被拖垮,必须有配套机制。这个机制不是额外的负担,而是团队本来就该有的工程基础设施。以下四个环节最重要。
7.1 代码评审:从"挑错"变成"知识转移"
代码评审是 Junior 成长最快的地方,但前提是评审不是走过场。Senior 在评审 Junior 的 PR 时,不应该只指出"这里不行",还应该解释"为什么不行"和"什么是好的做法"。
# Code Review Checklist ## 正确性 - [ ] 是否处理了空值和异常分支 - [ ] 是否考虑了并发、超时、重复提交等边界条件 - [ ] 变更是否与需求描述一致,有没有多改无关代码 ## 可读性 - [ ] 命名是否表达业务语义,而不是仅仅描述实现细节 - [ ] 是否存在过长方法和魔法数字 - [ ] 注释是否解释了"为什么",而不是复述"是什么" ## 知识与传承 - [ ] Junior 提出的问题是否被回答,并沉淀到文档或评论区 - [ ] 是否指出了问题的根因,而不是只贴一个补丁式解决方案 ## 可发布性 - [ ] 是否有测试覆盖,测试是否能证明改动有效 - [ ] 是否考虑了兼容性、迁移脚本和老数据 - [ ] 发布计划和回滚方案是否明确这份 Checklist 可以放到团队的 Git 仓库里,每个 PR 模板自动带上。Senior 评审时在对应的方框里打勾,Junior 也可以通过它自检,减少第一轮低级错误。
7.2 文档:最小但必须
很多资深团队不做文档,理由是"代码可读性高"。但当团队里有了 Junior,文档的价值会被重新定义:它决定了一个新人从入职到独立开发需要多久。不需要写长篇大论文档,只需要维护四类内容:环境搭建指南、核心架构设计说明、上线流程手册、常见问题 FAQ。Junior 的入职任务之一,就是按照文档走一遍流程,并把文档中不准确的地方修正过来。这既利用了 Junior 的"新人视角",又把文档维护工作分散到了日常。
7.3 师徒制:不是分配"导师"就行
师徒制最容易犯的错误是只挂名不负责。更有效的做法是给导师设定明确的培养目标,并纳入 OKR 或绩效评价。师徒双方每周至少有一次一对一交流,每次交流要有结论和行动项。Junior 的第一个月目标不是产出,而是能独立回答三个问题:系统怎么跑起来?核心链路是什么?出问题了我应该找谁?导师的核心职责是帮 Junior 建立对系统的心理模型,而不是代写代码。这里真正容易踩坑的地方是:导师把一对一交流变成"同步进度",十分钟就结束。更好的方式是让 Junior 提前准备至少三个问题,导师负责深入回答,并且追问"你为什么要问这个问题"。
7.4 任务拆分与定义完成
Junior 能接手的任务,边界一定要清晰。一个任务如果连 Senior 都需要讨论方案才能开始,就不应该分给 Junior。合理的拆分方法是在需求拆解阶段,把任务按影响面和复杂度分级:P0 核心链路、P1 普通业务、P2 边缘功能、P3 体验优化。Junior 应该从 P2 和 P3 开始,逐步过渡到 P1。每个任务在开工之前先明确 Definition of Done,没有明确 DOD 的任务不进入开发。
8. 效果验证:用数据证明梯队建设的价值
说了这么多,最终还是要回答一个问题:人才梯队建设到底有没有效果?靠感觉不行,得有数据。下面这个脚本利用 Git 历史分析仓库中的"知识集中度"。
知识集中度是衡量团队脆弱性的重要指标。如果一个文件长期只有一个人修改,那么这个模块的知识就集中在这一个人身上;他一旦请假或离职,整个模块的交付就会受影响。一个健康团队的目标是让核心文件至少有两个人参与维护。
# 文件路径:analyze_bus_factor.py # 功能:分析 git 历史,统计"单人维护文件"占比 import subprocess from collections import defaultdict def analyze(repo_path=".", since="2024-01-01"): cmd = [ "git", "-C", repo_path, "log", "--since", since, "--pretty=format:%x00%an", "--name-only" ] output = subprocess.run(cmd, capture_output=True, text=True).stdout blocks = [b for b in output.split("\x00") if b.strip()] file_authors = defaultdict(set) for block in blocks: lines = block.strip().splitlines() if not lines: continue author = lines[0].strip() for file in lines[1:]: if file.strip(): file_authors[file.strip()].add(author) if not file_authors: print("没有分析到任何文件,请检查 git 路径和分支") return single_owner = [f for f, authors in file_authors.items() if len(authors) == 1] total = len(file_authors) ratio = len(single_owner) / total * 100 print("总文件数:", total) print("单人维护文件数:", len(single_owner)) print("单人维护占比: {:.1f}%".format(ratio)) print("--- 风险最高的核心文件 ---") for f in sorted(single_owner)[:30]: print(" ", f) if __name__ == "__main__": analyze()在项目根目录执行:
python analyze_bus_factor.py输出中如果单人维护占比超过 40%,说明团队知识集中度已经偏高。这个指标不需要追求绝对的 0,因为一次性的脚本和配置文件大概率只有一个人动过;你需要重点关注的是核心源代码目录下的单人文件比例。这个统计应该每个月跑一次,观察趋势。如果引入 Junior 并进行团队轮换后,核心文件的单人维护占比开始下降,说明知识转移确实在发生。
除了知识集中度,还可以用另一组指标验证梯队建设效果:Junior 入职后第一次独立发布需求的时间、Junior 提交 PR 到合入的平均时间、Senior 主动发起技术分享的频次、模块 owner 数量、线上事故的平均发现时长。这些指标可以从研发效能平台里导出,没必要一次性全上,先选两个季度内相对容易拿到数据的指标。
9. 常见问题、排查思路与最佳实践
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 团队全员资深,线上事故反而增加 | 核心模块知识单点,架构演进无人敢碰 | 用 git 分析单人维护文件占比 | 引入评审机制和结对编程,强制轮换 |
| 招了 Junior 后,交付速度短期内下降 | 任务拆分不清晰,导师投入不足 | 检查 Junior 是否被直接抛入大型需求 | 建立分阶段培养计划,先小任务再大任务 |
| Senior 不愿意带 Junior,觉得浪费时间 | 导师职责未写入绩效,回报机制缺失 | 回顾绩效指标是否包含培养贡献 | 把辅导行为纳入晋升和绩效评价 |
| Junior 入职后 3 个月内流失 | 培养方式靠"放养",没有成长反馈 | 做离职面谈,检查前 4 周里程碑是否完成 | 每月做 1:1 复盘,明确成长路径 |
| 老板只愿意批 Senior 的 HC | 管理层没有看见人才梯队的长期价值 | 用单位成本模型和知识集中度指标汇报 | 先试点一个"1 Senior + 2 Junior"小组出数据 |
| 代码评审流于形式 | PR 过大、Reviewer 选择随意 | 统计 PR 评审评论数和合入时长 | 控制 PR 规模,指定固定 reviewer |
| 团队没有文档,Junior 只能靠问人 | 文档维护没有被纳入日常 | 让 Junior 按文档走流程并记录卡点 | 把文档更新作为 PR 的一部分 |
| 培养计划执行一段时间后失去效果 | 目标过于笼统,无法检验 | 检查每个里程碑是否有可交付物 | 参考 6.3 的 JSON 模板,每个阶段设明确产出 |
最后补充几条工程管理建议,它们不针对某一类团队,而是面向所有正在考虑人才结构调整的技术负责人:
第一,把"招聘 Junior"当成一次团队基建投资,而不是成本压缩。它需要配套的文档、评审机制和导师体系,没有这些前提,招 Junior 确实会拖累效率;有这些前提,Junior 会成为团队最具弹性的力量。
第二,给 Junior 设计一条真实可见的成长路径。路径不需要很复杂,但要明确:刚入职能做什么,3 个月后能做什么,1 年后能承担什么。没有成长的 Junior 留不住,而这笔流失损失比培育成本更严重。
第三,不要用同一把尺子要求所有层级。Junior 的考核重点应该是学习效率、任务执行力和沟通透明度,而不是"架构设计能力"或"推动跨团队协作"。把高级岗位的评价维度套在 Junior 身上,只会得到一群不敢说话、只求稳妥的"初级执行者"。
第四,持续监测知识集中度指标。一个团队最危险的时刻不是有 Junior 犯错,而是某个核心模块的负责人离职时,才发现没有任何一个人能接手。
回到标题那句话:Not hiring junior engineers won't solve the problem you think you have。这句话的准确含义不是说每一种团队都必须立刻招 Junior,而是说,如果你不招 Junior 的理由是"怕拖慢节奏、怕没人带、怕代码质量下降",那么这些理由指向的不是招聘策略问题,而是工程机制问题。修好机制,你完全可以拥有一支既有 Senior 深度、又有 Junior 活力的可持续团队。