程序员为何糟糕:代码复杂性与技术认知的深度剖析

本文探讨了程序员普遍面临的代码复杂性问题,揭示了90%的程序员缺乏对编程本质的理解,并提出了提升技术认知的关键问题与解决方案,强调持续学习与实践平衡的重要性。

程序员为何糟糕

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

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

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

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

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

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

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

那么为什么会这样?问题是什么?怎么会有这么多在这个领域工作的人完全不知道自己在做什么?嗯,这听起来有点像他们“愚蠢”。但什么是愚蠢?人们不会因为不知道某事而愚蠢。有很多东西是每个人都不知道的。这并不使他们愚蠢。这可能使他们对某些事情无知,但并不使他们愚蠢。不,愚蠢,真正的愚蠢,是不知道你不知道。愚蠢的人认为他们知道某事,但实际上不知道,或者他们不知道还有更多需要知道的东西。

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

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

无论你知道多少,几乎总是有更多关于任何领域的东西需要知道,计算机编程也不例外。因此,认为你知道一切总是错误的。不过,有时很难弄清楚应该学习什么。有这么多数据,从哪里开始?嗯,为了帮助你,我想出了几个问题,你可以问自己或他人,以帮助找出哪些领域可能需要更多学习:

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

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

这可能看起来是一个压倒性的列表。“哇,每个函数的文档?阅读那将花费太长时间!”嗯,你知道还有什么需要很长时间吗?如果你不阅读文档,成为一个好程序员。你知道需要多长时间吗?永远,因为它永远不会发生。你永远不会仅仅通过复制别人的代码并祈祷它对你有效而成为一个好程序员。但更重要的是,投入时间学习是变得优秀的关键。现在花时间将使你以后成为一个更快的程序员。如果你在学习一项新技术的头三个月花大量时间阅读资料,那么在未来10年里,你使用它的速度可能比如果你只是潜入其中然后从不阅读任何东西快10倍。

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

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

-马克斯


评论节选:

Noah Yetter 说:
2009年12月1日上午11:41
“但令我困惑的是,世界各地的大学、技术学校和培训项目仍然能培养出如此糟糕的程序员,即使经过几十年的软件开发技术进步。”嗯,这就是你的错误。你看,我们作为专业程序员所做的是“软件工程”(或者如果你认为我们不配“工程师”标签,只是“开发”),而学校教授的是“计算机科学”。与硬科学类比,这就像物理学和(真正)工程学之间的区别。知道一堆方程对设计机器或结构有帮助,但还不够。类似地,了解数据结构和算法对设计软件有帮助,但还不够。90%以上从计算机科学正式教育毕业的人不知道如何在团队中工作,不知道如何维护软件或编写将被维护的软件,从未使用过源代码控制或错误跟踪,从未编写过第三方API,也从未有机会编写实际上有用的程序。所有这些,他们必须从其他人那里在职学习,而这些人又不得不做同样的事情,形成一个无知的无限链。那些“软件开发技术的进步”都没有进入课堂,大多数真实程序员使用的工具也没有。

Michael Lefevre 说:
2009年12月1日下午1:31
“通过将象牙塔博士人群从大学计算机部门的控制中赶下台,并用10%的顶尖程序员替换他们,可以改善情况。”不过,我不太确定“替换”。马克斯文章中的一些内容属于计算机科学而不是软件工程。现有课程中是否有空间 properly 做两者?或者(当我们为理想世界提出建议时)建议一些进一步的专业资格,如“真正”的工程师、医生、建筑师、会计师和许多其他人会更好。这样的东西存在,至少在英国,但我不太了解它们,而且据我所知,没有很多人拥有它们(至少相对于其他职业)。

Max Kanat-Alexander 说:
2009年12月1日下午4:12
不,是的,我认为你是对的——计算机科学不能消失。它非常重要,尽管它只是实际编程的很小一部分。我们需要有人能坐下来为特定算法找出最有效的数学过程,以便专业程序员可以一次实现它,然后将其提供给每个人在库中。不过,专业资格的事情,我不太确定,因为如果我们有类似的东西,我会担心人们会将其用作权威系统,而不考虑实际知识或技能,有点像某些医疗行业所做的那样。

-马克斯

Noah Yetter 说:
2009年12月1日下午4:33
我不是说我们应该从大学课程中消除计算机科学。我们需要消除的是计算机科学对编程教学的垄断。我认为在计算机科学和软件工程中拥有平行 yet 重叠的轨道是完全没问题的。想要从事学术研究,或在非软件行业编程,或专注于语言设计等抽象事物的人可以坚持计算机科学,而想要以编写代码为生的人可以转向软件工程。毕竟,并不是像数据结构、算法和编程语言原理这样的课程对新兴的专业编码员没有任何用处,只是像数值分析和无处不在的 required Math minor 这样的课程 largely 是浪费时间。课程教学方式也存在根本问题。学生通常被禁止合作,这与实际工作的完成方式完全相反。编码项目通常从空白文件开始,这 again 不能反映实际程序员每天所做的事情。我相信这 largely 是由于计算机科学教授通常是职业学者而不是退休专业人士。我期望他们会通过尝试提供工具课程来 cover 源代码控制、错误跟踪和现代IDE来解决我提出的问题,而正确的方法是将这些东西嵌入整个项目的结构中。这就是我提议彻底消除学术类型的激进步骤的主要原因,以从一个不同的视角重新开始。

Max Kanat-Alexander 说:
2009年12月1日下午4:36
“我们需要消除的是计算机科学对编程教学的垄断。”是的,我认为这是真的。(你评论的其余部分也相当聪明和 well-stated。)

-马克斯

Tim 说:
2016年2月4日下午9:20
像Haskell、ML甚至Scala这样的尖端编程语言如果大学的人更多地推动尖端技术,可能会成为主流。如果有什么的话,大学太努力地 compliance 与行业中流行的任何东西,这没有发挥它们的优势。它们应该有重型的软件工程课程,但使用尖端技术,特别是如果它们不在行业中使用。训练拒绝学习除Java以外的任何东西,甚至如何 well 使用它的初级开发人员非常困难。很好地理解编程语言,无论是函数式还是面向对象,都不是行业的优势。我同意大学太强调反对合作,当它实际上使他们在团队中难以独立工作时,因为他们在大学那个早期阶段通过不共享信息学到的东西少得多。IDE对于已经有经验的程序员来说很好,但我认为它通过使他们懒惰和/或不愿意走出舒适区而阻碍了我合作过的初级开发人员。他们太多地从他们的IDE是“魔法”的角度思考,而如果他们实际上学会了命令行的做事方式,他们 ironically 也会更 creatively 理解如何使用他们的IDE。我不喜欢“软件工程师”头衔,因为它排除了从事开源项目的 passionate 爱好者,其中许多人 quite 能够独立工作, yet 几乎任何专业程序员都有“软件工程师”头衔, regardless 技能。强调程序员以行业的方式在团队中工作 just 鼓励一些 alpha 程序员,一些 beta 程序员(如果他们 actually 好,对行业至关重要), and 几乎 entirely 很多拒绝主动做任何事情并花费团队大量金钱和时间的程序员。 also 令人讨厌的是,我会花几周时间训练程序员一个子系统如何工作, yet 他们需要大量干预才能 even 开始, and even then 他们不负责程序 actually 正确工作。

Max Kanat-Alexander 说:
2009年12月1日下午4:10
是的,我认为你在这里说的一切都相当正确,但我遇到的问题在上学和没上学的人中 equally 分布——正式教育和缺乏教育之间几乎没有区别, except 正式教育可以帮助人们更轻松地阅读某些类型的文档,因为他们会熟悉某些 otherwise 有些难以解释的术语。有软件工程学校和课程,我认为这 mostly 是我写这篇博客时所想的。事实是, somehow,即使外部世界似乎正在开发许多新的和有趣的(或 old 和 rediscovered)软件工程方法,人们仍然从技术培训毕业(或仅仅从在线阅读他们的编程语言)而没有任何一点理解他们 actually 在做什么。

-马克斯

Adam 说:
2009年12月1日上午11:48
我相信你可能正在经历的是 obscurification。http://www.allwords.com/word-obscurification.html 很多时候在企业中,对于程序代码..和网络代码..他们 purposely 倾倒额外的东西在那里,以便更难弄清楚什么做什么..以及什么可以取出或修改以使一切保持工作。这是一个愚蠢的做法..但我知道很多人必须 bunk up 他们的代码 just 让他们的老板高兴。

Max Kanat-Alexander 说:
2009年12月1日下午4:13
哈哈哈,我确实经历了一些,我肯定。我在这里写了一点关于那个, sort of:http://www.codesimplicity.com/post/complexity-is-a-prison/ 但我所看到的,我在开源和商业项目中 equally 看到,所以 absolutely 没有理由(不是 that there ever is)创建 intentionally 晦涩的代码,而我的审查经验告诉我,事实上编码员 simply 不知道他们在做什么。

-马克斯

Mark Castillo 说:
2009年12月1日下午1:54
制作软件是一门科学和艺术。我认为愚蠢来自这个人不够关心或对他们的手艺不够 passionate。他们必须对它有真正的兴趣,才能学习并想知道关于它的一切,而不是做最少的学习(以在周末领取薪水)。

Max Kanat-Alexander 说:
2009年12月1日下午4:14
这是问题的一个非常可能的来源,是的。你在这里 anticipate 了我未来的一篇博客文章一点点。

-马克斯

Mike Kristoffersen 说:
2009年12月1日下午4:54
也可能是他们没有时间投资,因为他们的工作有截止日期, explicit 或 not。这是一个通用问题——做正确的事,或 quickly 制作一些“工作”的东西。(截止日期被移动以做正确事的解决方案 unfortunately 有时很难推销,因为短期利润通常被视为比长期潜在节省更重要。)也可能是某种骄傲——如果你需要学习某事,那 must 意味着你不知道它,而有些人可能不愿意承认 that。但 unfortunately 在某些情况下你是对的,有一些人 just 不关心,这不应该与那些做出 conscious 决定限制他们在给定任务上的工作以试图 either 做更少的工作 overall 或接触更多任务的人混淆。

Max Kanat-Alexander 说:
2009年12月2日上午5:13
是的,人们以 such 方式设置截止日期以至于系统无法 properly 设计是不幸的, also 不幸的是 given that 截止日期,我们 often still 尝试加入所有我们想要看到的功能。仍然,我认为那些看着那些短期利润的人真的不明白他们正在对系统的长期价值造成 such 损害,除非有 some 可怕的紧急情况,否则他们 would be way better off 等待 just 几周或几个月让系统正确完成。否则它是 such 一个 slippery slope——你将最终 forever 有未满足的截止日期,因为系统变得越来越难维护。关于骄傲的事情, definitely 是真的。我认为这是一个大问题,是有些人将承认缺乏知识视为某种“对他们骄傲的打击”,而 really 他们获得 ACTUAL 技能的唯一方式是通过承认他们不知道事情, frequently and easily!

-马克斯

Tim 说:
2016年2月4日下午9:44
我完全同意你在这里的两篇文章。我 consistently 发现,当我们 rushed 满足我老板不切实际的截止日期时(他会期望在两周内完成巨大的变化,甚至让客户参加设计会议,他后来 regretted),我们最终花费更多时间 correctly 重新设计子系统,而客户会抱怨 like crazy,因为问题会 noticeable,而我们会花费 an eternity 向软件的问题区域添加小功能。我发现 increasingly 我提出解决方案,这些解决方案 upfront 需要很长时间来设计,但 address 重要子系统中的每个角落情况,但我发现这样做 actually 节省时间,因为错误报告下降,我们可以 more easily 添加客户想要的复杂功能,并且它减少了维护工作,因为那部分代码几乎不需要更改,并且 often 更可扩展,因为更多思考被投入理解问题领域。它已经达到我老板 just 让我以正确的方式做事情的程度,因为他注意到了质量的 dramatic 增加和满意的客户。

-蒂姆

Vladimir Dzhuvinov 说:
2009年12月1日下午9:11
是的,动机 here 是一个关键因素。在我的本科课程中(我学习电子学),很多同事对这门学科 fanatic(读作书呆子)。但也有一些,对他们来说 electronics obviously 不是他们的菜。他们中的许多人 highly 聪明,但仍然 quite 不确定职业和人生方向 generally。最近我一直在为高中生做职业和进一步学习咨询。我 consistently 目睹青少年在毕业后 confused 不知道该做什么 with their lifes。除非你能够阅读你的内心指南针,理解你的欲望和才能,然后 follow up with conscious 决定,否则你 cannot 成为一个快乐的人。我们的学校系统为此做得很少,而这个任务也不应该留给父母。教学的重点太多关于外部世界的事实,而太少关于发现和创造自己,关于与他人联系。我有一个想法,对成年人平均一天思考什么进行全面调查,并使用结果形成高中的课程。所以,例如,如果成年人一天花20%的时间思考性(我不会 surprised 如果那证明多得多 ),那么在学校花20%的时间教如何 sexually 表达自己,成功约会的食谱,如何找到合适的伴侣,等等。我也 wouldn’t be surprised 如果“负一的平方根是什么”没有出现在这个调查的顶部 对我来说,这是使学校 relevant 并在未来看到更快乐的成年人的解决方案。

Max Kanat-Alexander 说:
2009年12月2日上午5:15
关于你的青少年,那 totally 迷人,我认为你 spot-on 你 just 不能快乐在生活中 unless 你做至少某种适合你目的的事情,而要做到那一点,你必须知道你的目的是什么。哈哈哈,我无法想象如果人们在 school 得到一些基本的关系建议,世界会有多么不同!当然,我不会信任学校给出关系建议,所以那是一个双刃剑。

-马克斯

Vladimir Dzhuvinov 说:
2009年12月2日上午9:59
许多成年人自己,包括老师,有 relationship 问题 should not be a reason not to entrust 学校处理这个话题。还有什么更有资格的机构?父母?嗯,为人父母甚至比成为老师 qualification 要求更低 为此你 only 需要某些身体器官; intelligence 不需要生产后代 为了使教学可信并使孩子 pay attention,老师 must 是它的活生生的例子。但这很难得到。因此,这样的课程 must not

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