今天正式入职了字节跳动。办公环境也很好,这边一栋楼都是办公区域。公司内部配备各类小零食、饮料,还有免费的咖啡。15楼还有健身房。并且公司包三餐来着。下午三点半左右还会有阿姨推着小车给你们送下午茶。据说入职之后很容易长胖来着。不过若是想要保持身材的话,公司二楼还提供专门的健身餐。周二周四还能够预定专业的按摩服务,有效调理颈椎和腰椎。生活服务得这么贴心,感受在这里就只须要好好工做就行了吧,哈哈python
实际上,此次的工做变更并不在我计划中。只是在四月份的时候偶然得知字节跳动上海要搬到合川路地铁站附近,我就突然心动了。为何呢,由于我家距离合川路地铁站步行只要十分钟。自己宇宙条待遇高名声在外,也就是说,只要我能来这里的话,人生最美满的钱多事少离家近的不可能三角我能拿俩。因此在五月份的时候我就开始悄摸摸地准备面试头条了。为的就是之后能够过上早上八点半起床,而后慢慢悠悠走到公司还不迟到(可能仍是很早来的人之一)的生活。面试
固然,这是我为何想去字节跳动的缘由。换算到大家本身的时候,大家也要想想是由于什么想要换一份工做、想要去某个公司。为了薪资?环境?平台?仍是大公司的名头?记住,无论是为了哪个,都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。数据结构
事已至此,虽然我帅如杨过,可是此时也不得不考虑一下整理一下生平所学,找出强点和弱点,而后在面试的时候有的放矢。因此第一次热身面试以后的一个星期,我基本就在整理个人知识结构了。我大体按照以下结构作了一份思惟导图:架构
运行时结构 GC算法 JVM调优并发
Scala Java
表、栈、队列 树 散列 优先队列 排序 高级数据结构
Java内存模型 基本工具 无锁并发 反应式工具
微服务设计 服务治理
分布式缓存 消息队列 RPC
关系型数据库 NoSQL NewSQL
推荐算法
其中JVM、Scala相关、并发编程、消息队列什么的,我都仔细写了一下;Java语言太简单就没弄,数据结构稍微看了一下感受脑海里面尘封好久的记忆突然就被唤醒了,因此也没咋作笔记,微服务相关的太熟没弄,推荐算法太难了也没有弄;数据库相关的内容太多了,也没弄。可是大致来讲索引结构在这里,拿到xmind以后,你能够按照本身的知识结构体系将其补全或者修改,而后学而时习之,甚至在面试以前也能够稍微看看加深一下记忆。
这以后我就进行了第二次面试。第二次面试技术相关的问题其实就没啥太大的问题了,主要考验个人是说话技巧相关的事情。我这人有点毛病,想的太多,想要作的事情太多。这些其实没啥大问题,可是我不肯定的事情我也喜欢和人说,还不分场合地就和人说了。好比,我面的是中间件团队,可是我终面面试的时候却说我由于以前搞推荐算法对深度学习产生了兴趣,想要今年考个在职研究生学一下深度学习。可其实,这个时候我说这个干吗呢?脑壳有点抽抽的吗?而且他问了我一个手写代码的题,我想了半天没有想出来。问题是如何去算根号2的值。个人第一反应很快,牛顿迭代法嘛!可是他说让我在纸上把代码写出来的时候,我就一直在想办法回忆牛顿迭代法是个什么鬼,应该怎么用来算根号2。而后一直在纸上推演导数啊什么鬼的……直到他提示我这个不是一个数学问题,二分查找就能算出来的时候,我才心不甘情不肯地开始弄二分查找的写法(心里OS:牛顿迭代法确定比二分查找好的呀!为何不给我时间回忆一下牛顿迭代!)。这个时候又暴露了我一个问题,我很久没有手写代码了。没有IDE的时候,我基本上啥都不是……写了半天勉勉强强地弄了个版本出来,估计也不是bug free的。因此,最终这个公司的offer也没拿到。辛苦为我推荐的普架了。
这以后我又知道了我出来面试的几个缺点。首先就是要合适地说话,与面试无关的话题不要扯;其次就是我得练习一下手写代码了。不至于要刷题,可是问到什么必须能至少写出个大概吧
字节其实我面试了两个职位。第一个职位的一面感受挺好的,面试官很亲和,问的问题也蛮到位的,而后留给个人发挥空间也蛮大的,因此顺利过了。二面的时候就有点聊不来了,并且越聊越感受职位不合适。因此后来朋友帮我从新推了一个职位,就是我如今所在的数据平台部门。一面的面试官又年轻又高大又帅气,并且基本上是针对个人简历问的问题。固然,第一个问题让我讲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 cache 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或者能扯上反应式架构的时候,只要嘉和和品神不在这条街,我就是这条街最靓滴仔!!!最后,我知道我为何想去这家公司,而且就算不去也没啥大的损失,因此面试的时候能够不卑不亢,心平气和,因而发挥的就也还行。并且,反正公司就在我家旁边,此次没面上没事,过段时间再面呗。
这些经验换算到你这边:若是你说你如今基础很差,我会说不要紧;可是若是一年、两年、三年之后你还和我说你基础很差,那是否是要自我反思一下呢?若是你说你如今没有拳头产品,我会说不要紧;若是一年、两年、三年之后,你仍是没有拳头产品,那你看我这篇文章有啥用呢?而后心态的问题可能就须要本身调整了。只要有基础,有拔高,而后心平气和地来面试,我相信你确定能面试成功的。