可塑性 === 悲伤

2025-06-08

可塑性 === 悲伤

我在这个网站上的第一篇文章(https://dev.to/bytebodger/your-coding-tests-are-probably-eliminating-some-of-your-best-candidates-de7)就是在吐槽许多“编码测试”的荒谬之处。所以,这种吐槽对我来说并不新鲜。但我还是想花几分钟时间告诉你,我有多么鄙视Codility。如果你是招聘经理,并且认为 Codility 能更好地衡量谁是“真正的”程序员……那你就得重新评估一下你的假设了。


图片描述

一些背景信息

我编程已经二十五年了。我从来不敢说——哪怕是一秒钟——我已经完全搞懂了。我也不是“编程万能”的专家。但我对自己在短时间内写出大量高质量代码的能力非常有信心。

所以,也许你会认为我写测试代码没问题?也许你会认为我能快速敏捷地完成这些测试?但如果你这么想……那你就错了。

每当我被要求参加编程测试时——几乎任何类型的测试——结果总是出乎意料。有时候……我能拿到A。其他时候……我会惨败。

现在,你可能会认为这是因为,尽管我有几十年的经验,但我仍然不是一个“真正的”程序员。但我对这个问题的看法却大不相同。几乎每次我“未通过”编程测试时,我都会觉得,这个测试实际上根本无法衡量我的真实技能。如果你在这个职业领域工作了很短的时间,我想你可能也会有同样的感受。


图片描述

设置

首先我要承认,正如我在之前的许多文章中强调的那样,我很少参加编码测试。我编写并维护了几十个 NPM 包。我在 GitHub 上拥有非常出色的影响力。我维护着多个在线网站,代码都公开。我还有一个很棒的简历网站(它本身就是一个功能齐全的 React 应用)。我在这个网站上撰写了 100 多篇关于软件工程的文章。尽管这么说可能听起来比我之前更加傲慢,但事实是,我的网络影响力非常强大,足以展示我的编码技能。

而且,我手头上通常都有一份非常好的工作。所以,当有招聘人员打电话给我,说他们有个很棒的机会让我考虑,而我“只需要”完成这个小小的编程测试就可以被考虑时,我通常会回答他们:“嗯……不用了,谢谢。”

但偶尔,我也会发现自己“在工作之余”会遇到麻烦。而当别人想让我帮他们完成一些编程工作时,我很难拒绝。就这样,我又一次面临了 Codility 编程测试。


图片描述

测试

测试的时间限制是2小时10分钟,需要完成3个挑战。这时间分配似乎有点奇怪,不过也无所谓了。我当然不会抱怨时间太长,因为我见过太多这类测试,你只有15分钟(甚至更少!)的时间来快速完成有时可能很棘手的编程题。所以2小时10分钟似乎更合理。

我的第一个任务是编写一个 SQL 查询。任务本身非常简单。但是,看到我的查询在他们那糟糕的在线门户网站上每次迭代都要耗费如此长的时间,我感到非常恼火。

这听起来可能有点不公平。毕竟,你很难指望在线工具能像原生客户端一样快。而且说实话,我记得很多年前第一次参加 Codility 测试的时候,他们的门户网站看起来并不比我遇到的任何其他在线编码环境慢。

但现在已经是2023年了。现在我可以打开像CodeSandbox这样的工具,看着我的解决方案编译运行得飞快——就在浏览器中——以至于我偶尔会觉得有点分心。然而,Codility似乎还在使用十年前那个又慢又慢的平台。这真是太荒谬了,因为这些差异会影响人们的测试表现

当然,你不必直接在 Codility 窗口中完成所有工作。不过我已经很久没在本地系统上运行 SQL 了。所以,我不可能直接打开本地查询编辑器,运行类似的查询。

不管怎样,我大约在 8 分钟内完成了 SQL 练习。当然,如果我不用他们那套蹩脚的工具集,这比我实际需要的时间多了 6 分钟。不过,我还有充足的时间完成剩下的两个任务,而且压力也不大。

我继续进行第二项任务,大约用了20分钟完成。这是一项JavaScript编程挑战,我需要编写一个函数(blah, blah, blah),它接受(blah, blah, blah)并返回(blah, blah, blah)。指令的措辞虽然算不上理想,但也不算糟糕,我几乎立刻就知道要编写什么代码。第二项任务大约用了20分钟完成,剩下的时间将近1.75小时。

然后我继续进行最后一项任务……


图片描述

令人羞耻的愚钝措辞

以下是上一个任务的说明:



There are M children, ordered from 0 to M-1, involved in a game.  
The N-th child is assigned a letter: L[N].  At the 
start the 0th child gives a note, consisting of one 
letter L[0], to the B[0]-th child.  When the N-th 
child gets the note, they add their letter L[N] 
to the note and pass it to B[N].  The game is over when 
the 0th child gets the note.  Find the final note.

Write a function:

function getNote(L, B);

that accepts String L and an array of integers B, both of 
equal length, and returns a string with the final note
given to the 0th child.

Examples:

1. Given L = "cdeo" and B = [3, 2, 0, 1], the function 
returns "code".  The 0th child gives a note "c" to the 
3rd child.  Next, the 3rd child gives the note "co" to 
the 1st child.  The 1st child gives the note "cod" to 
the 2nd child.  After adding the letter 'e' to it, 
the 2nd child gives it to the 0th child.  The final 
note, given to the 0th child, is "code".

2. Given L = "cdeenetpi" and B = [5, 2, 0, 1, 6, 4, 8, 3, 7], 
the function returns "centipede".

3. Given L = "bytdag" and B = [4, 3, 0, 1, 2, 5], the
function returns "bat".  NOTE: not all letters 
from L must be used.

M is an integer from [1... 1,000];
String L consists only of lowercase letters (a-z);
B is all integers within range [0... M-1];
L and B are both of length M.


Enter fullscreen mode Exit fullscreen mode

首先,开头那段文字混乱得令人尴尬,而且毫无必要。说实话,Codility总是A[0]-th person这样。我敢肯定,他们的技术写手都是些沮丧的、不及格的物理专业学生。我相信他们自以为用了这些……K-th之类的术语就非常精确了N-1。但实际上,他们只是在制造混乱,让人摸不着头脑。

我从事专业编程工作已经25年了,从来没有写过这种垃圾任务说明书。这可不是在考验你写好代码的能力,也不是在考验你理解复杂需求的能力。而是在考验你能否解读他们自以为是的“聪明谜语”。

至少对我来说,我实际上很难从这些说明中找出如何确定“第 K 个人”。我反复阅读了说明和示例,但就是搞不懂。(我们甚至在讨论“第 K 个人”,这足以说明我们面对的规格非常糟糕。)是的,我可以看看示例,看看应该这些数组中得到什么,但从说明中仍然无法清楚地看出我该如何得出那个神奇的“第 K 个人”。


图片描述

(不可避免的)反对意见

在这个网站上写了一百多篇文章之后,我发现总会有那么一小群技术控会对我写的几乎任何东西都嗤之以鼻。就算我写“Bug 很糟糕”,评论区里也会有人不屑一顾地说“如果你是个优秀的开发人员,你就不会介意 Bug 了”。所以,我猜想上面这些评论可能会引发一些反对意见:

理解这些说明没有任何问题。

真棒!你拿到一块饼干了。我的意思不是说这些说明对每个人来说都完全无法理解。我相信有些人读了这些说明后会立刻明白他们在做什么。我的意思是,这些说明的措辞过于晦涩难懂。

我以前做过很多 Codility 的挑战,它们几乎都是用这种风格写的。有时候,我一看说明就立刻“明白了”。它就像……在我的脑子里闪过一个念头。然后我就能迅速地开始编写解决方案的代码了。

问题在于,我理解指令的能力几乎……随机。有时候指令我一下子就能理解。而有时候,我发现自己一遍又一遍地读指令,脑子里却在想:“嗯……什么??? ” 如果你的指令无法让绝大多数程序员快速理解,那么你的指令就很烂。

你只是因为考试不及格而感到难过。

嗯……没有。我的评估满分。我搞明白了。但弄清楚我到底应该写什么代码,却复杂得有些不必要。

有时需求复杂,编码人员必须能够处理复杂的需求。

在二十五年的代码编写生涯中,我开发出了一些极其复杂的解决方案。有时,这些需求确实很复杂,甚至令人困惑。但复杂性清晰度之间有着巨大的差异。复杂并不意味着它无法用清晰的方式描述。如果你交给我的需求极其难以理解,那不是“我的问题”,而是“你的问题”。

当然,在现实生活中,如果我接到一些我不完全理解的要求,我绝对会去找提出这些要求的人/团队,并询问(不,应该说是要求)他们澄清。在我确定自己完全理解了要求之前,我不会开始着手编写代码解决方案。但是,当你进行自动化在线编码评估时,你没有能力去澄清这些要求。

复杂的解决方案可能需要复杂的指令。

再次强调,解决方案复杂并不意味着说明一定令人困惑。如果你无法清晰地描述你试图解决的问题,那么你应该修改说明,直到它们清晰为止。

此外,上面的任务本身并不“复杂”。它之所以让人感觉复杂,只是因为指令写得有点让人困惑。解决方案只有……行代码。不,我说的可不是那种涉及正则表达式、嵌套reducer和晦涩难懂的JavaScript语句的七行代码。我说的是极其简单的七行代码。对于这么简单的“问题”,指令没必要写得那么复杂。

Codility 必须为大众提供具有最小歧义性的挑战 - 因此他们使用过于精确的数学语言。

抱歉,这完全是胡扯。我理解他们想消除指令中的歧义。但你不用像……这样的措辞也能做到这一点。通过增加困惑来消除歧义,完全违背了评估一个人编程the A[0]-th person技能的初衷

如果我们试图消除歧义,还应该考虑另一个方面:有多少程序员不是以英语为母语的?如果像我这样在美国出生的英语母语人士都无法理解这些指令,那么如果你的母语是印地语、葡萄牙语、普通话或英语以外的任何语言,你会有什么感觉?

如果你在开发公司有过一些经验,你就会知道非英语母语人士非常普遍。你也知道,这些非英语母语人士中有很多是顶尖的程序员。那么,你为什么要把对他们技能的评估,与他们能否理解用晦涩难懂的数学术语编写的英语指令挂钩呢?


图片描述
说实话?Codility 根本算不上最差的在线编程测试提供商。如果你读过我之前关于编程测试的吐槽,你就会知道,我几乎把所有测试都当笑话看。但这并不意味着 Codility 没有认真投入。

当你给某人进行粗略的编码测试时——这种测试只是为了确定这个人是不是一个“真正的”程序员——你不应该依赖任何会混淆核心问题的冗长废话。Codility 可以做得更好。但我真的不认为他们真的在乎。

鏂囩珷鏉ユ簮锛�https://dev.to/bytebodger/codility-sadness-4of0
PREV
开发不是建筑,而是医学。
NEXT
2024 年数据库工具🛢️🔧:年度回顾🗓️