写点什么

调试器有害吗?

  • 2007-10-23
  • 本文字数:1590 字

    阅读完需:约 5 分钟

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 IDE Komodo 等等也都一样支持调试。

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

查看英文原文: Debuggers considered Harmful?

2007-10-23 12:13929

评论

发布
暂无评论
发现更多内容

JS语言基础

Jason199

js 6月月更

【技能树共建】Python 三元表达式

梦想橡皮擦

6月月更

Django API 开发:一个 Todo 应用的后端

宇宙之一粟

6月月更

C#入门系列(五) -- 运算符

陈言必行

C# 6月月更

5分钟了解CDN的功能及原理

穿过生命散发芬芳

CDN 6月月更

EasyRecovery15官方最新版下载功能介绍

茶色酒

EasyRecovery Easyrecovery破解 EasyRecovery15

修改gradle脚本,加速spring4.1源码编译构建速度

程序员欣宸

Java spring Gradle 6月月更

拒绝八股文!这篇图解动态路由分分钟爱了

wljslmz

网络工程师 网络技术 动态路由 6月月更 路由协议

Linux下可执行程序的Shell传参格式规范

乌龟哥哥

6月月更

【LeetCode】独特的电子邮件地址Java题解

Albert

LeetCode 6月月更

vue基本语法使用

小恺

6月月更

《非暴力沟通》:如何温柔地沟通?

郭明

读书笔记

【LeetCode】数组中第 K 个独一无二的字符串Java题解

Albert

LeetCode 6月月更

Squarespace 和 WordPress 的区别

海拥(haiyong.site)

WordPress 6月月更

JavaScript迭代器

大熊G

JavaScript 前端 6月月更

linux驱动开发_文件系统本地挂载

DS小龙哥

6月月更

Fork Join框架

急需上岸的小谢

6月月更

后端技术复习

卢卡多多

技术栈 6月月更

Kubernetes社区发行版:开源容器云OpenShift Origin(OKD)认知

山河已无恙

k8s openshift

网页设计制作要注意哪些问题

源字节1号

【愚公系列】2022年06月 二十三种设计模式(二十二)-模板方法模式(Template Method Pattern)

愚公搬代码

6月月更

spring event 介绍

Nick

Java spring springboot 6月月更 spring event

Fabric.js 居中元素 🎗️

德育处主任

fabric canvas FabricJS Fabric.js 6月月更

关于 SAP Commerce Cloud 的 Sample Setup Github 仓库

汪子熙

typescript angular SAP commerce 6月月更

Discourse 支持中文用户名

HoneyMoose

Flutter 使用 Redux 的中间件实现异步状态管理

岛上码农

flutter 安卓开发 ios 开发 跨平台应用 6月月更

详述Java中sort排序函数

工程师日月

算法 Java EE 6月月更

Web Service进阶(三)HTTP-GET, HTTP-POST and SOAP的比较

No Silver Bullet

soap 6月月更 Web Service HTTP-GET HTTP-POST

每日一题 | LeetCode 242 有效的字母异位词

武师叔

哈希表 Leet Code 6月月更

浅谈网络攻防中守方的准备工作

kk冲击波

6月月更 攻防演练

Web Service进阶(一)运行原理

No Silver Bullet

6月月更 Web Service 运行原理

调试器有害吗?_Ruby_Werner Schuster_InfoQ精选文章