“事已至此,我已无法回头了......这样糟糕的表现可能会对面试结果造成很大的负面影响,尤其是如果你还让这种表现影响到后续的面试过程的话。”
作者 | Albino Tonnina
译者 | 王艳妮,责编 | 郭芮
出品 | CSDN(ID:CSDNnews)
以下为译文:
最近,我已经很接近要得到一个去五巨头之一工作的机会了。我顺利完成了筛选过程和一份带回家的测试,但最后一个阶段我搞砸了,在一个一对一,或者二对一的面试中:
白板面试:算法。
技术面试:JavaScript,CS,React。
文化契合
第二次白板面试:也许下一篇文章写 :P
出师不利
这次阶段性失误是由几方面的原因导致的。
技术测试和文化契合的两关我可能已经通过了(先这样假设吧),但是我承认在白板面试中表现不佳。
回头想想那天的表现,这个结果其实也是意料之中。
——事实是:我对白板面试还没有准备好。
白板面试
“在某些方面,白板面试是对知识深度的技术考察和对社交测试的综合体。”
我们都知道白板面试是什么,对吧?与代码关系不大,与你的解决问题能力有关。
我是前端开发人员,在编写代码时,通常在工作中我不会用到类似于面试中的那种算法,也不会把自己的思维过程表述出来,我大多数时候都使用算法来制作交互式UI。当我需要部署一段时间没使用的算法时,我得重新开始研究。
这些测试又能在多大程度上反映测试者的水平呢?
有人甚至说:
在现实生活中,你很少会在编程过程中全凭记忆就写出一个算法。你几乎总是会使用现有的库,该库有自己的测试组件,并且已经经受了其他开发人员的检验。
你实际上真正需要手写算法的情况只会发生在一个末日后世界,到那时候,连接到互联网上的所有计算机的硬盘都烧了,所有基础学术论文和计算机科学教科书都化为灰烬了。
即使我原意相信这样一种技能(擅长于白板面试)的重点在于拥有一系列难得的技能,但我个人的观点还是倾向于与上述作者中的一位相同。
先说说那些可从轻处置的情节
我之所以列出这份清单,是因为觉得大家可能都有过类似的感受,但首先,我是为了先发泄一下自己的情绪 (笑)。
面试时我用的不是自己的母语。大家目光都在你身上时,会觉得更困难一些。
我是一名自学成才的前端开发人员,学术方面底子薄。
在我的职业生涯中,没有过太多面试经历。而且其中很少有白板面试这种类型。
我不在公开场合演讲。不幸的是,目前为止,我这方面的经历还很少。
你可能会反对,说这些都不是真的可从轻处罚的情节,确实如此。
按照定义,可从轻处置的情节是我们无法控制的:可事实上我可以提高英语水平,做更多CS方面的事情,参加更多面试,更多地参与公开演讲。
我想重新尝试那天的第一个白板测试,我将在此向大家报告解题过程。
测试
['Tokyo', 'London', 'Rome', 'Donlon', 'Kyoto', 'Paris']
// YOUR ALGORITHM
[
[ 'Tokyo', 'Kyoto' ],
[ 'London', 'Donlon' ],
[ 'Rome' ],
[ 'Paris' ]
]
没了,题目就这么简短。
旋转每个城市的字母,则可能与另一个城市匹配,也可能不匹配。如果匹配,将它们两个单独排列到数组里。
在工作中,你成天都在逃避上千行代码的迷宫,向这些人展示如何解决这个简单甚至有点搞笑的问题能有多难?来来,啤酒瓶子先帮我拿着。
嗯…
让我们假设实际情况与此略微不同吧。
完美的白板面试
朗朗上口的段落标题,尽管有语法错误。我本可以完美解决此测试的,包括代码和对思想表达。但谁知道有多少种出差错的方式呢!
我:非常感谢。我很乐意为您解答这个问题。(微微鞠躬)
我:首先我有一个问题,字母是只能“旋转”还是可以随机混合?
拉里:(为保护面试官的隐私,我将他们的名字都改成了更高大上的别名):只能旋转,第一个换到最后一个,以此类推,一次旋转一个字母。
重要提示
有几位朋友在评论区提出了解决此问题的建议。首先,谢谢大家,有一天我将研究所有这些提议并用它们来做些事情。但是,获得最佳性能解决方案并不是本文的重点——还请注意我问面试官的最后一个问题。许多人在评论区提出自己的解决方案时会漏掉一个条件:字母一个一个依次旋转。仅对字母进行.split和.sort排序是不够的,如果这样做,tokyo和yookt之类的组合将匹配:但它们不应该匹配。东京仅与以下几种匹配:okyoT,kyoTo,yoTok,oToky。看到了吗?5个字母,5个可能的组合。请记住这个提示,好了我们继续。
我:好的。
拉里:嗯。
我:对啦!我觉得首先需要一种方法来旋转每个城市中的字母。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()对累加器中的内容和数组中的每个元素(从左到右)应用一个函数,以将其减小为单个值。
这个值就是我们期望的输出内容。
让我们回顾一下这个算法做的事情:
检查城市数组中的每个城市名,旋转字母,并将每个结果与累加器值比较。
如果找到匹配的,则将新的城市名添加到包含匹配项的数组中(使用Array.splice),否则我们将这个包含着新城市名的新数组加到队列末尾。
瞧吧:
现在把所有的放一起!
这个解决方案并不是最好的,但我那天只想到了这个。(复杂性是O(N^2),你可能想要找到一个复杂度O(n)的算法来解决)。
我经历的真实的白板面试
我是从解决方案开始思考的。我说,好的,我需要用到reduce方法。我马上走向白板开始写,但实际上我脑子里并没有一个整体计划。我的确有解决方案的想法,跟我在前几节中写的差不多,但我没能好好地把它表达出来,我并没有给可怜的面试官一个连贯的解释。因此,我在一堆拙劣的伪代码和真代码的混合物中迷失了方向,思路断了好几次,偶然还出现了语法错误。
事已至此,我已无法回头了。这样糟糕的表现可能会对面试结果造成很大的负面影响,尤其是如果你还让这种表现影响到后续的面试过程的话。
我现在该怎么办?
练习,练习,练习。
去弄个白板,找个面试题目,把自己的想法说出来并写出来代码,多多地重复这个过程。
去练习白板面试题,让自己习惯这个过程。你自己的例行程序(routine),任何的例行程序。像用吉他弹一首曲子一样去练习,像练卡牌技巧一样去练习,像练任何危险的滑板特技一样去练习。
你需要准备一段讲话,就像做presentation展示那样:白板面试就像是带着变量的presentation,变量就是问题。
我会这样去做:
我将花一些时间分析题目要求(1分钟)
如果必要的话,我会提出一些问题并得到答复(3分钟)。
我会停下来,思考一下要采取的方向(几分钟,保持一会儿沉默没关系的)。
我将提出初步的解决方案,并从面试官那里得到反馈(5分钟)。
我将再次停下来,然后选择一个解决方案(2分钟)。
我将写下伪代码(5分钟)
我将测试我的伪代码(5分钟)
最后,将伪代码转换为真代码。(要求多真就写到多真)
在大约30分钟内,我就能以一种轻松愉快而又协调的方式解决这个问题。
原文:https://medium.com/hackernoon/how-to-lose-an-it-job-in-10-minutes-3d63213c8370
作者:Albino Tonnina,ASOS高级工程师。
本文为 CSDN 翻译,转载请注明来源出处。
热 文 推 荐
☞小米MIX Alpha获得百万美金技术大奖;索尼或将推出无边框手机;Linus 不建议用 ZFS | 极客头条
☞Rust 入坑指南:鳞次栉比 | CSDN 博文精选
☞在以太坊上开发 Dapp 的瓶颈和门槛有哪些? | 博文精选
你点的每个“在看”,我都认真当成了喜欢