调试技能对成为一名优秀的程序员重要吗?


24

除其他素质外,程序员还需要良好的调试技能吗?如果我的申请人无法在给定的程序中发现错误,但能够解决所有难题和程序,我是否应该考虑他的工作?

编辑:-难题是正常的红色,蓝色和红蓝色的球一样。程序就像在数组中找到连续的k个零。调试程序由于条件而失败,该条件应为> =,而是>。一切都在纸上。


13
他是否被允许运行该程序,还是他不得不在查看代码时发现错误?
Michael K 2010年

9
您只能编写和调试一样好的代码。两者在我的书中齐头并进。
Demian Kasier 2010年

3
有些人比其他人更好。通常很难在一段外来代码中发现错误-尤其是在压力很大的采访中。
leed25d 2010年

6
@Fanatic:仅当您仅使用自己的代码时。我在工作中所做的大部分调试工作都是在挖掘其他人的错误。
梅森惠勒

3
@Manoj R,您确定在相同的时间内可以找到相同的问题吗?您确定仅因为申请人在20分钟内未在纸上发现问题,就无法在自己的身边以及数周的练习中得到Google的帮助(是的,该死的Google)?
工作

Answers:


37

是的,这非常重要

关于该特定候选人,他/他可能对代码库x不够熟悉,无法对其进行调试。

一个好的问题解决者应该能够调试,因为通常所需要的只是拥有一个非常合乎逻辑的方法/方法。


1
编程,调试方面的其他任何技能都比经验多,而与人才的关系则少。
Pieter B

24

如果您无法调试,那么您根本就不是程序员,更不用说一个优秀的程序员了。

调试不仅是技术技能,而且是分析能力和思考过程的真实,实际应用。因此,我认为它是比白板或面试问题更有用,更相关的测试。

除非您的工作涉及花一整天的时间回答理论问题,否则您将需要可以应用他们所掌握的任何技能的人。

但是,您要做的就是问自己:这是否是对调试能力的公平测试-他们可以像在现实世界中一样运行代码,放置断点等吗?这是什么错误?编译器是否会拾取并标记(在这种情况下,这是一个毫无意义的问题,因为他们永远不需要发现它)?

如果它只是写在纸上,那么它基本上只是一个详细的阅读测试,并且比您的平均技术面试问题还要抽象的技能,我认为这几乎是毫无价值的。


2
为“问问自己,它是否是调试能力的公平测试” +1,听起来好像不是。一个公平的测试会附带一个调试器可运行的代码,即把它们放在一个自然的,正常的工作环境(考虑到他们很少会被工作SANS调试器)。
doppelgreener

11

主要招聘规则-如有疑问,请拒绝。

如果您需要廉价地实现很多新代码-可以找那个人,但就我个人而言,我将继续搜索。


7
我这几年雇用了很多人,对我雇用的几乎所有“也许”候选人都感到遗憾。
JohnFx 2010年

10

除非开发人员可以一直编写干净的代码(绝对不可能),并且只能在“绿色领域”项目上工作(永远不会这样),否则,调试技能绝对必不可少。绝对。我曾与不喜欢调试的开发人员有经验,所以他们变得懒惰,然后将代码扔给质量保证人员进行测试。但是这些开发人员不会持续很长时间。

软件开发是一种技巧和解决问题的技能。这些问题既包括业务问题,也包括其(和其他)代码的问题。顺便说一句,许多维护项目都是专门解决错误的,因此调试是绝对必要的技能。


我想补充的另一件事是,在此面试过程的一部分中,我们为应聘者提供了一个练习,既可以调试应用程序,又可以为应用程序添加一些小功能。此过程的每个部分均被同等重要。
Mark Freedman 2010年

7

我要记住,有很多“面试问题”类型的网站,完全有可能研究很多问题和困惑。您无法学习的一件事是调试从未见过的代码。您已经编写了足够的代码来知道如何调试,或者您还没有。如果是入门级职位,我不会排除候选人,但如果他们声称自己有使用该语言的经验并且无法调试其中的代码,则肯定会引起危险。


5

我发现初级程序员和高级程序员之间的主要区别在于他们的调试技能。调试技能是只有实践和经验才能带来的东西。

例如,考虑一个奇怪的错误,在该错误中,Java程序在交互模式下可以在控制台上正常运行,但是当您尝试对相同的输入使用Unix管道时却失败了。如果以前遇到过此问题,则可以检查以确保new Scanner(System.in)只调用一次;这样做的错误是,在通过管道传输时会消耗缓冲区,但在交互模式下则不会。我希望有一个更高级的程序员能够更快地识别此错误。也许是因为他们以前曾经体验过,或者是因为他们过去在缓冲方面遇到了其他问题。

对于解决难题和编写新代码,虽然经验很重要,但是初级程序员可能在其中可以达到甚至比高级程序员更好甚至更好的性能。也就是说,智力和技能可以产生更大的效果,而与经验无关。

如果您有能力投资初级程序员,他们可能有新想法并可以帮助团队“发展”,并且他们写新代码看起来不错,请继续雇用他们。如果您正在寻找高级程序员,那么这种调试技巧的缺乏可能是一个主要的警告信号:他们可能有十年的经验,仅相当于第一年的十倍。

附带说明一下,有一些方法可以使您无需先拥有10年的经验就能更好地进行调试。我推荐Andres Zeller的书《程序为什么失败:系统调试指南》,以此作为学习科学原理并更好地了解如何重现,发现和修复故障的方法。


因此,调试是通过实践实现的,可以学习,在选择候选对象时不应给予太大的重视。
Manoj R 2010年

1
需要说明的是:对于高级开发人员,您应该权衡重担,而对于初级开发人员,则要轻一些。例如,刚大学毕业的人开始编程一年级,可能需要花费10倍的时间来调试某些东西。但是有充分的理由投资初级开发人员。
Macneil 2010年

5

这取决于您的环境。如果您整天玩数独游戏和其他拼图游戏,也许是个不错的选择。

但是,如果您有时在代码中存在错误,或者它的性能并非始终如预期那样,我建议您找一个擅长进行故障排除的人员。

雇用您所需的东西,而不是程序员应有的理想。


3

除其他素质外,程序员还需要良好的调试技能吗?

是。

调试代码是解决问题的一部分。我从未遇到过编写完美代码和零错误的开发人员。开发人员将调试他/她的代码或其他人的代码。这是必须的。

我应该考虑他的工作吗?

也许,这取决于。

如果申请人能够完成面试中的所有其他难题和程序,那么在面试中不能调试程序就不应该成为一个大难题。这实际上取决于面试的深度和深度。

该职位需要进行多少调试?如果很多,那么应该增加申请人应如何回答调试问题的权重。但是由于您只提到了一个调试问题,所以看起来好像不是。


2
+1重申调试是必要的,但在面试过程中无需中断交易。
盖拉夫

3

程序员是否需要良好的调试技能?

是。就是说,我想请您考虑面试中的方法(即测验/测试方式)不完美(好,有缺陷),因为许多人在纸上发现代码是一种奇怪的,陌生的体验。

由于调试是一个过程,而不是答案或结果(例如错误),因此,我建议使用交互式对话或讨论作为评估候选调试能力的更好方法。尽管大多数人使用非正式的临时调试系统,但优秀的候选人通常会有类似的模式,即提出问题以了解系统或假设和要求,然后隔离问题(通常是分而治之),并系统地进行比较。代码的要求,评估预期输入/输出,而不是不管三七二十一在改变了一堆东西,一旦随意,直到它的工作原理。

我也对面试中的难题提出了保留意见,尤其是以书面形式,好像候选人没有正确的参考框架假设(技巧)),他们可能无法解决这个难题。即许多面试难题只有一条正确的道路,而生活却很复杂,最有创意的想法是采用令人惊讶的新颖方法来解决可能无法解决给定特定预煮难题的问题,并提供了预期的解决方案。就像希望所有小号手都演奏爵士乐一样。可以通过以非对抗性(压力可能混淆创造力)交互式讨论的方式提出问题来进行管理。同样,对我来说,答案是次要的,可以看到表达出了良好的思考过程。您可能需要让他们大声思考,但是根据我的经验,这往往会更有成效。

我尚未阅读或评估Zeller的Why Programs Fail,但是我可以建议您阅读《 Agans Debugging》,这是一篇简短而快速的文章,可以帮助您将即席调试过程巩固为更加结构化,具体而有条理的工作,这有助于提高调试效率。另外,打印出一份副本,然后将其悬挂在您的小隔间或解决方法中,即“ 调试规则”海报,这对于那些似乎无法正常工作的糟糕日子是一个完美的提醒。我的日子不好过,并且花更少的时间来积极地调试(阅读:困惑中的抓挠我的头),如果不按字母顺序尝试,则要本着它们的精神去做。


好答案。我花了几天的时间来寻找最简单的错误修复程序,而实际上却在几分钟之内发现了一个棘手的错误。一个好的开发者应该有一个合理的策略。这在很大程度上取决于应用程序。假设您输入一堆打印/日志语句或运行带有符号的版本时,您的应用程序不会出现问题。然后怎样呢?申请人至少应该能够阐明某种连贯的策略。
SnoopDougieDoug

2

我要说调试是必不可少的,除非程序员如此优秀以至于他绝不会犯任何错误。我不认为这是不可能的,但是我无法用当前流行的语言和工具来想象。

我不喜欢像在采访中那样被当场摆放的概念。如果应聘者很紧张(谁不紧张),他/她可能会像程序员一样空白,他也许能够例行处理此类问题。然后,如果这是一个众所周知的面试或计算机科学测试问题,则候选人可能会死记硬背地知道结果,但没有能力思考新问题。另外,如果候选人不熟悉该语言,他将不得不挣扎。许多错误很难实现,因为一个好的程序员知道他要键入的内容,并且他的大脑在阅读代码时会采用快捷方式。我找不到C语言风格的= =,应该在检查中使用==,因为我知道意图是什么,而我的大脑会采用解析快捷方式读取它。


1

编程解决问题的重要部分,要解决问题,您不仅要知道核心问题,不仅要表现出症状或不一致性。调试是识别核心问题的艺术。

  • 找出核心问题
  • 更好地可视化流程

还有很多。


1

在指出错误并查看此人的反应后,我会增加一些情况。他们是否对“ D'哦!我是个白痴,太傻了……”类型过于戏剧化,在“是的,不管那个家伙”阵营中过于冷漠,还是在积极聆听用某种道歉或言论来表示他们弄乱了本应解决的东西是错误的吗?只是将来需要考虑的事情。

及时调试是一项伟大的技能。这与在解决问题时给某人解决问题的方式有点不同。有时必须采取激进的措施来保存系统,这一点应该得到承认,因为我想大多数公司都不想在某人修复公司使用的会计软件中的错误时停止销售数周。


1

调试是一项关键技能。实际上,我想说的更多是故障排除是关键技能。有人应该知道如何定义问题(包括要询问的用户信息和要查看的日志),如何重现问题,他可用于诊断问题的数据源以及如何调试以及如何解决问题。不破坏其他东西 但是,很难在面试中确定。

我将给他一个真正的问题,并给他机会使用可用的工具,然后询问他采取了什么步骤来发现问题,或者如果他在指定的时间内无法找到问题,他还可以做什么。您实际上是在寻找某种可以系统地解决问题的人,并且其工具包中的工具比调试器和google还要多(在Junior级别,他至少应同时尝试这两种工具)(无法思考的人尝试这两件事可能无法胜任,或者至少我不会抓住机会),但可能还没有很多高级故障排除工具。

与疑难解答(我完全不会问那些问题)或已证明的编程技巧相比,我更重视解决问题的技巧。我很少见过能够很好地解决问题的开发人员,他们也不能编写出色的代码或进行所需的修复。我见过很多人可以将一些代码拼凑在一起以获得“工作中”的产品,但是如果他们的生活依赖于它,就无法解决问题。主要是因为他们不了解;他们实际上并不了解他们在做什么,也不了解他们要解决的问题。好的疑难解答者知道如何识别实际问题而不仅仅是症状。这样的人也知道要提出什么问题来定义新开发的问题。


1

任何工作中都有4至5个关键技能,编程也不例外。在专业级别,您必须精通所有关键的基本技能。如果您有5分之4,它仍然会阻止您。

您能想象一个销售人员能够提出,说服,表达,使客户合格,但无法完成交易吗?他们在那里,您不希望他们出现在您的销售团队中。

调试绝对是程序员不可缺少的一项核心技能。


0

我有这样的编码风格,需要进行少量调试。完成3行代码后,我运行它并进行测试,通常会打印出几个变量。在这种情况下,当我得到不想要的结果或行为时,我在代码中放置了许多转储-而不是调试。我使用真正的调试器非常罕见。奇怪,但事实如此。


0

调试是软件开发中的一个阶段,该阶段是在对软件进行某种测试并发现一个错误之后进行的。这是在软件中搜索和纠正错误的行为。在很多情况下,查找错误通常需要比修复它更多的时间。

这是消除计算机应用程序/系统中固有的错误(漏洞)的过程。如果不这样做,则黑客可能会利用这些错误并可能进行各种恶意活动:

1)他们可能会将漏洞暴露给公众,从而导致开发商和供应商的收入,业务和声誉损失。

2)蠕虫会搜索可以利用的易受攻击的系统,从而将自身复制到这些服务器上。例如。2003年1月,Slammer蠕虫利用了MS SQL Server中的漏洞。

3)在提到蠕虫的地方,我们如何忘记病毒。利用不雅暴露的主要目的,利用程序中存在的错误的开发人员也会使病毒迷路...

4)如果程序未正确调试,则消费者如果没有物有所值,就永远也不会保留。在这种情况下,您甚至不需要黑客来完成繁琐的工作-您不妨信任良好的公众。

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.