已收到网易短信offer
先说下阿里吧,前段时间找师兄内推了阿里巴巴实习生,特此记录一下面试的感受,阿里确实是技术的圣地,目前为止我遇到的面试官都很nice,无论是语气还是技术都让人佩服,我就根据印象回忆一下面试的情况吧。
早上投的晚上七点半就给我打电话了……这效率杠杠的。我内推的是蚂蚁金服,但面我的是一个天猫部门的大牛。有可能和我简历上写的项目有关(一个电商项目),这次面试主要是简历评估吧,问的问题分为两部分,一部分是项目细节,一部分是基础知识。
项目部分
1.商城首页怎么优化的?如何提高访问速度?
我说热点商品直接走缓存,数据库做了读写分离
2.缓存具体怎么设置的?key value
我结合项目说了实现,这边讨论了很久……
3.看你项目提到了分布式事务,说一下?
我说订单系统和商品系统是分布式服务,下单后减库存涉及到分布式事务,使用了阿里开源的RocketMQ事务型消息队列实现的,然后巴拉巴拉说了下RocketMQ如何保证分布式事务的……
4.那你的减库存操作怎么保证重复消费问题?多线程减库存情况下如何保证安全?
第一个我回答的是我在商品系统有个基于全局id的去重表(其实就是幂等性一个实现思路)。第二个我说用了redis分布式锁,他说那你这个分布式锁如何设计的?我巴拉巴拉说了一通,这里也讨论了很久很久……
5.你觉得手机访问淘宝,整个流程是怎么样的?
开始没明白问题的意思,我就从域名解析,ip,tcp,http角度去说了,说完后面试官说你这是从计算机网络的角度,具体的后台业务如何处理你能说说么……我就有点迷,不知道啥意思,我就说不知道淘宝用不用spring。。。我打算从spring的角度去说的,面试官看样就说那问你其他的的吧。然后就是基础知识了
基础部分
1.排序算法知道吧,说下选择排序思路
表示当时脑子一空居然想不起来了!其实很简单的,但是当时忘记了,也怪自己平时没有用过这些算法,就给面试官说一直在做项目,排序算法忘记了。。。面试官笑笑,说没关系的~(表示很温和0.0)
2.servlet生命周期
容器初始化—》init()—》service()—》destory()—》容器销毁
3..springAOP用过吗,说下原理
用过,动态代理,巴拉巴拉……
4.动态代理的原理?
jdk动态代理、cglib巴拉巴拉……
5.CAS知道吗,java哪些类哪里用到了CAS?
Compare and swap,比较后设置,巴拉巴拉……其实很多并发包都用到了CAS,当时我就说了个Lock。
6.CAS如何防止ABA问题?
如何避免我忘记了,索性就解释了下ABA问题。(java基于版本时间戳避免ABA问题,AtomicStampedReference、AtomicMarkableReference)
7.sleep和wait的区别
这个我说的有些不好,支支吾吾的说了一点
8.你上面说了分布式锁其实是悲观锁,知道乐观锁吗?
我说了乐观锁,然后面试官说你上面可以改进成乐观锁,然后我说对对对……(马后炮做法23333)
9.用没用过java8,知道新特性吗?
用过流式遍历,其他的知道lambda表达式,而且java8对很多数据结构进行了优化(本来是想让面试官问我哪些优化的,我就可以扯很多HashMap的优化,结果面试官没问)。
总结:一面面了54分钟。这次面试大部分时间都是问项目,和天猫的业务可能有关吧,面试官很懂业务问的自然就多点。其中排序算法没回答出来,其他的有一两个回答的不是很完美吧。回来五分钟后看到状态从简历评估中变成待安排面试……一面应该是过了
一面过后等啊等,状态从待安排面试变成面试中,一共等了九天。21号晚上九点半左右突然接到杭州的一个电话,心里一惊,接通后果然是面试的。这次面试官也非常好,上来就说自己是天猫的,这么久才打电话不好意思啊。我说没关系,辛苦啦……然后面试官说你先自我介绍吧,我就说了下自己的情况,然后开始正式面试,这次面的主要还是项目……
1.介绍下你的这个商城
2.听你介绍完,你这个是个B2B模式的商城,你研究过B2B吗,和B2C,C2C模式的区别?
我有些迷。。。这个商业模式我确实不敢乱说,就说了一点……
3.你用了线程池优化,说下实现思路?newFixedThreadPool和newCachedThreadPool区别?
这个我很熟,就说了线程池的核心参数(5个核心参数),以及使用的阻塞队列的区别。我的这篇文章java并发编程之线程池介绍了这些。
4.你这个里面的缓存和数据库之间如何保证一致性?就是缓存和数据库更新如何做到事务性?
因为我说了更新完数据库后再更新缓存,所以面试官立即就发现了这个问题。说真的我还真没在这个项目中考虑到这个问题,面试官就说你有没有好的实现思路。然后提醒了我,让缓存失效,这样用户查询的第一次会打到db,然后存到缓存,保证了一致性。我说这对db造成了一定的压力(只能这样安慰一下自己……)。
5.如过用户恶意请求不存在的商品,每次都会打到db,如何解决?
其实这是个缓存穿透的问题,我开始没理解,就说限制同一ip一定时间的访问频率。面试官说我伪造不同的ip,我说限流,面试官说不是这个问题,这样正常用户的请求也被限制了。我恍然大悟,就说缓存全量数据(其实应该说是布隆过滤器),面试官问还有没有其他的思路,在我思考的时候面试官提示第一次查是不是查不出来,我说对,然后这时候存不存缓存,我又恍然大悟,我说存!value为null,这样下次再查直接就返回null,后续的请求就不会打到db了。
ps:如果恶意请求每次都用不同的不存在商品,这种思路就无法解决了……还可能让正常缓存数据失效
6.分布式事务怎么实现的?如何解决重复消费问题?
同一面
7.订单中是不是包含很多商家的商品,合并支付的吗?支持分批退货吗?
支付我们还没有做,退货需要人工介入(我从业务角度解释了为什么要人工介入)
8.用户查询历史订单,那历史订单属于用户域还是订单域?
因为我写到了DDD思想,所以被问了这个,这个我回答的不是很好。。。
9.平时会学习其他的知识吗?
我说会看优秀的社区,学习心得技术架构,比如springboot、docker、微服务等
10.你项目是springboot,服务之间如何通信?
我说用了阿里的dubbo,面试官问如何配置,我说了下手动配置文件巴拉巴拉……然后说到用了zookeeper,扯了一会注册中心和微服务一些技术点(说的比较浅,面试官也没深问)
11.用过或者了解什么设计模式?
单例、动态代理、builder模式。说下builder模式、单例模式……我解释了一下
12.看到上个面试官问你sleep和wait区别了,你有没有再研究下?
这个问题我确实研究过了,但是当时脑抽了,回答错了,我居然还坚信自己是对的,在这里纠结了好久,事后想想面试官估计也很无奈,如果我没过肯定是因为和这个问题啊!(表示现在这个问题我已经彻底搞清楚了……)
13.让你实现一个生产者消费者模型你怎么实现?
我说借助阻塞队列,说了下LinkedBlockingQueue。
(还有两种方式,一个是使用object自带的wait、notify机制,一个是使用lock、condition的await、singal机制)
然后面试官说,时间不早了,辛苦了,就到这吧。我连说辛苦你啦,谢谢谢谢!
总结:二面很巧,又是面了54分钟,主要问题还是项目细节。感觉几个问题其实可以回答的更好的,可能因为面试官很厉害,我有些紧张。最坑的是自己sleep和wait说错了,哎 ,希望自己能过吧……
写这篇博客的时候是4.16号,距离阿里二面已经过去将近一个月了,官网状态还是面试中,在其他论坛上看到很多面试天猫部门的都是这个情况,不知道到是因为部门太忙了还是已经被备胎了……总之,等待吧,有后续结果我会更新……
一直都听说网易挺难进的,但是对网易一直充满了热爱,笔试算法题没有完全ac,但是还是收到了面试邀请。当时非常激动,4.14号要去杭州现场面试,果断订了票,去见识一下杭州,见识一下猪厂 0.0。到猪厂先去大厅签到,然后微信叫号安排你去面试,一面二面结果前台会告诉过没过,没过的可以直接溜了,整体效率非常高~
1.说下项目如何设计的
我画一个架构图,宏观讲解了一下
2.你项目里面用了RPC,说下RPC通信原理
我简单说了下什么是RPC,然后说了自己用的是dubbo,服务注册发现用的zookeeper
3.说下zk的原理
我对zk原理不是很理解,就挑了持久节点、临时节点、心跳机制说了下。
面试官在此基础又问我如果让你设计一个RPC应该怎么设计?
socket通信,反射机制等……面试官在我回答的过程中一直引导我,非常nice,赞!
4.假如你项目接口老了,添加新接口怎么不影响老接口?
适配器模式
5.RPC还涉及动态代理,说下你理解的动态代理
jdk动态代理基于接口实现,实现InvocationHandler……巴拉巴拉
cglib动态代理基于继承实现,实现MethodIntercepter……巴拉巴拉
6.看你项目用到了线程池,说下怎么用的
这个我是针对项目说的,不具参考意义。然后面试官问我假如你这100个任务要全部执行完才能继续,有任务失败就要全部结束/取消 你怎么实现?
我答使用CountdownLatch,设置100然后使用countDown方法和await等待。面试官说ok,你这个可以,那么用future能不能实现?我思考了一下,用future数组获得所有任务执行结果,然后去判断任务执行有没有失败,貌似是可以的啊,面试官为啥要这么问呢?(表示给天秤座的我跪了,总是会多想一步)我说可以吧,需要判断一下每个任务执行结果,面试官一笑,说ok。
8.项目里面要分表怎么实现?
我说了离散分片、连续分片两种方式,连续分片容易产生热点数据问题。我打算用离散分片。
离散分片如何实现?
基于商品id哈希取模
那如果一个商家要查询自己所有的产品就涉及到跨表操作了?
我说id可以基于商家名+唯一随机值生成,hash时候商家名保留,保证同一个商家产品在一个表里
那么什么情况下适合离散分片?
我回答分片id唯一且之间不存在联系的情况下。(这个是根据上面面试官问的说的,不知道对不对)
9.离散分片在拓展的时候需要重新hash,如何减少这里面的影响?
其实就是一致性hash算法,我详细给面试官讲了下。大家可以参考我的这篇博客:从redis源码看一致性hash算法
总结:一面小哥哥长得特别帅,说话温柔,我这一个大老爷们差点沉沦23333
一面大部分就是从项目里面找问题,然后问如何解决。
二面我现在还瑟瑟发抖,一直觉得是不是压力面啊,面试官内功深厚且全程严肃脸(偶尔被我的回答逗笑0.0)
1.你觉得自己的优势是什么?你最擅长什么?
(我:黑人问号???)
说了自己对web开发很熟悉,简历上写的都很熟悉
2.你没说出重点,你这个项目架构很普遍啊,有什么优势啊?(轻蔑笑)
我是微服务架构,我说了下架构思路,所有系统都支持横向拓展。面试官先生眉头一皱~我发现事情并不简单……
3.架构你主要关注什么?
我主要关注高可用、高可拓展
就这个吗?为什么这么考虑?还有高性能、高可靠等等等等都不考虑吗?(轻蔑笑)
(心理活动:不是说主要关注什么呢?难道我理解错啦?)
实际回答:对对,这些都是要关注的
4.未来准备怎么发展?
我说了最近在看spring clould、netty,然后说了下。未来会学习架构方面,未来往架构师进阶。
那你说下spring clould讲的什么?
我巴拉巴拉,主要就是提供服务治理、服务熔断、服务监控、链路监控一整套的微服务框架方案。
5.对全栈工程师什么看法
(我:黑人问号???)
我说觉得自己未来会努力往这个方面发展。。。
你这个思想不够全面(轻蔑笑)……??
6.说下数据库B+树
我说到一半,被打断然后直接问
7.你用了redis,redis为什么高性能速度快?
我说了基于内存和epoll模型
8.redis和mysql内存模式数据库底层实现的区别,哪个效率高?
这个问题我确实没思路,mysql基于B+树,叶子节点是链表,但是redis内部实现我还真不清楚,二者效率更不知道,不敢乱说,就说自己还没看到这个。
9..说一下epoll
我说画个图吧,说了epoll和select函数的区别,正在讲呢,面试官再次打断说,ok不要再说了,我懂你意思
10..TCP三次握手四次挥手详细过程知道吗,挑一个画个图
我说那我都画一下吧
不用,你随便画一个就行
我就画了三次握手的图
11.知道nagle算法吗?epoll模型和nagle算法之间有什么联系?
我说nagle算法知道,但是二者联系不太了解……
12.对区块链和AI怎么看
见仁见智,我由于上面被打乱思路了,这里面说的比较混乱。0.0
补充下:之间问我熟悉什么,我说了下jvm,面试官问我线程内存模型了,我从jvm内存分配说起(参考:jvm内存分配),依然中途被打断……上面忘记说了
总结:至今还在处在二面阴影下,可能和我面试经历少(网易是我人生第一次现场面试)有关,面试官经验丰富,内功深厚,我在他面前基本“一丝不挂”,面试官思路天马行空,一切都信手拈来。我只好强行稳住阵脚,自己熟悉的问题面试官会打断换另外的问题,然后我的节奏一直是乱的,面试官可能考察的是知识的广度而非深度吧。
本以为二面会挂,结果刚结束二面,喝了杯网易大厅的水(本来觉得既然来也来了,喝杯咖啡吧,无奈被喝光了……),水刚喝完就收到了hr面试通知,我立即跑了过去……
1.自我介绍
2.说下大学到现在的经历
3.平时和别人相比有什么区别
4.剖析下自己(优缺点)
5.有什么爱好
6.职业规划
7.区块链在网易云音乐怎么用?
因为我说了自己平时会关注新的技术,就提到了区块链,然后面试官就问了,我就说在音乐版权保护方面可以用。
9.琐碎问题忘记了
总结:网易面试结果7-10日公布,所以我还在等待,总之面试过程中也知道了自己的不足和与前辈们的差距,记录一下,好好学习。有结果会第一时间更新。
(吐槽下杭州的交通确实非常不方便,亲身感受到了)