如何在10分钟内丢掉工作
白板编程面试可能会让你丢掉工作
最近,我差点就被五大会计师事务所之一录用了。我顺利通过了筛选流程和家庭作业,但却没能通过最后阶段的一对一或二对一面试:
- 白板编码面试:算法。
- 技术面试:JavaScript、CS、React。
- 文化契合:就是这样。
- 第二次白板面试
出了问题
有几个错误导致了这次暂时的失败。
我可能通过了技术测试和文化适应(我们假设是这样),但我承认我在白板编码面试中表现很差。
回想那一天,我无法期待任何不同的结果。
事实是:我还没有准备好进行白板面试。
白板面试
从某种程度上来说,白板面试是对知识深度的技术测试和社交练习的混合体
(来源)
我们都知道它是什么,对吧?它和代码没太大关系,而是和你的解决问题的能力有关,等等等等……
我是一名前端开发人员,我通常不会在编码时实现类似面试的算法或表达我的思维过程,我大部分时间都在制作交互式 UI。
这些测试到底能说明多少有关候选人的信息?
甚至有人说:
在实际生活中,你很少会在编程过程中凭记忆即兴地想出一个算法。你几乎总是会使用现有的库,这些库有自己的测试套件,并且经过了其他开发人员的严格审查。
你真正需要能够回忆起算法的唯一世界是世界末日之后,所有连接到互联网的计算机的硬盘都被烧毁,所有基础学术论文和计算机科学教科书的副本都化为灰烬。
我的观点倾向于与上述作者的观点一致,尽管我喜欢相信这种技能(擅长白板面试)是关于拥有一套非常好的其他技能,软技能和硬技能。
首先是减轻处罚情节
我列出这个清单是因为你可能对其中一些有共鸣,但最重要的是我还是需要发泄一下😄
- 我没有用我的母语去面试。在压力和压力之下,用英语交流突然变得困难起来。
- 我是一名自学成才的前端开发人员。我缺乏学术方面的准备。
- 我职业生涯中参加过的面试并不多,而且很少有像白板面试那样的测试。
- 我很少公开演讲。很遗憾,目前确实不多。
您可能会反对说,这些实际上都不是减轻处罚的情节,您是对的。
根据定义,减轻处罚的情况是我们无法控制的:事实是,我可以提高我的英语水平,做更多的计算机科学,做更多的采访,做更多的公开演讲。
我将尝试按照那天应该做的方式解决第一个白板测试,并尝试在这里报告该过程。
测试
;['Tokyo', 'London', 'Rome', 'Donlon', 'Kyoto', 'Paris'][
// YOUR ALGORITHM
(['Tokyo', 'Kyoto'], ['London', 'Donlon'], ['Rome'], ['Paris'])
]
就是这样。如果你旋转每个城市的字母,你可能会匹配到其他城市,也可能不会。如果匹配到了,就把它们单独放在一个数组里。
工作中你每天都要躲避成千上万行代码的迷宫,向这些人展示如何解决这个简单甚至有点滑稽的问题有多难?等等我。
是的…
让我们假设事情进展稍有不同。
完美的白板面试
段落标题很吸引人,虽然错了。这正是我解决这个测试的方法,既能写代码,又能表达思路。谁知道还有多少其他方法呢!
我:非常感谢。我很乐意帮你解决这个问题(微微鞠躬)
我:第一个问题,字母只是“旋转”还是可以随机混合?
拉里(为了保护面试官的隐私,我把他们的名字改得更醒目一些):轮换一下就行了。第一个字母放在最后,等等。
我:对。
拉里:对。
我:对了!我猜首先我需要一个方法,把每个城市的字母轮换一下。Tokyo 会变成 okyoT,然后是 kyoTo,哦,太棒了!现在我们得到了 kyoto!好的,我需要一个函数来实现这个功能。
我:我还需要一种方法来循环遍历输入的城市,对字母进行“旋转”,进行匹配,最后将它们分组。我发现输入和输出都是数组,并且它们包含相同的值,唯一的区别在于两个数组的深度:一个是平面数组,另一个是数组的数组。
还是我:我现在要写点伪代码来验证一下我的想法。之后我也会测试一下,因为我太厉害了。😏
function groupCitiesByRotatedNames(cities) {
// use a variable to contain the output.
let output = []
// loop through each of the cities
// rotate the name in any possible combination
// check if the output contains a city that matches a combination
// add that city to the array containing the match
// otherwise add the city to the output as a new array
return output
}
我,像摇滚明星一样自信:让我们对我的伪代码进行伪测试(😛)。
const input = ['Tokyo', 'London', 'Rome', 'Donlon', 'Kyoto', 'Paris']
console.log(groupCitiesByRotatedNames(input))
// That's how it would build up. The final output would be the last array:
// [
// ["Tokyo"]
// ]
// [
// ['Tokyo'],
// ['London']
// ]
// [
// ['Tokyo'],
// ['London'],
// ['Rome']
// ]
// [
// ['Tokyo'],
// ['London', 'Donlon'],
// ['Rome']
// ]
// [
// ['Tokyo','Kyoto'],
// ['London', 'Donlon'],
// ['Rome']
// ]
// [
// ['Tokyo','Kyoto'],
// ['London', 'Donlon'],
// ['Rome'],
// ['Paris']
// ]
让我们开始实现这个算法。
首先,我们需要实现对城市名称字母进行旋转的功能。我将创建一个实用函数:
我:让我们把这个函数改得更流畅一些(可读性也差一点)。过度自信到了极点。
我:对!我喜欢 reduce 方法,我还会再用它!(它也很函数式编程,所以在面试中用起来很酷😎)
该
reduce()
方法对累加器和
数组中的每个元素(从左到右)应用一个函数,以将其减少为单个值
(MDN)。
我们的唯一价值就是期望的输出。
让我们总结一下这个算法的作用:
我们检查城市数组中的每个城市,旋转其名称,并将
每个组合与累加器值进行匹配。如果找到匹配项,就将新的城市添加到包含匹配项的数组中(使用Array.splice),否则,就直接推送一个包含新城市的新数组。
瞧:
现在大家一起!
真正的白板面试
我从解决方案开始。我说,好的,我需要一个 reduce 方法。我立即走到黑板前,开始编写实际代码,但其实我根本不知道具体方案。我其实对解决方案有个想法,跟上一章写的差不多,但我没有清晰地表达出来,也没有向可怜的面试官们解释得前后一致。所以我迷失在代码中,思路好几次都打乱了,还在糟糕的伪代码和实际代码中犯了语法错误。到了这个时候,已经没有办法扭转局面了。这样的表现会对面试结果造成很大的损害,尤其是如果你让它影响到你接下来的面试流程的话。
我现在该怎么办
练习,练习,再练习。
拿一块白板,选择一个问题,大声地对着空气说出来并写下来,经常这样做。
练习白板面试,学习常规。你的常规,任何常规。就像吉他弹奏一首歌、玩纸牌魔术,或者用滑板表演任何危险特技一样,学习它。
你需要准备一次演讲,它就像一次演示。
这就像一个带有变量的演示文稿。
变量就是问题所在。
我会像这样:
- 我会花一些时间分析需求(1 分钟)
- 如果有必要,我会提出问题并得到答案(3 分钟)。
- 我会停下来思考要采取的方向(几分钟,不要害怕保持沉默一会儿)。
- 我将提出初步解决方案并获得面试官的反馈(5 分钟)。
- 我将再次暂停并选择一个解决方案(2 分钟)。
- 我将编写伪代码(5 分钟)
- 我将测试我的伪代码(5 分钟)
- 我将通过将伪代码转换为实际代码来完成。(除非有必要)
大约 30 分钟后,我将以一种愉快且协调的方式解决问题。
结论
感谢阅读
感谢Adam Mackintosh和Josh Comeau对此的校对 :)
你好,我叫 Albino Tonnina,我是一名前端工程师,目前在白板面试方面做得不好,在伦敦工作,你可以在Twitter、Github、Instagram或伦敦市周围找到我。
文章来源:https://dev.to/albinotonnina/how-to-lose-a-it-job-in-10-minutes-35pi