为什么程序员很糟糕 » 代码简洁性
代码简洁性
为什么程序员很糟糕
2009年12月1日 by Max Kanat-Alexander
很久以前,我写过一篇名为《为什么计算机很糟糕》的文章(在后续两次修订中,标题被改为《计算机》和《计算机出了什么问题》,而原始标题从未面世)。那篇文章相当长,但基本观点是:计算机很糟糕,因为程序员创造了疯狂复杂的东西,其他人无法理解,而复杂性不断累积,直到程序的每个方面都变得难以管理。
当时我不知道的是,程序员为什么要这样做。很明显他们确实这样做了,但为什么软件开发行业会产生如此多疯狂、复杂、难以阅读的代码?即使开发人员在第一次糟糕经历后应该吸取教训,为什么这种情况仍在持续发生?是什么让程序员不仅写出糟糕的代码,而且持续写出糟糕的代码?
嗯,这是一个谜,但起初我并没有太担心。仅仅揭示“糟糕的程序完全是由糟糕的程序员造成的”,尽管看似简单明了,但足以推动对整个编程领域的调查和研究,并取得了一些相当好的成果(这主要是我在这个博客上写的内容,也是一本正在开发中的书的主题)。问题已经定义(创造复杂性的糟糕程序员),似乎也有解决方案(描述可以防止这种情况的软件设计法则),这对我来说就足够了。
但让我困惑的是,即使软件开发技术已经进步了几十年,世界各地的大学、技术学校和培训项目仍然能培养出如此糟糕的程序员。当然,软件设计的许多原则尚未成文,但有很多好的建议流传,其中很多非常常见。即使人们没有上学,难道他们没有读过任何这些建议吗?
嗯,真相超出了我的想象,我花了近五年的时间在Bugzilla项目中与大量不同的贡献者合作,直到有一天我突然意识到一个令人震惊的事实:绝大多数(90%或更多)的程序员完全不知道自己在做什么。
这并不是说他们没有读过软件设计的内容(尽管他们可能没有)。也不是说编程语言太复杂(尽管它们确实复杂)。而是绝大多数程序员根本不知道自己在做什么。他们只是在模仿其他程序员的错误——复制代码,并在机器上键入或多或少毫无意义的咒语,希望它能按他们想要的方式运行,而对计算机的机制、软件设计的原则,或他们键入计算机的每个单词和符号的含义没有任何真正的理解。
这是一个大胆、令人震惊且冒犯性的陈述,但根据我的经验,它是成立的。我亲自审查并反馈了数十名程序员的代码。我读过许多其他人的代码。我与许多许多程序员讨论过软件开发,并阅读了数百名开发者的文章。真正理解自己在做什么的程序员数量仅占我交谈过、合作过或听说过的所有程序员的约10%。在开源领域,我们得到了精英——那些想在业余时间编程的人。即便如此,我认为只有约20%的开源程序员真正掌握自己在做什么。
那么,这是为什么?问题出在哪里?怎么可能有这么多人在这个领域工作,却完全不知道自己在做什么?嗯,这听起来有点像他们 somehow“愚蠢”。但什么是愚蠢?人们并不因为不知道某事而愚蠢。有很多东西是每个人都不知道的。这并不使他们愚蠢。这可能使他们对某些事情无知,但并不使他们愚蠢。不,愚蠢,真正的愚蠢,是不知道你不知道。愚蠢的人认为他们知道某事,但实际上并不知道,或者他们不知道还有更多需要了解的东西。
这种愚蠢几乎可以在每个领域找到,软件开发也不例外。许多程序员根本不知道软件开发可能有法则或通用指南,因此他们甚至不去寻找它们。在许多软件公司,没有人试图提高开发人员对他们使用的编程语言的理解——也许仅仅是因为他们认为程序员“如果被雇用来做这件事,一定已经知道了”。
不幸的是,在软件开发中拥有这种心态尤其有害,因为如果你真的想变得优秀,有很多东西需要了解。任何认为自己已经知道一切(或有一个“盲点”,看不到还有更多需要学习)的人,都因为缺乏知识而削弱了产生优秀代码的能力——这些知识他们甚至不知道存在,甚至不知道他们缺乏。
无论你知道多少,几乎总是有更多关于任何领域的知识需要了解,计算机编程也不例外。因此,认为你知道一切总是错误的。不过,有时很难弄清楚应该学习什么。有这么多数据,从哪里开始?嗯,为了帮助你,我想出了几个问题,你可以问自己或他人,以帮助找出哪些领域可能需要更多学习:
- 你是否尽可能了解你写的每一页代码中的每个单词和符号?
- 你是否阅读并完全理解你使用的每个函数的文档?
- 你是否出色地掌握了软件开发的基本原则——掌握得如此之好,以至于你可以向组织中的新手程序员完美地解释它们?
- 你是否理解计算机每个组件的功能,以及它们如何协同工作?
- 你是否理解计算机的历史,以及它们未来的发展方向,以便你能理解你的代码在未来将构建的计算机上如何运行?
- 你是否知道编程语言的历史,以便你能理解你使用的语言是如何演变的,以及为什么它以这种方式工作?
- 你是否理解其他编程语言、其他编程方法以及其他类型的计算机,而不是你正在使用的,以便你知道每个工作的实际最佳工具是什么?
从上到下,这些是任何程序员了解他们正在编写的代码的最重要的事情。如果你能真实地对所有这些问题回答“是”,那么你就是一个优秀的程序员。
这可能看起来是一个令人望而生畏的列表。“哇,每个函数的文档?阅读那将花费太长时间!”嗯,你知道还有什么需要很长时间吗?如果你不阅读文档,成为一个好程序员。你知道需要多长时间吗?永远,因为它永远不会发生。你永远不会仅仅通过复制别人的代码并祈祷它能正常工作而成为一个好程序员。但更重要的是,投入时间学习是变得优秀的关键。现在花时间将使你以后成为一个更快的程序员。如果你在学习一项新技术的头三个月花大量时间阅读资料,那么在未来10年里,你使用它的速度可能比如果你只是潜入其中然后从不阅读任何东西快10倍。
不过,我想对此施加一定的限制——你不能只是阅读三个月就期望成为一个好程序员。首先,那太无聊了——没有人想只学习理论三个月而不进行任何实际练习。很少有人能坚持足够长的时间成为程序员,更不用说好程序员了。因此,我想指出,理解也来自实践,而不仅仅是学习。但没有学习,理解可能永远不会到来。因此,平衡编程的学习和实践非常重要。
这不是对我个人合作过的任何程序员的攻击,甚至不是对任何个体程序员的攻击。作为一个