编程

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

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

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

定义一:程序是将输入转化为输出的东西。

程序员是编写程序的人,编程是编写程序的行为。

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

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

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

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

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

不需要维护的程序

我们通常编写只要输出结果的程序,这种情况,输入和程序本身将来就不需要维护,所以不必有特别漂亮或很好的描述。我写的关于 Erlang 语言的书就是这类情况。书一旦出版,就不再需要撰写和维护。在重印时,这本书的勘误信息和必要的修改只涉及输入微小且简单的修改,即使输入没有被很好地归档。

必须要维护的程序

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

我与一位 Web 程序顾问聊天。他说只要程序的输出看起来是正确的,客户就会认为项目已经结束,项目经理就会投身于下一个项目。他们没有认识到,在开始下个项目前,网站不仅应该看起来不错,而且代码也要整洁并被归档。因为这是要在未来进行维护的项目。

使编程困难的其他原因

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

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

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

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

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

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

不通过学习解决问题

我是个没有出息的懒鬼。当我试图用 LaTex 对一个图表做排版时,就不想去阅读长达 391 页的说明书,让我为了文档中的一个图表用十分钟读完一个 391 页的文档是不现实的。

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

拿制作文档来说,我就在 TeX/LaTex、XSL-FO 和我的 ErlGuten 之间犹豫不定。大约每三年一次,我都会有强烈的愿望想将自己所有的文档直接写在附录中,而后唯一做的事情却是深呼气,等待这种感觉消失掉。

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

恶劣的编程环境

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

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

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

另一种方法是睡觉前在一些论坛或者用 tweet 发个帖子,第二天已经有人将解决方法发给你了。

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

英文原文:Why Programming is Difficult