注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号 
x
学校招聘会投的简历,全程 on campus 面试,面的是 Bloomberg 2016 R & D Software Engineer,今天 HR 刚打电话发了offer。
简单说一些自己背景:
学校: 美国本科 Industrial & Systems Engineering 毕业,Master 本校 Computer Science,2016年5月毕业。
实习: 2014 夏天在一个很小的软件公司做了三个月;2015 夏天在 J.P. Morgan Chase 做了十周,拿了 return offer 但是铁了心不想回去。
课程: 上了一整年课,算法,OS,数据库
刷题 : 用 Java , 主刷 lintcode,最后剩30道左右觉得太偏的懒得写了,不过我写过的题都至少看过2~3遍,反复研究过最优写法而且最常见的那些我都纯手抄了几份,加上自己的思路分析手稿。
leetcode 有些题挺好的,test case 也全,面Bloomberg之前买了个会员刷了些锁住的题和 lintcode 上没有的。不过总的来讲 leetcode 题偏简单,随便什么题都敢标 hard ...
秋季招聘会投简历,Bloomberg 门口人山人海的,排队之长已经挤的旁边几个公司的桌子门可罗雀。。。他们派了大概六个技术人员现场来问问题,然后收简历安排面试。第一轮面试当晚就发邮件预约了。面试风格是把onsite挪到on campus,连续三天车轮战,一天一场;每一场如果挂了就直接送你走,如果过了就会当场讨论一会儿然后约你第二天再过来。有种星际比赛打淘汰赛的感觉,我反正觉得挺爽的,速战速决BO1单败淘汰制,非常对我的胃口。
每一轮有两个面试官,一个主面试官负责把控交流,另一个负责辅助补充,同时从另一个角度问问题。
第一轮:主面试官白人青年Yuri, 惯用 C++ ,副面试官中年亚洲人 Eric ,写 Java.
一般公司面试第一轮都有两个目的,最基本的是screening,也就是说确定你确实是简历上的那个人,主要经历也没有伪造,面的出现替考或者替面试的情况。其次是考察各种技术能力。也就是说如果你在准备第一轮面试的话,一定要做好最重要的功课:Know your resume, inside out. 只要你写在简历上的东西,一定要能侃侃而谈非常详细的说清楚。
Yuri : (简单询问了一遍简历信息)“So tell me what have you done in the past summer in J.P. Morgan Chase ?”
我把暑假做的那个web application从头到尾讲了一遍,毕竟是从 0 一行一行从后端码到前端的,设计思路和细节都说的非常详细,其中还穿插了 Relational Database,Schema,Indexing,Hibernate ORM,Spring MVC framework,Spring Dispatcher Servlet Request Mapping,JSON serialization 和 JavaScript parsing 这些,讲了大概10分钟吧。
Yuri:“Wow.... Looks like you have done good work from backend all the way to frontend, great ! Ok now let's do a warm up problem, I want you to write code on the paper..”
Warm up 就是 Reverse Integer. 是时候展现真正的技(yan)术(ji)了。。。
先把 corner case 全给他丢了过去。。他表示很好开写吧。。。 一边写一边讲,他一开始有点不太理解我处理 integer overflow 的做法,因为我不喜欢声明 long 所以都是用 next / 10 == prev 这种办法判断 next 是不是 overflow的,如果 overflow 就返回 0,他想了想觉得可以,就算通过了。
一个有意思的地方是,Bloomberg面试官对于边界条件处理方式的偏好和 lintcode / leetcode 这种 OJ 不一样,OJ上你就直接返回 0 , -1, null 这种就可以了,但是面试官喜欢在这种情况下让你 throw new exception. 我遇到的几个技术面都是这样。
然后 Eric 接过话头给了另一道题:“给你一个完全由大写和小写字母组成的String,按照出现频率返回新的String,区分大小写。举个例子,ABCAabcABa -> AAAaaBBbcC,AAA在最前面因为它的出现频率最高。如果频率一样的话我不在乎谁先谁后,当然如果能按lexicographical order返回更好。”
我:“至少O(n)扫一遍 String 是必须的,统计频率的话用 int[] 或者 HashMap 都行,一边走一边加,不过最后要按频率输出我觉得定义一个 Pair Class 也不错,里面存一个 char ,一个 int 代表出现次数,然后让这个Pair Class implement comparable interface,放到一个Collection或者array里面可以直接调用 sort() 函数给 Pair 排序。”
Eric:“不错,写吧。不过我嫌全写完太麻烦,你就认真把你 Pair Class 和 implement comparator interface 那个地方写好,还有最后输出的部分。”
Pair Class 里面有 @Override compareTo ,Eric 就从这个入手开始问了一大堆 override ,overload, interface,abstract class / method , OOD 的概念,为什么要有 abstract class 和 interface,polymorphism 这些。不过有个地方我说的不好,Eric问了我一个 run-time polymorpism 的问题,问我这个是 run-time 还是 compile time,我当时脱口而出 run - time ,然后两个面试官居然丧心病狂的进入了影帝模式,同时做出了极其疑惑的表情看着我然后问我 “你确定??” 我简单思考了一下然后坚定地推翻了我原来的正确答案,改成了 compile time .....
后来一想觉得他俩是故意的,因为一个概念问题也好,算法问题也罢,你直接把最优解丢过去很容易让人怀疑你是背答案,从面试官角度讲不太容易区分出来你到底是对这个真的有透彻的理解,还是只是查了我们的题库在鹦鹉学舌。所以俩人一起演戏混淆视听,让你学着不仅能当场给出正确答案,更能给出背后的原因,通过分析来defend yourself. 这个地方确实理解的不好,背答案瞬间就被两个面试官抓包了,好在影响不是特别大。
Yuri:“算法表现不错,我看时间还挺多的,咱们来点刺激的 System Design 吧!”
我:(草泥马草泥马草泥马你们第一轮就这么搞我完全不按套路出牌啊)
Yuri:“一个用户用我们的 Bloomberg terminal 看数据,新闻和图表,功能都能用,但就是读取特别慢,比如说10秒钟才能加载出来,非常不爽。我们现在有十台服务器的 cluster,告诉我,怎么改善用户体验? ”
我:“你那十台服务器都用来做什么的?”
Yuri:“处理用户请求。”
我:“要不试试把一个用户的数据请求拆分成几块,比如数据请求,图表请求和新闻请求,然后同时分配到多个服务器上同时处理?”
Yuri:“想法不错,然而并没有什么卵用。因为这十个服务器都向同一个后台数据库要数据。”
我:“那你的意思是,瓶颈不在服务器处理业务逻辑的 CPU 时间上,而是后台数据库的 I/O ?”
Yuri:“(点点头)不错,就是这样”
我:“那多加几个数据库的replicate不就好了,这样还能比较有效利用你已经有的十台服务器,现在这个情况这十台服务器肯定都没用上啊”
Yuri 和 Eric 相视一笑,甚是暧昧。
Yuri:“想法不错,然而也并没有什么卵用。”
我:“为啥?”
Yuri:“没事,这种问题没有所谓的标准答案,我只是想看看你到底能答到哪一步。走到现在这一步,你不用非说出个业界方案,就给我说说你能想到的idea就好。”
我:“用户抓数据是一种pull request,反过来讲,后台数据库和服务器是知道数据被更新了的,他们可以在数据被更新的时候主动push 最近数据到对应的缓存里,把原来的缓存信息替换掉。”
俩人面色缓和了很多,一看时间大概还剩15分钟,就是纯聊天了。其实我觉得,面试里面和面试官聊天的部分才是干货最多最有意思的,因为特别自由随意,你可以问你好奇的东西,同时通过你问的东西也可以让面试官了解你这人的喜好和性格,我所有的面试里最喜欢的环节就是聊天。
Yuri:“首先我要郑重和你说一句。。。。Bloomberg是个金融行业的技术公司,不是电视台!你可能是从我们的Bloomberg news了解到我们公司的,但是我们真的是做技术的,不是新闻社!”
我:“汗,这个我还是知道的,我自己用过Bloomberg terminal,参加过 Bloomberg 出席的 Hackathon,还在J.P. Morgan 的 trading floor 看到无数台你们的机器,在我心目中绝对是技术公司啊。”
Yuri:“那就好。。。。。”
我:“你们的Developer culture怎么样?”
Yuri:“为什么这么问?”
我:“我在J.P. Morgan作为一名开发人员,亲眼目睹了我的同事们天天泡在ppt,excel,outlook上,实在是太他妈depressing了。。。”
Yuri 和 Eric 同时开始放声大笑,丝毫没有掩饰嘲讽意味的打算。。。
笑够了之后Yuri说:“我们这的人,你可以看到一整楼的 Linux Terminal,如果这个景象会让你感到不那么depressing的话,哈哈,那你很适合来我们这。”
我:“你们是怎么给新人分组的?随机乱扔,组挑人,还是人挑组?”
Yuri:“人挑组。我们管自己叫 Bloomberg University,CS新人进来先培训12周,期间你自己发掘和了解公司兴趣,最后自己选。当然,培训期间你的表现越好,就越容易选到你想去的组。”
我:“那差不多就是我在你们 Bloomberg University 再上一个学期的学,然后挑个专业,学霸优先?”
Yuri:“哈哈哈哈差不多就是这个意思。”
我:“其实我特别看重一个公司里,技术开发占多大的比重。在J.P. Morgan里我觉得他们对于技术的看法和真正靠技术赚钱的公司是不一样的。技术对他们来讲只是支撑金融运作的工具,他们不需要开发新技术的人,只需要维护技术的人。技术老旧不说,如果觉得太落后了,也不会自己开发,而是直接去买。所以我在那实习的时候总有一种感觉,就是我们根本就不是核心部门,也不是赚钱的部门。我们不带来任何利润,反而有很大的开销。每当出现任何问题的时候,那些 CIB / CCB 前台部门完全不懂技术的人只会觉得,我们花了这么多钱,怎么还是搞不好?”
Yuri 和 Eric 表情变得严肃了一些,听的非常认真。
Yuri:“你先坐着,我们出去商量一下。”
两分钟之后他俩回来,约了我第二天10点直接面第二轮,有惊无险这轮算是过了。
|