什么样的技能确定一个能够轻松调试代码的人?前一段时间,我的朋友接受了一个相对优秀的程序员的采访。程序员被录用了。他可以编写出色的代码,了解框架和设计模式。他缺少的是调试技能。他根本无法调试,发现他或别人的代码有问题对他来说是巨大的痛苦。
从那时起,我们一直在思考如何评估或估计一个人的调试技能。
因此,第一个问题是:哪些技能可以确定一个人是否可以有效调试软件?
第二:面试中如何测试这些技能?
什么样的技能确定一个能够轻松调试代码的人?前一段时间,我的朋友接受了一个相对优秀的程序员的采访。程序员被录用了。他可以编写出色的代码,了解框架和设计模式。他缺少的是调试技能。他根本无法调试,发现他或别人的代码有问题对他来说是巨大的痛苦。
从那时起,我们一直在思考如何评估或估计一个人的调试技能。
因此,第一个问题是:哪些技能可以确定一个人是否可以有效调试软件?
第二:面试中如何测试这些技能?
Answers:
如果该人员要做的第一件事就是查看代码,然后使用调试器逐步调试该代码,那么该人员就不是很好的疑难解答程序。
如果您还没有一个行动计划,而您却陷入了调试器盲区,那么您基本上就是复活节彩蛋。对于任何类型的故障排除都是如此。
在面试的情况下,一个询问系统如何运行并询问系统历史的人可能是一个很好的疑难解答者。首先考虑系统而后考虑机械的人可能是一个很好的疑难解答者。
任何复杂的系统都是如此。
我认为,使用特定语言或框架对优秀软件开发人员的最佳衡量标准是能够对复杂问题进行批判性分析并具有良好的语言或框架调试技能。他们必须能够展示低级调试以及使用通用调试工具进行高级调试的熟练程度。
这意味着为他们创建一个方案,以证明他们在所选IDE中具有很高的调试工具能力。您应该寻找类似的东西:
在调试模式下运行沙盒应用程序或服务器,或使用调试符号构建应用程序
提供并演示远程调试端口或使用符号构建的非沙盒应用程序的调试(如果适用于语言)
战略性使用断点
断点的自定义属性,断点的条件表达式(如果适用于语言)
使用表达式或变量监视来监视变量值或引用
实时使用临时变量值或引用或指针操作
展示进入,退出和退出应用程序流程的能力
对调用堆栈的严格评估
调试多线程应用程序并理解这一点。
还应展示其他没有工具的调试策略,例如分析日志和源代码,以及无需使用IDE即可执行一些底层调试的能力。
如果要查看程序员是否可以调试,请给他们修复代码。如果要查看他们是否可以编写代码,则使用相同的方法。给他们一个问题,让他们编写代码。
现在,我对此程序员感到困惑,他没有编写代码的问题,但是在被要求调试时却失败了。这个人会否重新编写代码示例,还是只是坚持自己具有阅读和写入数据库等经验的领域?除非他们第一次得到正确的代码,否则无法解决?
也许那个人只是不喜欢调试而不花力气?我不擅长此事,所以不要再要求我这样做了-学会了无助。
在现有代码库上工作需要仔细阅读代码,文档和可能做一些自己的注释和设计。
我知道我们认为调试是修复失败的生产代码,但是我在编写代码时需要调试代码。这个人不是一个非常好的程序员,或者他们只是喜欢编写新代码。不是我们所有人。
通常,具有良好才能的人也是具有良好调试技能的人。
在面试过程中(取决于他们的资历),您可以给他们分配一些难题,例如某种算法等。那是简单的方法。
如果可以,您可以从一些工作中打印出一个代码,询问此人是否有问题,以及如何解决。
我不太喜欢问那些模糊的面试问题,而这些问题往往侧重于人们阅读和修复语法的能力。
我将与新兵分享有关调试候选人技能测试的经验。我曾经接受过一个分为三个阶段的采访。第二阶段是“实际案例”。那时我还不知道。到那里时,我得知有一个系统停止工作了,他们不知道。后面有一些错误。
它被安排为旧测试环境的远程桌面。可能是在未插电或隔离的环境中。该项目是一些带有一些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管理工具。当然,有些候选人在纸面上看起来确实不错,但实际上可能会卡在这些任务上。
我挑选一个实际遇到的与职位相关的问题,并将其呈现给候选人的方式与呈现给我的方式一样多。当然,我为他们提供了一些一般背景知识,以及少量相关文档,例如代码段或示意图。
我告诉他们他们的工作是解决问题,我愿意回答他们遇到的任何技术问题,并告诉他们他们想要执行的任何实验的结果。如果他们说“我在这里放了一个示波器探头”,那么我将向他们勾勒出他们可能会发现的踪迹。如果他们想printf
在循环中插入a ,我将告诉他们永远不会出现(!)或先打印“ 7”,然后重复打印“ 5”。如果他们走得太远,以至于我无法给出有意义的答案,我将承认我们走错了道路,回到了其他地方。如果他们陷入困境,我会问一些主要问题或提示,直到我们继续前进。
我想看到的是井然有序的思考过程,决心解决问题的方案,经过深思熟虑的问题和实验,以及理想地成功识别问题的方法。有时,我选择的问题过于复杂,以至于某人无法在一小时的采访中进行全面调试,最后我给了他们真正的答案。在这一点上,我正在寻找一种反应,表明他们参与了该问题,并经历了“啊哈”的时刻和对找到原因的满足。最好的候选人会在那时自发地提出后续问题,试图将他们对问题的思维导图与实际情况联系起来。
将它们放在带有一些简单的二进制(带有调试)符号的计算机上,这些符号使用空指针引用或此类+源代码+ gdb进行段错误,看看它们是否可以找到崩溃的原因?
在少量代码片段中找到“错误”是一种非常人为的情况。我想这可能与拼图和脑筋急转弯一样有用。
一种更全面的方法将以行为方式询问候选人在过去如何以特定事件为例进行调试,然后再提出问题。
善于解决问题的人不仅可以讨论IDE中的调试功能,还可以讨论更多。漏洞报告工具,最终用户交互,漏洞再现,日志文件分析,验证又如何呢?
调试要比遍历一段代码还要多得多,对某人的调试技能的任何评估都可以证明这一点。
给某人一些您公司在生产中运行的出色代码。请他们介绍一个细微的错误。问他们为什么选择了那个。问他们如何寻找并修复它。
如果他们在原始代码中发现错误,则加分。
如果他们可以修复原始代码中的错误,则双倍奖励积分。
我会问几个与技术无关的问题,如下所示:
这在电话采访中特别有效,因为您只需要对方给您一个令人信服的答案,即可显示他在解决问题时的真实感受。