得,今天聊点让人血压高的话题——“人渣代码”。这词儿糙是糙点,但你要是接过那种让你想顺着网线爬过去打人的代码,你就懂。我这几年,真是没少碰见。
记得那回,刚接手一个老项目,说是前任“高升”,留下的摊子。我当时还挺客气,想着人走,我好好维护就行。结果打开代码一看,我靠,当时就想把电脑砸。那感觉,就像是掉进一个精心设计的屎坑,里面还埋着地雷。
初探屎山
代码这玩意儿,好不一眼就能看出来。那哥们留下的代码,简直:
- 命名:啥`a1`, `b2`, `temp1`, `temp2`满天飞,你要是能猜出这变量是干啥的,我敬你是条汉子。方法名也是,一个`doSomething()`里面塞几百行逻辑,鬼知道它到底"do"啥"something"。
- 结构:不存在结构。一个文件几千行是常态,函数调用跟蜘蛛网似的,绕来绕去把自己绕回去。改一个地方,一百个地方报错,按住葫芦起瓢。
- 注释:你想多,根本没有注释。偶尔有那么几行,还是早就过时、或者是骂人的话,或者是“这里有坑,别动!”,但就是不说坑在哪儿。
- 逻辑:硬编码遍地走,"magic number"随处可见。同一个逻辑,复制粘贴得到处都是,稍微改个需求,得,全局搜索慢慢改,改漏一个就等着线上炸雷。
当时我就感觉,这哪是写代码,这哥们是在代码里拉屎。而且是那种毫无规律、随心所欲的拉法。
挣扎与自救
没办法,活儿接下来,硬着头皮也得上。一开始我还天真,想着“小步快跑,逐步重构”。我先尝试着加点注释,把那些狗屁不通的变量名、方法名改得稍微人话一点。然后尝试着把那些巨型函数拆一拆。
过程?痛苦面具戴
改个变量名,IDE全局替换,刷刷刷改几百处,以为稳。一运行,崩!为因为有几处是通过字符串拼接动态调用的,根本没替换到。我真是谢他全家。
想拆函数?好家伙,一个函数里面几十个全局变量传来传去,还有各种没声明直接用的隐式变量,你根本不知道拆出去之后状态会不会丢。拆一个简单的,测试跑半天,各种诡异的bug冒出来。发现,原来某个犄角旮旯的地方,依赖这个函数里的一个临时变量的状态。我真是……无语。
那段时间,天天加班到深夜,对着屏幕发呆,烟一根接一根。同事看我脸色不问我咋,我只能苦笑:“在屎山寻宝。”
摊牌与抉择
搞差不多一个月,bug是修几个,但代码还是一坨屎,甚至因为我的改动,变得更复杂、更不可控。我知道,这样下去不行。要么我被这代码逼疯,要么这项目彻底崩盘。
我去找领导摊牌。把代码的烂度、维护的难度、潜在的风险,一五一十摆出来。我说:“这玩意儿,缝缝补补解决不问题,每次修改都是赌博。要么,给我时间,我带着人把它重写;要么,就维持现状,指不定哪天就爆个大雷,到时候别怪我没提醒。”
还领导还算明白人,也可能是被之前的坑搞怕。犹豫再三,最终拍板:重写!资源给得抠抠搜搜,时间也压得紧紧的。
推倒重来
后面的事儿就简单。拉着几个靠谱的兄弟,对着老代码的功能列表(文档?那是什么?只能靠猜和试),重新设计,重新写。过程当然也累,但心情是舒畅的。至少,我们知道自己在盖房子,而不是在屎上雕花。
新代码上线那天,看着跑起来的稳定服务,感觉像是打赢一场恶仗。虽然累得像狗,但值。
遇到“人渣代码”怎么办?
我的经验是:
- 先评估:看看还有没有抢救的价值。如果只是局部烂,还能改改。
- 别硬扛:如果烂到根,别犹豫,赶紧向上反映,争取重写。硬扛的后果通常是你累死,项目还是崩。
- 沟通,沟通,再沟通:让所有人都知道这坨代码有多烂,风险有多大。甩锅是小事,别让项目死在自己手里才是大事。
- 实在不行就跑路:如果公司或团队根本不重视技术,任由这种代码存在,甚至鼓励这种文化(比如谁写的快谁牛逼,不管质量),那还等赶紧跑路,这种地方待久,你自己也会变成写“人渣代码”的人。
说多都是泪。希望大家少遇到这种破事儿。今天就唠到这。
还没有评论,来说两句吧...