为什么程序员糟糕:代码复杂性与行业反思

本文探讨了程序员普遍存在的问题:缺乏对编程本质的理解,导致代码复杂难维护。作者通过多年经验指出,90%的程序员只是模仿他人代码而不懂其原理,并提出了提升编程能力的七个关键问题,强调持续学习与实践的重要性。

为什么程序员糟糕

2009年12月1日 by Max Kanat-Alexander

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

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

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

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

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

这不是因为他们没有读过软件设计(尽管他们可能没有读过)。也不是因为编程语言太复杂(尽管它们确实复杂)。而是绝大多数程序员根本不知道自己在做什么。他们只是在模仿其他程序员的错误——复制代码,向机器输入或多或少无意义的咒语,希望它能按自己的意愿运行,而对计算机的机制、软件设计的原则或他们输入计算机的每个单词和符号的含义没有任何真正的理解。

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

那么为什么会这样?问题是什么?怎么可能有这么多人在这个领域工作却完全不知道自己在做什么?

嗯,这听起来有点像他们 somehow “愚蠢”。但什么是愚蠢?人们不知道某事并不愚蠢。有很多东西是每个人都不知道的。这并不使他们愚蠢。这可能使他们对某些事情无知,但并不使他们愚蠢。不,愚蠢,真正的愚蠢,是不知道你不知道。愚蠢的人认为他们知道某事,但实际上不知道,或者他们不知道还有更多需要知道的东西。

这种愚蠢几乎可以在每个领域找到,软件开发也不例外。许多程序员根本不知道软件开发可能有法则或一般指南,因此他们甚至不去寻找它们。在许多软件公司,没有尝试提高开发人员对他们使用的编程语言的理解——也许仅仅是因为他们认为程序员“如果被雇用来做这件事,一定已经知道了”。

不幸的是,在软件开发中有这种心态特别有害,因为如果你真的想变得优秀,有太多东西需要知道。任何认为自己已经知道一切(或有“盲点”,看不到还有更多需要学习)的人,由于缺乏知识——他们甚至不知道存在的知识,甚至不知道他们缺乏的知识——他们生产优秀代码的能力受到了损害。

无论你知道多少,几乎总是有更多关于任何领域的东西需要知道,计算机编程也不例外。所以认为你知道一切总是错误的。

不过,有时很难弄清楚一个人应该学习什么。有这么多数据,从哪里开始?嗯,为了帮助你,我想出了几个问题,你可以问自己或他人,以帮助找出哪些领域可能需要更多研究:

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

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

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

但更重要的是,投入时间学习是变得优秀所需要的。现在花时间将使你以后成为更快的程序员。如果你在学习一项新技术的头三个月花大量时间阅读资料,那么在未来10年里,你使用它的速度可能比如果你只是潜入其中然后从不阅读任何东西快10倍。

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

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

-Max


评论节选:

Noah Yetter 说:2009年12月1日上午11:41 “但让我困惑的是,世界各地的大学、技术学校和培训项目仍然能培养出如此糟糕的程序员,即使经过几十年的软件开发技术进步。”嗯,这就是你的错误。你看,我们作为专业程序员所做的是“软件工程”(或者只是“开发”,如果你认为我们不配“工程师”标签),而学校教的是“计算机科学”。用硬科学来类比,这就像物理学和(真正)工程学之间的区别。知道一堆方程对设计机器或结构有帮助,但还不够。同样,了解数据结构和算法对设计软件有帮助,但还不够。

90%以上从计算机科学正式教育毕业的人不知道如何在团队中工作,不知道如何维护软件或编写将被维护的软件,从未使用过源代码控制或错误跟踪,从未编写过第三方API,也从未有机会编写对任何事情真正有用的程序。所有这些,他们必须从其他人那里在职学习,而这些人又不得不做同样的事情,在一个无知的链条中。那些“软件开发技术的进步”都没有进入课堂,大多数真正程序员使用的工具也没有。

通过将象牙塔博士群体从大学计算机系的控制中赶下台,并用10%中的顶尖程序员取代他们,可以改善情况。但是A)祝你好运,B)为什么一个真正伟大的程序员会选择学术界而不是工业界或开源?

Max Kanat-Alexander 说:2009年12月1日下午4:12 不,是的,我认为你是对的——计算机科学不能消失。它非常重要,尽管它在实际编程中只占很小一部分。我们需要有人能坐下来为特定算法找出最有效的数学过程,以便专业程序员可以一次性实现它,然后通过库提供给每个人。

不过,关于专业资格的事情,我不太确定,因为如果我们有类似的东西,我会担心人们会将其用作权威系统,而不考虑实际知识或技能,有点像某些医疗行业所做的那样。

-Max

(评论继续讨论教育、实践、工具使用等话题,许多程序员分享类似经历和观点。)

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