我们将继续谈论技术面试(如果您还没有读过,请阅读该系列的前几篇文章-
有关人力资源和
技术 面试的信息 )。 这次将有更多的主观经验,最少的技巧以及关于测试任务和理论问题的知识。 走吧
免责声明:作者不是Turbo开发人员,而是无投诉的常规猕猴。 因此,上述任务和解决方案可能会引起您微笑,对接和渴望,并希望向作者表明自己的无能。 我期待在评论中见到您! :)讨论完成的测试项目
在
最后一部分中,我描述了如何完成两个测试任务:第一个是在DevOps Engineer上,第二个是在Ruby Developer上。 我告诉你接下来发生了什么。
Ruby Developer的面试-面试官甚至没有看我的考生,没有问他任何问题,也没有夸奖(我比以前的所有候选人都更出色地完成了任务,至少招募者称赞我)。 看来他甚至都不了解他。 这让我有些不高兴,因为后来他们开始问我这个理论,结果他们拒绝了这个理论。
DevOps工程师的面试-面试官看了看作业,称赞了一下(说我已经定性完成了),并提出了一些解决方案上的控制问题:为什么这行在这里? 如果以此替换条件,则需要在哪个文件中执行此操作? 为什么在这里使用这种方法? 等等。 正如招聘人员告诉我的那样,有些应聘者不是独自完成任务,也无法回答此类问题。 因此,在这里我没有出现问题。
在第一种情况下,我没有询问受访者是否完全看过我的测试任务以及他对此有何看法。 但这是必要的! 如果您遇到这种情况,请务必将此事告诉您的受访者。
面试任务
我们继续上一部分的测试任务主题,并在面试时考虑编码任务。
任务可以有几种类型:实现算法,用伪代码编写解决方案,重构某些内容等等。 我们的工程师最喜欢算法问题。
包括我自己在内的许多人都认为,这些任务仅显示应聘者解决此类问题的能力,而根本没有显示出他将如何应对实际的工作任务,通常这是较高级别的任务。 他们为什么还给他们? 我认为原因很简单:面试官根本无法提出更好的建议。 而且,由于我们无法提供更好的解决方案,因此让我们进行良好的旧行倒置,排序,平衡树等操作。
作为用于解决方案的工具,代码编辑器+ repl +协作的可能性是最合适的。 在市场上的所有选项中,我
最喜欢
CoderPad 。 在您和访问员之间建立了一个房间,您可以编辑,一起执行代码并查看执行结果。 很舒服 如果没有足够的资金购买键盘,则
repl.it会进入战斗,并且屏幕共享基本上是相同的,只是没有协作的可能性。
更新:在翻译本文时, 代表添加了“多人游戏模式”,该模式允许无限数量的参与者同时使用代码。 完全免费! 不再需要CoderPad,加油!我曾就Java Developer的职位接受过公司的采访。 该公司从事CRM之类的工作,并编写了大量集成。 我联系了Zoom技术专家,他说:“让我们从算法问题开始。” 我回答:“好的,我会完成任务,但是我有一个问题:您在工作中需要这些知识吗,是否需要解决类似的问题?” 我得到一个惊人的答案:“我们编写休息端点并来回驱动json-chiki,但是谈论它并不有趣 ,所以让我们解决问题。” 也就是说,面试官本人承认自己的无能。 我不知道是谁,但是从那一刻起,我意识到我将一无所获。 但是,出于体育兴趣,对话继续进行。
我们打开了编码板,然后继续执行任务,我口头表达了这一条件:“查找给定字符串中最长的唯一字符序列。” 此后,面试官说:“一个人可以给动态编程任务,但我们将自己局限于一个更简单的选择。” 我想认真地看看在面试中负责动态编程任务的人。
我向面试官重复了任务的条件,以确保我正确理解了该任务,并得到了肯定的答复并开始工作。 5分钟后,事实证明我完全不正确地理解了问题,因为有必要找到一个子串而不是它的长度(这很容易)。 但是,我回答:“好吧,自从他们开始以来,让我们用一个星号而不是一个简单的星号来解决问题。” 面试官有点困惑,因为他已经根据自己的情况专门准备了测试,但是我已经决定不给后继者,而是尝试按原样进行。 我问我有多少时间(大约40分钟)并开始编码。 我注意到,尽管我知道他们会做作业,但我并没有特别准备。
因此,我立即编写了测试,并开始使用i,j和k索引进行萨满化:)循环在循环中,依此类推。 15-20分钟后,我有一个半途而废的解决方案,但面试官给出的边界案例并未解决。 又过了20分钟,他们终于完成了任务。 面试官似乎很满意,然后开始向我询问数据结构。 事实证明,要解决他最初想要解决的问题,可以使用哈希或类似的方法,而他希望有这样的解决方案,但我把这弄糟了。
然后,我们讨论了有关该项目的一些信息(表格和桩)。 然后他说:“之后,将接受有关系统设计的采访。 总的来说,我看不出有什么执行的理由,因为我们在这里不需要这样做,并且我们不需要这样的知识,但是订单就是订单,所以下一步就是这个。” 好了,您了解了-进行了两次(!)面试以了解应聘者是否可以做该公司日常工作中不需要的事情。 然后,我允许我自己谈论这种采访的无意义。 面试官同意我的意见,但再次包括了授权代表团,并说:“我没有决定应该采取什么程序,所以我们要做我们要做的事情。” 我还要补充一点,我确实经历了第二次面试(关于系统设计),并且和第一次面试一样没有意义。
面试官犯了一个多么大的错误-他没有在案文中修正任务的条件。 当我进行这样的面试时,我只是将任务的条件复制到了代码编辑器中,这样候选人就不会有任何问题。
我犯了什么错误-我立即着急编写代码,没有指定我是否正确理解了条件的三遍。 如果在面试时会给您这样的任务,请
立即与聊天断开连接,并找到一个更有趣的课程;检查几次是否正确理解状况,在编辑器中编写测试,并从面试官那里确认一切正确。
我还接受了Ruby Developer的职位面试 。 在遇到问题并提出默认问题后,我被赋予了编写each_slice方法的任务。 对于那些不知道的人来说,这就是这样的事情:它击中给定大小的子数组,然后为每个子数组执行我们传递给方法的块,或者在这些子数组上返回迭代器。 我坐下来写书,然后打开管书。 问题是,在Ruby上,相当长一段时间以来,我仅成功地从事网络Macing操作,并且作为参考白名单,我不了解某些基本语言构造。 即-我不知道for循环中的索引是不可变的(例如,不同于Java)。
我或多或少地很快编写了该方法,但是它没有用,我也不明白为什么。 我开始有些恐慌,删除了所有内容,然后再次编写,但是我的代码再次无法正常工作。
我想着,对对话者说:“没成功,伙计们,你知道,我擅长网络托管和做项目,但是我没有成功完成你的愚蠢任务。 我知道这是一项简单的任务,而拥有10年经验的人只是必须迅速做到。 因此,让我不再耽误您了,我们将驱散您。” 伙计们同意了,分开了。
我遭到严重轰炸,因为我不习惯于如此轻易地失去。 为了以某种方式获得生存优势,我写信给招聘人员,说我已经分解了一项与实际工作无关的任务。 然后他冷静下来,坐下来,快速测试索引如何循环工作。 我意识到自己犯了一个小错误,重新索引并得到了现成的解决方案。 实际上,我的错误在同一行。 我告诉了HR,并建议她将链接传递给解决方案的人(如果他们有兴趣的话),因为我仍然可以解决问题。 但是她回答:“您没有走得更远,因为您没有解决问题, 再见 。” 我仍然对中断的面试流程了解一些,以某种方式证明自己是正当的,我们分开了。
之后,我重新考虑了对此类任务的态度。 通常,在受监管的情况下编写代码对我来说从来都不是问题,但是在这里起作用的几个因素是:我申请一个认真的职位,对语言的基本结构缺乏理解(尽管我从来不需要它们,如果我愿意的话,我可以用Google搜索解决方案在5秒内)和观察者的效果。 当然,我读到很多人在看问题时都无法解决问题,但是在我看来,这一直是我自身的不安全感和无能的借口,直到我自己遇到每个残酷的家伙。
我还接受了Java Developer职位的采访。 这次是以稍微不同的格式举行的。 Zoom与我们联系后,面试官说:“告诉我您的电子邮件,我将向您发送任务,阅读该任务,并告诉我一切是否清楚。 您将有两个小时,我将处于静音状态,并且我不会看您在那里所做的事情(我们不会在屏幕上播放)。 两个小时后,我们取得联系,翻动屏幕,看看您在这里做了什么。 您可以使用任何东西。” 我阅读了任务的条件,与面试官再次交谈,关闭了视频(因为流的编码占用了CPU)并感到困惑。 打开IDE并开始。
该任务与I / O有关-必须创建一个API来将数据写入磁盘上的文件,以便所有内容都是线程安全和快速的,并且还编写了可以对此进行检查的单元测试(包括线程安全性)。 我已经很长时间没有使用并发和I / O了,所以我不得不快速浏览码头,并记住发生了什么。 我在额头上写了一个解决方案,检查它是否是线程安全的,依此类推。 一切都花了我一个半小时。 我对面试官打了个电话,说我已经准备好了,但是只有一点点需要抛光,我们看看吗? 他回答道:“让我们再坐半个小时,完成所有您尚未完成的事情。” 好的,我坐下来,想起所有的小事情和粗糙之处,完成了javadki,再一次阅读了有关I / O的所有知识,并思考了解决方案的缺点。
半个小时后,我们取得了联系,我共享了屏幕,显示了代码,运行了测试等等。 在接下来的半小时内,我们严格地讨论了解决问题以及在更改某些条件时进行修改的可能选择。 我想提请注意这样一个事实,在以前的采访中(以及在随后的采访中)也没有人为按任务进行对话奠定基础,它总是只是某种抽象的片断,输出为0/1,我们继续下一个问题。 此处的任务非常简单,因此可以在几个小时内完成,但同时又足够详尽,可以添加条件并与应聘者讨论如何最终决定。
我真的很喜欢这次采访。 我能够证明,嘶嘶声不仅可以解决,而且还可以了解体系结构中的某些知识。 面试官确信他不是在六月坐,而是一名专家,他在工作中拍摄某些东西。 这是我有史以来最好的技术面试。 我想您已经猜到了面试官不是我们的面试官:)我还要补充一点,我成功通过了面试官,然后又经过了两个阶段,最终获得了录用通知。 但这是另一个故事。
这个任务有什么好处?
- 接近实际工作,以及他们在该公司所做的工作。
- 时间限制。
- 缺乏观察力。
- 可以使用任何内容而不进行内存检查的功能。
- 为进一步的对话打下基础。
- 测试候选人的编码技能,使用IDE并进行一般思考。
不幸的是,在所有的采访中,我只有三个这样的任务,因此选择很小。 也许还有一些比较棘手的测试/任务,但我没有得到。
面试任务的典型缺点
- 该任务与实际工作无关。 最让我烦恼。 尽管实际上堆在铆接,但允许使用算法来求解。 让我们来完成相关的任务,我会为您做个粗略的! 为什么需要一个知道如何在字符串中搜索子字符串的人?
- 组织上的-通常没有解决问题的常规工具。 一旦他们向我展示了google文档中的代码,一旦我在repl.it中弄乱了屏幕,就曾经是CoderPad。
- 该任务不会为进一步的对话创建上下文-这是第一段的结果。 如果以后不讨论,为什么要给出任务?
- 并非所有人都能在监督下完成任务。 因此,在这个阶段可以消除好的候选者。
理论问题
这是我最喜欢的部分。 每个人都喜欢问理论,让我们再谈一点。
由于某种原因,碰巧发生了,在Ruby工程师的职位上,我最被问到了这一理论。 我知道她最糟糕的事情,所以我不断地接受采访,看起来像一个六月,直到我意识到不再适合这样下去了。 我坐下来读了一本有关该语言的教科书,这使我的语言说得好多了,而没有抱怨“伙计们,你为什么要问我这个? 我是一名优秀的开发人员,有什么区别,方法搜索对象的顺序是什么? 谁需要这个?”
我作为Ruby Developer进行的第一次面试正是要完成测试任务的地方,但是事实证明,没有人对此感兴趣。 本来应该与我交流的蒂姆利德(Timlid)没有来(他被塞在交通拥堵之类的东西中),所以他们又给了我一个。 见面后,他说:“我有一条规矩-我用英语进行所有面试,所以我们改用英语。” 然后,我的耳朵扭成石墨烯纳米管,因为面试官的口音很浓。 这让我有些不安(我很难用英语与我的同胞交流)。
接下来出现的问题是:什么是模块,什么是块,什么是产量,我开始归档。 我没有像在教科书中那样定义,而是began不休:“嗯,我不知道确切的定义,但是可能就是这样,我是这样使用的。” 面试官很不高兴,我开始感到,然后以为每个人都来了。
然后是有关特定方法的问题,即:“过滤集合中所有nil的方法的名称是什么?” 然后,我打开了巨魔,然后回答:“如果您检查一下这些方法的知识,那么我将无法告诉您最近没有使用过的信息。 我用多种语言和平台编写,并且不记得所有的SDK方法。” 这使面试官不满意,接下来的问题是:“什么是可数的? 那里有什么方法,谁来扩展它。” 我对自己想,“叔叔,你不明白吗?”但大声说:“我不确定,我认为有些方法可以使用map / reduce / slice等方法。” 这也不适合他。
然后他问我一个关于在MVC中放置逻辑的标准问题。 我在模型中回答过,如果不适合模型,则在其他一些类中回答。 事实证明,所谓的服务对象是正确的答案(这个垃圾也到这里了吗?)。 我喃喃地回应一些事情,例如,可以这样称呼,但我不喜欢它。
然后他问了有关SQL的默认问题,我已经可以正确回答它,然后问了我没有使用的RSpec,仅此而已。 在Rails(他们只有Rails)上,我没有收到任何问题。 另外,我还没有收到关于我以前的经历的任何问题。
在那之后,他问我对日常站立的看法。 然后我决定不给出社会期望的答案(谷仓被烧毁–烧毁和小屋!),然后立即说这是浪费时间,并且在经理无法确保透明性和易于报告进度的团队中进行。 他补充说,Scrum是植物油中的垃圾,没有人通常会根据该scrum工作,但每个人都假装。 显然,我仍然抓住了缺点。
此外,他建议向他提出问题(显然出于礼貌),而我本人则询问过程,体系结构等问题。 我听到的是我不喜欢的,因为他们在完成典型任务时进行了大量的骑行。 我想向那个家伙说清楚,我不仅是一名开发人员,还可以做更多的事情,但是一切都徒劳无功,不久他说他必须参加集会并启航。
第二天,一名招聘人员写信给我,并告知我拒绝的情况。 “感谢上帝,”我想,但还是有点焦躁。 我不知道面试官从一开始就有一些偏见。 顺便说一句,这是同一家办公室,从第一次接触到进行技术面试都花了一个月的时间。
因此,他们拒绝了我,因为我不了解该语言(Ruby)的基础知识。 好吧,让我们继续前进。
Ruby Debeloper的另一次采访,已经有两名采访者 。 至少要用俄语说第二种是很好的,用乌克兰语讲,这样我就不必动脑子了。 令我惊讶的是,同一故事开始了:什么是模块,什么是模块。 我还没有读过教科书,所以我再次游遍了答案。 进一步询问了Rails中的关联类型。 «- -», — , . ( ), , : « ». , — each_slice. , , . : « , - Rack middleware?». , . , , ( Java Servlets, middleware - Laravel/Express), . , .
, , . . , , rack middleware, , .
. — . , , , , …
Ruby Developer. , . , , . Proc, , :) : « , , , - ». 100% , - , . .
: « require». Rails Grape, , , . « , ». , . - -, « , ?». ActiveRecord — , .
concurrency ( ). , concurrency Ruby — . , , . , MRI — JVM , volatile synchronized , . , , ( !) concurrency . ? ?
, - SOLID. , « — », . , . , . - , . , « ». .
? . , , , . , ! ( ). , , Cracking Ruby Interview, . , - «» , , , :)
.
Fullstack Java Developer. — . , . , , Java.
, , , - . , , , , . , , .
. . , , , undefined null, var. JS WAT-. : «, WAT . , , , ». , -. «JavaScript: The Good Parts», .
, , . (?) , ( , ) , . . , :)
- , , . jQuery, . :)
DevOps Engineer , . : « ?». - :) , , — . , . , , , . . ( )?
( MVC). (-) 5-10 . ( GoF) . . Ruby-, , — , , ( MVC ActiveRecord ). Java- .
SOLID , , : Ruby-, — Java. DRY :)
?
- , .
- , .
- , .
- , .
, , :
- / . , . : « -AOP AspectJ Spring?» :) , , .
- LeetCode , .
, , . , , « » , .
( , ),
, !