近日,某网友在 Hacker News 上发起了一个 “你见过的最糟糕的代码是什么?” 的问题,引起了广泛关注和讨论,评论数已接近600条。其中,一位 ID 为“oraguy”的程序员对 Oracle 数据库代码的吐槽,更是引发热议。《2500 万行的代码就问你敢不敢动?!》


500531248_wx.jpg


Oracle 数据库 12.2。它有近 2500 万行 C 代码。这有多恐怖,简直难以想象!试想假如一个开源项目有这代码量,维护起来那该有多崩溃。


因此,有网友表示:为开源项目作出贡献的最佳方式是帮助它删除代码行。致力于编写出不用注释和解释就能让新手看得懂的代码,维护人员不用花太多时间和精力去维护的代码。


学生时代,我们尝试用越来越复杂的技术去解决越来越具有挑战性的问题。我们首先学习循环,然后是函数,然后是类等等。当我们用更先进的技术编写更复杂的程序时,我们就会得到赞扬。就像老程序员用monads 而小白程序员们用 loop 作循环。


毕业以后,找一份工作,或者是和他们合作一个开源项目。我们利用在学校里学到的所有技能,寻找可以添加的东西,并为自己做出的解决方案洋洋得意,诸如我能实现某个牛逼的功能了,我在这里也能用继承了呢......


当我们实现了某个特性,就理所当然觉得完成任务了,在实际系统中编程是一个不小的成就。就我个人而言,写代码让我很兴奋,也让我感到自豪的是,我可以向世界展示我所具备的能力。作为我热爱编程技术的证据,这是用另一种元编程语言构建的一个线性代数语言,注意,这么多年以来一直没人愿意碰它。


然而,在维护了很多代码之后,我的观念发生了改变:


1、我们一昧地把重心放在如何构建软件上面。软件是我们为解决问题而产生的成果,努力构建尽可能简单的软件来解决我们的问题,这才是我们的目标


2、我们应该尽可能使用简单的技术,以便更多的人能够使用和扩展它们,而不需要理解我们的高级技术。只有当我们不知道如何使用更常用的技术时,我们再去考虑复杂先进的技术。


上面提出的两个观点其实都不新颖了,大部分开发者也都同意这种看法,但当我们向一个新项目贡献代码时又会忘掉这个初衷。情不自禁的就用了复杂技术去构建。



软件是种投入


你写的每一行都需要花时间,但你愿意做出这种个人牺牲。与此同时,这段代码也花费了阅读者理解它的时间,维护者和开发人员在修复和修改代码时依然需要花费时间,而这些时间他们本可以拿来陪家人、消遣......


因此,当你向项目添加代码时,你应该谦卑一点。用更少的代码解决问题是一件困难的事情,但它是你自己为了减轻其他人的负担而勇于承担起来的重任。



复杂的技术更难维护


作为学生,我们通过使用日益先进的技术来证明自己的价值。我们对价值的衡量取决于我们在开源项目中使用函数、类、更高阶函数等能力。我们向身边的人展示我们的解决方案,也会因自己所使用的技术而感到自豪与否。


然而,当与团队合作解决难题时,情况正好相反。现在我们都尽量用尽可能简单的代码来解决问题。当我们用简单的解决方式,即便是初级程序员也能够扩展我们的解决方案,并用它解决其他问题。我们通过只使用基本技术解决难题来展示我们的价值,简单的代码不仅帮别人解决难题,还能帮助者我们提高影响力。



当然,也要在合理范围内


话虽这么说,过度坚持“用简单工具构建东西”的原则可能会适得其反。一般情况下,递归解决方案比for循环解决方案简单得多,而且通常使用类或Monad是正确的方法。但是在使用这些技术时,有些情况还是要区别对待,一是为只为自己创建的系统;二是其他人没有构建经验的系统。


开源最前线(ID:OpenSourceTop) 猿妹 编译

综合自:http://matthewrocklin.com/blog/work/2018/01/27/write-dumb-code