⾯试字节跳动的⼀点⼩经验
今天正式⼊职了字节跳动。⼯号超吉利,尾数是4个6。然后办公环境也很好,这边⼀栋楼都是办公区域。公司内部配备各种⼩零⾷、饮料,还有免费的咖啡。15楼还有健⾝房。⽽且公司包三餐来着。下午三点半左右还会有阿姨推着⼩车给⼤家送下午茶。听说⼊职以后很容易长胖来着。不过如果想要保持⾝材的话,公司⼆楼还提供专门的健⾝餐。周⼆周四还可以预约专业的,有效调理颈椎和腰椎。⽣活服务得这么贴⼼,感觉在这⾥就只需要好好⼯作就好了吧,哈哈
其实很早就和⼩伙伴们说要写⼀篇⾯试经验的。包括我为什么想要换⼯作,为了换⼯作做了什么准备,以及⾯试过程的⼀些分享。但是前段时间因为住院做了个⼩⼿术⽽耽误了。今天刚刚好现在在⼊职的熟悉时期。晚上的时候趁机把这篇写完,顺便也借机会完成⼀下我们组的新⼿村任务。各位有兴趣来字节跳动的朋友们,可以把简历发送给我邮箱,我来帮你内推哟。
为什么想去字节跳动
实际上,这次的⼯作变动并不在我计划中。只是在四⽉份的时候偶然得知字节跳动上海要搬到合川路地铁站附近,我就忽然⼼动了。为什么呢,因为我家距离合川路地铁站步⾏只要⼗分钟。本⾝宇宙条待遇⾼名声在外,也就是说,只要我能来这⾥的话,⼈⽣最美满的钱多事少离家近的不可能三⾓我能拿俩。所以在五⽉份的时候我就开始悄摸摸地准备⾯试头条了。为的就是以后可以过上早上⼋点半起床,然后
慢慢悠悠⾛到公司还不迟到(可能还是很早来的⼈之⼀)的⽣活。
当然,这是我为什么想去字节跳动的原因。换算到你们⾃⼰的时候,你们也要想⼀想是因为什么想要换⼀份⼯作、想要去某个公司。为了薪资?环境?平台?还是⼤公司的名头?记住,不管是为了哪⼀个,都OK的。谈钱不伤感情,⽬标明确,⼼智坚定以后,才好围绕着这个⽬标做⼀系列的准备。⾯试的过程中每次⾯试官问我为什么想来字节跳动,我都是直截了当地说离家近,还说假如这次⾯不上,准备准备,过段时间再⾯试好了。反正你们公司就在我家旁边,三年五载的可能都跑不掉,哈哈。
因为这种⾯上OK,⾯不上也没事的⼼态,所以感觉⾯试的时候我的发挥也好⼀些。本⾝就是⼀个互相选择的过程,⽽且这个过程中,公司⽅相对来说固定⼀些,因为他的招⼈标准不太可能会有太⼤的变化。拿我经常⽤来怼⼈的⼀个例⼦来打⽐⽅:我常常和别⼈说,搞技术开发,英语很重要。你需要英语来看最新的技术⽂档,并且有些翻译并不准确,你可能需要看原⽂才能理解什么意思。有的⼈当时就会和我说,哎,可惜我英语不太好。这个时候我会回,没事,你现在英语不好不是你的错,但是如果我⼀年以后,甚⾄两年三年以后再来问你英语怎么样,要是你还和我说你英⽂不好的话,那你就得查⼀下⾃⼰的问题了。你根本就不想着学英语,英语怎么可能会好?
类⽐下来,如果你根本不想去这个公司,那你怎么可能来到这个公司?如果你真的想去⼀个公司,可能现在这个时候你暂时不满⾜要求,但是没事,只要咱知道别⼈是啥要求,咱认真学习,好好准备,
⼀年以后再⾯试,两年以后再⾯试,甚⾄三年、五年以后再来试试,都可以的。⼈最怕的不是没有达成⽬标,⽽是没有⼀个真正的⽬标。所以,换⼯作之前,你要想清楚为什么,并且提前开始准备。
我准备了些啥?
其实我有好长⼀段时间没有正规地⾯试过了。三年前从数云换到GIO的时候,因为简历上的相关技术太过于匹配,所以基本上就和CTO聊了聊就确定过去了;后来再回数云的时候,也就和总监喝了⼀下咖啡就回来了。也就是⼤约5年的时间⾥⾯,我没有正规地接受过⾯试。所以在准备投字节跳动之前,我投了⼏个公司做了⼀下热⾝活动。记住,这个时候其实不需要有啥⼼理包袱。因为本⾝候选⼈⾯试成功的可能性⽐较低,⼀个合适的可以⾯试的⼈选他们也很乐意看看,⽽且万⼀你确实想换⼯作,但是⼼仪的公司⾯不上,⽽热⾝活动的公司拿到了offer,你也可以考虑考虑去看下。并且这个时候你没有任何的⼼理包袱,因为反正你也就是来⾯试看看的,所以⾯试时候的发挥可能也会更好点,因此说不定最终拿的offer会⽐最后想去的那家更好呢?
当然这⾥⾯不包括我。我第⼀次⾯试的时候就被⾎虐了T-T。参加中间件⽐赛的时候,我⽤的netty做的实现。个⼈感觉对netty还算有所了解的,结果⾯试官让我直接写出netty的源码结构,包括哪⼏个主要的类以及名称还有互相之间的关系……⼯作的项⽬⾥⾯我使⽤了kafka来做消息队列,来缓冲流量,保护系统,结果直接让我描述kafka的存储结构……⽐赛的时候我通过各种⼿段让程序⽆GC,结果直接
就要我说出各种GC算法的原理和应⽤场景……PolarDB⽐赛我们⾃⼰写了KV,对标的是RocksDB,结果让我描述RocksDB的索引结构……
当然,虽然基本上他问的东西我都有所了解,并且清楚应⽤场景在哪⾥,但是到了细节⾥⾯的时候,就稍微有点蒙圈了。虽然每个细节我确认我稍微看⼀下就能搞定的,但是架不住⾯试的时候⽆法张⼝就来呀。这个时候,感觉仿佛我变成了年轻时候的杨过,忽然⾝边出现了⼀个⾦轮法王对我说:"杨兄弟,你的武功花样甚多,不过我倚⽼卖⽼说⼀句,博采众家固然甚妙,但也不免驳⽽不纯。你最擅长的到底是哪⼀门功夫?要⽤什么武功去对付郭靖夫妇?"。对呀,我的知识⾯很⼴,各种应⽤框架新技术可能都有所⽿闻,但是我最擅长的是哪⼀个呢?虽然我深深地知道我最擅长的是Scala和Akka、Play、Lagom等,但是架不住没有⼈会问呀T-T。
事已⾄此,虽然我帅如杨过,但是此时也不得不考虑⼀下整理⼀下平⽣所学,出强点和弱点,然后在⾯试的时候有的放⽮。所以第⼀次热⾝⾯试之后的⼀个星期,我基本就在整理我的知识结构了。我⼤致按照如下结构做了⼀份思维导图:
1. JVM相关
1. 运⾏时结构
2. GC算法
3. JVM调优
2. 编程语⾔
1. Scala
2. Java
3. 数据结构与算法
1. 表、栈、队列
2. 树
3. 散列
4. 优先队列
5. 排序
6. ⾼级数据结构
4. 并发编程
1. Java内存模型
2. 基本⼯具
3. ⽆锁并发微服务在哪里
4. 反应式⼯具
5. 微服务
1. 微服务设计
2. 服务治理
6. 中间件
1. 分布式缓存
2. 消息队列
3. RPC
7. 数据库
1. 关系型数据库
2. NoSQL
3. NewSQL
8. 机器学习算法
1. 推荐算法
其中JVM、Scala相关、并发编程、消息队列什么的,我都仔细写了⼀下;Java语⾔太简单就没弄,数据结构稍微看了⼀下感觉脑海⾥⾯尘封很久的记忆忽然就被唤醒了,所以也没咋做笔记,微服务相关的太熟没弄,推荐算法太难了也没有弄;数据库相关的内容太多了,也没弄。但是⼤体来说索引结构在这⾥,拿到xmind之后,你可以按照⾃⼰的知识结构体系将其补全或者修改,然后学⽽时习之,甚⾄在⾯试之前也可以稍微看看加深⼀下记忆。(想要获得我的索引笔记,关注我的,后台回复"知识索引"即可。)
这之后我就进⾏了第⼆次⾯试。第⼆次⾯试技术相关的问题其实就没啥太⼤的问题了,主要考验我的是说话技巧相关的事情。我这⼈有点⽑病,想的太多,想要做的事情太多。这些其实没啥⼤问题,但是我不确定的事情我也喜欢和⼈说,还不分场合地就和⼈说了。⽐如,我⾯的是中间件团队,但是我终⾯⾯试的时候却说我因为之前搞推荐算法对深度学习产⽣了兴趣,想要今年考个在职研究⽣学⼀下深度学习。可其实,这个时候我说这个⼲嘛呢?脑袋有点抽抽的吗?并且他问了我⼀个⼿写代码的题,我想了半天没有想出来。问题是如何去算根号2的值。我的第⼀反应很快,⽜顿迭代法嘛!但是他说让我在纸上把代码写出来的时候,我就⼀直在想办法回忆⽜顿迭代法是个什么⿁,应该怎么⽤来算根号2。然后⼀直在纸上推演导数啊什么⿁的……直到他提⽰我这个不是⼀个数学问题,⼆分查就能算出来的时候,我才⼼不⽢情不愿地开始弄⼆分查的写法(内⼼OS:⽜顿迭代法肯定⽐⼆分查好的呀!为什么不给我时间回忆⼀下⽜顿迭代!)。这个时候⼜暴露了我⼀个问题,我好久没有⼿写代码了。没有IDE的时候,我基本上啥都不是……写了半天勉勉强强地弄了个版本出来,估计也不是bug free 的。所以,最终这个公司的offer也没拿到。⾟苦为我推荐的普架了。
这之后我⼜知道了我出来⾯试的⼏个缺点。⾸先就是要合适地说话,与⾯试⽆关的话题不要扯;其次就是我得练习⼀下⼿写代码了。不⾄于要刷题,但是问到什么必须能⾄少写出个⼤概吧。所以我就登录了我好友邱嘉和个⼈制作的⽹站 AlgoCasts(algocasts.io/), 看了⼀下他精⼼录制的⼩视频。然后跟着敲了⼀下代码。这之后,我就开始⼈帮我推字节跳动了。
字节跳动⾯试体验
字节其实我⾯试了两个职位。第⼀个职位的⼀⾯感觉挺好的,⾯试官很亲和,问的问题也蛮到位的,然后留给我的发挥空间也蛮⼤的,所以顺利过了。⼆⾯的时候就有点聊不来了,⽽且越聊越感觉职位不合适。所以后来朋友帮我重新推了⼀个职位,就是我现在所在的数据平台部门。⼀⾯的⾯试官⼜年轻⼜⾼⼤⼜帅⽓,⽽且基本上是针对我的简历问的问题。当然,第⼀个问题让我讲Akka的时候,我是真的呆了。完全不按套路出牌呀!我从来没有遇到过有⼈会问我Akka的怎么会有⼈问我Akka内⼼⼀阵狂喜和激动之后,我先收拾了⼀下⼼情,慢慢整理了⼀下⾃⼰脑海中⼀直在跳着举⼿喊着"讲我讲我"的Akka特性。于是先从线程模型开始讲起,讲了它的M:N实质,Actor模型依赖的消息传递模式,层级结构划分的监督职责,让它垮的失败处理,Akka集⽀撑起的横向扩展,等等等等。然后围绕着Akka⼜问了⼀些⼩问题,基本很顺利的过去了。后来⼜问了⼀下缓存相关的内容,其中讲了⼀个缓存雪崩的问题我⼀时半会⼉没有反应过来。问题其实很简单,就是忽然有⼀堆请求访问同⼀个key,⽽这个key在缓存中不存在。如此所有请求就会同时去访问数据库然后⼜同时去更新缓存。这样的缓存雪崩效应应该如何解决?这个问题听起来其实很熟很熟很熟的,但是当时我脑袋短路了没有想起来。后来想起来原来Akka-Http-Caching(以前的Spray-Caching)就是专门为这种情况服务的。⽼外给的说法是这种问题叫做惊效应,讲的是很多请求在第⼀个请求完成之前,⼀起访问同⼀个键(This approach has the advantage of taking care of the thundering herds problem where many requests to a particular ca
che key (e.g. a resource URI) arrive before the first one could be completed.)。⽂档上说的This approach指的是缓存的时候,不要缓存⼀个值,⽽是⼀个Future[T]。这样,第⼀个请求获取值的过程也被缓存下了。后续的请求就会访问到这个Future,然后可以向其注册回调,等待缓存动作完成再完成回调。当然,这个没有答得特别好也没事,后续⼜问了我⼀下关于JVM相关的⼀些东西,最后⼿写了⼀个算法题。然后⼀⾯顺利地就过了。
之后⼆⾯的话基本也是围绕我的简历来问的,讲了⼀下当时做的推荐算法的原理,讲了⼀下Spark的基本原理,然后最后做了⼀个算法题,然后也顺利过了(其实还有⼀些其他问题,但是我忘了问的是什么了……)。当然这个算法题的实现并不是最好的。题⽬内容是26进制的加法,其实要涉及单个字符的加减和进位的处理的,这样实现下来细节就要处理好多东西,还很有可能出错。所以我取了个巧,我先把字符数字都转化成了整型,然后整型加减得到结果,然后再把结果转化成了26进制字符。虽然结果不是最优的,因为数字⼤了肯定会溢出的嘛。但是起码还是做出来了,所以⼆⾯也顺利过了。
三⾯的时候也是先围绕着我的项⽬问了⼀些相关的问题,所以答得蛮平淡的,但是也还⾏。然后他问了⼀下我如何做流量控制。问我流量控制哎然后,我⼜强⾏按捺下了内⼼的喜悦,将《反应式设计模式》的第⼗六章流量控制的内容⼤致讲了⼀遍。也许就是给了这样⼀个我发挥的空间,所以我第三⾯也很顺利地过了。没多久就是HR⾯试⼤致谈了⼀些技术之外的问题。
HR⾯我就中规中矩了。当时⾯完感觉就稳了,但是等了好久好久还没有跟我沟通offer的事情,等的我有点难受了……之后HR联系我说,还要给我加⾯试,说团队⽼⼤要⾯我⼀下。原本字节⾯试⼀般3+1就OK了,然后突如其来地加⾯试让我感觉有点忐忑,所以后⾯的⾯试发挥没有前⾯好了。其实后来回想⼀下,我可能是以为前⾯⾯试表现不好,不能给我确定offer,才会有后来多的⾯试的。所以当时⼼态不好,答的感觉也没有之前果断。后来第五⾯完了以后,团队⽼⼤还是不确定,还要加⼀⾯交叉⾯试,这个时候我就豁出去了。⽆所谓,⾯上⾯不上没关系,反正字节跳动在我家旁边,只要庙不搬,我就进得去。所以最后⼀⾯跟隔壁leader聊的时候相对来说还好⼀些。问题没有问啥特别的,就是仔细问了下我最近做的⼀个项⽬,优点在哪⾥,缺点在哪⾥,难点在哪⾥。然后顺着难点来进⾏扩展,为什么是难点,怎么解决,有哪些⽅案,这些⽅案有哪些优缺点。幸好我平时⼯作还是有思考的,所以最终答的还不错。于是终于到了6⽉10号左右,HR和我确定要发offer了。
经验总结
整个⾯试过程,如果加上之前不合适的职位的话,总共8⾯,前后跨度⼀个多⽉。然后到了今天的时候,最终⼊职成功。说起来还是有点漫长的。如果再加上前⾯的两次热⾝⾯试,可能跨度就有接近两个⽉的时间了。说实话我并不是那种别⼈⼀看就很喜欢的⼯程师,因为⼀直在⼩公司做个⼩架构,⽽且主⼒编程语⾔⽐较偏门,所以适合我的职位范围相对来说很窄。实际上我今天看了⼀下和我⼯作相关的两个项⽬,⼀个go,⼀个python,我的scala技能可能在后⾯相当长⼀段时间要荒废了……不过没
关系,离家近就⾏,⽽且跳出舒适区看⼀下其他风景,我感觉对我来说也是⼀件好事。
最终总结为什么能成功⾯上字节跳动,⾸先我的基础实际上还可以的,虽然第⼆次⾯试的⾯试官觉得我基础不好,但是其实很多内容在我深⼊的时候我就把思路、结构、来龙去脉整的明明⽩⽩的,所以就算忘了,回忆起来也能很快塞进体系⾥重新理解透彻;其次我有⾃⼰的拳头产品,⾯试不问就罢了,⼀旦问到Scala、Akka、Play、Lagom或者能扯上反应式架构的时候,只要嘉和和品神不在这条街,我就是这条街最靓滴仔最后,我知道我为什么想去这家公司,并且就算不去也没啥⼤的损失,所以⾯试的时候可以不卑不亢,⼼平⽓和,于是发挥的就也还⾏。⽽且,反正公司就在我家旁边,这次没⾯上没事,过段时间再⾯呗。
这些经验换算到你这边:如果你说你现在基础不好,我会说没关系;但是如果⼀年、两年、三年以后你还和我说你基础不好,那是不是要⾃我反思⼀下呢?如果你说你现在没有拳头产品,我会说没关系;如果⼀年、两年、三年以后,你还是没有拳头产品,那你看我这篇⽂章有啥⽤呢?然后⼼态的问题可能就需要⾃⼰调整了。只要有基础,有拔⾼,然后⼼平⽓和地来⾯试,我相信你肯定能⾯试成功的。
哦,对了,在准备的同时,可以配合着嘉和的AlgoCasts(algocasts.io) ⼀起服⽤,如果带上⼀本《反应式设计模式》就更好了,很多⽅案真的就是属于降维打击的内容。⽽且,就算字节跳动没有
适合你的岗位,只要你能把嘉和的⼩视频、品神的《反应式设计模式》都学好,那你去⾯淘宝的消息团队,也能有额外的优势。
总之,只要觉得可以了,准备好了,就给我发邮件吧!邮箱地址是 wangshichong.wayne@bytedance 。你有俩选项,⼀个是我这边的数据平台,另⼀个是品神所在的淘宝消息团队,发简历的时候在标题⾥⾯注明就好了。当然如果你觉得搞不定字节跳动的算法题⽬,那你也可以带着我的专属优惠码 wayne 去看看嘉和的⼩视频。⼿绘讲解算法思路,逐⾏撸代码逐⾏解释,⼀题多解,并提供最优解法,助你搞定各⼤⼚⾯试算法。使⽤专属优惠码 wayne,购买套餐后添加 Hawstein-Studio 还可以获得 40 元返现。所以,要学算法、要投简历的⼩伙伴们,赶紧⾏动吧!点击阅读原⽂就可以看到字节跳动热招职位!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论