为什么程序员很糟糕:代码复杂性的根源

本文深入探讨了程序员普遍制造复杂难懂代码的现象,揭示了90%的程序员实际上并不真正理解自己在做什么的惊人事实,并提出了成为优秀程序员必须掌握的7个核心知识领域。

为什么程序员很糟糕

2009年12月1日 by Max Kanat-Alexander

很久以前,我写过一篇题为《为什么计算机很糟糕》的文章(在后来的两次修订中被改名为《计算机》和《计算机出了什么问题》,原标题从未面世)。那篇文章相当长,但核心观点很简单:计算机很糟糕是因为程序员创造了疯狂复杂的东西,其他人无法理解,复杂性不断累积,直到程序的每个方面都变得难以管理。

当时我不知道的是,程序员为什么要这样做。很明显他们确实这样做了,但为什么软件开发行业会产生这么多疯狂、复杂、难以阅读的代码?为什么即使开发人员在第一次糟糕经历后应该吸取教训,这种情况仍在继续发生?是什么让程序员不仅写出糟糕的代码,而且持续写出糟糕的代码?

好吧,这曾经是个谜,但我一开始并没有太担心。就像"糟糕的程序完全是由糟糕的程序员造成的"这样简单明显的启示,足以推动我对编程领域的整个调查和研究,并取得了一些相当好的结果(这主要是我在这个博客上写的内容,也是一本正在开发中的书的主题)。问题已经被定义(创造复杂性的糟糕程序员),似乎也有解决方案(描述可以防止这种情况的软件设计法则),这对我来说就足够了。

但让我困惑的是,即使经过几十年的软件开发技术进步,世界各地的大学、技术学校和培训项目仍然培养出如此糟糕的程序员。当然,很多软件设计的原则还没有被编撰成文,但有很多好的建议流传在外,其中很多非常常见。即使人们没有上过学,难道他们没有读过任何这些建议吗?

事实超出了我的想象,我花了近五年时间在Bugzilla项目上与大量不同的贡献者一起工作,直到有一天我突然意识到一个令人震惊的事实:绝大多数(90%或更多)的程序员完全不知道自己在做什么。

这并不是说他们没有读过软件设计的书(虽然他们可能确实没读过)。也不是说编程语言太复杂(虽然它们确实复杂)。而是绝大多数程序员对他们真正在做什么毫无头绪。他们只是在模仿其他程序员的错误——复制代码,向机器输入或多或少毫无意义的咒语,希望它能按照他们的意愿行事,而对计算机的机制、软件设计的原则,或者他们输入计算机的每个单词和符号的含义没有任何真正的理解。

这是一个大胆、令人震惊且冒犯性的说法,但根据我的经验,这是成立的。我亲自审查并反馈了数十名程序员的代码。我阅读了许多其他人的代码。我与许多许多程序员讨论过软件开发,阅读了数百名开发者的著作。真正理解自己在做什么的程序员数量,大约只占我交谈过、合作过或听说过的所有程序员的10%。在开源领域,我们得到的是精英——那些想在业余时间编程的人。即便如此,我认为只有约20%的开源程序员真正掌握自己在做什么。

为什么会这样?问题出在哪里?

为什么会有这么多在这个领域工作的人完全不知道自己在做什么?这听起来有点像他们"愚蠢"。但什么是愚蠢?人们不会因为不知道某事而愚蠢。有很多东西是每个人都不知道的。这不会让他们变得愚蠢。这可能会让他们对某些事情无知,但不会让他们变得愚蠢。

不,真正的愚蠢是不知道你不知道。愚蠢的人在他们不知道的时候认为自己知道,或者他们根本不知道还有更多需要知道的东西。这种愚蠢几乎可以在每个领域找到,软件开发也不例外。许多程序员根本不知道软件开发可能有法则或一般准则,所以他们甚至不去寻找它们。

在许多软件公司,没有人试图提高开发人员对他们使用的编程语言的理解——也许仅仅因为他们认为程序员"如果被雇来做这件事就一定已经知道了"。不幸的是,在软件开发中持有这种心态特别有害,因为如果你真的想变得优秀,有太多东西需要知道。任何认为自己已经知道一切(或者有"盲点"看不到还有更多需要学习)的人,都会因为缺乏知识而无法产出优秀的代码——这些知识他们甚至不知道存在,甚至不知道他们缺乏。

优秀程序员的七个问题

无论你知道多少,几乎总是有更多关于任何领域的东西需要了解,计算机编程也不例外。所以认为你知道一切总是错误的。不过,有时候很难弄清楚一个人应该学习什么。有这么多数据,从哪里开始?

为了帮助你,我提出了一些问题,你可以问自己或他人,以帮助找出哪些领域可能需要更多研究:

  1. 你是否尽可能了解你写的每一页代码中的每个单词和符号?
  2. 你是否阅读并完全理解你使用的每个函数的文档?
  3. 你是否对软件开发的基本原则有出色的掌握——掌握得如此之好,以至于你可以毫无瑕疵地向组织中的新手程序员解释它们?
  4. 你是否理解计算机每个组件的功能,以及它们如何协同工作?
  5. 你是否了解计算机的历史,以及它们未来的发展方向,以便你能理解你的代码将在未来构建的计算机上如何运行?
  6. 你是否了解编程语言的历史,以便你能理解你使用的语言是如何演变的,以及为什么它这样工作?
  7. 你是否理解其他编程语言、其他编程方法以及其他类型的计算机,而不仅仅是你正在使用的,以便你知道每个工作的实际最佳工具是什么?

从上到下,这些是任何程序员了解他们正在编写的代码的最重要的事情。如果你能对所有这些问题诚实地回答"是",那么你就是一个优秀的程序员。

学习与实践的平衡

这可能看起来是一个压倒性的列表。“哇,每个函数的文档?阅读这些会花太长时间!“好吧,你知道还有什么需要很长时间吗?如果你不阅读文档,成为一个好程序员需要很长时间。你知道需要多长时间吗?永远,因为它永远不会发生。你永远不会仅仅通过复制别人的代码并祈祷它对你有用而成为一个好程序员。

但更重要的是,投入时间学习是变得优秀的关键。现在花时间会让你以后成为一个更快的程序员。如果你在学习一项新技术的头三个月花很多时间阅读相关资料,那么在接下来的10年里,你可能会比那些直接投入然后从不阅读任何东西的人快10倍。

不过,我想对此加上一个限制——你不能只是阅读三个月就期望成为一个好程序员。首先,这太无聊了——没有人想只是学习三个月的理论而不进行任何实际练习。很少有人会坚持足够长的时间成为程序员,更不用说好程序员了。所以我想指出,理解也来自实践,而不仅仅是学习。但没有学习,理解可能永远不会到来。因此,平衡编程的学习和实践是很重要的。

这不是对任何程序员的攻击

这不是对我个人合作过的任何程序员的攻击,甚至不是对任何个别程序员的攻击。作为一个人,我几乎钦佩我认识的每一个程序员,我想如果我遇到其他人,我也会钦佩他们。相反,这是对所有程序员的一个公开邀请,打开你的思维,接受可能总是有更多需要知道的东西,知识和实践是技能的关键,不知道某事一点也不可耻——只要你知道你不知道它,并在必要时花时间学习它。

  • Max
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计