程序员为何糟糕
2009年12月1日,作者:Max Kanat-Alexander
很久以前,我写过一篇题为《为什么计算机很糟糕》的文章(后来两次修订时标题改为《计算机》和《计算机的问题》,原标题从未公开)。那篇文章相当长,但核心观点是:计算机糟糕是因为程序员创造了疯狂复杂的东西,其他人无法理解,复杂性不断累积,直到程序的每个方面都变得难以管理。
当时我不知道的是,程序员为什么会这样做。很明显他们确实这样做了,但为什么软件开发行业会产生如此多疯狂、复杂、难以阅读的代码?即使开发人员在第一次糟糕经历后应该吸取教训,为什么这种情况仍在持续发生?是什么让程序员不仅编写糟糕的代码,而且持续这样做?
嗯,这是一个谜,但起初我并没有太担心。仅仅揭示“糟糕的程序完全是由糟糕的程序员造成的”,尽管看似简单明了,但足以推动对整个编程领域的调查和研究,并取得了一些相当好的结果(这主要是我在这个博客上写的内容,也是一本正在开发中的书的主题)。问题已经定义(创造复杂性的糟糕程序员),似乎也有解决方案(描述防止这种情况的软件设计法则),这对我来说就足够了。
但令我困惑的是,即使软件开发技术经过几十年的进步,世界各地的大学、技术学校和培训项目仍然培养出如此糟糕的程序员。当然,许多软件设计原则尚未成文,但有很多好的建议流传,其中很多非常常见。即使人们没有上学,难道他们没有读过任何这些建议吗?
嗯,真相超出了我的想象,我花了近五年的时间在Bugzilla项目中与大量独立的贡献者合作,直到有一天我突然意识到一个可怕的事实:绝大多数(90%或更多)的程序员完全不知道自己在做什么。
这不是因为他们没有读过软件设计(尽管他们可能没有)。也不是因为编程语言太复杂(尽管它们确实复杂)。而是绝大多数程序员根本不知道自己在做什么。他们只是在模仿其他程序员的错误——复制代码,向机器键入或多或少无意义的咒语,希望它能按自己的意愿运行,而对计算机的机制、软件设计的原则或他们键入计算机的每个单词和符号的含义没有任何真正的理解。
这是一个大胆、令人震惊且冒犯性的陈述,但根据我的经验,它是成立的。我亲自审查并反馈了数十名程序员的代码。我阅读了许多其他人的代码。我与许多许多程序员讨论过软件开发,并阅读了数百名开发人员的文章。真正理解自己在做什么的程序员数量仅占我交谈、合作或听说过的所有程序员的约10%。在开源领域,我们得到了精英——那些想在业余时间编程的人。即使如此,我认为只有约20%的开源程序员真正掌握自己在做什么。
那么为什么会这样?问题是什么?怎么可能有这么多人在这个领域工作,却完全不知道自己在做什么?嗯,这听起来有点像他们“愚蠢”。但什么是愚蠢?人们不会因为不知道某事而愚蠢。有很多东西是每个人都不知道的。这并不使他们愚蠢。这可能使他们对某些事情无知,但并不使他们愚蠢。不,愚蠢,真正的愚蠢,是不知道你不知道。愚蠢的人认为他们知道某事,但实际上不知道,或者他们不知道还有更多需要了解的东西。
这种愚蠢几乎可以在每个领域找到,软件开发也不例外。许多程序员根本不知道软件开发可能有法则或一般指南,因此他们甚至不去寻找它们。在许多软件公司,没有人尝试提高开发人员对他们使用的编程语言的理解——也许仅仅是因为他们认为程序员“如果被雇佣来做这件事,一定已经知道了”。不幸的是,在软件开发中拥有这种心态尤其有害,因为如果你真的想变得优秀,有太多需要了解的东西。
任何认为自己已经知道一切(或有一个“盲点”,看不到还有更多需要学习)的人,都会因为缺乏知识而削弱他们产生优秀代码的能力——这些知识他们甚至不知道存在,甚至不知道他们缺乏。无论你知道多少,几乎总是有更多关于任何领域的东西需要了解,计算机编程也不例外。因此,认为你知道一切总是错误的。
有时,很难弄清楚一个人应该学习什么。有这么多数据,从哪里开始?嗯,为了帮助你,我想出了几个问题,你可以问自己或他人,以帮助找出哪些领域可能需要更多学习:
- 你是否尽可能了解你编写的每一页代码中的每个单词和符号?
- 你是否阅读并完全理解你使用的每个函数的文档?
- 你是否出色地掌握了软件开发的基本原则——如此出色,以至于你可以向组织中的新手程序员完美地解释它们?
- 你是否理解计算机每个组件的功能以及它们如何协同工作?
- 你是否了解计算机的历史以及它们未来的发展方向,以便你能理解你的代码将在未来构建的计算机上如何运行?
- 你是否了解编程语言的历史,以便你能理解你使用的语言如何演变以及为什么它这样工作?
- 你是否了解其他编程语言、其他编程方法以及其他类型的计算机,以便你知道每个工作的实际最佳工具是什么?
从上到下,这些是任何程序员了解他们编写的代码的最重要的事情。如果你能诚实地对所有这些问题回答“是”,那么你是一个优秀的程序员。
这可能看起来是一个令人望而生畏的列表。“哇,每个函数的文档?阅读那将花费太长时间!”嗯,你知道还有什么需要很长时间吗?如果你不阅读文档,成为一个好程序员。你知道需要多长时间吗?永远,因为它永远不会发生。你永远不会仅仅通过复制别人的代码并祈祷它对你有效而成为一个好程序员。但更重要的是,投入时间学习是变得优秀的关键。现在花时间将使你以后成为更快的程序员。如果你在学习新技术的头三个月花大量时间阅读资料,那么在接下来的10年里,你可能会比那些只是潜入其中然后从不阅读任何东西的人快10倍。
不过,我想对此加上一个限制——你不能只是阅读三个月就期望成为一个好程序员。首先,那太无聊了——没有人想只学习理论三个月而不进行任何实际练习。很少有人会坚持足够长的时间成为程序员,更不用说好程序员了。因此,我想指出,理解也来自实践,而不仅仅是学习。但没有学习,理解可能永远不会到来。因此,平衡编程的学习和实践非常重要。
这不是对我个人合作过的任何程序员的攻击,甚至不是对任何个别程序员的攻击。作为一个人,我几乎钦佩我认识的每一个程序员,我期望如果我遇到其他人,我也会钦佩他们。相反,这是对所有程序员的公开邀请,开放你的思想,思考可能总是有更多需要了解的东西,知识和实践是技能的关键,不知道某事一点也不可耻——只要你知道你不知道,并在必要时花时间学习它。
- Max
评论部分
Noah Yetter 说:
2009年12月1日上午11:41
“但令我困惑的是,即使软件开发技术经过几十年的进步,世界各地的大学、技术学校和培训项目仍然培养出如此糟糕的程序员。”
嗯,这是你的错误。你看,我们作为专业程序员所做的是“软件工程”(或者如果你认为我们不配“工程师”标签,只是“开发”),而学校教授的是“计算机科学”。类比硬科学,这就像物理学和(真正)工程学之间的区别。知道一堆方程对设计机器或结构有帮助,但还不够。类似地,了解数据结构和算法对设计软件有帮助,但还不够。
90%以上从计算机科学正式教育毕业的人不知道如何团队合作,不知道如何维护软件或编写将被维护的软件,从未使用过源代码控制或错误跟踪,从未编写过第三方API,也从未有机会编写真正有用的程序。所有这些,他们必须从其他人那里在职学习,而这些人又不得不做同样的事情,在一个无知的链条中。那些“软件开发技术的进步”都没有进入课堂,大多数真实程序员使用的工具也没有。
通过将象牙塔博士群体从大学计算机部门的控制中赶走,并用10%中的顶尖程序员替换他们,可以改善情况。但A)祝你好运,B)为什么一个真正伟大的程序员会选择学术界而不是行业或开源?
Michael Lefevre 说:
2009年12月1日下午1:31
“通过将象牙塔博士群体从大学计算机部门的控制中赶走,并用10%中的顶尖程序员替换他们,可以改善情况。”
但我不太确定“替换”。Max帖子中的一些内容属于计算机科学而不是软件工程。现有课程中是否有空间同时做好两者?或者更好的是建议(在我们为理想世界建议时)一些进一步的专业资格,像“真正”的工程师、医生、建筑师、会计师和许多其他人。这样的东西存在,至少在英国,但我不太了解,据我所知,没有很多人拥有它们(至少相对于其他职业)。
Max Kanat-Alexander 说:
2009年12月1日下午4:12
不,是的,我认为你是对的——计算机科学不能消失。它非常重要,尽管它只是实际编程的很小一部分。我们需要有人能坐下来为特定算法找出最有效的数学过程,以便专业程序员可以一次实现它,然后在库中提供给每个人。
不过,专业资格的事情,我不太确定,因为如果我们有类似的东西,我会担心人们会将其用作权威系统,而不考虑实际知识或技能,有点像一些医疗专业所做的那样。
- Max
Noah Yetter 说:
2009年12月1日下午4:33
我不是说我们应该从大学课程中消除计算机科学。我们需要消除的是计算机科学对编程教学的垄断。我认为在计算机科学和软件工程中拥有平行 yet 重叠的轨道是完全没问题的。想要进行学术研究,或在非软件行业编程,或专注于语言设计等抽象事物的人可以坚持计算机科学,而想要以编写代码为生的人可以转向软件工程。
毕竟,并不是像数据结构、算法和编程语言原理这样的课程对新兴专业编码员没有任何用处,只是像数值分析和无处不在的 required Math minor 这样的课程 largely wastes of time。课程教学方式也存在根本问题。学生通常被禁止合作,这与真实工作的完成方式完全相反。编码项目通常从空白文件开始,这 again 不反映实际程序员每天所做的事情。我认为这 largely due to CS professors typically being career academics rather than retired professionals。我期望他们会通过尝试提供工具课程来解决我提出的问题,以涵盖源代码控制、错误跟踪和现代IDE,而正确的方法是将这些东西嵌入整个项目的结构中。这是我提议彻底消除学术类型的激进步骤的主要原因,以从一个不同的视角重新开始。
Max Kanat-Alexander 说:
2009年12月1日下午4:36
“我们需要消除的是计算机科学对编程教学的垄断。”
是的,我认为这是真的。(你评论的其余部分也相当聪明和陈述良好。)
- Max
Tim 说:
2016年2月4日下午9:20
像Haskell、ML甚至Scala这样的尖端编程语言如果大学的人更推动尖端技术,可能会成为主流。如果有什么的话,大学太努力地符合行业中流行的任何东西,这没有发挥它们的优势。它们应该有重型的软件工程课程,但使用尖端技术,特别是如果它们不在行业中使用。训练拒绝学习除Java以外的任何东西,甚至如何很好地使用它的初级开发人员是非常困难的。很好地理解编程语言,无论是函数式还是面向对象,都不是行业的优势。
我同意大学太强调反对合作,当它们实际上使他们在团队中独立工作时变得困难,因为他们在大学早期阶段通过不共享信息学到的东西少得多。
IDE对于已经有经验的程序员来说很好,但我认为它通过使他们懒惰和/或不愿意走出舒适区而阻碍了我合作的初级开发人员。他们太多地认为他们的IDE是“魔法”,而如果他们实际上学习了命令行的做事方式,他们也会讽刺地更创造性地理解如何使用他们的IDE。
我不喜欢“软件工程师”头衔,因为它排除了从事开源项目的热情爱好者,其中许多人完全能够独立工作,而几乎任何专业程序员都有“软件工程师”头衔,无论技能如何。强调程序员以行业的方式在团队中工作只是鼓励一些alpha程序员,一些beta程序员(如果它们实际上很好,对行业至关重要),以及几乎完全很多拒绝主动做任何事并花费团队大量金钱和时间的程序员。也很烦人的是,我会花几周时间训练一个程序员一个子系统如何工作, yet 它们需要大量干预才能甚至开始,即使那样它们也不对程序实际正确工作负责。
Max Kanat-Alexander 说:
2009年12月1日下午4:10
是的,我认为你在这里说的一切都相当正确,但我遇到的问题在上学和没上学的人中 equally spread——正式教育和缺乏教育之间几乎没有区别,除了正式教育可以帮助人们更轻松地阅读某些类型的文档,因为他们会熟悉某些否则有点难以解释的术语。
有软件工程学校和课程,我认为这 mostly what I was thinking of when I wrote the blog here。事实是, somehow,即使外部世界似乎在开发许多新的和有趣的(或老的重新发现的)软件工程方法,人们仍然从技术培训毕业(或仅仅从在线阅读他们的编程语言)而没有一点理解他们在做什么。
- Max
Adam 说:
2009年12月1日上午11:48
我相信你可能正在经历的是 obscurification。
http://www.allwords.com/word-obscurification.html
很多时候在企业中,对于程序代码..和Web代码..他们 purposely dump extra stuff in there so that it is much harder to figure out what does what.. and what can be taken out or modified for everything to keep working。
这是一个愚蠢的做法..但我知道很多人必须 bunk up their code just to keep their bosses happy。
Max Kanat-Alexander 说:
2009年12月1日下午4:13
哈哈哈,我确实经历了一些,我肯定。我在这里写了一点关于那个, sort of:
http://www.codesimplicity.com/post/complexity-is-a-prison/
但我所看到的,我在开源和商业项目中 equally see,所以绝对没有理由(不是曾经有)创建 intentionally obscure code,而我的审查经验告诉我,事实上编码者 simply didn’t know what they were doing。
- Max
Mark Castillo 说:
2009年12月1日下午1:54
制作软件是一门科学和艺术。我认为愚蠢来自这个人不够关心或对他们的手艺不够热情。他们必须对它真正感兴趣,才能学习并想知道关于它的一切,而不是做最少的学习(为了在周末收集薪水)。
Max Kanat-Alexander 说:
2009年12月1日下午4:14
这是问题的一个非常可能的来源,是的。你在这里稍微 anticipate 了我未来的博客文章。
Mike Kristoffersen 说:
2009年12月1日下午4:54
也可能是他们没有时间投资,因为他们的工作有截止日期,明确或不明确。这是一个通用问题——做正确的事,或快速制作“有效”的东西。
(截止日期移动以做正确的事的解决方案 unfortunately sometimes very hard to sell,因为短期利润通常被视为比长期潜在节省更重要)
也可能是某种骄傲——如果你需要学习某事,那一定意味着你不知道它,而有些人可能不愿意承认这一点。
但不幸的是,在某些情况下你是对的,有一些人只是不在乎,这不应该与那些做出有意识决定限制他们在给定任务上的工作以试图 either do less work overall or to touch more tasks 的人混淆。
Max Kanat-Alexander 说:
2009年12月2日上午5:13
是的,不幸的是,人们以这样的方式设置截止日期,系统无法正确设计, also unfortunate that given that deadline, we often still try to get in all the features that we want to see。仍然,我认为那些看短期利润的人真的不明白他们对系统长期价值造成的损害,除非有一些可怕的紧急情况,否则他们最好等待 just a few weeks or months for the system to get done right。否则它是一个如此 slippery slope——你将最终 forever 有未满足的截止日期,因为系统变得越来越难维护。
关于骄傲的事情, definitely true。我认为这是一个大问题,是有些人认为承认缺乏知识是某种“对他们骄傲的打击”,而实际上他们获得 ACTUAL 技能的唯一方式是通过承认他们不知道事情, frequently and easily!
- Max
Tim 说:
2016年2月4日下午9:44
我完全同意你们俩的帖子 here。
我 consistently found that when we rushed to meet my boss’s unrealistic deadlines (he would expect huge changes to be done in two weeks, and even let the customer attend design meetings, which he later regretted), we end up spending more time to redesign the subsystems correctly, and the customers would complain like crazy because the problems would be noticeable and we would take an eternity to add small features to problematic areas of the software。
我发现越来越多地,我提出 solutions that take a really long time upfront to design but address every corner case in an important subsystem, but I’ve found that doing so actually saves time, because the bug reports go down, we can more easily add complicated features that the customer wants, and it reduces maintenance work because that section of code almost never needs to be changed, and is often more extensible since more thought was put into understanding the problem domain。
它已经到了我的老板 just lets me do things the right way, because he’s noticed the dramatic increase in quality, and happy customers。
Vladimir Dzhuvinov 说:
2009年12月1日下午9:11
是的,动机是一个关键因素 here。
在我的本科课程中(我学习电子学),很多同事对这门课程狂热(读作书呆子)。但也有一些,对他们来说电子学显然不是他们的菜。他们中的许多人非常聪明,但仍然对职业和人生方向 generally quite unsure。
最近,我一直在为高中生提供职业和进一步学习咨询。我 consistently witness teenagers who are confused what to do with their lifes after they finish school。你不能成为一个快乐的人,除非你能够阅读你的内心指南针,理解你的欲望和才能,然后 follow up with conscious decisions。我们的学校系统为此做得很少,这个任务也不应该留给父母。教学的重点太多关于外部世界的事实,太少关于发现和创造自己,关于与他人联系。
我有一个想法,对成年人平均一天想什么进行全面调查,并用结果形成高中的课程。所以,例如,如果成年人花20%的时间思考性(我不会 surprised if that proves a lot more),那么在学校花20%的时间教如何性表达自己,成功约会的食谱,如何找到合适的伴侣,等等。我也不会 surprised if “what’s the square root of minus one” doesn’t appear at the top of this survey。对我来说,这是使学校相关并看到未来更快乐的成年人的解决方案。
Max Kanat-Alexander 说:
2009年12月2日上午5:15
关于你的青少年, totally fascinating,我认为你 spot-on that you just can’t be happy in life unless you’re doing something that at least sort of fits your purposes, and to do that you have to know what your purposes are。哈哈哈,我可以想象如果人们在 school got some basic relationship advice,世界会有多么不同!当然,我不会信任学校给出关系建议,所以那是一把双刃剑 there。
- Max
Vladimir Dzhuvinov 说:
2009年12月2日上午9:59
许多成年人自己,包括教师,有关系问题,不应该是 entrust schools to deal with this topic 的理由。还有什么更有资格的机构?父母?嗯,为人父母甚至比成为教师有更低的资格要求。