为什么学校不提供调试器?[关闭]


12

关于SO的另一个作业问题。似乎绝大多数学生都不知道调试器是什么或如何使用调试器。我觉得知道如何使用调试器与编程的其他基础几乎一样重要。

  • 问题是不应该进行调试吗?如何在编程基础知识的基础上教授现代调试工具的使用方法?如果不是,为什么不呢。

2
嗯..您是说gdb是一种现代的调试工具?这不是一个不好的调试器,但肯定不是最新技术。
Billy ONeal

1
我会同意,但我也回答了问题:学生使用Visual Studio,却不知道他们将如何或为什么使用调试器。
重播

@rerun:嗯。他们无法在IDE上点击“播放”按钮吗?(顺便说一句,我+1)
Billy ONeal

system.out打印日志记录是惰性和惰性的最后堡垒

6
@Jarrod,一个相当广泛的概括,也许太过分了。有时,您根本无法在发生问题的程序上使用调试器。

Answers:


7

并不是必须要教如何使用调试器,而是要介绍更通用的调试技术。这当然将包括教授如何使用调试器,但还将包括各种其他重要技术,例如

  • 批判性思维
  • 分而治之
  • printf调试,日志记录等
  • 桌面检查
  • 压力测试

另外一个好处是,许多技术也可以应用于编程以外的领域中的问题解决。

关于整个主题,有一本相当不错的书,所有本科生和任何学习编程基础知识的人都应该读这本书:David J Agans的《调试》


8

正如您所提到的,专为计算机科学设计的课程旨在教给学生编程基础知识 -这些概念是向学生讲授的,希望他们能够掌握必要的概念并将其应用于更广泛的编程语言和问题集。

另一方面,调试工具是实现区域中的子集-每种工具的每种语言都不同(即使概念相同)。我们接触过调试工具,但从未真正深入了解它们。如果我们在调试工具上花费了一个多星期的时间,事后看来,我会回头,认为这是浪费时间。我宁愿了解BigO表示法或多态性。但是,如果尚未(成功)将调试工具的功能传达给学生,那么这将是不必要的。


3
+1。翻译:因为不是每个人都使用MSVS,GCC / GDB,LLVM / CLANG等
比利·奥尼尔

1
+1,尽管我必须承认我同意@rerun;涵盖软件商店中使用的基本概念和工具的一门课程(或一门课程的一部分)将大大有助于提高新毕业生的工作效率。我遇到了一些似乎在使用了一段时间后似乎仍然不了解源代码控制的代码。
肯·亨德森

普通开发人员花大量时间与之相处的许多技能都在学校里讲授。源代码控制,一般的配置管理,代码探索,代码阅读,构建过程等。虽然我了解CS学位需要涵盖理论方面,但我认为在一个senor级别的课程中,学生可以使用大量现有的代码库进行查找和修复bug并将其检入代码并“部署”将使新开发人员更加有用。
重新运行

3
我完全不同意。如果正在编写实际代码(因为编写代码是实践科学概念的一种好方法),那么学生应该可以使用编写该代码的方法,包括在需要时使用调试器。这样做并没有浪费可用于bigO表示法的时间-而是释放了许多学生花在小错误上的蛮横方式所花费的时间。从中没有得到什么。此外,许多其他科学课程(例如物理学)的确将实用的测量技能作为其课程的一部分。
印加

2
使用调试器需要了解计算机的工作原理,而不仅仅是代码。我认为这是编程的基础。我遇到了太多的学生,他们根本不知道他们的计算机实际上在做什么,而这对于一个好的程序员来说是没有用的。
edA-qa mort-ora-y

2

在大多数入门编程课程中,程序状态非常简单,您可以使用一些打印语句清除所有错误。可能还存在强迫学生用手做事情的问题,以便他们了解某些类型的错误在代码中的发生方式和位置。如果您不知道在哪里看,那么调试器将毫无用处。


4
一个好的调试器比print语句更易于使用。打印语句要求您以某种方式将数据序列化为字符串,这需要使用它自己的代码(可能存在错误)进行序列化。例如,链接列表程序很容易在调试器中完成,但是打印语句不会对试图编写链接列表横向算法的学生有所帮助-因为您需要该算法来编写正确的打印语句。
Billy ONeal

2
@Billy所以逐步执行错误的代码会以某种方式帮助他们吗?
尼尔·巴特沃思

1
@Billi ONeal,你错了。您正在谈论的调试器不存在。仅当您已经确定调试日志记录的问题时,交互式逐步执行程序才有用。在我的实践中(> 20yrs)从不使用带有我自己的代码的调试器-正确的断言和日志记录就足够了。我只将那些该死的工具与库代码和旧有的东西一起使用。顺便说一句,能够将任何 数据结构序列化为可读的东西总是 一个好主意。某些语言/环境免费提供此功能。
SK-logic

1
@Billy ONeal,您将如何浏览连接到串行端口的微控制器设备的内存?而且,我认为在具有足够的数据结构和算法知识之前,用指针和东西将低级语言公开给低级语言不是一个好主意。到那时,他们将知道如何正确调试。
SK-logic

1
@Billy ONeal,最困难的部分是确定何时在调试器中检查值的正确时机(顺便说一句,在大多数情况下,它仍然类似于调用.dump()方法,而不是直接的内存检查)或打印序列化的值。有了适当的调试日志记录基础结构,问题就可以归结为对日志文件的分析。在大多数情况下,简单grep的工作即可。没有步进,没有条件断点-仅grep。
SK-logic

2

没那么重要。我几乎从未使用过,也从未使用过。调试代码的最佳方法是:

  • 不要一开始就写错误
  • 如果您确实编写了它们,请通过思考来解决问题,而不要深入调试器

对于许多现代的多线程软件,调试器具有隐藏错误而不是发现错误的作用。而且他们绝对不应该在学位级别上“教”,不如教他们如何使用文字处理器。


6
我认为这取决于。如果您试图习惯未编写的大型且文档记录薄的代码库的行为,则调试器是适应该代码库工作的最快方法之一。当然,如果您正在编写所有代码,则不需要经常使用调试器,但并非所有人都在该位置。+1
Billy ONeal

1
@比利我们必须同意有所不同。您尝试了解带有调试器的大型MT交易服务器。
尼尔·巴特沃思

@Neil:我从来没有亲自处理过这种事情……但是我之前没有问题就调试过MT代码。也许我被MSVC ++宠坏了-那里的调试器使显示各个线程的工作变得非常容易。但是,如果我在2008年之前的版本中进行调试(我认为那是在那时添加的内容),那么我会看到如何使事情变得更加困难。
Billy ONeal

@Neil:不要误会我的意思-我并不是说调试器可以代替思维,或者它应该是您唯一要看的东西。我只是说这是一个工具,在某些情况下可以使理解变得更容易。如果调试器引起更多的混乱,通常很容易说出它正在引起更多的混乱(因为您变得更加困惑),那就是当您关闭调试器并尝试其他操作时。在某些情况下这很有用,但是它不能替代查看代码/输入/输出并思考发生的事情。
Billy ONeal

2
我知道您在这里四处张扬着已收到的智慧。但是您与Linus Torvalds,Larry Wall,Brian Kernighan和Rob Pike等人相处融洽。
btilly 2011年

0

应该教授调试,因为学生是人类,人类会犯各种错误,其中一些错误需要在对给定错误的任何启发发生之前获取一些实验数据(调试信息)。

由于存在这样的前提(可能是从数学部门继承来的),即程序在设计上应该是正确的,所以甚至没有证明可以进行调试。因此,学生不应正确地进行编程的“实验”。但是,这忽略了不完美的人类在现实的制造过程中,在日程安排压力等情况下推出软件以更改规格的过程。


嗯..也许我的学校与众不同,但这不是CWRU的工作方式。
Billy ONeal

可能取决于所讨论的编程过程的历史部门继承树。
hotpaw2

我不确定您从哪里得到这一切。所有入门班都花了几节关于如何跟踪错误的讲座。
davidk01 2011年

@ davidk01-这并不能解释OP的观察,我听到的频率不高,但不止一次。
2011年

@ hotpaw2:什么不能解释OP的观察?仅仅因为学生很难学习调试程序并不意味着它没有被教,这就是您要跳转的结论。无论是本科生还是研究生,我都参加了几门编程课程。在每堂课中,讲师至少花费了一次讲座来检查错误的程序并进行修复,以演示一些常见的调试技术。
davidk01 2011年

0

这个问题对我来说是陌生的。在我的大学里,最早在计算机科学第一年的课程中就教过调试器(JDB和Eclipse调试器)的使用。在软件测试课程中再次教导了调试器和其他测试工具的使用。

我个人觉得很难相信,任何一所试图让人们为进入劳动力市场做好准备的好学校都没有教授适当的调试和测试技术。他们显然不能涵盖所有方面,但至少可以在课堂上教授基础知识。


0

自己弄清楚

我不需要,也不想让教授或助教花时间教我一些我可以很容易地自己弄清楚的东西。他们在那里教我一些困难的概念并指导学习。它们不存在也不应该存在,因此您不必进行RTFM。

学习如何学习

大学应该学习如何学习,而不仅仅是掌握您不知道的每个主题。如果您在此过程中始终握有您的手,那么您将在现实世界中惨败。

上山,双向,在雪地里

当我上学时,他们也不用教你这种语言。我们希望您可以自己接电话。他们会给您项目和设施。由您来跟踪所需的信息以完成实施并提交工作程序。除办公时间外,与现实世界非常相似。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.