如何检查或评估一个人的调试技能?[关闭]


48

什么样的技能确定一个能够轻松调试代码的人?前一段时间,我的朋友接受了一个相对优秀的程序员的采访。程序员被录用了。他可以编写出色的代码,了解框架和设计模式。他缺少的是调试技能。他根本无法调试,发现他或别人的代码有问题对他来说是巨大的痛苦。

从那时起,我们一直在思考如何评估或估计一个人的调试技能。

因此,第一个问题是:哪些技能可以确定一个人是否可以有效调试软件?

第二:面试中如何测试这些技能?


14
实际上,在一次采访中,我得到了在计算机上调试的代码。他们已经将源代码修改为tar或gzip或其他内容,并希望了解如何调试它。
wkl 2012年

4
唯一可以肯定的方法是让他或她“活着”。事先让他(她)知道您的开发环境是什么,并且将进行简单的编码和调试测试。

@ThorbjørnRavnAndersen,它甚至不必直播。我在几个地方进行了面试,向我提供了一个小功能的打印输出,以及该功能的功能说明,然后要求我“查找错误”。
2012年

@quanticle在这里,我公司会进行5个问题的编程测试(其中大约一半是调试的),然后再考虑进行面试。显然,它淘汰了大多数候选人...
Izkata 2012年

给他一个堆栈跟踪以进行分析:-)
JustMe 2012年

Answers:


24

如果该人员要做的第一件事就是查看代码,然后使用调试器逐步调试该代码,那么该人员就不是很好的疑难解答程序。

如果您还没有一个行动计划,而您却陷入了调试器盲区,那么您基本上就是复活节彩蛋。对于任何类型的故障排除都是如此。

在面试的情况下,一个询问系统如何运行并询问系统历史的人可能是一个很好的疑难解答者。首先考虑系统而后考虑机械的人可能是一个很好的疑难解答者。

任何复杂的系统都是如此。


1
+1可以很好地理解这一点。我同意,但是当他们的确考虑机械原理时,他们现在会更好地使用工具。就像在汽车上一样,不了解或无法使用机械工具的工程师根本不是合格的工程师。
maple_shaft

16
这个答案没有任何本能调试的余地。曾经使用过足够的系统,代码类型或语言的人通常可以“嗅到”自己的方式,以应对任何时髦的情况。有时,您无需了解系统的来龙去脉即可发现其缺陷。
约旦

首先,没有“本能调试”之类的东西。专家将使用启发式(又称“断腿线索”)。好的 如果有启发式可用,那么专家将有效地使用它们。但是那些启发式方法可以使这些专家陷入困境。继续阅读有关认知心理学专家所做的大量工作,您会发现。因此,一个好的专家可能对从哪里开始有很好的想法,但是他们永远不应该完全依赖这些直觉。他们应该至少能够在某种程度上解释这些直觉。
ElGringoGrande'3

10
如果他们的第一件事是发表评论,那么我必须不同意您的黑人和白人。我要说的是,如果某人认为在某些情况下启动调试器不是一个好的选择,那么该人也不是一个好的故障排除者。如果问题是通讯停止了,那么我要做的第一件事就是启动调试器,并找出哪些进程/线程/任务被阻止或停止工作。启动调试器的另一个原因是尝试查看问题是否可重复。一旦您知道如何破坏系统,找到解决方案就变得容易得多。
Dunk 2012年

5
@ElGringoGrande,他在暗示与我正在读的相反。关键是随着人们变得越来越有经验,他们自然会在调试方面变得更好。工具或方法的有效性并不重要。这就是为什么您的答案不完整的原因。有许多有效的调试方法,包括拉起椅子并遍历代码,提出问题等。我已经用print有效地调试了大型PHP程序。我不喜欢这样做,但实际上,它对工具的了解不如对系统一般如何工作的了解。
约旦

15

我认为,使用特定语言或框架对优秀软件开发人员的最佳衡量标准是能够对复杂问题进行批判性分析并具有良好的语言或框架调试技能。他们必须能够展示低级调试以及使用通用调试工具进行高级调试的熟练程度。

这意味着为他们创建一个方案,以证明他们在所选IDE中具有很高的调试工具能力。您应该寻找类似的东西:

  • 在调试模式下运行沙盒应用程序或服务器,或使用调试符号构建应用程序

  • 提供并演示远程调试端口或使用符号构建的非沙盒应用程序的调试(如果适用于语言)

  • 战略性使用断点

  • 断点的自定义属性,断点的条件表达式(如果适用于语言)

  • 使用表达式或变量监视来监视变量值或引用

  • 实时使用临时变量值或引用或指针操作

  • 展示进入,退出和退出应用程序流程的能力

  • 对调用堆栈的严格评估

  • 调试多线程应用程序并理解这一点。

还应展示其他没有工具的调试策略,例如分析日志和源代码,以及无需使用IDE即可执行一些底层调试的能力。


+1非常有用的清单。多应用之一。
Dipan Mehta'3

8
我认为调试多线程应用程序与调试单线程应用程序完全不同。与众不同,而且难度更大。
Bruce Ediger 2012年

20
@JarrodRoberson Brian Kernighan和Rob Pike在《编程实践》中写道,他们仍然更喜欢打印语句而不是调试器,因为它的瞬时性较小。许多人喜欢一个好的日志记录系统,该系统可以为他们提供代码路径的详细视图,而不会在程序中期停止运行。读取日志文件然后调试核心转储也更容易。因此,您的石蕊测试可能会拒绝一些优秀的程序员,因为并非所有人都认为调试器与替代调试方法(日志,单元测试,断言)一样有用
MetricSystem 2012年

12
调试打印语句很好,并且可能比调试器更好,尤其是在涉及并发的情况下。您对它们的问题可能确实与缓慢的编译器有关。
瑞奇·克拉克森

8

我想说的是,将系统中存在的错误提炼成可以在面试中讨论的错误。启动调试器,然后让他进行调试。


7

问他这样的问题:

  1. 您如何解决问题?

  2. 您所做的复杂项目之一是什么,如何实现的?

  3. 您使用了哪些调试工具?

  4. 您对某些工具有偏好吗?

  5. 举例说明您自己的情况,并问他如何解决?

  6. 您如何评价进入他人代码的能力?

您可以通过提问解决您的问题。总是存在他可能会或可能不会擅长某些技能的风险。但是,如果他是一个好的学习者,那将会有很大帮助。


6

如果要查看程序员是否可以调试,请给他们修复代码。如果要查看他们是否可以编写代码,则使用相同的方法。给他们一个问题,让他们编写代码。

现在,我对此程序员感到困惑,他没有编写代码的问题,但是在被要求调试时却失败了。这个人会否重新编写代码示例,还是只是坚持自己具有阅读和写入数据库等经验的领域?除非他们第一次得到正确的代码,否则无法解决?

也许那个人只是不喜欢调试而不花力气?我不擅长此事,所以不要再要求我这样做了-学会了无助。

在现有代码库上工作需要仔细阅读代码,文档和可能做一些自己的注释和设计。

我知道我们认为调试是修复失败的生产代码,但是我在编写代码时需要调试代码。这个人不是一个非常好的程序员,或者他们只是喜欢编写新代码。不是我们所有人。


2
我们都调试我们的程序。在一开始,它很容易,因为程序很小,并且容易掌握所有内容。但是随着它的增长和变得越来越复杂,调试变得越来越困难。而现在-有些人仍然可以处理并在合理的时间内找到错误,有些人则迷路了。他们不知道该把重点放在哪里以及如何缩小范围来找到它……
Michal B.

1
@MichalB .:我们都调试了程序,但是有些人会展示一种有原则的方法,而另一些人只是随机地调整事情,看看会发生什么
Matthieu M.

我不明白你为什么会感到困惑。成为一个好的开发人员和一个好的维护者是非常不同的技能。充其量,大多数人只有一种或多种(如果不幸的话,它们涵盖了大多数开发人员),他们只会精通其中一种。
扣篮

3

用与确定某人的编码能力相同的方式,向他们询问有关调试的问题。

问他们“如何”解决给定情况下的错误。

更进一步,将它们坐在计算机前,看着他们调试问题。


3

我经常给候选人一些假设的情况……例如,生产系统已停止响应。你是做什么?他们可能会回答“检查日志”,我说“日志没有显示任何异常,只是自问题开始发生以来,其中没有写任何东西”。因此,这种情况一直持续到我对评估候选人解决​​问题的能力感到满意为止。


2

通常,具有良好才能的人也是具有良好调试技能的人。

在面试过程中(取决于他们的资历),您可以给他们分配一些难题,例如某种算法等。那是简单的方法。

如果可以,您可以从一些工作中打印出一个代码,询问此人是否有问题,以及如何解决。

我不太喜欢问那些模糊的面试问题,而这些问题往往侧重于人们阅读和修复语法的能力。


+1好答案!我同意最好的软件开发人员具有良好的调试技能,并且我也认为发现语法错误并不能证明很多。大多数IDE甚至某些优秀的文本编辑器(Notepad ++)都可以识别常见语言中的语法错误。但是,我不同意拼图演示调试技能。拼图展示了批判性思维,这是一种不同但相关的技能。
maple_shaft

@maple_shaft感谢您(还要再+1)。没错,难题与调试并没有直接联系。但这对于判断人们如何解决问题很有用-确实是间接的事情。
Dipan Mehta'3

2
我看着拼图,我就像ewwwwwwww。您真的没有比“陷阱”更好的东西吗?以及“高级程度”如何出现?老年人应该解决更困难的难题吗?所有好的程序员(或调试员)是否都喜欢数独?您可能最终会惹恼一些非常好的程序员,并且在整个城镇中都不好听。问题是一个侮辱<period>,请提出一些更好的男人。
Chani 2012年

@Scrooge我只是把它当作编程难题了 -我从没有参加过数以百计的面试的数独游戏
Dipan Mehta'3

2

在采访中,请他们告诉您他们过去所修复的错误以及调试该错误所使用的步骤。

让他们告诉您他们在上一份工作中所做的事情,家庭作业等,以及他们在发现问题时所经历的事情。


2

我将与新兵分享有关调试候选人技能测试的经验。我曾经接受过一个分为三个阶段的采访。第二阶段是“实际案例”。那时我还不知道。到那里时,我得知有一个系统停止工作了,他们不知道。后面有一些错误。

它被安排为旧测试环境的远程桌面。可能是在未插电或隔离的环境中。该项目是一些带有一些ASP.NET控件和相关代码文件代码的Web窗体。该代码文件指的是一种业务层,为此我只有一个dll,没有源代码和方法描述。Webforms完成了您可以期望的CRUD功能。还有一个小的搜索功能。反过来,业务层与sql服务器中的Views和SP通信。

他们破坏了不同级别的某些零件。我收到了有症状的论文。“无法搜索”“上次更新后“区域”字段消失”等。例如您可以从您的用户那里收到。

我不记得所有详细信息,但至少已重命名了一个表字段,这导致了SP损坏,该SP被搜索功能使用。这意味着VS中没有错误,也没有BL源代码来跟踪字段名称。针对Sqlcommand的SELECT参数拼写错误,并导致Webform出现故障。还省略了一个字段,该字段是GridView(Autogeneratecolumns)中缺少的字段。ASP.NET按钮是指必须重复,增强的方法,并且“忘记”将按钮指向新方法。

同样,在html标签中使用标题的此类小事也不允许这样做。另外,相对的ALT标签在需要它的控件中也被省略。不正确的关闭html标记也存在一些错误,但没有出现故障。不确定所有这些是纯粹的剧场项目错误,还是不同招聘的相同项目。我没问过 困难程度当然应该符合新兵的需要。

可能应筛选(不遵循)这种测试,以在面试后查看调试是如何完成的。对于那个阶段的我自己,我觉得测试有点荒谬,但这也很重要。如果是或不是,将候选人放在正确的位置应该值得很多。

* 我认为该测试已证明是候选人/我的技能*
*分析外部系统
*使用最少的信息来查找错误和错误
*在时间紧迫且没有人帮助的情况下,代码会假定更正
*不同程度的知识;
** sql db和存储过程,
**在项目中使用dll,
** asp.net技术,
**分层体系结构
**面向问题的方面

但是,还有一些更明显的事情,例如处理开发人员环境,查找和了解Db Server管理工具。当然,有些候选人在纸面上看起来确实不错,但实际上可能会卡在这些任务上。


2

我挑选一个实际遇到的与职位相关的问题,并将其呈现给候选人的方式与呈现给我的方式一样多。当然,我为他们提供了一些一般背景知识,以及少量相关文档,例如代码段或示意图。

我告诉他们他们的工作是解决问题,我愿意回答他们遇到的任何技术问题,并告诉他们他们想要执行的任何实验的结果。如果他们说“我在这里放了一个示波器探头”,那么我将向他们勾勒出他们可能会发现的踪迹。如果他们想printf在循环中插入a ,我将告诉他们永远不会出现(!)或先打印“ 7”,然后重复打印“ 5”。如果他们走得太远,以至于我无法给出有意义的答案,我将承认我们走错了道路,回到了其他地方。如果他们陷入困境,我会问一些主要问题或提示,直到我们继续前进。

我想看到的是井然有序的思考过程,决心解决问题的方案,经过深思熟虑的问题和实验,以及理想地成功识别问题的方法。有时,我选择的问题过于复杂,以至于某人无法在一小时的采访中进行全面调试,最后我给了他们真正的答案。在这一点上,我正在寻找一种反应,表明他们参与了该问题,并经历了“啊哈”的时刻和对找到原因的满足。最好的候选人会在那时自发地提出后续问题,试图将他们对问题的思维导图与实际情况联系起来。


1

将它们放在带有一些简单的二进制(带有调试)符号的计算机上,这些符号使用空指针引用或此类+源代码+ gdb进行段错误,看看它们是否可以找到崩溃的原因?


2
所有这些告诉您,该人员可以分析代码和二进制文件以找到潜在的空指针引用。它实际上并没有证明熟练使用常见的调试工具。
maple_shaft

1

如果您让候选人进行初步的代码测试,请他们在面试期间修改代码以解决错误或添加新功能,或者两者兼而有之。如果使代码测试规范含糊不清,则可以轻松地在其中创建带有“错误”的测试用例。


1

在少量代码片段中找到“错误”是一种非常人为的情况。我想这可能与拼图和脑筋急转弯一样有用。

一种更全面的方法将以行为方式询问候选人在过去如何以特定事件为例进行调试,然后再提出问题。

善于解决问题的人不仅可以讨论IDE中的调试功能,还可以讨论更多。漏洞报告工具,最终用户交互,漏洞再现,日志文件分析,验证又如何呢?

调试要比遍历一段代码还要多得多,对某人的调试技能的任何评估都可以证明这一点。


我想假设该软件中存在尚未发现的错误。这就像在寻找地震断层。问题是人们如何寻找明显的迹象。
Christopher Mahan 2012年

1

给某人一些您公司在生产中运行的出色代码。请他们介绍一个细微的错误。问他们为什么选择了那个。问他们如何寻找并修复它。

如果他们在原始代码中发现错误,则加分。

如果他们可以修复原始代码中的错误,则双倍奖励积分。


1

我倾向于要求人们向我描述他们曾经追踪和修复的最困难的错误,以及找到并修复它所做的工作。我也知道,如果最棘手的错误是您只希望初学者很难发现的错误,那么他们可能不是很好的疑难解答者(除非这是入门级的访谈)。如果这确实很困难,并且他们在试图追踪的过程中描述了他们的思维过程,那么我可以对他们的技能水平有所了解。令我惊讶的是,只有如此之多的人看起来像“头上的鹿”,却无法想到他们所做的一件复杂的事的例子。不好意思,除了学校之外,除了其他方面我不感兴趣的人,还有其他人需要解决的棘手问题,


1

我会问几个与技术无关的问题,如下所示:

  • 指导我完成确定根本原因并修复错误(缺陷)的所有步骤
  • 在调试多线程应用程序时如何使用调用堆栈

这在电话采访中特别有效,因为您只需要对方给您一个令人信服的答案,即可显示他在解决问题时的真实感受。

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.