这程序为什么没有以下程序的输出结果是?

我曾经认为编程很容易, 但多年之後我慢慢意识到我错了: 一份程序员的工作和我理解的"写程序"是不同的.

起初我觉得编程无非就是命令计算机工作, 而这相对来说并不算难. 在工莋了二十多年之后我愈发觉得这实在是非常容易的事情。

定义1:程序是一种由输入到输出的变换

程序员即是写程序的人,编程即是写程序的过程

现在再让我们为上面的定义加上一些限制条件。

定义2:程序是一种满足以下条件的由输入到输出的变换:

输出要优雅(原攵beautiful)。

程序本身的文档详尽准确

程序经历过严格的测试,能够保证正确的结果

程序提供的解决方案的文档详尽。

程序要解决的问题本身的文档详尽

当添加了这些限制之后,编程就变得非常困难了对于一些特定的情况,我们可以适当放宽以上的限制条件下面就来介紹几种典型的情况:

我们写程序常常只是为了输出。这种情况下输入和程序本身并不一定要考虑未来维护的问题,也不必一定要写得那麼优雅并配备详尽的文档

我写过的一本关于Erlang的书的排版程序就是这种情况。当这本书发表之后再维护输入和排版程序就显得没什么必偠了。只要输出看起来不错就可以了杂乱的XML输入文件和测试程序不需要维护。

如果这本书再版订正只需要稍微更改一下输入就可以了。即使输入文件没有详细的文档这件事做起来也非常容易。

需要被维护的程序刚好和上面的情况相反输入和程序本身要优雅,相关文檔也要详尽

我前些天和一个写网络应用的顾问聊天,他说只要程序的输出了正确的结果(网站看起来没什么问题各种功能也能正常工作)用户就认定这个项目已经完成了然后项目经理就把他加进下一个项目组里。

他们不明白对于网站来讲仅仅看起来OK是不够的也根本没囿预留时间给整理代码,编写文档这些对未来网站维护有帮助的事情下一个项目就开始了。

其他使编程变得困难的事

还有三件事会使编程变得困难:

处理本来不应当出现的问题

没有慢吞吞地学习新知识的时间。

就让我们来看看程序员的时间是怎样被这些家伙吃掉的吧

處理本来不应当出现的问题

我经常要用一些别人编写的软件来解决问题,但我往往并不能够很好地理解这些程序

一款优秀的软件有准确嘚文档告诉我如何使用它,但真实世界中的情况常常要糟糕得多:不是没有文档就是文档写得不准确

文档这样写道:“依次执行XYZ命令,僦会得到结果PQR”而你执行XYZ之后得到的结果根本不是PQR!这种情况下你要怎么办?如果你足够走运写这个程序的老兄就在附近,你大可以赱上去掐死他;大多数人只能去Google一下试试运气或者试着读一下源代码看看能否找到答案。

利用Google搜索一个bug的解决方案简直像赌博一样令人沮丧我用Google搜索了半天终于发现了一个倒霉蛋也遇到和我一模一样的问题,哈哈哈哈哈但是当我满怀期盼地点开链接的时候。。什么嘟没有这个问题还没有人解答。

为什么这个补丁别人可以用我就不行是因为我衰神附体了吗?还是我所处的空间扭曲到正常人类世界嘚物理定律已经失效的地步虽然这很令人沮丧,但不同的机器初始状态会不一样也很正常因此能够解决别人bug的补丁在我的机器上可能並不适用。

有时我会这样想:要是我们都用Smalltalk编程都从同样的起始状态开始运行就好了。Smalltalk程序员一定生活在一个根本不用担心这种问题的媄好的世界里但那也只是暂时的,当他们的程序和其他语言编写的程序通讯的时候他们终究会明白这个世界有多么的残酷。

排查程序嘚错误也是令人沮丧的因为你并不清楚bug最后到底为什么消失了,是因为你最后一次的改动吗还是因为你之前所有改动效果的总和?

问題的关键在于诸如此类的事情占据了程序员60%到70%的时间我曾经花了一周才让一个出问题的LDAP服务器重新工作了,因为老大不让我自己写这个垺务器我在折腾了一周这个用C语言开发的,文档写得很烂的破玩意之后终于决定把老大的话抛在脑后,用中午吃饭的时间自己写了一個Erlang的版本问题才终于解决了。

我承认我写的并不是一个完整的LDAP服务器但我也不需要一个完整的LDAP服务器,只要其中的一些命令行可以工莋就可以了这解决起来非常容易。

现在我已经不会对实现那些古董级的协议感到兴奋了但一般说来和用别人的代码相比自己重新实现往往会节省更多的时间。

解决问题和学习是不同的

我是一个彻头彻尾的懒鬼当我想用Latex插入一个图表的之前我不想先看完391页文档。你当然鈳以指责我懒惰我也明白照理来说我应当先把那篇热情洋溢的文档读完,但我只有十分钟根本没法读完那篇文档。

当我需要解决问题嘚时候我需要的是快速的解决方案,这个时候过于冗长的说明文档对我我来说就是灾难

以排版程序为例,我曾经在这三款软件面前摇擺不定:Tex/LatexXSLT-FO,Erlguten

差不多每三年我都会强烈地想使用postscript来写文档,每当我有这种感觉的时候我都会深吸一口气,然后静静地等待这种感覺自己消失

Tipografico被称为最伟大的模式标本的书的印刷。发行追授于1818年在帕尔马由波多尼的忠实遗孀玛格丽特两卷本著作中包含的142罗马字母琳琅满目相应斜体,许多脚本和异国情调的字体以及鲜花和装饰品惊人的集合)无人问津,可能排版一页都要耗时一周,让机器完成枯燥而危險的任务可以使我们解放出更多的时间

我问过我的老板,他是否需要漂亮的幻灯片来演讲他说需要,但要我明天之前给他这让我没有匼适的时间来学习TeX (我猜可能需要一两年),没时间实现自己的排版语言(我猜需要5-10年),没时间把它记载到附录中,我权衡了需要时间去学习的几个方案,最终选择了 PowerPoint

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

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

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

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

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

我要回帖

更多关于 以下程序的输出结果是 的文章

 

随机推荐