网易首页 > 网易号 > 正文 申请入驻

代码能用即可,重构不是万能药

0
分享至

作者:佚名来源:strongerHuang

写烂代码很容易,但是就算写成一坨屎,能用即可, 你同意这种观点吗?

程序员刚入行经常听到一些观点

你要把精力放在需求文档/功能设计/架构设计/理解原理 (ABCD )上,写代码只是把想法翻译成编程语言而已,是一个没什么技术含量的事情。

当时的我在听到这种观点时会有一种近似于高冷的不屑: 你们就是一群傻子,根本不懂代码质量的重要性,这么下去迟早有一天会踩坑。

可是几个月之后,他们似乎也没怎么踩坑。而随着编程技术一直在不断发展,带来了更多的我以前认为是傻子的人加入到程序员这个行业中来。

语言越来越高级、封装越来越完善,各种技术都在帮助程序员提高生产代码的效率,依靠层层封装,程序员真的不需要了解一丁点技术细节,只要把需求里的内容逐行翻译出来就可以了。

很多程序员不知道要怎么组织代码、怎么提升运行效率、底层是基于什么原理,他们写出来的是在我心目中烂成一坨屎一样的代码。但是那一坨屎一样代码竟然能正常工作。

即使我认为他们写的代码是坨屎,但是从不接触代码的人的视角来看(比如说你的boss),代码编译过了,测试过了,上线运行了一个月都没出问题,你还想要奢求什么?

所以,即使不情愿,也必须承认,别人写的代码能正常运行,且不出错,那就是牛x。

烂代码终究是烂代码

但是偶尔有那么几次,写烂代码的人离职了之后,事情似乎又变得不一样了。

想要修改功能时却发现程序里充斥着各种无法理解的逻辑、改完之后莫名其妙的bug一个接一个,接手这个项目的人开始漫无目的的加班,并且原本一个挺乐观开朗的人渐渐的开始喜欢问候别人祖宗了。

总结几类经常被骂娘的烂代码:

ி 意义不明

能力差的程序员容易写出意义不明的代码,他们不知道自己究竟在做什么。

就像这样:

void Save(void)
{
int x;
for(x=0; x<100; x++)
{
//防止保存失败,保存100次
Flash_Write();
}
}

对于这类程序员,我一般建议他们转行。

ி 不说人话

不说人话是新手最经常出现的问题,直接的表现就是写了一段很简单的代码,其他人却看不懂。

比如下面这段:

很多程序员喜欢简单的东西: 简单的函数名、简单的变量名,代码里翻来覆去只用那么几个单词命名;能缩写就缩写、能省略就省略、能合并就合并。

这类人写出来的代码里充斥着各种g/s/gos/of/mss之类的全世界没人懂的缩写,或者一长串不知道在做什么的连续调用。

还有很多程序员喜欢复杂,各种宏定义、位运算之类写的天花乱坠,生怕代码让别人一下子看懂了会显得自己水平不够。

简单的说,他们的代码是写给机器的,不是给人看的。

ி 不恰当的组织

不恰当的组织是高级一些的烂代码,程序员在写过一些代码之后,有了基本的代码风格,但是对于规模大一些的工程的掌控能力不够,不知道代码应该如何解耦、分层和组织。

这种反模式的现象是经常会看到一段代码在工程里拷来拷去;某个文件里放了一大坨堆砌起来的代码;一个函数堆了几百上千行;或者一个简单的功能七拐八绕的调了几十个函数,在某个难以发现的猥琐的小角落里默默的调用了某些关键逻辑。

这类代码大多复杂度高,难以修改,经常一改就崩;而另一方面,创造了这些代码的人倾向于修改代码,畏惧创造代码,他们宁愿让原本复杂的代码一步步变得更复杂,也不愿意重新组织代码。当你面对一个几千行的类,问为什么不把某某逻辑提取出来的时候,他们会说:

“但是,那样就多了一个类了呀。”

ி 假设和缺少抽象

相对于前面的例子,假设这种反模式出现的场景更频繁,花样更多,始作俑者也更难以自己意识到问题。比如:

文件路径变更的时候,会把代码改成这样:

需要加载的内容更丰富的时候,会再变成这样:

之后可能会再变成这样:

这类程序员往往是项目组里开发效率比较高的人,但是大量的业务开发工作导致他们不会做多余的思考,他们的口头禅是:“我每天要做XX个需求”或者“先做完需求再考虑其他的吧”。

这种反模式表现出来的后果往往是代码很难复用,面对deadline的时候,程序员迫切的想要把需求落实成代码,而这往往也会是个循环:写代码的时候来不及考虑复用,代码难复用导致之后的需求还要继续写大量的代码。

一点点积累起来的大量的代码又带来了组织和风格一致性等问题,最后形成了一个新功能基本靠拷的遗留系统。

ி 还有吗?

烂代码还有很多种类型,沿着功能-性能-可读-可测试-可扩展这条路线走下去,还能看到很多匪夷所思的例子。

那么什么是烂代码?个人认为,烂代码包含了几个层次:

▶ 如果只是一个人维护的代码,满足功能和性能要求倒也足够了。

▶ 如果在一个团队里工作,那就必须易于理解和测试,让其它人员有能力修改各自的代码。

同时,越是处于系统底层的代码,扩展性也越重要。

所以,当一个团队里的底层代码难以阅读、耦合了上层的逻辑导致难以测试、或者对使用场景做了过多的假设导致难以复用时,虽然完成了功能,它依然是坨屎一样的代码。

ி 够用的代码

而相对的,如果一个工程的代码难以阅读,能不能说这个是烂代码?很难下定义,可能算不上好,但是能说它烂吗?如果这个工程自始至终只有一个人维护,那个人也维护的很好,那它似乎就成了“够用的代码”。

很多工程刚开始可能只是一个人负责的小项目,大家关心的重点只是代码能不能顺利的实现功能、按时完工。

过上一段时间,其他人参与时才发现代码写的有问题,看不懂,不敢动。需求方又开始催着上线了,怎么办?只好小心翼翼的只改逻辑而不动结构,然后在注释里写上这么实现很ugly,以后明白内部逻辑了再重构。

再过上一段时间,有个相似的需求,想要复用里面的逻辑,这时才意识到代码里做了各种特定场景的专用逻辑,复用非常麻烦。为了赶进度只好拷代码然后改一改。问题解决了,问题也加倍了。

几乎所有的烂代码都是从“够用的代码”演化来的,代码没变,使用代码的场景发生变了,原本够用的代码不符合新的场景,那么它就成了烂代码。

重构不是万能药

程序员最喜欢跟程序员说的谎话之一就是: 现在进度比较紧,等X个月之后项目进度宽松一些再去做重构。

不能否认在某些(极其有限的)场景下重构是解决问题的手段之一,但是写了不少代码之后发现,重构往往是程序开发过程中最复杂的工作。花一个月写的烂代码,要花更长的时间、更高的风险去重构。

曾经经历过几次忍无可忍的大规模重构,每一次重构之前都是找齐了组里的高手,开了无数次分析会,把组内需求全部暂停之后才敢开工,而重构过程中往往哀嚎遍野,几乎每天都会出上很多意料之外的问题,上线时也几乎必然会出几个问题。

从技术上来说,重构复杂代码时,要做三件事:理解旧代码、分解旧代码、构建新代码。而待重构的旧代码往往难以理解;模块之间过度耦合导致牵一发而动全身,不易控制影响范围;旧代码不易测试导致无法保证新代码的正确性。

重构之后能提升多少效率?能降低多少风险?很难答上来,烂代码本身就不是一个可以简单的标准化的东西。

总结

不写代码的人认为应该重构,重构很简单,无论新人还是老人都有责任做重构。

写代码老手认为应该迟早应该重构,重构很难,现在凑合用,这事别落在我头上。

写代码的新手认为不出bug就谢天谢地了,我也不知道怎么重构。

✉ 写好代码很难

与写出烂代码不同的是,想写出好代码有很多前提:

✔ 理解要开发的功能需求。

✔ 了解程序的运行原理。

✔ 做出合理的抽象。

✔ 组织复杂的逻辑。

✔ 对自己开发效率的正确估算。

✔ 持续不断的练习。

写出好代码的方法论很多,但我认为写出好代码的核心反而是听起来非常low的“持续不断的练习”。

很多程序员在写了几年代码之后并没有什么长进,代码仍然烂的让人不忍直视,原因有两个主要方面:

1、环境是很重要的因素之一,在烂代码的熏陶下很难理解什么是好代码,知道的人大部分也会选择随波逐流。

2、还有个人性格之类的说不清道不明的主观因素,写出烂代码的程序员反而都是一些很好相处的人,他们往往热爱公司团结同事平易近人工作任劳任怨–只是代码很烂而已。

而工作几年之后的人很难再说服他们去提高代码质量,你只会反复不断的听到:“那又有什么用呢?”或者“以前就是这么做的啊?”之类的说法。

那么从源头入手,提高招人时对代码的质量的要求怎么样?

前一阵面试的时候发现了一个现象:

一个人工作了几年、做过很多项目、带过团队、发了一些文章,不一定能代表他代码写的好;反之,一个人代码写的好,其它方面的能力一般不会太差。

悲观的结语

说了那么多,结论其实只有两条,作为程序员:

⊱ 不要奢望其他人会写出高质量的代码

⊱ 不要以为自己写出来的是高质量的代码

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
C刊论文:《论哈梅内伊的科技观》

C刊论文:《论哈梅内伊的科技观》

必记本
2026-03-13 00:17:55
家长拒交550班费续:孩子被调最后一排,老师听到自己女儿名怕了

家长拒交550班费续:孩子被调最后一排,老师听到自己女儿名怕了

奇思妙想草叶君
2026-03-11 13:29:37
马克龙:不接受

马克龙:不接受

南方都市报
2026-03-13 11:42:10
打了十来天,“最高强度”打击来了

打了十来天,“最高强度”打击来了

中国新闻周刊
2026-03-11 15:02:08
两年了,为何许家印迟迟不判刑?真相可能比你想象的复杂得多

两年了,为何许家印迟迟不判刑?真相可能比你想象的复杂得多

南方健哥
2026-03-13 05:53:33
34分难掩怒火!杰伦-布朗赛后炮轰:有人在操纵比赛

34分难掩怒火!杰伦-布朗赛后炮轰:有人在操纵比赛

大眼瞄世界
2026-03-13 16:39:37
57岁歌手孙楠被偶遇,脸黄又垮一副老人样,又瘦又高很有星味

57岁歌手孙楠被偶遇,脸黄又垮一副老人样,又瘦又高很有星味

翰飞观事
2026-03-13 09:38:50
钱再多有什么用!郭富城称无法接受年过六旬,每天喝几十杯咖啡

钱再多有什么用!郭富城称无法接受年过六旬,每天喝几十杯咖啡

神秘莫测的世界
2026-03-11 07:50:46
颠覆达尔文!谷歌科学家实验证明:智能根本不是进化出来的,它一开始就在

颠覆达尔文!谷歌科学家实验证明:智能根本不是进化出来的,它一开始就在

报人刘亚东
2026-03-11 12:25:28
医院里为什么看不到和尚、道士、尼姑去看病呢?主要有4个原因

医院里为什么看不到和尚、道士、尼姑去看病呢?主要有4个原因

猫叔东山再起
2026-03-12 11:50:08
“唯一贫穷的路被你找到了”,专八女生留守农村,网友恨铁不成钢

“唯一贫穷的路被你找到了”,专八女生留守农村,网友恨铁不成钢

妍妍教育日记
2026-03-13 21:47:44
轰99+22+23!三巨头杀疯了,湖人终于清醒,老詹也只剩下一个结局

轰99+22+23!三巨头杀疯了,湖人终于清醒,老詹也只剩下一个结局

林子说事
2026-03-13 20:51:27
凌晨在北京去世?75岁“风流妖精”刘晓庆,给内娱明星们上了一课

凌晨在北京去世?75岁“风流妖精”刘晓庆,给内娱明星们上了一课

乡野小珥
2026-03-11 19:44:41
比赛还没开打,中国女足先遭一个致命暴击,取胜中国台北难度大增

比赛还没开打,中国女足先遭一个致命暴击,取胜中国台北难度大增

零度眼看球
2026-03-13 14:08:36
64分狂胜后再赢43分!女篮霸主杀红眼:世预赛第一强队出炉!

64分狂胜后再赢43分!女篮霸主杀红眼:世预赛第一强队出炉!

篮球快餐车
2026-03-13 10:54:37
微信出现这条杠,你已经不是对方好友了

微信出现这条杠,你已经不是对方好友了

小影的娱乐
2026-03-10 07:44:17
刚刚,开盘暴跌!重挫1100点!

刚刚,开盘暴跌!重挫1100点!

中国基金报
2026-03-13 08:55:17
伊朗实战公开课,惊醒了所有人:美军亚太基地如何自保?

伊朗实战公开课,惊醒了所有人:美军亚太基地如何自保?

兵国大事
2026-03-13 00:05:12
有钱人都找什么样的女人做老婆?网友:只要有钱,干嘛都行

有钱人都找什么样的女人做老婆?网友:只要有钱,干嘛都行

带你感受人间冷暖
2026-03-13 00:05:12
4月1日交通新规落地,后排不系安全带罚司机,打车必扫一车一码

4月1日交通新规落地,后排不系安全带罚司机,打车必扫一车一码

老特有话说
2026-03-13 14:33:33
2026-03-14 00:44:49
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 823关注度
往期回顾 全部

科技要闻

龙虾热卷到AI硬件 “无脑”硬件或被淘汰

头条要闻

穆杰塔巴"亮相"没讲话 伊朗学者:其处境可能非常危险

头条要闻

穆杰塔巴"亮相"没讲话 伊朗学者:其处境可能非常危险

体育要闻

叕战奥运,张雨霏要做回“小将”

娱乐要闻

田亮一家新年全家福!森碟变清纯少女

财经要闻

“十五五”规划纲要,全文来了!

汽车要闻

置换补贴价8.68万 五菱缤果S 525km旗舰款上市

态度原创

旅游
家居
艺术
数码
亲子

旅游要闻

上海:陆家嘴玉兰迎春绽放 吸引市民游客打卡

家居要闻

艺术之家 法式优雅

艺术要闻

她的美,竟是用粉彩描绘的,太震撼了!

数码要闻

3999元!KTC G32P5S电竞显示器开启新品预约

亲子要闻

当有女人叫老爸宝贝,萌娃会如何应对?

无障碍浏览 进入关怀版