大型科技公司优秀工程师写出低劣代码的技术分析

一、问题概述

1. 问题背景

大型科技公司偶尔会出现令人惊讶的低劣代码,这种现象在外界看来似乎难以理解。这些公司支付有竞争力的薪资吸引优秀工程师,且开发节奏相对缓慢,看起来有充足时间写出高质量的代码。

2. 核心问题

为什么优秀工程师在大型科技公司会写出低劣代码?

这个问题的本质是:在大规模软件开发环境中,系统性因素如何导致个体工程师在非专业领域工作时产生技术债。

3. 分析范围

A. 涉及角色

  • 初级工程师
  • 资深工程师(老手)
  • 技术管理者

B. 涉及系统

  • 大型遗留代码库
  • 频繁重组的团队结构
  • 工程师流动性管理机制

二、问题分析

1. 直接原因

A. 工程师在非专业领域工作

大型科技公司充满了在自身专业领域之外工作的工程师。这种现象的主要表现:

  • 平均任期短:大型科技公司工程师平均任期仅 1-2 年
  • 内部流动性高:工程师经常被重新分配到不同团队
  • 代码库寿命长:许多服务已有十年或更久历史

B. 薪酬结构的设计

大型科技公司的薪酬包裹通常设计了 4 年上限:

  • 初始股票授予在 4 年后完全归属
  • 4 年后工程师可能面临 50% 的降薪
  • 公司提供的年度续期奖励具有不确定性
  • 这种结构实际上激励工程师跳槽
graph LR
    A[入职] -->|第1年| B[股票25%归属]
    B -->|第2年| C[股票50%归属]
    C -->|第3年| D[股票75%归属]
    D -->|第4年| E[股票100%归属]
    E -->|面临降薪风险| F{选择}
    F -->|获得续期| G[留下]
    F -->|无续期| H[跳槽]

工程师任期与薪酬关系图

C. 持续学习状态

许多大型科技公司的工程师持续处于学习状态:

  • 高比例的代码变更由新手完成
  • 新手定义:过去 6 个月内加入公司、代码库或编程语言的工程师
  • 工程师不断适应新系统、新语言、新团队

2. 根本原因分析(5 Whys)

A. 为什么工程师在非专业领域工作?

第一层:工程师平均任期短,代码库寿命长

第二层:为什么任期短?
薪酬结构设计为 4 年上限,之后面临降薪风险

第三层:为什么这样设计薪酬?
公司希望保持工程师流动性,以便快速调配资源

第四层:为什么需要高流动性?
公司优先考虑内部可见性而非生产力

第五层:根本原因
大型科技公司为了获得快速部署工程师的能力,主动牺牲了部分专业知识和代码质量。这是一种深思熟虑的权衡。

B. 为什么没有及时发现和阻止问题?

老手机制的两个缺陷

缺陷 1:过程完全非正式

  • 公司几乎不投入资源培养个人对特定系统的长期专业知识
  • 一旦工程师获得专业知识,公司也不重视保留
  • 老手经常被调往不同服务
  • 要么在不获得报酬的基础上自愿承担老手职责,要么放弃并成为新系统的初学者

缺陷 2:资深工程师总是过载

  • 成为少数对特定服务有深入理解的工程师是一项忙碌的工作
  • 没有足够时间亲自审查每个软件变更
  • 无法积极参与每个决策过程
  • 工程师还有自己的工作要完成
  • 如果花所有时间审查变更和参与讨论,可能会因个人产出不足而受到惩罚
graph TB
    A[代码变更] --> B{有老手审查?}
    B -->|是| C[老手过载]
    B -->|否| D[低劣代码合并]
    C --> E{时间充足?}
    E -->|否| D
    E -->|是| F[提出改进建议]
    F --> G[初级工程师实施]
    G --> H{理解正确?}
    H -->|否| D
    H -->|是| I[代码合并]
    C --> J[个人工作受影响]
    J --> K[绩效考核下降]

代码审查流程问题分析图

3. 中产工程师画像

典型的中产工程师具备以下特征:

A. 能力水平

  • 足够胜任,通过招聘标准并能够完成工作

B. 工作状态

  • 在对他们来说基本陌生的代码库或语言上工作
  • 或者试图在管理自己工作的同时跟上大量代码变更

C. 时间压力

  • 几乎肯定在截止日期下工作
  • 或者同时在多个不同项目的重叠截止日期下工作

D. 环境特征

他们正试图在一个不利于产生高质量代码的环境中尽力而为

三、问题演化

1. 典型问题场景

A. 场景描述

初级工程师接手一个基本不熟悉的代码库中的错误修复任务

B. 处理流程

  1. 探索阶段:花几天时间理解问题
  2. 初步方案:提出一个临时的解决方案
  3. 审查环节

    • 如果幸运,资深老手会在空闲的半小时内瞥一眼
    • 否决临时方案
    • 建议稍微更好的方案
  4. 实施阶段:初级工程师尽可能实施建议方案
  5. 测试验证:测试功能正常
  6. 合并发布:简要审查后发布
  7. 立即转向:所有相关人员立即转向更高优先级的工作

C. 长期后果

5 年后的困境

  • 有人注意到这段代码
  • 想法:太临时了,这样的大型软件公司怎么写出这样的低劣代码

2. 系统性因素

A. 公司优先级权衡

大型科技公司优先考虑:

  • 内部可见性:一目了然地知道谁在做什么并随意更改
  • 资源流动性:快速将熟练工程师部署到月度问题上
  • 而非生产力:牺牲专业知识和软件质量

B. 权衡的合理性

这种权衡在 2025 年尤为重要:

  • AI 相关技术转型速度至关重要
  • 公司需要快速调整方向
  • 工程师被视为可替代资源
graph LR
    A[公司目标] --> B{优先级}
    B -->|可见性| C[工程师可替代性]
    B -->|生产力| D[专业知识积累]
    C --> E[快速资源调配]
    D --> F[高质量代码]
    E --> G[适应AI时代]
    F --> H[技术债减少]
    G -->|选择| I[接受低劣代码]

公司优先级权衡图

3. 工程师的无力感

A. 个人影响力局限

工程师完全无力改变这种动态,特别是在 2025 年:

  • 权力平衡已从工程师转向科技公司领导层
  • 个人工程师最多只能尝试成为老手
  • 在至少一个领域发展专业知识
  • 用它来阻止最糟糕的变更

B. 职业风险

即使成为老手也存在风险:

  • 往往逆着组织潮流游泳
  • 如果操作不当可能导致被 PIP(绩效改进计划)
  • 甚至更严重的后果

四、纯工程与不纯工程

1. 工程类型对比

A. 纯工程

特征

  • 工程师在独立的技术项目上工作
  • 例如:编程语言开发
  • 对低劣代码的唯一解释是无能

B. 不纯工程

特征

  • 更像水管工或电工的工作方式
  • 在相对陌生的项目上按截止日期工作
  • 即使技术基础无可挑剔
  • 总有一些特定设置的尴尬或令人惊讶之处
  • 对不纯工程师来说,低劣代码是不可避免的
  • 只要整个系统运行良好,项目就是成功的

2. 大公司的现实

在大型科技公司:

  • 工程师无法决定是从事纯工程还是不纯工程工作
  • 这不是他们的代码库
  • 如果公司想让你从数据库基础设施转移到构建新的支付系统
  • 他们完全有权这样做
  • 在不熟悉的系统中犯错是公司权衡的结果
  • 而不是工程师的权衡
graph TD
    A[工程师技能] -->|纯工程| B[独立项目]
    A -->|不纯工程| C[现有系统维护]
    B --> D[技术质量可控]
    C --> E[受系统复杂度限制]
    E --> F[低劣代码不可避免]
    G[公司决策] -->|资源调配| H[工程师迁移]
    H --> C
    G -->|权衡取舍| I[接受质量损失]

工程类型与代码质量关系图

五、影响分析

1. 对工程师的影响

A. 职业发展

  • 持续学习压力
  • 难以深入掌握特定领域
  • 技能广度增加但深度受限

B. 心理状态

  • 持续的初学者心态
  • 对代码质量的无力感
  • 对未来不确定性的焦虑

2. 对代码质量的影响

A. 技术债积累

  • 临时解决方案长期存在
  • 缺乏整体架构视角
  • 补丁式修复而非根本解决

B. 维护困难

  • 知识分散且不连续
  • 文档更新滞后
  • 历史决策背景丢失

3. 对公司的影响

A. 短期收益

  • 快速资源调配能力
  • 适应市场变化
  • 降低对特定个人的依赖

B. 长期成本

  • 代码质量下降
  • 系统复杂性增加
  • 潜在的稳定性风险

六、解决方案探讨

1. 个人层面

A. 成为老手

  • 在至少一个领域发展专业知识
  • 主动参与代码审查
  • 指导新工程师

B. 局限性

  • 逆着组织潮流
  • 需要额外时间投入
  • 可能影响个人绩效

2. 团队层面

A. 知识保留机制

  • 改进文档实践
  • 建立知识传承流程
  • 减少关键人员流失影响

B. 代码审查改进

  • 确保有经验工程师参与
  • 提供足够时间进行深入审查
  • 建立审查质量标准

3. 公司层面

A. 结构性调整可能

  • 重新思考工程师流动性策略
  • 在可见性和生产力间寻找更好平衡
  • 投资长期专业知识培养

B. 现实约束

  • 当前的权衡对大公司有效
  • AI 时代需要快速转型
  • 改变可能影响竞争优势

七、总结与反思

1. 核心观点

大型科技公司优秀工程师写出低劣代码的根本原因不是工程师无能,而是系统性环境使然

  • 大多数大公司工程师被迫在不熟悉的代码库中进行大部分工作
  • 这是公司为了资源流动性而做出的主动权衡
  • 即使工程师能力提升两倍,仍然会有低劣代码
  • 因为几乎没有人能立即进入全新的代码库并快速做出零错误的变更

2. 认知偏差

A. 外部视角

  • 想象自己的工作环境与每个人都相似
  • 缺乏想象力是主要失败
  • 认为低劣代码必然是无能的表现

B. 内部现实

  • 不纯工程的本质决定了低劣代码不可避免
  • 只要整个系统运行良好,项目就是成功的
  • 代码质量不是唯一衡量标准

3. 局限性认知

A. 指出问题的影响

  • 可以是修复特定示例的有效方式
  • 高管通常会抓住机会将坏公关变成好公关

B. 错误归因的风险

  • 将主要责任归咎于工程师是错误的
  • 忽视了系统性因素
  • 无助于根本解决问题

4. 对工程师的建议

A. 理解现实

  • 接受不纯工程的现实
  • 认识到个人影响力有限
  • 在约束条件下尽力而为

B. 策略性应对

  • 选择性成为老手
  • 平衡个人工作与知识分享
  • 保护自己免受系统性风险影响

C. 心态调整

  • 适度的愤世嫉俗是必要的
  • 不要对公司过度理想化
  • 在可能的情况下做出积极改变

参考资料

  1. How good engineers write bad code at big companies
最后修改:2026 年 01 月 16 日
如果觉得我的文章对你有用,请随意赞赏