因为一些外在和个人原因,犹豫大半年后,笔者从58到家离职,从6月10日提出离职到7月10日滚蛋,将近有1个月时间在工作、面试、选择中度过,期间养成了写博客做笔记的总结习惯。现在新工作定下来,也是时候对这段时间面试经历做一次总结(笔者是做JAVA开发,面试也是JAVA开发岗位)。
面试的公司:未来汽车(NIO)、老虎证券、京东、滴滴、阿里、WiFi万能钥匙、美团
笔者工作经历:
2011.07从北京交通大学 软件工程毕业
2011.07-2014.12 NEC:专注中间件ESB JERSEY WSRM等的开发
2015.01-2017.07 58到家 :负责到家商家结算系统、速运交易系统、司机运营体系、速运发券系统
这几年的经历一直是按部就班,心得:一定要选对方向,跟对人。
还是说下面试的过程吧。
NIO(未来汽车,猎头介绍):是家做电动汽车的创业公司,去之前已经A轮,据说百度、腾讯、汽车之家创始人李响等投资,估值不小,入职后有8000期权(个人觉得期权太虚了,鸡肋)。
面试过程(3轮技术,1轮HR):早上10点到,10点15开始面试第一轮面试(面试官A),A面试官一来就让自我介绍:“11年校招去了NEC,做中间件...15年开始在到家做资金池,项目使用dubbo做分布式框架,redis做缓存。。。”,巴啦巴拉,项目介绍和技术实践描述下来尽量让面试官了解自己;A面试官接下来问JAVA知识:线程池实现原理(参看JUC中ThreadPoolExecutor的实现,大佬Doug Lea的杰作)、volatile具体作用(1.可见性,2 禁止指令重排,面试官反感背书,最好举例子说明下为什么禁止指令重排), HashMap的实现原理(也是大神Doug Lea,注意下JDK1.7和1.8的有很大区别,JDK1.7是数组+链表,JDK1.8是数组+链表+红黑树实现)、垃圾回收算法(标记-清除,标记-整理,复制三种算法,千万不要背书);接下来是数据库:4种事务隔离级别(要理解,最好结合spring实践下);算法:折半查找(从一堆有序数中确定某个数的位置),二叉树反转。
二轮:B面试官开场也是让自我介绍,问了垃圾回收器算法,反射( 如何变更一个没有set方法的实例的属性值,答得不好,知道spring中有一个 reflectiontestutils.setfield方法可以实现) ,MQ基本实现(生产者通过长连接如何和broker之间如何产生关联,找到最佳节点,broker集群是如何保证不丢消息,消费者以何种方式平均消费 );数据库:分库分表(水平拆分、垂直拆分,框架有阿里的corba,当当sharding-jdbc)、事务的隔离级别(unread commit,read commit,repeable,serial);算法:从多个有序数组中找出前100大数字(一开始想到的是merge算法,面试后想想可以用堆排序算法)
三轮:前2轮面了大概2个半小时,第三轮是boss面 ,主要问了秒杀系统如何实现(思路:从数据一致性(redis.setnx()和乐观锁)和限流(使用MQ,nignx,tomcat,程序做好限流))着手;之后,面试官介绍了他们的业务。这一过程大概40分钟,和前面2轮加起来有3个半小时的时间,boss给我感觉沟通能力差(这是我拒绝他们家offer的主要原因)。
小结:这是我面试第一家,问的东西还挺全也很难,幸亏有基础,也准备充分,最终还是很遗憾拒掉了他们家的offer。
老虎证券:一家小公司,主要是证券交易,据说美股的交易是在中国做的最好的,在boss直聘上跟我勾搭上,面试 约在下午2点,当时天气潮湿燥热,加上笔者是个路痴, 迟到半小时,进行了2轮面试。
一轮(A面试官):A面试官来让说项目经历(感觉自己快成复读机了),问了线程池的实现原理,数据库的事务隔离级别,垃圾回收器,算法:证券交易网站上排序(按照涨幅,成交量等顺序进行排序,个人给出的方案是先按照涨幅进行排序,标识权重,对相同权重的项目按照成交量进行排序...如此类推。
二轮(B面试官):说项目经历(复读机啊),垃圾回收的算法,zookeeper的实现原理(悲剧啊,面试官你大爷啊, paxos算法至今也没看懂)和实践(dubbo注册中心,部署多个定时任务使用zookeeper的分布式锁防止并发),redis缓存淘汰使用算法LRU实现(MD又悲剧了,不知道),证券交易中如何找到最佳的买进点和卖出点,实现最优的收益(勉强答上来,时间花了20分钟)
结果当然是没有结果,心得就是面试要端正态度,面试要认真,准备要充分。
京东:部门是虚拟平台,主要是做电费,水费,冲话费等虚拟物品买卖,面试了2轮(第3轮没去面试,感觉地方太远,技术和业务不感兴趣,拒绝了)
1轮(A面试):介绍项目经历(复读机啊复读机) ,也许是临到饭点,我前面的项目介绍花了很多时间(项目介绍中途被打断了,汗颜啊),简单问了多线程有没有用过,HashMap和HashTable的区别,是不是使用mysql.然后就没有然后了,开始二轮面试。
2轮(B面试):面试官自我介绍是京东的架构师,问了dubbo的实现原理,dubbo的优缺点,数据库的事务隔离级别,技术解决方案问了:上游业务处理后,可能有上千万的数据,每个数据需要进行n步处理,平均每次处理耗时在1s左右,如何设计这个系统,回答:定时任务扫描数据库( 还可以像从库一样读取binglog),将读取的数据发送给MQ,多个系统订阅MQ进行消息处理数据,MQ的ACK机制保证处理失败能再次处理。
2轮后将近12点30半,因为是京东6.18活动的结束后的第四天。3轮面试官在现场处理问题,要下午才有时间,笔者有其他安排约改天,后面自然没去。
滴滴:早上面试完京东,下午去面试滴滴,一南一北,横穿了大半个北京,午饭也没吃好,本来约在2点面试,结果迟到30分钟。面试的部门是QA(我嚓,看到面试介绍的时候,其实我内心是拒绝的),主要做全链路压测,模拟线上环境,链路追踪(如到家的守望者,Google Dapper),问题追踪,技术上还是挺吸引人的。面试了3轮。
1轮(面试官A):简单的自我介绍,问了JAVA的基础,Java的基本类型有哪些(8种基本类型),String类为什么是final,包装类型和解包装类型的比较(Integer a=100,Integer b=100,a==b是什么(结果当然是true);Integer a=new Integer (100),Integer b=new Integer(100), a==b是什么(结果当然是false);Integer a=1000,Integer b=1000,a==b是什么(答案是false,因为Integer类使用缓存池,-128-127中数字使用中会被缓存起来,超过后需要new对象)),ThreadLocal使用场景(如果回答上来,就会问如果对外暴露1个API,API实现需要调用很多独立服务,然后汇总起来,这些独立的服务使用ThreadLocal存放数据,主线程和子线程怎么读取ThreadLocal),算法1.将无序数据排列成有序数组,算法2:提供一个临时变量,怎么将一个栈反转过来(要求o(n),解题思路递归,将复杂问题简单化)
2轮(面试官B):简单自我介绍,volatile的原理,数据库事务隔离级别,线程池,dubbo的实现原理,分库分表的路由规则 算法:不记得了,记得很难
3轮(面试官):boss面试,项目介绍,问了并发量大概有几百兆,设计一个实时统计功能,要求找出最大那个,性能在1毫秒以内,调用方并发在百万上(主要考察对redis的集群,incr,set的使用),算法:有一个先升序后降序的数组,找出最大的数的位置。(部分面试题不记得了,问的还挺深的)
小结:滴滴的面试注重基础和算法(时间久远,上面的面试中有2个算法题忘记了,以后记得在补充吧),框架问得少,面试要主动多说。
阿里:面试还挺曲折的,杭州的面试官电话面试了6轮(4轮电话+1轮视频+1轮HR面试,每次至少4分钟),业务主要是做淘宝 天猫的商家业务,如管理购买商家商品用户积分,商家刷单管理,商家促销等等。
简单说下,按照阿里流程,第一轮通常是电话摸底,主要问:JVM中JMM 垃圾回收,HashMap的实现,volatile的2种作用。
第二轮:dubbo的实现原理(分层处理,有多少层,负载算法是如何实现的),currentHashMap的实现原理,垃圾回收(阿里很注重JVM,面试必考);数据库的隔离级别,索引原理。
第三轮:不出意外还会问JVM,不过会问项目使用什么垃圾回收器,有没有JVM的调优过;classLoader的原理,JVM中classLoader有几层,分层的意义是什么,osgi的原理;JMM,锁的实现机制(Syn和可重入锁的区别:Syn基于monitorEnter和monitorExit指令,线程在争夺对象的控制权限时若对象monitor的记录数是0可争夺,否则对象monitor计数器加1,线程放弃对象monitor控制则记录数减一,Syn只能实现非公平锁,执行中不能主动中断;可重入锁,基于AQS实现,在执行中中断,可实现非公平锁和公平锁)
第四轮:和前面3轮一样,问的更细,锁机制(偏向锁,轻量级锁,锁),Hash一致性(平衡性,单调性,分散性,负载性,实现是虚拟环实现),MQ的实现原理,分表的规则;数据库调优,数据库中锁的实现机制,大分页问题;使用过哪些设计模式
第五轮:视频面试,idea上写出单例模式和2个线程交替打出1,2,3,4,5,6,7,8....1000(非常注重变量命名,方法的名称)
第六轮:HR面试,强势的HR,批的我体无完肤。
小结:阿里的面试,应该是距离太远没有具体问算法,也可能面试官觉得没有必要问,注重JVM和框架的研究以及代码实践能力。
美团:同时面试了2个部门,应该是他们招聘系统有问题吧,第二个部门在技术3面的时候要求拒掉第一个部门的offer(哥们太耿直了,不该说有部门也在面试我)。具体啥业务就不说了。流程差不多,问题也差不多。
第一轮:简单自我介绍,主要考察项目经验和系统架构能力:要求画出自己拿得出手的项目的上下游系统,时序图。数据库:用户下单的程序存在问题,产生了重复数据,要求写出保留时间最新的数据删除多余的数据的sql。算法:1个单向链表,提供3个临时变量,要求求出链表的长度(感觉面试官题目出错了,思路:使用了1个临时变量执行链表的头,临时变量的next的不为null,计数器加1,变量的next赋值给临时变量,如此求出链表长度)
第2轮:自我介绍,dubbo的实现原理,估计美团有题库吧,按着题库问,然后打分(1.线程池的实现原理 2.HashMap在多线程情况下会发生什么(回答:线程不安全,可能发生死锁造成性能低下)3.mysql的引擎有哪些,innodb和myisam有什么区别 3.分布式事务中2段提交分别指什么 ,jta了解过吗 4.Syn和可重入锁区别是什么 5.mysql的bingLog原理是什么,主从如何实现数据同步,如何选择:是多主多从,还是1主多从 6.分库分表有几种方式 7.数据库调优(索引不生效举例,如何诊断)8.数据索引的实现原理是什么(B+树,hash) 9,数据库锁的实现机制是什么 10.redis的存储结构是什么)。
算法1:1.将数字转化成汉字(如1001,一千零一), 思路:将对应每位的单位存下来("",“十”,“百”,“千”,“万” ,”十”,“百”,“千”,“万”...),逐一读取要数字,读取的数如非0时找到对应的数字(如2,读取二),然后找到单位(("",“十”,“百”,“千”,“万” ,”十”,“百”,“千”,“万”...),关键点在读取到0时要注意零的读取,如101对应一百零一,101001对应十万零一千零一。
算法2:将一个2维数组,从外层向里层逐一打印 思路:循环(横向打印(向右),竖向打印(向下),横向打印(向左),竖向打印(向上),标记打印的层数,下次如此打印时横向和竖向要比前一个少打印2个),直到标记的层数大于或等于数组的高度时终止。
算法3:如下图,可以扫描到图中柱子的的长度和高度以及坐标,求出阴影面积。解题思路:找出最大的高度的元素E1,得出面积减去该元素的之前柱子的面积得到面积A1,在该元素后面的数据中找到最高的元素E2,求出E1和E2之间的阴影面积A2,。。。如此类推,得到阴影面积A1+A2+A3。。。
3轮:boss面试,怎么合理安排任务,面试中使用开发方式(瀑布还是敏捷),都使用哪些设计模式,如果是负责人,你会关心哪些点(回答:需求拆分,大概排期,设计,设计评审,详细排期,进度(晨会和项目站会,邮件),代码质量(sonar可看出),单元测试,上线后项目质量,项目总结)
小结:全方位考察面试者的技术、沟通、管理能力,个人感觉美团技术氛围不错
自己也看了不少书:《深入理解Java虚拟机》 《Netty权威指南》 《重构与模式》《图解Http协议》
《Redis实践》《图解tcp/ip》《整洁代码之道》《数据结构与算法分析》
网友评论
推荐下,分库分表中间件 Sharding-JDBC 源码解析 17 篇:http://www.yunai.me/categories/Sharding-JDBC/?jianshu&401