除其他素质外,程序员还需要良好的调试技能吗?如果我的申请人无法在给定的程序中发现错误,但能够解决所有难题和程序,我是否应该考虑他的工作?
编辑:-难题是正常的红色,蓝色和红蓝色的球一样。程序就像在数组中找到连续的k个零。调试程序由于条件而失败,该条件应为> =,而是>。一切都在纸上。
除其他素质外,程序员还需要良好的调试技能吗?如果我的申请人无法在给定的程序中发现错误,但能够解决所有难题和程序,我是否应该考虑他的工作?
编辑:-难题是正常的红色,蓝色和红蓝色的球一样。程序就像在数组中找到连续的k个零。调试程序由于条件而失败,该条件应为> =,而是>。一切都在纸上。
Answers:
如果您无法调试,那么您根本就不是程序员,更不用说一个优秀的程序员了。
调试不仅是技术技能,而且是分析能力和思考过程的真实,实际应用。因此,我认为它是比白板或面试问题更有用,更相关的测试。
除非您的工作涉及花一整天的时间回答理论问题,否则您将需要可以应用他们所掌握的任何技能的人。
但是,您要做的就是问自己:这是否是对调试能力的公平测试-他们可以像在现实世界中一样运行代码,放置断点等吗?这是什么错误?编译器是否会拾取并标记(在这种情况下,这是一个毫无意义的问题,因为他们永远不需要发现它)?
如果它只是写在纸上,那么它基本上只是一个详细的阅读测试,并且比您的平均技术面试问题还要抽象的技能,我认为这几乎是毫无价值的。
主要招聘规则-如有疑问,请拒绝。
如果您需要廉价地实现很多新代码-可以找那个人,但就我个人而言,我将继续搜索。
除非开发人员可以一直编写干净的代码(绝对不可能),并且只能在“绿色领域”项目上工作(永远不会这样),否则,调试技能绝对必不可少。绝对。我曾与不喜欢调试的开发人员有经验,所以他们变得懒惰,然后将代码扔给质量保证人员进行测试。但是这些开发人员不会持续很长时间。
软件开发是一种技巧和解决问题的技能。这些问题既包括业务问题,也包括其(和其他)代码的问题。顺便说一句,许多维护项目都是专门解决错误的,因此调试是绝对必要的技能。
我发现初级程序员和高级程序员之间的主要区别在于他们的调试技能。调试技能是只有实践和经验才能带来的东西。
例如,考虑一个奇怪的错误,在该错误中,Java程序在交互模式下可以在控制台上正常运行,但是当您尝试对相同的输入使用Unix管道时却失败了。如果以前遇到过此问题,则可以检查以确保new Scanner(System.in)
只调用一次;这样做的错误是,在通过管道传输时会消耗缓冲区,但在交互模式下则不会。我希望有一个更高级的程序员能够更快地识别此错误。也许是因为他们以前曾经体验过,或者是因为他们过去在缓冲方面遇到了其他问题。
对于解决难题和编写新代码,虽然经验很重要,但是初级程序员可能在其中可以达到甚至比高级程序员更好甚至更好的性能。也就是说,智力和技能可以产生更大的效果,而与经验无关。
如果您有能力投资初级程序员,他们可能有新想法并可以帮助团队“发展”,并且他们写新代码看起来不错,请继续雇用他们。如果您正在寻找高级程序员,那么这种调试技巧的缺乏可能是一个主要的警告信号:他们可能有十年的经验,仅相当于第一年的十倍。
附带说明一下,有一些方法可以使您无需先拥有10年的经验就能更好地进行调试。我推荐Andres Zeller的书《程序为什么失败:系统调试指南》,以此作为学习科学原理并更好地了解如何重现,发现和修复故障的方法。
程序员是否需要良好的调试技能?
是。就是说,我想请您考虑面试中的方法(即测验/测试方式)不完美(好,有缺陷),因为许多人在纸上发现代码是一种奇怪的,陌生的体验。
由于调试是一个过程,而不是答案或结果(例如错误),因此,我建议使用交互式对话或讨论作为评估候选调试能力的更好方法。尽管大多数人使用非正式的临时调试系统,但优秀的候选人通常会有类似的模式,即提出问题以了解系统或假设和要求,然后隔离问题(通常是分而治之),并系统地进行比较。代码的要求,评估预期输入/输出,而不是不管三七二十一在改变了一堆东西,一旦随意,直到它的工作原理。
我也对面试中的难题提出了保留意见,尤其是以书面形式,好像候选人没有正确的参考框架假设(技巧)),他们可能无法解决这个难题。即许多面试难题只有一条正确的道路,而生活却很复杂,最有创意的想法是采用令人惊讶的新颖方法来解决可能无法解决给定特定预煮难题的问题,并提供了预期的解决方案。就像希望所有小号手都演奏爵士乐一样。可以通过以非对抗性(压力可能混淆创造力)交互式讨论的方式提出问题来进行管理。同样,对我来说,答案是次要的,可以看到表达出了良好的思考过程。您可能需要让他们大声思考,但是根据我的经验,这往往会更有成效。
我尚未阅读或评估Zeller的Why Programs Fail,但是我可以建议您阅读《 Agans Debugging》,这是一篇简短而快速的文章,可以帮助您将即席调试过程巩固为更加结构化,具体而有条理的工作,这有助于提高调试效率。另外,打印出一份副本,然后将其悬挂在您的小隔间或解决方法中,即“ 调试规则”海报,这对于那些似乎无法正常工作的糟糕日子是一个完美的提醒。我的日子不好过,并且花更少的时间来积极地调试(阅读:困惑中的抓挠我的头),如果不按字母顺序尝试,则要本着它们的精神去做。
我要说调试是必不可少的,除非程序员如此优秀以至于他绝不会犯任何错误。我不认为这是不可能的,但是我无法用当前流行的语言和工具来想象。
我不喜欢像在采访中那样被当场摆放的概念。如果应聘者很紧张(谁不紧张),他/她可能会像程序员一样空白,他也许能够例行处理此类问题。然后,如果这是一个众所周知的面试或计算机科学测试问题,则候选人可能会死记硬背地知道结果,但没有能力思考新问题。另外,如果候选人不熟悉该语言,他将不得不挣扎。许多错误很难实现,因为一个好的程序员知道他要键入的内容,并且他的大脑在阅读代码时会采用快捷方式。我找不到C语言风格的= =,应该在检查中使用==,因为我知道意图是什么,而我的大脑会采用解析快捷方式读取它。
调试是一项关键技能。实际上,我想说的更多是故障排除是关键技能。有人应该知道如何定义问题(包括要询问的用户信息和要查看的日志),如何重现问题,他可用于诊断问题的数据源以及如何调试以及如何解决问题。不破坏其他东西 但是,很难在面试中确定。
我将给他一个真正的问题,并给他机会使用可用的工具,然后询问他采取了什么步骤来发现问题,或者如果他在指定的时间内无法找到问题,他还可以做什么。您实际上是在寻找某种可以系统地解决问题的人,并且其工具包中的工具比调试器和google还要多(在Junior级别,他至少应同时尝试这两种工具)(无法思考的人尝试这两件事可能无法胜任,或者至少我不会抓住机会),但可能还没有很多高级故障排除工具。
与疑难解答(我完全不会问那些问题)或已证明的编程技巧相比,我更重视解决问题的技巧。我很少见过能够很好地解决问题的开发人员,他们也不能编写出色的代码或进行所需的修复。我见过很多人可以将一些代码拼凑在一起以获得“工作中”的产品,但是如果他们的生活依赖于它,就无法解决问题。主要是因为他们不了解;他们实际上并不了解他们在做什么,也不了解他们要解决的问题。好的疑难解答者知道如何识别实际问题而不仅仅是症状。这样的人也知道要提出什么问题来定义新开发的问题。
调试是软件开发中的一个阶段,该阶段是在对软件进行某种测试并发现一个错误之后进行的。这是在软件中搜索和纠正错误的行为。在很多情况下,查找错误通常需要比修复它更多的时间。
这是消除计算机应用程序/系统中固有的错误(漏洞)的过程。如果不这样做,则黑客可能会利用这些错误并可能进行各种恶意活动:
1)他们可能会将漏洞暴露给公众,从而导致开发商和供应商的收入,业务和声誉损失。
2)蠕虫会搜索可以利用的易受攻击的系统,从而将自身复制到这些服务器上。例如。2003年1月,Slammer蠕虫利用了MS SQL Server中的漏洞。
3)在提到蠕虫的地方,我们如何忘记病毒。利用不雅暴露的主要目的,利用程序中存在的错误的开发人员也会使病毒迷路...
4)如果程序未正确调试,则消费者如果没有物有所值,就永远也不会保留。在这种情况下,您甚至不需要黑客来完成繁琐的工作-您不妨信任良好的公众。