编程为什么困难
文 / Joe Armstrong:Erlang语言最初的设计者和实现者,他拥有瑞典皇家理工学院博士学位,是容错系统开发领域的世界级专家。
编译 / 白云鹏
原文链接:http://joearms.github.io/2014/02/07/why-programming-is-difficult.html
很多年前,我认为编程很容易,随着岁月的流逝,我已经意识到编程并不那么容易。这是围绕编程是什么,程序员做什么这两方面感知上的缓慢转变。
起初我还以为编程只是告诉计算机做什么,这样的编程是相对容易的。编了二十多年程序后,我感觉这种编程相当简单。
定义一:程序是将输入转化为输出的东西
程序员是编写程序的人,编程是编写程序的行为。
现在让我们给程序定义添加一些约束。
定义二:程序是将输入转化为输出,并受到以下限制的东西。
- 该程序的输出结果要悠美。
- 该程序的输入要悠美。
- 该程序要悠美。
- 该程序的输入要恰当并被正确归档。
- 该程序本身要恰当并被正确归档。
- 该程序通过测试并被证明是正确的。
- 该程序正在解决中的问题要恰当地说明。
- 该程序存在的其他问题要恰当地说明。
带着这些约束条件进行编程就变得十分困难了。
对于特定的问题,一些限制可以放宽。
不需要维护的程序
我们通常编写只要输出结果的程序,这种情况,输入和程序本身将来就不需要维护,所以不必有特别漂亮或很好地描述。
我写的关于Erlang语言的书就是这类情况。书一旦出版,就不再需要撰写和维护。结果看起来不错,但输入是一堆乱糟糟的XML文件和不会再被维护的测试程序。
在重印的时候,这本书的勘误信息和必要的修改只涉及输入微小且简单的修改,即使输入没有被很好地归档。
必须要维护的程序
对于必须要维护的程序来说,程序的输入和程序本身,则要悠美并很好地归档。
我与一位Web程序顾问聊天。他说只要程序的输出看起来是正确的,那么客户就会认为项目结束了,项目经理就会投身于下一个项目。
这里没有认识到,在开始下个项目前,网站不仅应该看起来不错,而且代码也要整洁并被归档。当然,也没有时间去这样做。因为这是要在未来进行维护的项目。
使编程困难的其他原因
- 修复本来以为不可能坏的东西
- 没有时间学习
- 恶劣的编程环境
这些因素都是“时间的盗贼”。
修复本来以为不可能坏的东西
通常,我会使用自己并不十分了解的软件去解决特定的问题。
如果运气好,我使用的程序有准确的使用描述。而更多的情况是程序要么没有描述,要么是错误的描述。
如果文档里面的描述与事实不符,你会怎样?如果写文档的人就在你旁边还好,否则只能借助Google或者从源码中寻找答案了。
进了Google这赌场想搏一记,这样的查错经历真是不堪回首。好容易Google到一篇帖子,有个倒霉鬼恰巧和我遭遇了完全一样的问题。我的心脏激动得跳个不停。我用颤抖的指尖把这找来的咒语输入,以为这样诅咒就能解除……结果,还是不行。问题依旧。
为什么我的修复工作这么不顺呢,难道恶意之神有意盯着我?或者我身处区域的物理规律与别处不同不成?其实不然,两台机器的初始状态是不同的,所以在此机器上修复了缺陷的高招,在状态不同的彼机器上就不一定灵验。
修复坏掉的东西会令人感到加倍沮丧的,因为即使问题消失了,你也不知道是否解决了这个问题,或目前的效果是否是你所做的修改导致的。
顺便说一句,这样的问题需要我大部分的时间去处理。我曾经用一周多的时间去修复坏掉的LDAP服务器,而我的老板禁止我自己去做新的。但后来我还是自己做了一个。
说实话,这并不算一个完整的LDAP服务器。我想要的仅仅是两行命令就能工作,这是很容易修复的。
如今,我觉得去实现那些过时的和有悖常情的协议没有什么特别的喜悦,而重新实现它们往往是最快的进步方式。
不通过学习解决问题
我很懒,是个没有出息的懒鬼。当我试图使用LaTex对一个图表做排版时,我不想去阅读长达391页的说明书。我知道你会指责我懒惰,品德不健全。我明白自己应该首先阅读说明书,但我为了文档中的一个图表用十分钟读完一个391页的文档是不现实的。
恶劣的编程环境
工作场所的设计使编程更加困难,无隔板的开放式办公室那嘈杂的环境,破坏了我们的注意力,移动电话的打扰,以及互联网都会分散我们的注意力。
幸运的是我们还可以有可去的地方,那就是睡觉。很多编程问题是在睡觉过程中解决的。
有两种方法。首先将考虑的问题记住,然后睡觉,第二天醒来一些问题就被解决了,很容易。
另一种方法是睡觉前用tweet,在网上发个帖子,第二天就有人将解决方法发给你了。
做一名优秀的程序员需要很长的时间,你需要学习很多东西,当遇到问题的时候,需要知道向谁请教。
令人吃惊的事实
我写完这篇文章的时候,拼写检查工具竟然罢工了。就在我抱怨自己花费大半辈子修复的东西本不应该坏掉时,Emacs上的语法检查工具就坏掉了。
我的Emacs拼写检查器在这台机器上老老实实地工作了好几年。
我并不相信恶意之神,也不认为我这里的物理规律有什么不同。
一切都正常,我不知道为什么拼写检查器会坏掉,而我什么都没做。
幸运的是,用了十一分钟在Google这赌场搏一把后见效了,其中第二条方法解决了我的问题,而我仍然不知道Emacs中为什么找不到Aspell了。人生短暂而有太多不甚明了的事情。
我想有些东西我们永远都不会知道。
从长远来看,选择快速的方法处理问题是个灾难。
拿制作文档来说,我就在TeX/LaTex、XSLT-FO和我的Erlguten之间犹豫不定。
大约每三年一次,我都会有强烈的愿望,将自己所有的文档直接写在附录中,而后唯一做的事情却是深呼气,等待这种感觉消失掉。
如今因为我们可以让机器去做枯燥和危险的事情,我们反而没有更多的时间去做事。
我问过我的老板,他是否需要漂亮的幻灯片来演讲。他说需要,但要我明天之前给他。我权衡了需要时间去学习的几个方案,最终选择了PowerPoint。