只十分钟,唾手可得的工作机会就被我搞砸了!

来自:CSDN 2020-01-12

" 事已至此,我已无法回头了 ...... 这样糟糕的表现可能会对面试结果造成很大的负面影响,尤其是如果你还让这种表现影响到后续的面试过程的话。"

作者 | 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 博文精选

中国程序员在美遭抢劫电脑遇害,数百人悼念

2019,不可错过的 NLP" 高光时刻 "

详解 CPU 几个重点基础知识

在以太坊上开发 Dapp 的瓶颈和门槛有哪些?| 博文精选

你点的每个 " 在看 ",我都认真当成了喜欢

此内容来源于互联网 查看原文