优秀程序员与普通程序员——以及为什么提问和关注细节很重要。

2025-05-25

优秀程序员与普通程序员——以及为什么提问和关注细节很重要。

披露:本篇文章包含附属链接;如果您通过本文提供的不同链接购买产品或服务,我可能会收到报酬。

面试程序员或软件开发人员时,目标是找到最适合这份工作的人选,但这说起来容易做起来难。实际上,在短短的面试时间内很难判断一个人的能力、经验和专业知识。

我知道从电话面试笔试到面对面面试有一个过程,但雇用或找到一名优秀的程序员仍然不容易。

这个过程可以帮助您筛选候选人,但最终,找到优秀的程序员还是要依靠您的经验和直觉。

随着你参加的面试越来越多,你就会知道该问什么、不该问什么,而且像世界上许多其他面试官一样,你会形成一些自己的技巧来找到合适的候选人。

同样,我从面试许多程序员的经验中也学到了一些技巧,这些技巧帮助我过去区分普通程序员和优秀程序员。

今天,我想与大家分享其中一条技巧,看看您是否同意我的观察,或者我的理解是否存在缺陷,并且希望我可以从你们那里学到更多技巧,以便将来找到一些优秀的程序员。


我最常用的技巧之一是找到需求中的差距。随着时间的推移,我发现并学会了——

优秀的开发人员善于将需求分解成小块并找出差距,

这对于生产高质量的软件非常重要。

虽然这种技能主要来自经验,但优秀的开发人员即使经验较少,也具备这种能力。

在本文中,我将分享一个面试场景,以检查在相同要求下普通程序员和优秀程序员会写出什么。

这是一个假设性的采访,用来演示我的建议,但它与真实的采访非常接近。

您可以根据您所在的领域、候选人的经验、领域专业知识以及职位描述来调整要求。关键在于给候选人一行要求,然后比较多个程序员开发的程序质量。

在这种情况下,我使用了一个非常通用的要求,它不需要任何领域的专业知识,如金融、医疗保健或制造业,但需要一些编程经验。


面试官:您能否编写一个脚本来存档超过 30 天的文件,并且可以使用 cron 作业在每月 1 日运行?

程序员 1 立即开始编码,并编写了一个完全符合要求的脚本。

他的脚本可以找到输入目录中的所有文件,并可以在同一目录中创建一个以提供的名称和备份日期作为后缀的档案。

看起来不错,对吧?

但请稍等一下,还缺少了一些东西:

  1. 他没有排除脚本本身创建的存档文件,这意味着下个月的脚本也会包含上个月的存档。如果您没有进行监控,只有在需要从存档中检索某些内容时才会意识到这个问题。
  2. 他没有考虑到这个脚本中两个相互矛盾的部分:查找超过 30 天的文件,并在每个月 1 号运行它。因为这个脚本的目标是备份上个月的数据,而月份可以是 28、29、30 或 31 天。所以,如果你在 3 月 1 号运行这个脚本,它将不会归档任何文件,因为所有文件都少于 30 天,而二月通常是 28 天。
  3. 他的脚本没有在存档后删除文件,尽管这并不是要求的一部分;这是一个隐含的要求,直到面试官特别提到不要这样做。

我同意他不应该假设任何事情,但至少应该向面试官澄清这一点。即使他提出这一点,我也会给他加分,因为他理解手头的工作,并且提出了一些用户当时甚至没有想到的事情。

这是优秀程序员和普通程序员之间的关键区别


这些只是缺失需求的一些例子,但这种情况在现实世界的编程中相当常见。

很多用户都会提出这样的需求,经验丰富的程序员都知道 细节决定成败”。在做任何事情之前,第一步是了解目的,然后思考缺少什么。

就像你去看医生并说你有一些问题时,他会问几个问题以更好地了解问题一样;你应该总是问问题来消除疑虑,让用户知道缺少了什么,等等。

作为软件开发 领域的专家,您有责任获取足够的细节,以便产品满足用户期望并经得起时间的考验。

我喜欢问这种问题,它不是针对特定领域,而是非常通用。这不仅能让我们有机会评估应聘者对PerlPythonJavaBash 脚本等特定技术的掌握程度,还能了解他的整体思维过程。

任何能够思考并发现需求差距的开发人员都将成为团队的财富。

顺便说一句,就像所有的事情一样,情况并非总是如此,而且这也不是一条硬性规定,它只是另一个指标,可以潜在地帮助你找到优秀的程序员。


这里还有几个例子来区分普通程序员和优秀程序员。

其中一个有趣的任务是要求开发人员编写代码来读取文件;优秀的程序员总是询问有关文件内容的问题,例如二进制或文本。

如果是文本,那么编码是什么,而普通开发人员只需编写代码来读取文件。

优秀的开发人员会确保以正确的方式关闭流并释放文件描述符(资源),而普通程序员通常会忘记这一点。


对于开发人员和程序员来说,如果您遇到这类问题,面试官要求您做真正的工作,请考虑更好地理解需求并提出正确的问题。

就像我们之前的问题一样,您可能已经询问过当您开始使用脚本时出现的所有那些缺失的要求。

不用说,第二位程序员(优秀的程序员)更聪明、更实际,能够填补其中的一些空白。

这个技巧在过去对我有帮助,但它并不是找到优秀开发人员的硬性规定,事实上,没有规则可以找到他们。

你只需要根据一些指标和你的直觉来判断。跟我说说你们在面试中寻找优秀程序员的秘诀吧。

这里还有几个问题供您练习:

1)编写一个 wordwrap() 函数,它可以接受一个字符串并根据屏幕大小对其进行拆分?

这是一个真正的 J2ME 问题,当移动设备非常小并且没有足够的 API 支持时我曾遇到过这个问题。

由于手机或智能手机的屏幕尺寸各不相同,因此根据屏幕尺寸换行是一项常见的任务。

虽然没有明确说明,但这里的目标是使该函数适用于所有设备。该函数应该考虑换行符、空格、字体大小等。

现在您可以将这个问题用于AndroidiOS面试,因为智能手机尺寸仍然不统一。

2) 编写一个函数来替换 Java 字符串中的给定字符?

这是一个相当简单的问题,但要求他编写一个类似生产的代码,然后看看候选人是否处理明显的问题,例如空字符串,空字符串,字符串包含所有要替换的字符等,这里是该问题的示例解决方案

以下是一些您可以使用的更受欢迎的编码问题:

  1. 如何设计自动售货机?(解决方案
  2. 如何检查一个字符串是否是另一个给定字符串的旋转?(解决方案
  3. 如何计算字符串中给定字符的出现次数?(解决方案
  4. 如何打印字符串中第一个不重复的字符?(解决方案
  5. 如何像 atoi() 一样将给定的字符串转换为 int?(解决方案
  6. 如何实现桶排序算法?(解决方案
  7. 如何实现计数排序算法?(解决方案
  8. 如何从数组中删除重复项?(解决方案
  9. 如何在 Java 中就地反转数组?(解决方案
  10. 如何在不使用任何库的情况下从数组中删除重复项?(解决方案
  11. 基数排序算法是如何实现的?(解决方案
  12. 如何在不使用第三个变量的情况下交换两个数字?(解决方案
  13. 如何检查两个矩形是否相互重叠?(解决方案
  14. 如何设计自动售货机?(解决方案
  15. 如何在给定的 1 到 101 的整数数组中找到缺失的数字? (解决方案
  16. 如何在给定的整数数组中找到重复的数字?(解决方案
  17. 如果数组包含多个重复的数字,如何找到重复的数字?(解决方案
  18. 稳定排序算法和不稳定排序算法之间的区别?答案
  19. 迭代快速排序算法是如何实现的?(解决方案
  20. 如何在未排序的整数数组中找到最大和最小的数字?(解决方案

如果您需要更多问题,或者您是准备面试的程序员,您可以查看Coding Interview BootCamp课程或Gayle Laakmann McDowell的经典《Cracking the Coding Interview》一书,这是我个人最喜欢的快速审查和初步筛选候选人的书籍之一。

这就是区分普通程序员和优秀程序员的技巧。正如我所说,这只是面试官考察候选人的几个方面之一;对于程序员来说,这是一个展示他们思考能力以及他们在理解需求和发现差距方面能力的机会。如果你想成为一名优秀的程序员,你也可以阅读这十条技巧和这十篇文章

进一步学习
数据结构和算法:深入使用 Java
准备技术编程/编码工作面试的 10 本书
每个程序员都应该阅读的 10 本算法书籍
Java 开发人员的 5 本最佳数据结构和算法书籍
从 0 到 1:Java 中的数据结构和算法
数据结构和算法分析 --- 工作面试
20+ 来自面试的基于字符串的编码问题20+
来自面试的链表问题
20+ 来自面试的基本算法问题

结束语

谢谢,你终于读完了这篇文章……祝你的编程面试好运!这当然不容易,但只要注意细节,提出好问题,就能带来很大的不同。

如果您需要更多练习题,那么您还可以查看这些额外的50 个电话面试编程问题以及这些书籍课程,以进行更彻底的准备。

祝你的编码面试一切顺利。

文章来源:https://dev.to/javinpaul/good-programmers-vs-average-programmer-and-why-asking-questions-and-paying-attention-to-details-matters-j3h
PREV
如何在 2025 年成为认证 AWS 解决方案架构师
NEXT
9 个最佳 Coursera 课程 + 项目,面向 Web 开发人员