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

给神马写程序是很难的

时间:2023-03-20 14:56:20 科技观察

以前我以为编程很容易,但是多年后慢慢发现我错了:程序员的工作和我理解的“写程序”是不一样的。一开始我以为编程无非就是命令计算机做一些事情,比较简单。工作了二十多年,觉得很轻松。定义1:程序是从输入到输出的转换。程序员就是编写程序的人,编程就是编写程序的过程。现在让我们为上面的定义添加一些约束。定义2:程序是满足以下条件的从输入到输出的转换:输出应该是优雅的(原文是优美的)。优雅地打字。程序本身应该是优雅的。输入文件是全面和准确的。该程序本身的文档是详尽而准确的。该程序已经过严格测试以保证正确的结果。该程序提供的解决方案有据可查。该程序旨在解决的问题本身有据可查。当加上这些限制后,编程就变得非常困难。针对某些特定情况,我们可以适当放宽上述限制。以下是一些典型的情况:不需要维护的程序我们经常编写程序只是为了输出。在这种情况下,输入和程序本身不必是未来可维护的、优雅的编写和良好的文档记录。我在Erlang上写的一本书的排版程序就是这种情况。本书出版后,几乎不需要维护打字排版程序。只要输出看起来不错就可以了,不需要维护混乱的XML输入文件和测试程序。如果本书是重印的,更正只需要稍微改变输入即可。即使输入文件没有很好的记录,这也很容易做到。需要维护的程序需要维护的程序与上面的正好相反。输入和程序本身应该优雅,文档应该完整。前几天和一个写web应用的顾问聊天。他说,只要程序输出正确的结果(网站看起来没问题,所有功能正常),用户就认为项目已经完成,项目经理就会去做。将他添加到下一个项目团队。他们不明白一个网站光看OK是不够的,也没有时间去整理代码,写文档等等,这些对以后的网站维护有帮助,下一个项目就要开始了。使编程困难的其他事情使编程困难的其他三件事:处理不应该出现的问题。没有时间慢慢学习新知识。恶劣的系统环境。来看看程序员的时间是怎么被这帮家伙吃掉的。处理不该出现的问题我经常不得不用别人写的软件来解决问题,但我常常对这些程序不是很了解。一个好的软件有准确的文档告诉我如何使用它,但现实世界往往更糟糕:要么没有文档,要么文档不准确。文档中写道:“按顺序执行XYZ命令,你将得到结果PQR。”而你执行完XYZ得到的结果根本就不是PQR!在这种情况下你应该怎么做?如果你足够幸运,写程序的人就在附近,你可以走到他身边勒死他;大多数人只是在Google上试试运气,或者尝试阅读源代码,看看是否能找到答案。在谷歌上搜索错误的解决方案是一场令人沮丧的赌博。google了半天,终于找到一个和我遇到同样问题的倒霉蛋,哈哈哈哈。但是当我满怀期待地打开链接时。..没什么,这个问题还没有回答。为什么这个补丁别人可以用,我不能用?是因为我附体了吗?还是我所在的空间已经扭曲到正常人类世界的物理定律不再适用的地步?虽然这令人沮丧,但不同的机器具有不同的初始状态是正常的,因此修复其他人错误的补丁可能无法在我的机器上运行。有时我会想:要是我们都可以用Smalltalk编程,并且都从相同的起始状态开始就好了。Smalltalk程序员一定生活在一个美好的世界里,他们根本不必担心此类问题,但这只是暂时的。当他们的程序与其他语言编写的程序进行交流时,他们最终会明白这个世界是多么的残酷。.排查bug也是很郁闷的,因为你不知道为什么这个bug最后消失了,是不是因为你上次的改动?或者它是您之前所有更改的总和?关键是像这样的事情占用了程序员60%到70%的时间。我花了一周的时间才让一个损坏的LDAP服务器重新工作,因为老板不让我自己写服务器。这个用C语言开发,文档写的很烂的狗屎折腾了一个星期,我终于决定把老板的话抛在脑后,午饭时间自己写一个版本的Erlang,问题终于解决了。.我承认我不是在编写一个完整的LDAP服务器,但我也不需要一个完整的LDAP服务器,只要某些命令行正常工作,就很容易修复。现在我对实施那些古老的协议并不太兴奋,但总的来说,它会比自己重新实施别人的代码节省更多的时间。解决问题和学习是不同的。我是个十足的懒鬼。当我想在Latex中插入图表时,我不想先通读391页的文档。当然,你可以指责我懒惰,而且我知道我应该先阅读那篇热情洋溢的文档,但我只有十分钟的时间来完成它。当我需要解决问题时,我需要一个快速的解决方案。此时,过于冗长的文档对我来说是一场灾难。以排版程序为例,我曾经在这三个软件面前动摇过:Tex/Latex、XSLT-FO、Erlguten。每隔三年左右,我就会有一种强烈的冲动,想用postscript来写文档,每当有这种感觉时,我都会深呼吸,静静地等待这种感觉自行消失。我猜GiambattistaBordoni于1818年制作了他的ManuleTipografico(GiambattistaBordoni的ManuleTipografico被称为有史以来最伟大的活字书。1818年由Bodoni忠实的遗孀Marguerite在帕尔马死后出版,其两卷本作品包含142个罗马字母相应的斜体、许多脚本和异国情调的字体,以及令人惊叹的鲜花和装饰品收藏)没人关心,排版一个页面可能需要一周时间,而让机器去做无聊和危险的工作可以腾出更多时间。我问我的老板他是否需要漂亮的幻灯片来做演示。他说他需要它,但他要我明天之前给他。这让我没有合适的时间学习TeX(我估计可能需要一两年),没有时间去实现自己的排版语言(我估计需要5-10年),没有时间记录在附录中,我权衡了学习几个程序需要时间,最后选择了PowerPoint。糟糕的编程环境有些工作场所旨在让编程变得更加困难。没有隔断的开放式办公室嘈杂的环境扰乱了我们的注意力。手机和互联网的干扰会让我们分心。幸好我们还有地方要去,那就是睡觉。很多编程问题都是在睡觉的时候解决的。方法有两个:先记住自己考虑过的问题,然后去睡觉,第二天醒来有些问题就迎刃而解了,SoEasy;另一种方法是睡前在一些论坛或推特上??发帖,已经有人给你发了解决方案。成为一名优秀的程序员需要很长时间,你需要学习很多东西,你需要知道遇到问题时该向谁请教。惊人但事实当我完成这篇文章来检查内容的拼写时,但我使用emacs-ispell模式检查拼写时,它停止了并说没有找到aspell。我的emacs拼写检查器多年来一直忠实地在本地工作。就在我抱怨生活一成不变的时候,它从眼镜上掉下来了。我不相信上帝有恶意,也不相信我房间左手沙发上的物理定律与右手沙发上的不同,但有相反的间接证据。我不明白我的意思没有那样做,我的拼写检查器坏了。为了检查上一篇文档的拼写,我安装了新版本的Erlang和Julia,并写了一些讲义。幸运的是,11分钟就像在谷歌赌场工作一样。两个建议的工作:我不知道该问什么我的emacs找不到aspell-生命太短暂,问题太莫名其妙。我想有些事情我们永远不知道答案。英文原版:WhyProgrammingisDifficult翻译自:http://www.oschina.net/translate/why-programming-is-difficult