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


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

作者 | 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 的瓶颈和门槛有哪些? | 博文精选

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

发布了1648 篇原创文章 · 获赞 4万+ · 访问量 1368万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503

分享到微信朋友圈

×

扫一扫,手机浏览