前一段时间-确切地说是2000年-乔尔·斯波斯基(Joel Spolsky)写了一篇博客文章,标题为:“ 乔尔测试:改进代码的12个步骤 。”
许多软件工程师和开发人员使用此测试来评估公司,以确定公司是否是适合工作的好公司。
实际上,许多软件开发组织都使用Joel测试作为一种自测试来确定他们需要进行的工作。
如果您不熟悉,这是Joel测试的样子:
乔尔测验
- 您是否使用源代码管理?
- 您可以一步一步构建吗?
- 您每天制作吗?
- 您有错误数据库吗?
- 您在编写新代码之前会修复错误吗?
- 您有最新的时间表吗?
- 你有规格吗?
- 程序员有安静的工作条件吗?
- 您是否使用金钱可以买到的最好的工具?
- 你有测试员吗?
- 新候选人在面试中会写代码吗?
- 您是否进行走廊可用性测试?
根据Joel所说,这是应用方法:
“关于乔尔测验的整洁之处在于,您可以轻松地快速回答每个问题。 您不必找出每天的代码行数或每个拐点的平均错误数。 对于每个“是”的答案,请给您的团队1分。 关于乔尔测试的可耻之处是,您真的不应该使用它来确保您的核电站软件安全。
满分为12分,可以忍受11分,但低于10分则表示您遇到了严重的问题。 事实是,大多数软件组织的运行得分为2或3,他们需要认真的帮助,因为像Microsoft这样的公司全职运行12个。
但是,针对程序员的“ Joel测试”呢?
Joel Test非常适合软件开发商店和对快速评估公司软件开发环境感兴趣的程序员,但是对于实际程序员而言,Joel Test又如何呢?
最近有几个人问我是否有一个乔尔测试的想法来评估一个实际的程序员,而不是一个软件开发组织,所以我决定列出一份我认为可能与乔尔相当的列表。测试评估实际软件开发人员的技能。
这是我想出的。
我将把它们列出来,然后像乔尔在其原始文章中所做的那样对每个人进行更深入的研究。
简单程序员测试
- 您可以有效地使用源代码控制吗?
- 您能解决算法类型的问题吗?
- 您可以使用一种以上的语言或技术进行编程吗?
- 您每天都在做一些事情来增加自己的学历或技能吗?
- 你给事情起个适当的名字吗?
- 您能否有效地传达您的想法?
- 您了解基本的设计模式吗?
- 您知道如何有效调试吗?
- 您是否测试自己的代码?
- 你分享你的知识吗?
- 您是否使用最好的工具来工作?
- 您可以构建一个实际的应用程序吗?
显然,这是一个简单的测试, 没有包含使优秀软件开发人员所能接受的所有内容 ,但是您可以使用该测试进行自我评分,或者在面试候选人时获得一般才能的好主意。
对于自我评分,当然重要的是要根据这12条标准诚实地评估自己 ,并且只有在您可以自信地说您达到该标准时才给自己打分。
如果老实说分数低于8,请不要灰心。 这只是意味着您还有很多工作要做。
我想说, 得分超过8分的人应该在软件开发中找到一份不错的工作。
1.您可以有效地使用源代码控制吗?
(我讨厌有效地使用该词,但我选择在整个列表中使用该词,只是因为能够有效地执行某件事确实是一回事,而能够有效地执行此事完全是另一件事。因此,尽管“有效地”是主观的,我会尽力在这里的每个描述中尽可能客观地定义它。)
是的,几乎所有开发人员都可以从源代码管理中检入和检出文件,但是有效地使用源代码控制不仅意味着了解从存储库中提取源代码并进行提交的基础知识。
不同的源代码控制技术有不同的使用方式,但是无论您使用哪种源代码控制技术, 您都应该知道如何使用它来做更多的工作,而不仅仅是检出并检入代码。
为了有效地使用源代码控制, 您应该了解分支和合并之类的概念。
您应该知道如何使用源代码控制系统返回并查看代码修订版以进行比较。
您应该知道如何在合并时解决冲突,并了解如何使用分支或工作空间来孤立地工作,或者在适当时与队友一起工作 。
由于源代码管理对于几乎每个软件开发人员都非常重要,因此您应该真正成为使用任何源代码控制技术的专家,并了解适用于几乎所有源代码控制系统的基本概念。
2.您能解决算法类型的问题吗?
令我惊讶的是有多少程序员无法解决相当简单的算法问题,尤其是因为在任何大型编码采访中几乎总是会问这类问题。
作为软件开发人员, 您应该能够解决以下基本算法问题 :
“编写一个函数来确定两个字符串是否彼此相似。”
而且您应该能够在白板上解决比这困难得多的问题。
对于程序员来说,这简直是小菜一碟。 即使大多数现实世界的问题与您在面试中经常被问到的算法问题的类型都不一样,但现实世界中确实存在相同类型的问题。 实际上,真正认识它们的唯一方法是拥有一些解决一般类型问题的经验。
我已经写了很多有关解决这类问题的文章,并提供了许多有关该主题的资源,因此在这里我不再重复,如果您有兴趣提高自己的技能,请阅读其中的一些文章。在这方面:
3.您可以使用一种以上的语言或技术进行编程吗?
您在该行业工作的次数越多,您就会越发意识到对技术虔诚是毫无意义的,并且精通一种以上的编程语言或技术堆栈是多么有益。
最好的程序员能够使用最好的工具来完成这项工作。 他们意识到,使用不同的技术可以最好地解决不同的问题。 他们不会尝试只使用他们所知道的东西,也不会仅仅因为他们所知道的就嫁给特定的技术或编程语言。
一个真正优秀的程序员将通过学习一种以上的编程语言来尝试获得广泛的经验和知识,并将花费一些时间在多种技术体系中进行自我教育。
当然, 专业化很重要 ,但是即使您不是每天都在使用这些知识,但精通多个技术领域也很重要。
在我看来,我真正从一个普通的开发人员过渡到一个好的或非常好的开发人员的那段时间是我在舒适地带以外工作并开始进行Java开发的那段时间,尽管我的志向和大部分经验都在C#和.NET。
在过渡到第二种编程语言和完全不同的技术堆栈之后,我为我从事的未来项目带来了更广阔的视野,并且不再受使用单一技术可以给您带来的隧道愿景的限制。
4.您每天都在做一些事情来增加自己的学历或技能吗?
我问面试的任何软件开发人员的第一个问题是,他们为保持技术水平所做的工作以及如何保持最新。
我发现制定了某种自我教育计划的程序员是最终做得最好的程序员,是我最喜欢与之合作的开发人员,也是整体上生产力最高的开发人员。
在当今每天都会出现新技术和进步的环境中, 如果您没有某种养成习惯的习惯 , 就不可能保持与时俱进的意义。
即使是很小的事情,您也应该每天做一些事情,以提高您的技能或学习新知识。
每天花15分钟阅读编程博客(像这样的博客),阅读技术书籍或做其他事情来提高您的技能,这在几年的时间中会产生巨大的变化。
5.您是否恰当地命名?
工作中最困难但最重要的部分之一就是命名。
一个好的软件开发人员会编写干净且易于理解的代码。
除非您擅长命名变量,方法,类以及所创建的任何其他需要名称的名称,否则就不可能编写干净且易于理解的代码。
如果我看一下您的代码,看看您是如何选择命名的,那么它可以告诉我很多有关您的想法以及您对编写代码的重要性的理解,这不仅可以实现预期的功能,而且很容易了解和维护。
一本可以教您如何正确命名的好书是“ 代码完整” 。
另一个好方法是“ 清洁代码” 。
6.您能否有效地传达您的想法?
您可以成为世界上最好的软件工程师,但是如果您不能有效地传达自己的想法,那么对于团队来说就不会很有用。
沟通是一项至关重要的技能 ,几乎影响到我们在软件开发领域所做的一切。
从编写电子邮件到在白板上解释体系结构构想,再到与客户和利益相关者进行沟通,软件开发都涉及大量沟通。
培养沟通能力的一种好方法是定期写作。 一旦我开始定期在此博客上写作,我自己的沟通技巧就会突飞猛进。 我知道其他许多软件开发人员也取得了类似的结果。
7.您了解基本的设计模式吗?
您不一定必须经常使用设计模式才能成为一名优秀的软件开发人员,但您至少应了解所使用的技术和编程语言中使用的最常见的设计模式。
面向对象的编程语言最常使用的设计模式将与功能性语言所使用的设计模式不同(或者相当多的设计模式将通过语言本身来表达),但是,您应该意识到至少大多数最常见的设计模式。
如果您还没有读过四本书《 Design Patterns 》,那就去读。
如果您想要一个更容易理解的版本,请尝试“ Head First设计模式” 。
8.您知道如何有效调试吗?
这是一个棘手的问题。 许多软件开发人员认为他们知道如何调试,但是他们真正知道如何进行调试。
别误会,您需要知道如何使用调试器,但是调试不只是单步执行代码行,寻找可能出错的地方。
优秀的程序员知道调试涉及从错误的假设开始,然后仅使用调试器来证明或反驳该假设。
通过采取正确的方法,可能会浪费数小时来尝试调试问题 ,而该问题原本可以在不到一半的时间内得到解决。
由于大多数软件开发人员花费在调试代码上的时间比编写新代码要多 ,因此能够有效调试的开发人员非常有价值。
9.您是否测试自己的代码?
质量和测试不是测试和质量检查部门的责任。 质量是每个人的责任,尤其是开发人员的责任 。
优秀的程序员将对自己的代码质量负责,并确保在将代码移交给QA或其他任何人之前先对其进行测试。
别人应该总是测试您的代码,但是在将代码交给其他人进行测试之前,您应该尽可能地对其进行测试。
我坚信,成为一名优秀的软件开发人员的一部分是成为一名优秀的测试人员。
我最喜欢的测试书籍-有点陈旧,但仍然是不错的读物-“ 测试计算机软件” 。
10.您分享您的知识吗?
优秀的开发人员的标志之一是,他们可以自由开放地共享知识。
它不仅对团队和周围的其他开发人员有帮助,而且我坚信,只有教好它 , 您才真正学到东西 。
最好的程序员总是与他人分享他们的知识。 他们不怕工作安全,也不会泄露自己的秘密。
任何团队中最有价值的人是使团队中其他所有人更有价值的人,而不是最了解的人。
知道很多但不共享它只会对自己有好处。
11.您是否使用最好的工具来完成工作?
一个真正优秀的程序员将始终拥有一整套用于提高工作效率的工具。
使用哪种工具都没有关系,但是您应该拥有一些您认为最适合所从事工作的工具,并且应该花一些时间来学习这些工具。
真正关心自己的工作的开发人员会花时间寻找可以帮助他们做得更好的工具。
以Scott Hanselman为例,他拥有大量的开发人员工具 (基于Windows)。
您的工具集可能有所不同,但是工具很重要。
他们总是说什么? 适合正确工作的正确工具。
您可以花费数小时尝试使用工具箱中的不同扳手和钳子来转动管道上的垫圈,也可以花费数秒钟使用活动扳手完成同一任务。 (相信我,我已经学到了其中一种艰难的方法。)
12.您可以构建实际的应用程序吗?
仅仅编写代码还不够。
有很多软件开发人员可以更改现有代码库并修复错误, 但实际上可以从头开始编写整个应用程序的软件开发人员要少得多。
一个好的软件开发人员可能无法自行开发大型企业应用程序或大型软件套件,但他们应该能够自己编写至少某种简单的应用程序。
能够创建整个应用程序(即使是很小的应用程序)也显示出对软件如何工作以及如何构建的基本了解。
在我的职业生涯的大部分时间里,我都不知道该怎么做。
我可以修复错误,可以更改现有应用程序中的某些功能,甚至可以向应用程序中添加新功能,但是我不知道如何从头开始创建自己的应用程序。
直到我自己创建了一些小型副项目并真正构建了一个真正的应用程序之后,我才真正理解了复杂软件系统的所有部分是如何工作的以及如何将它们组合在一起。
你应该用它击败某人吗?
两者都不。
这些只是一些指南,您可以用来了解自己的立场和从事的工作。
软件开发是一个复杂的领域。 永远不会有一个清单可以用来确定您或其他人是否是优秀的开发人员,但是我确实相信一套通用的指导原则有助于您大致了解您或您正在采访的人的立场,而我相信此列表可以作为一种快速的方法来识别您可能想要解决的任何弱点。
如果您喜欢这篇文章,并且想为软件开发人员提供更多职业建议,请确保注册我的每周免费电子邮件。
另外,我也很高兴收到您关于这项测试的消息。
您觉得有用吗?
有什么我想念的东西应该包括在这里吗?
我列出了约30个项目,然后将其范围缩小到我认为排名前12位的项目。
翻译自: https://www.javacodegeeks.com/2015/02/joel-test-updated-programmers.html