“代码写成一坨屎却能受重用”这件事,我在不同公司见过至少五回,每次吐槽的同事都觉得“无解”,我一开始也觉得无解,后来踩过的坑多了才反应过来:不是没解,是我们一直用“技术人的评分标准”去衡量“领导心中的价值”,尺子拿错了,自然怎么量都不对。
先说清楚,这篇我不是来安慰你的。我既不会说“博士就是会包装”这种情绪话,也不会灌“迟早露馅”这种毒鸡汤。我想做的是,把“博士同事代码烂却受重用”这个现象彻底拆开,从领导视角、职场博弈、需求管理、代码债务四个方向逐个解剖,然后给你一套真正能落地的自救方案。里面包含大量我在项目里踩过的坑,也会有具体的需求梳理模板和代码整改实操,希望对你有用。
1. 先别急着骂“博士”——领导眼中的价值排序和你完全不一样
很多技术人有一个默认前提:代码写得好 = 工作做得好。基于这个前提,看到“代码烂”的人被领导看重,第一反应就是“领导瞎了眼”。但实际上,领导不是瞎,是你们俩用的根本不是同一张评分卡。
1.1 领导眼里的核心价值:稳定、可控、向上能交代
做过管理的人都知道,一个需求从提出到上线,中间变量太多了:业务方说不清楚、产品方案反复改、排期突然被压缩、做一半发现技术方案根本走不通。在这种环境下,领导最怕的不是代码烂,而是“失控”——需求问东答西、进度一问三不知、风险藏到上线前一天才爆。
博士同事哪怕代码写得烂,只要他能在会上声音洪亮地讲出“我打算怎么搞、目前到哪一步了、什么时候能交付”,领导对他的评价就已经站在“可控”这一档。而代码写得好但沉默寡言的同事,开会只说“还在做”,领导心里默认是“不可控”。这不是讽刺,这是管理视角的日常。
我举个真实例子。之前项目组里有个老哥,代码功底明显高出博士一截,代码审查意见几乎挑不出毛病。但每次产品评审,他都一句话不说,做完就默默丢到测试环境。结果季度复盘,领导评价他“主动性不足、跨部门协作待提升”。博士同事呢?每周主动写一个“Alpha版本进展汇报”邮件,塞进各种数据图表,哪怕功能只跑到40%,领导已经在周会上拿他举例“项目进展顺利”了。
1.2 “不了解需求就开搞”的另一面:执行力被当成优点
这点更气人,但我们必须承认,在一些管理者眼中,“不了解需求就先动手”会被包装成“执行力强”“很有冲劲”。尤其是当团队里大部分人还在谨慎评估、迟迟不动手时,博士已经把原型跑起来了——哪怕跑错方向,领导看到的也是“速度”和“响应力”。
这不是说“不了解需求就开搞”是对的,而是说领导的价值系统里,“快”本来就是权重很高的指标。尤其在向上汇报压力大的时候,领导需要“有东西可以讲”的手下,而不是“还在了解需求”的手下。
我见过最夸张的一次,需求方只给了半句话“要把用户访问数据做成看板”,博士第二天就搭出一个半成品页面,功能不对、数据也不准,但大领导路过往屏幕上一瞥,说了句“不错,年轻人有执行力”。底层同事气得半死,但在领导眼里,这一瞥已经盖过了后面两周的返工成本。
1.3 学历光环与“信任前置”:博士身份是隐性的信用背书
这个原因说出来可能不好听,但真实存在。博士这个标签,在非技术出身的管理者眼里,约等于“聪明、靠谱、有钻研能力”。因为有了这层信任前置,他讲出来的话天然比普通同事的可信度高一个档位。
同样是说“这个方案可行”,普通同事说出来,领导可能会追问一句“你确认过了吗”;博士说出来,领导往往点头。同样是一个功能延期,普通同事找理由会被当成借口,博士找理由会被当成“技术难度确实大”。这种隐性信任,让博士在领导那里的容错率比你高得多。
明白这一点,你会发现“无解”是一个假象。真正的问题不是“博士为什么被看重”,而是“凭什么让领导也这样看重我”。这才是值得投入精力的方向。
2. 代码烂不是玄学——“一坨屎”的四个典型技术信号
光吐槽代码烂没有说服力。我做了几年Code Review,发现“烂代码”烂得都很有规律。建议你对照这四个信号,看看那位博士同事到底踩了哪几条,好针对性下手。
2.1 命名反人类、结构混乱:代码可读性灾难
烂代码第一症状是命名灾难。变量叫a、b、tmp,函数叫dealData、doThing、handle111,一个方法三五百行,没有任何注释。你问他这个函数干什么的,他能讲出前后矛盾的两个版本。
可读性差带来的直接后果,不是“看着不舒服”,而是任何一个接手的同事都要花大量时间考古。每修一个Bug,得先花两小时搞懂他在写什么。这种隐形成本是最致命的——它会拖慢整个团队的速度,哪怕只有一个人的代码烂,全体成员都会跟着买单。
我曾经在项目里接手过一个遗留模块,一个 800 行的函数,里面嵌套了六层 if-else,变量复用同一个名字七次,且每次类型都不同。我第一遍读完,大脑直接过载,只能把代码一行一行抄到新文件,边抄边加注释,才勉强搞明白流程。那次之后我就立了规矩:新代码不通过命名审查,直接打回。
2.2 代码解耦?不存在的:牵一发动全身的耦合地狱
烂代码第二个特征是强耦合。模块之间没有任何边界,函数直接读全局状态,业务逻辑和 UI 混在一起,改一个字段能影响六个页面,删一个文件能让整个服务启不来。
这种代码最怕的不是“烂”,而是“没有人敢动”。你改了这里,不知道哪里会炸,于是大家只能无休止地在上面打补丁。补丁多了,代码越来越厚,越来越乱,最后变成谁都不敢碰的屎山。如果你在产品迭代快、需求经常变的业务里工作,这种耦合的代码简直是灾难中的灾难。
日常开发里“代码解耦”这个词,博士同事大概率听过,但从来没动手做过。因为他解耦需要先设计、再重构、再回归测试,这些环节在他“先跑起来再说”的节奏里全被砍掉了。结果就是上线一时爽,维护火葬场。
2.3 没有测试、没有监控:风险全靠线上用户顶雷
劣质代码的第三信号,是几乎没有自动化测试。功能能跑就算完,不写单元测试、不写集成测试,甚至连基础冒烟测试都懒得做。上线之后也没有有效监控,应用报错全凭用户投诉,然后人肉排查。
这带来的体验是灾难级的:线上出问题,你根本不知道是哪个模块、哪次改动引入的,只能一台一台查日志,一行一行对代码。排查成本高得离谱,而且每次线上故障,整个团队都得跟着陪绑——半夜被叫起来处理问题的,往往不是写烂代码的人,而是后续接盘的同事。
不要觉得“没有测试”是小问题。在没有测试保护的代码库里,上线的每一次改动都是在赌命。我一个同事被打回 Bug 的原因,就是他改了一行判断条件,结果把某个用户的老数据全部重置了。如果当时有单元测试覆盖,这种低级错误不会留到线上。
2.4 文档缺失最致命:需求文档、规格说明书一样没有
代码烂之外,博士同事往往还有一个致命伤:不写文档。需求阶段不输出需求规格说明书,设计阶段不画流程图,开发完不补接口文档,交接时只有口头一句“你看看代码就懂了”。
文档缺失的杀伤力比代码烂还狠。代码再烂,你还能一行行读;需求不落地成文档,后面就是无底洞——需求从哪来的、业务方想要什么、方案为什么这么做、哪些边界被否过,这些信息全部锁死在博士的脑子里。他一休假、一离职,团队瞬间失忆。
我见过太多团队,上线半年后问当初需求是谁提的,已经没有人说得清;问这个逻辑为什么这样实现,所有人面面相觑。这时候你会发现,外包维护团队报价翻倍是有道理的——人家卖的就是从屎山代码里考古的成本。
3. 想不被“不了解需求就开搞”带节奏?吃透需求的三个落地步骤
关于需求分析这个话题,网上的方法论已经泛滥到令人麻木了,什么五问法、用户故事、敏捷估算,听着都对,用起来全废。我挑了三个我自己一路跌撞才掌握的动作,分享出来,它们比很多方法论都实用——核心就一句:把口头讨论变成白纸黑字的文档,再用文档逼着所有人对齐。
3.1 第一步:把模糊需求翻译成“需求规格书”——哪怕只有一页
很多同事听到“需求规格说明书”就发怵,觉得那是产品经理的活。但我的经验是,干开发的人最该自己养成的,就是随手把需求“文档化”的习惯。你不用写几十页正式文档,你只需要在自己的项目笔记里,把需求转译成结构清晰的几条:
- 用户是谁:谁在用这个功能,解决他什么痛点
- 核心场景:在什么时间、什么状态、什么操作下会走到这里
- 输入输出:需要什么数据、经过什么处理、产出什么结果
- 边界条件:哪些情况不处理、哪些异常忽略、哪些数据直接丢弃
这四条写清楚,你对需求的理解就超过 80% 的人。我见过太多同事,需求评审会上不打断,下来就动手,结果做出来的东西跟业务方脑子里的完全两样。一个简单的转账功能,有人做出来没有手续费说明,有人做出来没有重复提交校验,全是需求理解偏差导致的返工。
3.2 第二步:给需求画边界,明确“不做什么”,避免无限扩张
需求工作中的另一个大坑是“需求蔓延”。业务方刚开始只说了要一个列表页,做完之后又说要筛选、要导出、要图表、要权限控制。如果你没有边界意识,这些会全部演变成你的内存括约肌,通过无休止的加班消化掉。
写需求文档时,我习惯专门开一个“不做什么”的清单。比如“本次只包含查询功能,不做数据修改”“本模块不涉及跨部门审批”“性能优化单独立项,不随业务开发摊派”。清单不是用来顶撞业务方的,而是用来校准预期的:明确不做什么,能避免做出一堆没必要的功能,也能在需求蔓延时有一个可以回退的锚点。
3.3 第三步:开工前和产品、业务方确认“验收标准”
这是我最常被问到、也最想把经验甩出来的一个动作:需求对齐不是把需求文档读一遍,而是把“怎么算做完”聊明白。
你需要和业务方确认三件事:第一,这个功能的成功指标是什么,是访问量、转化率还是操作时长;第二,有没有可量化的效果指标;第三,验收时谁拍板,是业务方直接判定,还是需要走一轮数据测试。这个对齐动作看起来不产生代码,实际上决定了你后面开发的靶向性。
如果没有这一步,你代码写得再漂亮,业务方一句“不是我要的感觉”,就全部推倒重来。让业务方在开工前就把验收标准签下字,你的返工率会急剧下降。这比任何代码技巧都管用,因为它从源头上降低了返工风险。
4. 在烂代码和领导偏爱的夹缝里,普通工程师如何自救
吐槽归吐槽,真正要紧的是怎么破局。我结合自己见过的实例,给你列几条可执行的自救方案,不保证让你瞬间翻盘,但保证能让你从“憋屈的位置”挪到“有话语权的位置”。
4.1 不要正面对抗:用数据和事实说话,而不是情绪
很多人看到博士同事代码烂,第一反应是直接开怼,或者在评审会上当面指出。这在大厂里有个专有名词叫“送人头”——你也许说的是事实,但在别人眼里,这是内部斗争,是搞事情。
更有效的做法是,把代码问题的“影响”量化成领导能听懂的语言。不要说“这个代码写得乱”,要说“这个模块的 Bug 率是平均水平的3倍,上季度因为这个模块返工了两次,导致上线延期”。用数字代替形容词,这是技术人向管理语言转译的第一步。
我整理过一份“代码健康度周报”,把每人负责模块的 Bug 数、平均修复时长、技术债务评分做成表格,发给团队负责人。发了两期之后,博士同事自己开始主动找我讨论重构方案了——倒不是他突然觉醒了,而是每次周会数据摆在那,他也不好意思继续硬撑。
4.2 把埋坑变成机会:主动写测试、补文档,做那个“兜底的人”
与其抱怨烂代码,不如反手把烂代码变成你职业成长的垫脚石。怎么变?主动把坑给填了。
博士埋坑,你去补测试用例;博士不写文档,你去补接口说明;博士不上监控,你去把报警加上。这些动作在同事眼里可能是在帮别人擦屁股,但在领导眼里,是“有担当”“能兜底”。我甚至见过一个同事,专门去接别人不愿意接的维护性需求,半年后顺理成章成了这个系统的负责人。
不要觉得做这些事亏。你写的测试、补的文档,带走的都是你对业务的理解和代码的熟悉度。这玩意儿跟解耦、重构一样,都是自己长在身上的本领。等到你成了那个“离了你业务就转不动”的人,你在话语权上的位置自然就上来了。
4.3 建立自己的“可见度”:让努力被正确的人看见
很多工程师有一个致命误区:只要我代码写得好,领导自然会看见。真相是:领导一天看太多东西了,他根本看不见你写了多么优雅的代码,他只看得见你主动汇报的频率。
当然,我不是让你学讨厌鬼每天去领导面前邀功。你可以做的是:固定输出一份“模块进展日报/周报”,简单描述做了什么、下一步做什么、风险有哪些。坚持一个月,领导对你的印象绝对远超那些“只干活不吭声”的同事。
我自己试过一个更狠的办法:团队周会上主动把当前系统里最大的技术债列出来,再提出一个 30% 时间的重构方案。领导对“有方案的人”通常态度是开放态度的。哪怕当场没拍板,至少你给领导留下了“这个人看问题全面且有解法”的印象。
4.4 当烂代码已经拖垮你绩效时,两个可操作的抽身策略
如果上面的动作你都做了,博士同事依然在系统里持续埋雷,而你已经因为他把大量时间花在救火上,绩效被拖垮,那就要认真考虑抽身了。
第一个策略:申请换模块。在周会或绩效沟通时,明确表达“我想去更有挑战的新方向”,把旧模块留给能容忍它的人。这是体面的退出,不伤害关系,也不背锅。
第二个策略:把工作交接清单做到极致。当你准备走人时,请写一份极其详尽的交接文档,包括系统架构、核心逻辑、已知坑位、未完成事项。很多人好奇为什么要给讨厌的人写这么细?因为这份文档是你的作品集。面试时拿出来讲,你会收获一份极具信任分的工作经历,而不是一段关于“同事很烂”的职场恩怨。
5. 把纸面理论落地:一次“填坑化反”的真实复盘实录
前面的内容理论性偏多,我讲一个真实发生在我自己工作里的“填坑”经历。它完整展示了从“代码烂到想离职”到“靠填坑完成职场翻身”的全过程,你可以直接参考里面的做法。
5.1 现场还原:一个数据库连接泄漏的“世纪大坑”
那年团队接了一个数据分析平台,主程是一位博士。他负责底层数据采集模块,代码写得极其随性:连接池不释放、异常吞掉不处理、线程直接 new 一个丢一个不回收。上线一个月后,每天凌晨高峰必掉线。
运维排查了两天,把所有责任都推到网络波动上,后来数据量越来越大,系统直接在白天也崩了。部门头儿火急火燎开大会,问谁能解决。博士低头不说话,我因为之前私下读过他的部分代码,隐隐感觉是连接没释放。我说给我两小时排查看看。
结果一查,果然,代码里 execute 完连 connection 都没 close,连接池被耗尽,新请求全部排队,最终服务雪崩。我把那几十行代码打印出来,用红色笔圈出问题,写了五分钟的排查报告,然后顺手把连接管理改成了 try-with-resources,还加了自动重连机制。
5.2 复盘报告怎么写:既解决问题,又没有让任何人难堪
那次故障处理后,我写了一份《故障复盘与整改报告》,分为四节:现象描述、根因分析、修复方案、预防建议。封面写上“本文档由 XX 整理,感谢 XX 提供模块背景”,给足了博士面子。
报告里我没有用“错误”“缺陷”这种词,而是说“发现该模块连接资源生命周期未显式释放,存在优化空间”。这不仅是情商问题,也是安全策略——因为谁也不知道后面会不会有人为这件事找连带责任。我的目的是解决问题、展示能力,不是树敌。
领导看完报告,当场在周会上表扬了“有人愿意深入底层排雷”。也就是从那时候起,我开始接手底层架构相关的任务,博士继续开发业务功能,我则负责系统韧性。说白了,他把坑挖出来,我把坑填上,填坑的人成了系统最不可或缺的人。
5.3 顺手沉淀的护城河:规范、检查清单、交接文档三件套
处理那次故障后,我干了一件极其出格的事:私自建了一份“代码走查检查清单”,覆盖了十个最容易埋雷的点——资源未关闭、空指针未判断、循环里操作数据库、异常被吞、线程未受管、密码硬编码、日期格式化线程不安全、大事务长时间持有锁、日志打全量对象、配置散落各处无统一入口。
每次有同事提测,我就用这份清单过一遍。被发现的问题列成表格贴到项目群,人证物证俱在,代码烂者也不好发作。这不是针对谁,而是让“提质增效”这件事变得有规则可依。
与此同时,我每一段接手的模块,都同步更新一页交接文档,写清模块入口、依赖关系、已知坑位、修复记录。半年下来,我的文档加起来有一百多页。那位博士同事再怎么“不了解需求直接开搞”,只要有我的文档兜底,团队就永远乱不到哪里去。
这三件套,就是我的护城河。哪怕有一天我要离开这个团队,这套代码走查规范、排查清单、系统交接文档,就是我跟下一家公司谈薪资时的硬货。你写代码的水平可能一时半会儿没法碾压博士,但这些软实力,是可以快速积累并且立刻生效的。
6. 最后再分享一个小技巧:把“烂代码”变成你成长的“错题本”
个人体会很深的一条:烂代码不是你的敌人,它是你免费的“错题集”。每次看到值得吐槽的代码,别只停留在嘴头上,把它记下来,分析为什么烂、怎么改、用什么模式替代。积累二三十个案例后,你对“什么样的设计合理”会有一个极其清晰的认知。
我自己就保存着一个“反面代码明细表”,记录了模块名、问题描述、改进方案。面试时被问到“你踩过最大的技术坑”时,我直接从明细表里挑出一个最经典的案例展开讲,既展示了问题处理思路,又说明了复盘总结能力,面试官反馈普遍很好。
遇到“代码烂却受重用”的同事,最差的做法是把精力耗在嫉妒和抱怨上。最优的做法,是把他踩过的坑、埋下的雷,变成你手里的一张张经验卡牌。等到卡牌足够多,你在任何团队里都是那个“懂的怎么避免重蹈覆辙”的人,这种价值,不依赖某个领导对你的看法,它长在你自己身上,谁也拿不走。
如果你此刻正被烂代码坑得焦头烂额,不妨先深呼吸,把这个帖子里的方法挑一条试试看。哪怕只有一条,也比你继续站在边上生闷气有用得多。我们没有义务替别人擦屁股一辈子的,但每一次擦屁股,都可以成为垫高自己的砖。这一点,我试过,实测有效。