如何轻松和安全地构建的满足合规要求的智能产品,实现业务需求?4月26日,告诉你答案! 了解详情
写点什么

最好的代码是没有代码

  • 2020 年 3 月 19 日
  • 本文字数:1375 字

    阅读完需:约 5 分钟

最好的代码是没有代码

不久前,我开始着手清理一个接手过来的项目。因为项目有一些 bug,所以我有足够的自由来重构它。但修复旧 bug 会引入新 bug,于是乎我就陷入了恶性循环。


一整个周末,我都一头扎进源代码里,很快就发现了问题:这个项目太混乱了,乱成一锅粥。项目中有有很多不必要的、冗余的和紧密耦合的代码。我所说的混乱,并不是指代码看起来很业余或充斥着快代码(捷径代码)。事实上恰恰相反,项目里有太多“魔法”,我看到了很多聪明而宏伟的设计技巧,但它们与项目要解决的问题毫无关系。像反射、面向切面编程、自定义注解一个都不少。这个项目是一只被过度设计的怪兽。经过我的一番重构,模块规模减少到原来的一半不到。


我相信原先开发这个项目的人的出发点是好的,但聪明反被聪明误,他们使用的技巧给自己带来了麻烦。所以他们只得花很多时间在维护和修复 bug 上,而用户对满是 bug 的软件也会感到不满。开发者自己感觉就更糟糕,因为每个人都在抱怨这个项目。但是谁该为他们承受的这些痛苦负责呢?他们不得不花很长时间来修复 bug,却无法从工作中获得满足感。除了开发者自己,还能责怪谁呢!Jeff Atwood 在一篇博文中提到过:“最好的代码是没有代码”:


对于大多数软件开发者来说,要让他们承认这一点是很痛苦的,因为他们爱他们的代码。你写的每一行新代码都需要经过调试,需要具备可阅读性和可维护性。每次写新代码时,你都要在这种压力之下不情愿地这么做,而你已经无计可施了,不得不这么做。代码成了我们的敌人,因为有太多程序员写了太多该死的代码。如果你一定要写代码,那最好一开始就简洁。


Jeff 的观点很有道理。作为开发者,我们喜欢想出各种聪明的解决方案,认为这会让我们看起来更专业,或者有助于我们学习新的工具或技术。于是我们抛弃简单,层层叠加各种方案,并证明它们是“实际需要的”。但我们必须认识到,我们写的代码越多,在代码中使用的“魔法”也越多,为 bug 留下的机会也就越多。


这些 bug 会回头过来给我们或接手我们代码的人造成困扰,我们需要加班来修复它们。显然,我们不是在讨论如何使用技巧来减少代码行数。相反,我们应该问问自己是否需要写这么多代码。在我的职业生涯中,我见过一些自己开发的 ORM 框架和线程池,这让我想起了一句话:


不要重复发明轮子。


这句话不只是想想而已。在开发这些框架之前请先思考一下是否真的有必要。我参与过的一个项目使用 Hibernate 和 DAO/DTO 来执行一个简单的查询。另一个项目有一个事件处理系统,它使用反射 API 根据事件类型来调用具体的类方法。这个解决方案看起来很“巧妙”,我花了很长时间才搞清楚 IDE 标记未被使用的方法原来是通过反射来调用的。更搞笑的是,这个系统只处理一种类型的事件。实际上,这些代码可以被压缩成一个简单的 if 语句:


if (event.type == THE_ONE_TYPE_THIS_SYSTEM_CAN_HANDLE) {  process_the_event_and_return_result;}
复制代码


最好的代码是没有代码,而最快的代码是永远不会被执行的代码。我们的目标应该是让解决方案尽可能保持简单,避免过度工程,避免使用讨巧的技巧和设计模式,除非它们对于解决问题来说是绝对有必要的。复杂性是我们最大的敌人,不必要的复杂性更是如此。大多数时候,我们不需要这些复杂性。


最后,我以 Jeff 的一句名言结束本文:


如果你真的喜欢写代码,那就要喜欢到尽可能少写代码。


参考链接:https://codeahoy.com/2016/06/03/write-less-code


2020 年 3 月 19 日 14:452099

评论

发布
暂无评论
发现更多内容

git 常用操作及 git 工作流介绍

hepingfly

git git分支操作 git工作流

程序员为什么热衷于造轮子,升职加薪吗?

小傅哥

Java 小傅哥 代码质量 编程开发 编程经验

科大讯飞再握一国产核心技术,可高精细拾取30分贝超小音量

Talk A.I.

第1周 作业

wgl

UML

SpringBoot系列(1)-初识SpringBoot

引花眠

学习 springboot

架构师训练营第 1 期第一次作业

Geek_a01290

极客大学架构师训练营

架构师训练营第 1 期第一周总结

Geek_a01290

极客大学架构师训练营

信任环:口碑传播的关键环节

boshi

用户增长 运营创新

课程大作业

小胖子

深入理解JVM垃圾回收算法 - 标记清理算法

CHEN川

GC算法 标记清理 位图标记 懒惰标记

高效程序员的45个习惯:敏捷开发修炼之道(8)

石云升

敏捷开发 技术分享 轮换制

RDS、DDS和GaussDB理不清?看这一篇足够了!

华为云开发者社区

数据库 华为云 RDS

第二周 - 框架设计

Arthur云剑

Java新特性:数据类型可以扔掉了?

王磊

Java 新特性 Java新特性 var 局部类型推导

超全面分布式缓存高可用方案:哨兵机制

架构精进之路

redis哨兵模式

智能商业时代的思考(三)数据驱动

刘旭东

大数据 数据驱动 智能商业

使用递增计数器的线程同步工具 —— 信号量,它的原理是什么样子的?

程序员小航

Java 源码 源码阅读 JUC Semaphore

早知道这 8 个锦囊,我的程序人生一定更精彩

沉默王二

程序员

腾讯PCG数据中台专场介绍&招聘报名

Geek_c46970

数据中台 腾讯 招聘

Java ConcurrentHashMap 高并发安全实现原理解析

vivo互联网技术

Java hashmap 多线程 高并发

大作业2

雪涛公子

我的 2020 iOS BAT面试心得:Bigo、字节、快手、伴鱼、百度、微博等

iOSer

ios 面试

架构师第一周笔记

Geek_Gu

java安全编码指南之:输入校验

程序那些事

java安全编码 安全编码规范 java安全编码指南

拆分链表、图解HTTPS、Zookeeper原理、如何成为技术专家、架构师三板斧 John 易筋 ARTS 打卡 Week 18

John(易筋)

ARTS 打卡计划 图解https ZooKeeper原理 架构师三板斧 拆分链表

ARTS打卡 第17周

引花眠

微服务 ARTS 打卡计划

【架构师训练营1期】第一周作业

诺乐

架构师训练营第一周课程笔记及心得

Airs

oeasy 教您玩转linux 010303文件管理器 nautilus

o

从linux源码看socket的阻塞和非阻塞

无毁的湖光

Linux TCP socket Linux Kenel

JavaScript原型机制

Clloz

Java 原型

最好的代码是没有代码_语言 & 开发_Umer Mansoor_InfoQ精选文章