我在伦敦的IB IT(Java开发人员,投资银行)的采访历史,以及典型任务的示例

碰巧的是,我想在仍在莫斯科的一所大学学习的同时成为一名程序员,但是我已经成为一名不在俄罗斯的人,而且不是立即-道路漫长而棘手。 我参加了许多访谈(起初我一直在寻找,然后他们已经在寻找我),我深入研究了这项工作的复杂性,并思考了如何成为一名优秀的程序员。


在我整个职业生涯中一直与之相关的方面之一是找到工作并进行面试。 我本人进行的采访很少(4-5次),但是我访问了很多(> 100次)。 在过去的约7年中,我有3-4个找工作的时间,一两个月,或者每天有1-2-3个。


在本文中,我想分享通过面试的经验,对面试的方式,发生的方式以及准备工作进行一些系统化。


我想在评论中知道什么-与其他国家(尤其是在莫斯科/俄罗斯)一样,可能与欧洲有所不同。


根据我的个人经验,与同事交谈,阅读论坛,书籍等。 我要说的是-这是我对整体情况的主观意见,该帖子声称是完整的信息,并且涵盖了(即使不是全部)大部分方面。 我的意见在哪里,我写我的意见。 否则,我假装是客观的。


我几乎所有的经验都是在欧洲金融公司采访过IT(主要在伦敦)担任Java(高级)开发人员的职位。 没有网络(以任何形式,前端/后端),没有集成,没有为客户服务(按类型-有CRM,并且公司在银行中实施),亚马逊,Facebook,谷歌也没有代表-我不知道如何我想我并不是真的在努力。 我的经验从一个简单的程序员开始,到一个高级开发人员结束。 团队/技术负责人/经理-不。


关于一般面试


采访过程是统计性的,即 -我们在有趣的地方提供服务,某些事情不会仅仅因为我们不走运,已经被录用,其他一些市场考虑因素或经验不足或仅仅找到一个更好的候选人而无法奏效。 即 如果这只是一个公司职位,则很难进行面试。 从这个意义上说,谷歌在我看来是有问题的-它是如此孤独。 有很多银行从事类似的事情,而不是一家,所以在另一家有一个有趣的项目,一天会成功等等。


面试是一种根据自己的规则进行的游戏,通常要遵循这些规则,了解这些规则有助于设定期望以及准备,通过的过程。 最后,它表明您能够遵守规则并接受规则,并能够考虑团队的风俗习惯。 没有人手动编写排序,甚至同步也不太可能必须编写,更不用说notify / notifyAll。 正如不太可能需要详细了解hashmap内部设备-但这是最流行的问题之一-70%的访谈不能没有它,只有equals和hashcode之间的契约才能解决这个问题。 另一方面,这表明候选人的一般准备,他完成工作任务的能力如何(而求职也是一种小项目)。


从行政问题


忘记等待答案。 没有答案-答案是否定的。
有时在我看来,这是他们的好口味规则-如果他们不感兴趣,他们不会回应。 这是招聘人员的一个例子-如果您回答他现在不需要工作,那就像a夫。 对于他们自己来说,当然不要残废,如果我们不需要残废,逻辑是应该浪费时间。 通常,招聘人员都是很棒的人,一旦我开始认为他们就像警笛一样-值得回答,仅此而已,您已经在面试中了。 明确说不或制定我所需要的能力是一项很好的技能。 我相信代理商,但永远不要信任。 我仅从“这是一个新项目,那里的一切都很好”类别中得出的事实和可以证明的事实-这就是空袭。 如果“他们准备将他们的薪水提高一万”,那么这已经是一件好事了:-)


一些有趣的信息-代理商(代理商)获得了成功候选人的很大一部分年薪(并超过了试用期)。 公司似乎有单独的代理商预算,即 如果您在没有代理人的情况下找到相同的工作,那么很可能您将无法指望获得更高的薪水。 我不太明白为什么会这样,也许在小型公司中则有所不同。


当然,代理商有一种感觉,有时他们是有用和有益的。 事实是,一些非常有趣的职位空缺仅通过代理商来找我。 但是,尽管人们普遍认为可以并且应该找到没有代理的工作,但事实恰恰相反。 尤其是如果您有兴趣在不太明确的领域工作-我们会选择该行业全球/国家/地区排名前20位的公司,并前往他们的站点。 因此,我在伦敦找到了第一份工作,对此我感到非常满意。


还值得一提的是,您需要为面试做准备,在比赛开始一个月后,比赛开始时的表格会有很大不同。 重复问题,简单,立即,快速地编写简单的任务。 他的经验,优势,计划和未来计划的故事从他的牙齿反弹。 在某个时候,我想随身携带一张海报,上面有我们系统的体系结构,这样可以更方便地告诉我我在做什么。


通常,无论何时何地,中级都不感兴趣,因此您必须超越平均水平,包括并且超越自己的能力,因为您需要尽力而为。
金融IT是一个庞大的官僚机构,我们必须能够存在于其中,是的,资源都花在了它上,一切都效率低下,但这是规则,有时甚至没有更好的选择。 在优点中-有有趣的,非常有趣的项目,官僚机构和业务分析师收不到很多非常好的钱。


我根本不会考虑面试的准备。 我们认为,这是一个完成的阶段,有必要的知识,并且有面试的邀请。


面试阶段


初步阶段是电话采访。


通常会与代理人联系-他们会从简历中询问您现在工作的实际基本信息,期望的薪水和当前薪水(这是一个单独的主题,我将在下面说明),签证状态以及上班的速度。 代理通常会告知公司和职位空缺(但是,仅提供一般信息),并询问对我来说是否有趣,以及我通常在寻找什么。 他们认真地询问动机,您为什么要寻找,换工作。


如果直接与公司代表进行对话,则第一次电话对话可以与人力资源部进行交流,也可以直接与通常由招聘经理(即,招聘经理)所雇用的团队的代表进行对话。 有人直言不讳,可以识别并筛选出合适的人选,值得花精力进行技术面试。


好处是您可以立即找到有关该项目的更多信息并拒绝,因为 意识到这很有趣,这没什么意思,反之亦然。


很少有情况(但是很稳定),在第一次面试时一切就已经开始了-你好,你好,让我们看一下Java,算法等。 按照计算机科学考试的精神,这些问题仅需40-50分钟。


关于金钱


很长时间以来,我一直在这个话题上禁忌-我不想知道我的同事能得到多少-这会激励我并降低我的自尊心。 然后,他改变了看法,将相反的观点-将工资隐藏在雇主的手中,因此,在同事之间,他们不介意交换数字,而只是在熟人之间-不。 对于伦敦-您可以查看玻璃门并乘以1.5。 出于某种原因,尽管这是最甜的部分,并且很重要,但它是可以实现的,因此薪资的最高部分没有在此处显示。 无论如何,伦敦银行的程序员的钱非常非常好,生活水平比莫斯科要高(这是我的主观意见,根据我对生活水平和需求的看法,城市本身也施加了限制,在莫斯科,我我想我什至不会考虑抵押贷款,在欧洲伦敦,每年2%是正常水平,首付20-25%已足够)。


据我了解,回到面试中,雇主希望见到一定数额的候选人。 我会说最好每隔一段时间回答一次,但是您需要合理地设置它,以便以后不再出现,一切都很好,但是我想要更多的钱。 一般来说,我会说,当前薪资的+ 10-15%是一种平均选择。 薪水也可能几乎翻倍,而且无论代理人怎么说,目前的位置也可能每年增加10%。 我将解释,一方面,代理人出售的价格越昂贵,他将获得的收益就越多,但是优先事项通常是卖给您,结果是多少,代理人的薪水差异的5-10%并没有那么大的差异代理会立即处理(这是一个假设)。


面试形式


组织问题


我对采访本身的组织方式,采访地点,办公室本身和会议室有一个有趣的观察。 日期,时间,地点的确认-仅在通过电话确认的时候很少,但是确实如此。 通常是一封信。 通常来自代理商的信息很少。 最令人愉悦的是一封格式合理的信件,上面写着姓名和职位,与谁开会和有趣的事情–指明会议室(这意味着他们可以提前计划,而不在面试前5分钟不找免费的会议室),代理商通常会向面试官发送linkedin-保存我时间,因为我一直在看我可能需要与之合作的个人资料。 如果有他的文章,我会阅读。
顺便说一句,如果已经宣布了几个人,通常会期望如果他们中最重要的人将其委托给某人,他们都不会来。 但是,恕我直言,当所有宣布来宾到来时,这很好。


然后一切都变得标准了,他来了,向接待处报告,为您服务或派人到会议室。 通常,员工会落后于您,并独自带领您。 电梯中和路上的时间也可以用于协商。


顺便说一句-一个公司如何像一组候选人,这也是一个指标。 面试是一个双向过程,作为公司,个人会采用这种方法,面试的程度如何,这也是公司/团队的一个特征。 当然,这是主观的,在我看来,这不是问一个级别的所有Collections接口的最佳选择,您知道/不知道,选择一个主题并进一步开发它,同一个最喜欢的hashMap更加有趣-与CHM有什么区别,我该怎么存储它内存中的Mapu,询问访问时间,在重新缓存期间会发生什么,并进一步发展有关如何将元素存储在冲突列表(列表,树,哪棵树等)中的主题


另外,如果面试不成功,他们会拒绝,并且看来您的表现不错-这也不是让您沮丧的原因,如果您不参加并且没有火花,那么最好不要开始。 从这个意义上说,我喜欢这样的想法,即如果解决不了,也许我不需要去那里。 我也喜欢这种方法(顺便说一下Google)-最好不要雇用一个好员工,而不要雇用一个坏员工。 对于应聘者来说,也是一样-最好不要进入一个好公司,而要倒入一个坏公司。


我对两件事感到好奇-面试开始的实际时间(我总是在开始前10分钟到达)以及墙上挂着什么画,会议室的设计-通常,这些是供银行客户使用的会议室,并在设计中投入了大量资金。


就是这样一个时刻-宣布接受4人2小时的采访,一个小时后,他们说谢谢。 很明显,您没有通过。 我不知道该如何与之相关,这不关乎–它冒犯了我,我正在准备,让他们听(或者至少让我接受面试)–一切都清楚,是的,艰难; 很有可能是失败的表现,如果继续,一切都会变得更好。 但是,这里的逻辑又是-最好不要雇用好员工,而不要雇用坏员工。


电话号码


正如我所描述的,最基本的是电话交谈。 可能存在技术问题,但是很困难或很复杂的问题显然很难提出。 快速排序的地方的实现细节不太可能被询问,如果是,则必须运行它们,因为恕我直言,这是不够的。


在线上


此外,最近的一个热门话题(这不是5年前或7年前更少)-在线编程,例如hackerrank或在线测试。


从清单中选择答案的测试很少见,而且我认为很少有测试能够充分反映候选人的准备情况,尽管我遇到了一个非常棒的12分钟,12个相当清晰的问题。 因此,我认为这是一个粗略的过滤器。


与访问者的在线编程如下所示-转到站点,登录,然后在您面前是一个在线IDE,您和访问者都可以看到。 他给您任务,然后您立即编写代码,运行它,等等。 当我只是一个Google Dock时,只有一次见面,其他所有东西都相当简单。


家庭作业


简单地描述任务的好坏测试任务,您需要发送解决方案-有时需要一段时间,有时仅需要1--2-3-4天。


根据任务的格式-功课通常是非常容易理解和有意义的。 从算法上讲,这是某种东西(例如在迷宫中寻找路径,或者是一种用于从价格流中计算平均值并存储最后一个的小型系统,在这里您需要设计一些类并以低延迟为重点编写所有内容),或者像我所说的那样我称呼为OOP,这是一个简单的主题区域,您只需要编写一个显示任务的程序即可。 例如,我们有一家医院,里面有病人,每位病人都得到一定的药物清单,根据某些规则的药物相互作用会产生不同的效果(如果您服用A和B,如果没有给予D病,则该病人会患X病。毒品,他会死)。 我们必须编写一个程序,根据给定的药物清单,给出将其应用于患者清单的结果(每个患者都有其自身的初始疾病)。 另一个示例是编写一个ATM(注意事务的原子性)。 另一个是写纸石头剪刀游戏。


进行一段时间的在线编程(另一侧无需人工干预)-通常,这是树遍历类别中的算法,可以处理数组-geelforgeeks上的所有内容,而且更复杂的任务并不罕见。 不幸的是,解决许多问题的方法取决于她是否曾遇到过,通常任务是复杂的,并且是在开源中完成的(制定的)。在我看来,这不是很好的选择,面试官不太可能要测试他们的Google技能。


与访问者进行在线编程也是一个有趣的观点,任务要简单得多,但是增加了IDE的压力和不熟悉,这里的主要内容不是保持沉默,理性和不着急立即编写解决方案。 思考和思考。 可以是一个任务的示例-给出一组值,给每个值一个概率。 有必要编写一个程序,以给定的概率产生这些值。 我认为这很复杂,但可行。
另一个例子-有一个长操作以一个参数作为输入,有许多线程调用并执行此操作。 编写一个可以优化调用的包装器(您需要进行缓存,重点是多线程处理,以便如果第二个线程调用具有相同值的操作并且该操作处于计算过程中,则无需再次运行计算,只需等待)。 众所周知,魔鬼存在于细节和极端情况下。


有关代理的更多信息-有时,代理似乎似乎知道他们会询问并可以以某种方式描述它。 这是一个灰色地带,一方面,很高兴知道采访是纯粹的技术性交流,还是仅仅是您期望的对话等。 没关系 但是说到具体的任务,我认为这不是很好,特别是对于公司而言,如果候选人立即用魔术般地写出解决问题的方法,但却无法解释,那看起来就很糟糕。 因此,我不希望使用这些技巧。


现场采访


  • 配对编程,与在线编程基本相同,只是采访者不在电话中,而在附近的椅子上。
  • 作业-给出任务,完成任务,一个小时的时间,编写-打电话。
  • 编码,纸/板上设计。

只是一次对话。


根据对话本身-50/50将会有1 /许多面试官,通常,一次有几个面试官就不错了,当看起来像是盘问时,这很有趣,他们问了很多人。


典型任务/问题示例


知道解决方案并不能保证任何事情,以及解决方案的不准确性,不完整性,答案。
任务本身就是问题,这是关于该话题的对话的开始。 例如,如何包含两个排序的数组。 然后,如果我们有两个以上的数组,那么复杂度如何,如何优化以及如果改变这一点和那件事该怎么办。 在我看来,这是一种非常好的方法-您不会受到复杂算法的威胁,但是会给出一些简单的方法,然后就复杂性这一话题展开对话。


Java规范


  • 等于和哈希码契约,如果您破坏,将会发生什么
  • hassmap如何运作。 具有不同程度的细节? 从如何使用哈希码(如果断开与equals的联系会发生什么)到-CHM,按内部排列在复制数组上复制,阻止读/写,分段锁定,并发级别。
  • 易失性(内存屏障),发生在语义之前
  • Java 7-CHM,原子,Nio(?)
  • Java 8-流,lambda
  • GC(我似乎已经可以就这个主题进行演讲)
  • 关于易失性数组的问题,volatile int [] arr; arr [2] = 2; int j = arr [2];
  • 仔细检查锁定(以及为什么不应该使用它)
  • 我不了解您感兴趣的内容,但是在某个地方,我将其视为一个有趣问题的示例:
    对象[] o =新对象[10](); VS对象b =新对象[10]();(在这里我不知道答案本身,如果有人读过-帮助解决这个问题)
  • 通知全部通知,生产者消费者,并且在可以的情况下\不能使用notify代替notifyAll

演算法


普通硬


  • 检查父母平衡({[-检查表达式中的平衡括号
  • 表达式计算(给定带数字的字符串,+-* /计算括号中的值)-表达式求值
  • BFS / DFS-bfs-vs-dfs-binary-tree
  • 在图中找到从顶部到全部的路径,在2个顶点之间最小。-查找给定图中的两个顶点之间是否有路径
  • 排序栈-排序栈使用临时栈
  • 随机洗净数字数组

困难的


  • 在两行中搜索最大的相同子字符串-longest-common-substring-java
  • 找到单词的最小后缀,将其添加到单词中将导致回文-最长回文前缀
  • (union find)



  • , (, , tail recursion c )
  • , N
  • fuzz buzz ( 2 )


  • ring buffer, thread (non)safe, (non)blocking.
  • producer consumer, notify/notifyAll, .
  • queue -> blocking queue wait notify
  • thread safe
  • calculate VWAP (with sliding window, global)
  • sliding mean/avg
  • ,
  • ( - )
  • — , .
  • ( , ).
  • - ( 1 , N ) —
  • — check-for-string-rotation-in-java/

( , )


  • — maze
  • — Knight's tour, i,j
  • — leetcode-word-search-java
  • ( , , ).

— . , , , - , .


  • — leetcode-paint-house-java
  • . , .
  • throthler , — , , 1 . throttling vs conflation.
  • .
  • 2 ( 1GB), . <1000 , 99% ( — 99% , 99% ). , .. — , 1-epsilon — ( , ).


  • ,
  • ATM ()
  • — , , , X Y .
    ( ). , .


  • , \.
  • ,
  • ( 3 \)
  • . . , — , — ?..
  • /
  • , . () .


  • ,
  • TDD
  • SOLID
  • — .


  • leetcode
  • hackerrank
  • interviewbit
  • geeksforgeeks
  • ( )
  • glassdoor
  • google
  • practice-practice-practice and have fun!

, , , .

Source: https://habr.com/ru/post/zh-CN430788/


All Articles