今年校招已然开始,不过对我来说已经结束了。拿到了还算满意的offer,终于可以逃离帝都了。
网易内推开始的时候还在某东实习,笔试那天四点多就偷偷溜回学校,幸好组里的氛围比较宽松,老大也没怎么管我。。。然后笔试过了,通知我20号去杭州面试,原本以为过笔试很正常,但发现认识的同学居然好多没过,我就有点诧异,心存侥幸的同时更有点慌乱和紧张,因为实习快两月了基本上没怎么复习过基础知识。得到面试通知后下定决心要抓紧面试前的一段时间好好复习,可当时正好在做组里的新项目,有点忙,导致实际上只在周末看了两天笔记、去杭州的高铁上看了两小时书。本来还想晚上在宾馆里复习下项目的,然而躺在宾馆柔软的床上我还是忍不住打开电视机看起了林丹和李宗伟的奥运会半决赛。。。比赛确实很精彩啊,虽然林丹输了。。。第二天,起得比较早,提前赶到网易,虽然通知的11点,但报完到后才十点多就让我去一面。一面上来让我自我介绍,都是套路了:我叫XX,在XXXX学校读研二,有两段实习经历,简单说了下都是干嘛的(一个写Java,一个写node.js),当然我面的是Java研发,最重要的是给面试官下套的那几句:我平时喜欢研究并发和网络编程,看过Concurrent包和netty源码,也对大型网站分布式架构感兴趣等等。自我介绍当然要言简意赅,直达技术点,方便面试官下一步问问题。自我介绍完,让我说个项目,又是套路。于是开始装逼模式,先是从总体上介绍了下简历上的RPC项目,个人感觉总会有面试官对你的项目不感兴趣的,所以介绍时一定要点出用到的技术点,为了让面试官有可以引申的问题问你。果不其然,他开始转而问我netty了。其实很多面试官对netty也不太了解,那么我能扯淡的点更多了,从netty的线程模型扯到职责链的处理模式,从nio扯到单线程池减少线程切换的损耗,说得面试官一愣一愣的。然后开始问下一个我山寨github的项目,貌似也没啥可问的,看到里面用到了redis,又开始问redis。问题的核心无非就是怎么做一个redis的高可用性的集群。于是我又不得不开始装逼模式,从一致性hash扯到aof和rdb两种持久化方式,从主从复制扯到zookeeper做master选举。后面又问了点jvm的gc算法之类的常见问题,差不多面了半个小时就让我去hr那等下一步消息。回到大厅,找个座位,屁股还没坐热,hr又喊我名字让二面了。间隔时间之短,让我还特意确认了下是不是二面。二面面试官上来就说,那我们就开始吧,居然没让我自我介绍,这是我碰到的第一次。然后面试官说,根据一面的反馈,java web还没问,那我们聊聊这个吧。我说那好吧,我就说说我项目里用到的spring。还是那个RPC项目,我仔细说了下如何将netty的网络连接融入Spring的bean加载过程当中,无非就是实现initializingBean和各种aware结尾的接口。然后又仔细说了下项目中其他的技术点,比如说自己实现的注解类、实现异步化、心跳检测等。接着聊了下并发,concurrent包里面的一些东西,cas啊,concurrentHashMap啊,countDownLatch啊这些。然后问我用没用过MySQL,我大吃一惊,难道有人没用过么?当然用过啊。问的也是常见问题,Innodb特性。于是我将Innodb和MyISAM比较了下,什么行级锁啊、事务啊、外键啊。接着问行级锁的原理。我就按个人思考说了下锁的本质和b+树的节点,后面又扯到分布式锁,答用zookeeper可以实现,又问还有其他的实现方式吗?答可以用Redis。我还期待面试官问具体的实现原理呢,毕竟zookeeper或者redis我还可以聊很多,可惜并没有,让人有点小失望。。。最后聊的就是一些轻松的话题了,像你一般怎么学习的,平时看哪些书啊,我就说我在看些中间件有关的书。hr面hr居然是个男的,不过说话也挺温柔的。。。问了好多我在某东实习的情况,说他是从某东跳过来的,聊的还挺好。原本以为就结束了,可hr让我再等等,我不解,hr告诉我说还可能有总监面,当时就懵逼了,总监面是个什么鬼。总监面等了十来分钟,真的叫了我的名字。hr对着我微笑,起身离开座位,说跟我来。搞得我很茫然,这架势,是要干嘛呢。然后将我送到了一个女的旁边,目测是总监秘书之类的,但是总监已经来了。总监和我随便聊了两句,带我进了一个小房间。总监看了下简历,上来就问技术问题,完全不按套路出牌。先让我说个项目吧,那我就说那个RPC呗,反正都说了不知道多少遍了,然而刚开始才说到动态代理,他就打断我,问动态代理是怎么实现的,答了下jdk里的动态代理和cglib的动态代理实现,又问cglib动态代理怎么实现的呢,就说了下字节码增强和装饰者模式。接着回到项目,我继续说序列化,又打断我,问都有哪些序列化方式呢,扯了下hessian、msgpack、protocol buffer。问为什么项目中用protocol buffer呢?其实我也不知道为啥,我就用了啊。。。当然我不会这么回答的,就说什么查找的资料,protocol buffer序列号压缩生成的字节少,占用网络带宽少等。可是总监毕竟是总监,不依不饶的继续问那这些序列化方式都是具体怎么实现的啊?实现原理都有什么区别呢?当时我就不行了,我靠,这我哪知道啊,我觉得也没几个人知道吧,毕竟压缩字节的算法可不是几句话就能搞定的。假装思考半天,总监接着说,那你在纸上写个压缩字节的代码吧,比如int是怎么压缩的?瞬间我感觉要完蛋,从来没思考过这种问题,一点思路都没有。然而我还是淡定的拿起纸笔,写了个函数名和一个括弧。。。最后我写了一堆没用的边界检查之类的凑数代码,总监说,时间有限,写完了吗?我装作一脸无辜,这个题有点难,我一时半会写不出来,我给你说说思路吧。扯了点移位这类的想法。总监也没继续纠缠这个,接着问其他的。接着问nio,这个我熟啊,说了半天byteBuffer、channel、selector这些。然而总监依旧不按常理出牌,问为啥要用byteBuffer啊?最本质的原因是什么?为啥不用byte数组啊?我说了一些自己认为的原因,貌似他不是很满意,最后给我整急了,我说如果需要用直接内存的话,byte数组是不能申请的,只有通过ByteBuffer的allocateDirect()方法才能,总监才没继续这个问题。后面接着聊中间件,问mq消息队列的原理。如何持久化,持久化的格式是什么,为啥会有重复发送消息,怎么避免。了解哪些网站的架构,说说看。于是我以知乎这个网站从最开始创建到现在比较大的流量怎么演变的技术架构为例,扯到口干舌燥,然而总监盯着电脑,也不看我一眼。还问了一些乱七八糟的像tcp啊,mysql的索引b+树,为啥要用b+树,机械磁盘读取时间,内存读取时间等等。最后问了一个小时左右,感觉累到不行,总监点点头,对我说你去找下hr问问后面流程吧。就这样结束了一天的面试。大概在下午四点多的时候。心情顿时轻松了不少,感觉还是有希望拿offer的。然后就去找师兄吃饭去了。第二天,坐上高铁抵达北京,结束了校招的第一次面试,也是最后一次。回忆起从今年三月份开始准备找实习开始,虽然一直各种担心和焦虑,一路走来也算是比较顺利和幸运了。算是没有辜负自己这些年的努力吧。
最后给了我sp,也是有点出乎意料的,分配的部门也还可以,终于不用写业务代码了,欣慰。以后路还很长,但愿自己能一直保持技术的热情和好奇心吧。研究docker去了。。。