14 9月

编程为什么困难

文 / Joe Armstrong:Erlang语言最初的设计者和实现者,他拥有瑞典皇家理工学院博士学位,是容错系统开发领域的世界级专家。

编译 / 白云鹏

原文链接:http://joearms.github.io/2014/02/07/why-programming-is-difficult.html

很多年前,我认为编程很容易,随着岁月的流逝,我已经意识到编程并不那么容易。这是围绕编程是什么,程序员做什么这两方面感知上的缓慢转变。

起初我还以为编程只是告诉计算机做什么,这样的编程是相对容易的。编了二十多年程序后,我感觉这种编程相当简单。

c

定义一:程序是将输入转化为输出的东西
程序员是编写程序的人,编程是编写程序的行为。

现在让我们给程序定义添加一些约束。

定义二:程序是将输入转化为输出,并受到以下限制的东西。

  • 该程序的输出结果要悠美。
  • 该程序的输入要悠美。
  • 该程序要悠美。
  • 该程序的输入要恰当并被正确归档。
  • 该程序本身要恰当并被正确归档。
  • 该程序通过测试并被证明是正确的。
  • 该程序正在解决中的问题要恰当地说明。
  • 该程序存在的其他问题要恰当地说明。

带着这些约束条件进行编程就变得十分困难了。

对于特定的问题,一些限制可以放宽。

不需要维护的程序
我们通常编写只要输出结果的程序,这种情况,输入和程序本身将来就不需要维护,所以不必有特别漂亮或很好地描述。

我写的关于Erlang语言的书就是这类情况。书一旦出版,就不再需要撰写和维护。结果看起来不错,但输入是一堆乱糟糟的XML文件和不会再被维护的测试程序。

在重印的时候,这本书的勘误信息和必要的修改只涉及输入微小且简单的修改,即使输入没有被很好地归档。

必须要维护的程序
对于必须要维护的程序来说,程序的输入和程序本身,则要悠美并很好地归档。

我与一位Web程序顾问聊天。他说只要程序的输出看起来是正确的,那么客户就会认为项目结束了,项目经理就会投身于下一个项目。

这里没有认识到,在开始下个项目前,网站不仅应该看起来不错,而且代码也要整洁并被归档。当然,也没有时间去这样做。因为这是要在未来进行维护的项目。

使编程困难的其他原因

  • 修复本来以为不可能坏的东西
  • 没有时间学习
  • 恶劣的编程环境

这些因素都是“时间的盗贼”。

修复本来以为不可能坏的东西

通常,我会使用自己并不十分了解的软件去解决特定的问题。

如果运气好,我使用的程序有准确的使用描述。而更多的情况是程序要么没有描述,要么是错误的描述。

如果文档里面的描述与事实不符,你会怎样?如果写文档的人就在你旁边还好,否则只能借助Google或者从源码中寻找答案了。

进了Google这赌场想搏一记,这样的查错经历真是不堪回首。好容易Google到一篇帖子,有个倒霉鬼恰巧和我遭遇了完全一样的问题。我的心脏激动得跳个不停。我用颤抖的指尖把这找来的咒语输入,以为这样诅咒就能解除……结果,还是不行。问题依旧。

为什么我的修复工作这么不顺呢,难道恶意之神有意盯着我?或者我身处区域的物理规律与别处不同不成?其实不然,两台机器的初始状态是不同的,所以在此机器上修复了缺陷的高招,在状态不同的彼机器上就不一定灵验。

修复坏掉的东西会令人感到加倍沮丧的,因为即使问题消失了,你也不知道是否解决了这个问题,或目前的效果是否是你所做的修改导致的。

顺便说一句,这样的问题需要我大部分的时间去处理。我曾经用一周多的时间去修复坏掉的LDAP服务器,而我的老板禁止我自己去做新的。但后来我还是自己做了一个。

说实话,这并不算一个完整的LDAP服务器。我想要的仅仅是两行命令就能工作,这是很容易修复的。

如今,我觉得去实现那些过时的和有悖常情的协议没有什么特别的喜悦,而重新实现它们往往是最快的进步方式。

不通过学习解决问题
我很懒,是个没有出息的懒鬼。当我试图使用LaTex对一个图表做排版时,我不想去阅读长达391页的说明书。我知道你会指责我懒惰,品德不健全。我明白自己应该首先阅读说明书,但我为了文档中的一个图表用十分钟读完一个391页的文档是不现实的。

恶劣的编程环境
工作场所的设计使编程更加困难,无隔板的开放式办公室那嘈杂的环境,破坏了我们的注意力,移动电话的打扰,以及互联网都会分散我们的注意力。

幸运的是我们还可以有可去的地方,那就是睡觉。很多编程问题是在睡觉过程中解决的。

有两种方法。首先将考虑的问题记住,然后睡觉,第二天醒来一些问题就被解决了,很容易。

另一种方法是睡觉前用tweet,在网上发个帖子,第二天就有人将解决方法发给你了。

做一名优秀的程序员需要很长的时间,你需要学习很多东西,当遇到问题的时候,需要知道向谁请教。

令人吃惊的事实
我写完这篇文章的时候,拼写检查工具竟然罢工了。就在我抱怨自己花费大半辈子修复的东西本不应该坏掉时,Emacs上的语法检查工具就坏掉了。

我的Emacs拼写检查器在这台机器上老老实实地工作了好几年。

我并不相信恶意之神,也不认为我这里的物理规律有什么不同。

一切都正常,我不知道为什么拼写检查器会坏掉,而我什么都没做。

幸运的是,用了十一分钟在Google这赌场搏一把后见效了,其中第二条方法解决了我的问题,而我仍然不知道Emacs中为什么找不到Aspell了。人生短暂而有太多不甚明了的事情。

我想有些东西我们永远都不会知道。

从长远来看,选择快速的方法处理问题是个灾难。

拿制作文档来说,我就在TeX/LaTex、XSLT-FO和我的Erlguten之间犹豫不定。

大约每三年一次,我都会有强烈的愿望,将自己所有的文档直接写在附录中,而后唯一做的事情却是深呼气,等待这种感觉消失掉。

如今因为我们可以让机器去做枯燥和危险的事情,我们反而没有更多的时间去做事。

我问过我的老板,他是否需要漂亮的幻灯片来演讲。他说需要,但要我明天之前给他。我权衡了需要时间去学习的几个方案,最终选择了PowerPoint。

http://www.csdn.net/article/2014-03-31/2819060