亲爱的KV,
我刚刚花了一个星期的大部分时间来调试一段代码中的一个问题,这段代码需要程序员本人重新运行同样的100行代码,添加越来越多的调试语句,直到bug最终暴露出来。由于此特定代码位于无服务器环境中,因此传统的调试器不是一个选项。相反,我必须启动这个函数,一次又一次,一次又一次。最终,我的目光变得呆滞,我站起来,在我的家庭办公室里走了一圈,然后坐下来,一切又重新开始。我不相信这是解决这类问题的正确方法,但当我向团队的其他成员寻求帮助时,他们告诉我,乏味是意料之中的事。显然这是不可能的,不是吗?
在Tedium开球
亲爱的策划,
那么多clichés与这个话题有关,我觉得我可以在这里引用所有的,然后就收工了,但这似乎很懒惰和不公平。
我们大多数人都知道计算机擅长于一遍又一遍地做同样的事情。在糟糕的日子里,KV觉得这是电脑唯一的用处,他被困在一个超现实的、苏斯博士(Dr. Seuss)噩梦般的场景中,在那里,奇怪的绘画、色彩鲜艳的角色吐出胡言乱语,同时导致我所有的代码以明显不可能的方式崩溃。
调试代码通常是迭代的,而迭代过程属于反复的范畴。你运行这个函数,它给出了错误的输出,你挠头想,“哦,它一定是X”,你改变了X的值,再次运行它,得到了另一个错误的结果。然后您会想,“哦,不是X,是Y,”然后您将X更改回来,然后尝试Y,再次运行代码,然后是... .无论是否使用微剂量,这条路都是疯狂的,但在我们的行业中,这是一条我们都走过多次的老路。
要想离开这条疯狂的道路,有几种策略。
您已经提到了脱离疯狂路径的第一种方法,那就是使用调试器。不幸的是,世界上优秀的调试器太少了,而程序员很少倾向于改善这种情况,因为——正如任何风险投资家会告诉您的那样——软件工具赚的钱很少。
有人可能会认为,我们这些在行业中工作的人会为了自己的理性而开发更好的调试器,但正如KV之前指出的那样,程序员都是乐观主义者:我们总是认为这一次我们做对了,我们可以编写更多的代码,而不是调试我们眼前的东西。这并不是说没有调试器;有,其中一些甚至有效——少数甚至有效——但能有效的却少之又少。
KV继续咬牙切齿,因为他看到代码加载了调试语句,如果编写代码的程序员对他们的调试器既自信又熟练,那么这些调试语句就完全没有必要了。如果一个人足够幸运,能够访问到一个好的调试器,那么他应该对他通常所感谢的任何东西表示极端的感谢,并使用这个该死的东西!当KV还是一个年轻得多的程序员时,他的老板坚持所有的代码都首先在调试器中运行——当KV可以时,他就这样做。如果程序在调试器中工作良好,那么您可以在没有辅助轮的情况下尝试它,看看它是如何运行的。
另一种脱离疯狂路径的方法,也是可能与无调试器环境最相关的方法,是在失败函数的每一行中添加某种形式的断言。作为程序员,您当然应该知道函数应该做什么,所以要明确这一点!好的语言应该让您这样做,然后让您隐藏断言,但我很少看到有语言这样做。
通常情况下,您可以使用一个或10个断言库(因为人们很懒,他们不会先搜索自己需要的东西,然后才开始自己的断言库)来完成此任务。不要只在你认为导致bug的东西上添加断言,从而走上疯狂的迭代之路。断言函数中的每一行,然后——如果星号对齐——您将在下次运行代码时发现错误,因为您正在逐行检查函数的每一位。
最后,如果您要处理的函数只有一个失败n有时,您将不得不利用这样一个事实,即计算机确实擅长反复做事情,并自动执行失败的功能,以便您可以捕捉到故障。提升一个级别,编写一个循环,确保它能够捕获故障,然后返回。
KV
相关文章
在queue.acm.org
外包责任
Kode恶性
https://queue.acm.org/detail.cfm?id=2639483
肆无忌惮的调试行为
Kode恶性
https://queue.acm.org/detail.cfm?id=2048938
在活动系统上调试
Kode恶性
https://queue.acm.org/detail.cfm?id=2031677
数字图书馆是由计算机协会出版的。版权所有©2022 ACM, Inc.
没有发现记录