BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

调试器有害吗?

| 作者 Werner Schuster 关注 6 他的粉丝 ,译者 俞黎敏 关注 0 他的粉丝 发布于 2007年10月24日. 估计阅读时间: 5 分钟 | GMTC大前端的下一站,PWA、Web框架、Node等最新最热的大前端话题邀你一起共同探讨。

Giles Bowkett在《Debugger Support Considered Harmful》中写道:

问Ruby为什么没有很好的调试器支持,就像问海豚为什么没有鳃一样。Ruby没有很好的调试器支持,是因为Ruby程序员不应该使用调试器。Ruby比任何其他语言(可能除Smalltalk之外)都更好地支持TDD和BDD。调试器支持是不能优雅地运行测试的语言才需要的。

注释:TDD是指"测试驱动设计/开发(Test Driven Design/Development)",BDD是指"行为驱动开发(Behaviour Driven Development)"。

这篇文章引起了很大的反响,其中有许多是来自Smalltalk社区。这点尤其相关,因为Smalltalk和Ruby是近亲。Cincom System的James Robertson,甚至录了一段截屏视频(Sceencast),来说明Smalltalk调试器在进行TDD时的用处:

我写了一个测试,并运行它。测试失败了。我调试测试,让调试器替我创建漏掉的方法——于是我在调试器中给该方法编写代码,并再次运行它。调试器并不是一件不该过于依赖的工具:它把TDD提升了一个层次。

Avi Bryant——Smalltalk Seaside Web框架的创建者,说:

Giles忽略的一点是,你首先怎样去理解代码。要想理解代码——无论是你写的,还是其他人写的——没什么比得上调试器中逐步跟踪一遍。既然Giles曾经是一位剧作家,或许可以这样比喻:阅读代码就像阅读一部电影剧本。编写测试可能就像在描绘故事板(它们帮助你将最终的产品形象化)。而使用调试器就像实际观看这部电影。有了调节轮,你就可以一帧一帧慢慢看。

Blaine Buxton提出了调试器角色的另一种观点:

当你正好在试验一种新的框架,并想观察它是如何工作的时候,调试器在检测程序方面就非常棒。我喜欢一行行地跟踪。我在学习Seaside的时候就是这么做的,它比任何文档都更好。此外,看着漂亮的代码在你的调试器中展开,简直就像在阅读一本好书。在处理一些难看的代码时,调试器会给我展示出在我看代码时被眼睛所蒙骗了的一些东西。如果动物活着的时候就能观察各器官是如何工作的,我为什么要解剖它的尸体呢?

Ben Matasar认为"调试器"这个名称可能是问题的根源:

我认为"调试器"这个名称让人们对它的作用产生了误解,至少在Smalltalk是这样。当我去年12月刚接触Smalltalk的时候,我尽力不用调试器,我的确认为它是一件不该过于依赖的工具。现在我时刻用它来作为研究代码的支撑点。事实上,我直接在调试器中编写相当多的代码,而让Web浏览器呆在后台,等待我发送响应。

我现在把它当作是一种方法上下文浏览器,在这里,你在调用堆栈的每一步中都有一个活动的REPL。这样很好,因为你可以发送消息给对象,捅捅它们,然后观察它们如何对消息做出响应。

因此,传统的调试器工具允许你通过断点或者在任意时间中止执行,并允许你查看当前的状态。它与其他工具一起,帮助开发人员理解系统在运行时实际上是如何表现的——与只查看源代码相对照。同类的工具还包括覆盖工具(coverage tools)(如rcov)、剖析器(profiler)、跟踪器(tracer)或者日志记录器(logger)。

虽然Giles的文章认为Ruby缺乏调试器支持,但我们不太确定他指的是什么。Ruby拦截器具有调试器支持,既有用Ruby编写的较慢的版本,也有像ruby-debug这样的快速版本。JRuby的情形也一样,快速版的方案(jruby-debug)目前正在开发当中。其他的Ruby实现,如Rubinius具有低开销的调试,也有的使用底层的VM调试支持。

当然,调试器实现只是一个方面——还必须有调试器的用户界面。但是这在Ruby领域中也不缺。所有主要的现代Ruby IDE都支持调试。RDT(现在是Aptana的一部分)已具有调试支持多年了——最新的NetBeans调试支持与RDT源自相同的代码。Eclipse DLTK Ruby具备调试支持,其他非Java的IDE,如Sapphire Steel公司的Ruby in Steel IDEKomodo等等也都一样支持调试。

你在调试Ruby方面又有什么经验呢?

查看英文原文:Debuggers considered Harmful?

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

因果是很复杂的 by 熊 节

> Ruby没有很好的调试器支持,是因为Ruby程序员不应该使用调试器。

另一方面,因为Ruby的debugger太难用,所以我们尽量做好TDD。两者互相促进,互为因果吧。
不过我从来没用过Ruby的debugger,这是事实。

Re: 因果是很复杂的 by Jacky Li

嗯嗯,如果在理想的状态下,如果单元测试足够全面的话,应该就不需要debugger了吧

用log么? by 曹 云飞

的确可以不用调试器。除了TDD以外,还需要合适的log信息吧。Xiong Jie如何使用Log呢,是否把log作为调试的一种辅助手段?

Re: 用log么? by 熊 节

log这种东西,也是能不用就不用。好的程序就像可靠的人一样,只说必须说的话。
说到底,为什么需要用log?无非是想知道一段程序运行到中间部分时的临时状态。很多时候这就意味着你应该重构,做更细粒度的测试。

要是Test不能100%覆盖怎么办?而且Test粒度大怎么办? by B Necromancer

举个例子,在Swing中,Unit test很难写,我只写interactive test。这时要是有错误,我还得DDD(Debug Driven Develop):)

要是你的Unit test大粒度,有时还要Debug。

Re: 因果是很复杂的 by Guo Xiaogang

别说Ruby,现在就是Java、C#也不怎么用Debugger吧。

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

6 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT