当前位置: 首页 > 科技观察

为什么编程这么难?Erlang之父感悟

时间:2023-03-15 11:42:21 科技观察

【攻略】:作为程序员,你会如何向非程序员解释写程序并不容易?为什么看不见摸不着的程序要花时间去编写和维护?很多人其实连想都没想。看看Erlang之父JoeArmstrong的感受吧。为什么编程这么难?多年前,我认为编程很容易,但随着岁月的流逝,我终于意识到编程并不容易。这是因为我所认为的“编程究竟是什么”、“程序员到底是做什么的”,在观念上已经逐渐发生了变化。定义1:所谓程序就是将输入转化为输出的东西,程序员就是编写程序的人,编程就是编写程序的行为;现在让我们为我的程序定义添加一些约束。定义2:所谓程序就是在下列约束条件下,将一些输入转化为输出的东西。程序输出优美;程序输入优雅;程序本身是优雅的;程序输入被完整且正确地记录在案;程序本身有良好且正确的文档;程序经过充分测试和验证是正确的;进行中要解决的问题非常明确;整个问题本身也很明确;加上这些约束,编程变得非常困难。现在针对一个具体的问题,可以放宽上面的一些约束。几个典型的假设是:不需要持续维护的程序我们经常编写程序只是为了获得输出结果。在这种情况下,程序的输入和程序本身不需要后期维护,所以这些不必特别优雅和充分地解释。我的Erlang书就是一个例子。一旦本书出版,用于编写本书的程序和输入组件就不需要维护了。程序看起来不错,但输入部分只是一堆乱七八糟的xml文件,而且我用来写这本书的一些测试代码从来没有保留过。本书的勘误表和后续重印的一些必要更正仅涉及对输入的微小修改,即使程序的输入没有很好地记录,这也很容易做到。必须维护的程序是那些从头到尾都维护的程序。程序的输入和程序本身都必须得到精美的解释,并具有完整而优雅的文档和注释。不久前我和一位开发网络应用程序的计算机顾问聊天。他说,一旦程序的输出看起来不错(即网站看起来不错,程序似乎可以运行),客户就认为项目完成了,项目经理就会将他分配到下一个项目。在下一个项目开始之前,不仅网站要好看,写的代码也要整理和文档化。但人们没有时间这样做,他们也不明白其中的意义。而且这种项目以后是需要维护的。还有什么让编程变得困难?还有其他三个因素使编程变得困难:修复不应该被破坏的程序没有时间学习编程的恶劣环境这三个问题都是“时间窃贼”,让我们具体检查一下:修复不应该破坏的程序BeBroken为了解决一个特定的问题,我经常使用我既不编写也不理解的软件。最重要的是,我必须使用的程序有一本详细描述的说明手册。但往往这个程序要么没有描述文件,要么描述文件有误。那么,当文档说:“执行XYZ之后,发生PQR”而你执行“XYZ”但“PQR”没有发生时,你会怎么做?如果幸运的话,编写这个程序如果有人就在你旁边,那么你可以过去问这些问题。如果没有,你可以谷歌试试你的运气,或者直接挖掘源代码来寻找答案。使用谷歌的“大赌场”来查找如何修复错误真是令人沮丧。我快速进行了一次谷歌搜索,发现了一些记录,表明某个不幸的人遇到了与我完全相同的问题。大喜过望,我颤抖着输入解除诅咒的魔法指令……然后……什么都没有改变。问题仍然存在。为什么此修复程序对其他人有效但对我无效。是有邪神在注视着我,还是我处于暂时不符合物理定律的宇宙局部区域?我们两台机器的初始状态不同,所以在一个状态下修复一台机器的错误的方法可能无法修复另一个。机器在这种状态下的错误。正如我有时想用smalltalk编程一样,我们都从完全相同的程序图像开始-Smalltalk程序员必须生活在一个理想的天堂,那里不会发生这种情况,但有一天即使是他们自己的程序也可能当你不得不说话时乐趣就开始了到其他程序。修复损坏的东西的挫败感是双重的,即使你已经把错误赶走了,你也不知道这是否是你要修复的最后一个问题,或者你所做的改变会带来什么实际影响。顺便说一句,这种问题占用了我大部分时间,大约占我时间的60-70%。我曾经花了一个多星期的时间试图让一个损坏的LDAP服务器工作,我的老板禁止我实现我自己的LDAP服务器,但是在与这个以C编码混乱归档的损坏的LDAP服务器斗争了一周之后,我的记忆是有点模糊,我忘记了我老板说的话,并且在我午休期间不小心用Erlang从头开始??运行服务器。老实说,这不是一个完整的LDAP服务器,但我也不需要一个完整的LDAP服务器。我只想运行一些命令,这实际上很容易修复。现在我对实施旧的、变态的协议没有兴趣,通常最快的方法是从头开始重新实施它们。解决问题而不是学习我很懒惰,我是个懒汉。当我想在LaTeX中放一个图表时,我不想先通读391页的手册。现在我猜你会指责我懒惰和道德败坏。我也知道我想先看这本优秀的手册,但是我想在十分钟内在文档中放一张图,所以391页的手册是不可能看完的。在解决这类问题时,我会选择更快的解决方案——但从长远来看,这是非常昂贵的。在文档方面,我一直在犹豫是使用TeX/LaTeX、XSLT-FO还是我自己的Erlguten。每隔三年左右,我就有一种直接用后记写下所有文档的冲动,然后我深吸一口气,等待这种想法消失。我想当GiambattistaBondoni于1818年发明他的手印时,他并不特别在意排版单页是否需要数周时间。但是现在我们有了机器来做这些无聊和危险的事情,我们有更多的时间来做正确的事情。我问我的老板,他的下节课是否需要一个很酷的幻灯片,他说是的,并让我在明天之前给他。这让我没有时间好好学习Tex(我估计几年内就可以),实现我自己的排版语言(大概5年),直接用postscript写(大概一周左右)——所以我猜我将使用PowerPoint。编程的恶劣环境读到这里,你就会明白我说的编程真的很难了。原因是工作场所旨在让编程变得更难。我们开放的工作场所提供的嘈杂环境会扰乱我们的注意力,我们的手机和互联网会分散我们的注意力。幸运的是,我们可以去一些不会打扰我们的地方。那就是睡觉。很多编程问题都是在你睡觉的时候解决的。有两种方法。首先,你将问题上传到你的大脑,然后上床睡觉。第二天起来之后,有些问题就迎刃而解了。很简单。其次,您在睡觉前在线或在Twitter上发布问题。第二天会有人给你发解决方案。成为一名优秀的程序员需要很长时间,你需要学习很多知识,你需要知道当你遇到困难时该问谁。令人惊讶的事实当我完成这篇文章时,我想对内容进行拼写检查。emacs的ispell模式出现了。这个我一直用来检查拼写的程序,现在不能搜索拼写了。我的emacs拼写检查器多年来一直忠实地在这台机器上工作。就在我抱怨花费半辈子修复不应该被破坏的程序时,我的emacs拼写检查器被破坏了。我不相信邪神,也不相信我打字的客厅沙发左角不符合物理定律。尽管一些间接证据似乎与我相矛盾。我不知道为什么我的拼写检查器坏了-一切看起来都很好,我没有改变任何东西。哦,自从上次检查课文后,我刚刚安装了更新版本的Erlang,安装了Julia并写了一些讲义。幸运的是,在谷歌赌场工作11分钟后,关于如何解决我的问题的第二个建议奏效了。但是我仍然不明白为什么emacs不能搜索拼写。生命太短暂,无法找到所有答案。我想这只是有些事情我们永远无法理解。