算算本身大概面试了近十家公司,也拿到了几个Offer,如今面试告一段落,简单总结下面试经验。程序员
我如今主要的方向是Java服务端开发,把遇到的问题和你们分享一下,也谈谈关于技术人员如何有方向的提升本身,作到有的放矢。面试
面试遇到的问题算法
百度sql
百度面了两次,分别是百度糯米和金融事业部,百度目前只有这两个部门的招聘岗位和我比较匹配。面试都在西二旗的百度新总部,园区还在施工,离地铁也比较远,须要打车过去。数据库
面试官自带电脑,整个面试过程都在记录,首先详细询问了最近一份工做项目的架构和工做内容,面试主要围绕工做中用到的组件和中间件技术来扩展,考察掌握程度。编程
MySQL InnoDB存储的文件结构设计模式
索引树是如何维护的?数组
数据库自增主键可能的问题缓存
Redis的并发竞争问题如何解决安全
了解Redis事务的CAS操做吗
分析线程池的实现原理和线程的调度过程
动态代理的几种方式
Spring AOP与IOC的实现
为何CGlib方式能够对接口实现代理?RMI与代理模式
Dubbo的底层实现原理和机制
描述一个服务从发布到被消费的详细过程
算法方面考察了一个简单的数组就地去重问题,用丢弃数组尾部元素的方式实现了。
百度金融的面试安排在了周六,一面面试官很赞,态度认真,有些问题没有思路会给你提示,交流的不错,
二面被告知缺乏金融支付背景,不过做为一名工做不到两年的新人,我以为被Pass主要缘由应该是工做经验比较少,教育背景也不太亮眼。
面试中的问题:
分布式系统怎么作服务治理
接口的幂等性的概念
Maven出现版本冲突如何解决
JVM垃圾回收机制,什么时候触发MinorGC等操做
新生代和老生代的内存回收策略
Eden和Survivor的比例分配等
Synchronized和Lock的区别
两次面试,感受百度的流程比较严格,面试官挺不错的,简单可信赖
阿里巴巴
阿里的面试安排的很快,此次止步二面,两轮面试都是电面。听朋友说阿里五轮面试,四轮技术一轮HR,技术面试是部门的几个同事交叉面试,也有了了解。
一面整体上仍是围绕项目架构、Java基础、JVM、并发编程、数据库操做、中间件技术和Dubbo服务治理框架等展开,可能由于是云安所有门,有一半时间在考察JVM,还提问了一些编译优化的知识,一面结束后很快安排了二面,相对一面,二面的问题更深刻,问题比较刨根问底,更加注重对一些技术细节的理解和把握。
好比数据库操做,面试官会详细的问你数据库插入和删除一条数据的过程在底层是如何执行的,项目里配置了读写分离,也会比较深刻的就实现方法和底层逻辑展开讨论。
一些值得记录的问题:
JVM内存分代,
Java 8的内存分代改进
深刻分析了Classloader,双亲委派机制
JVM的编译优化
对Java内存模型的理解,以及其在并发中的应用
指令重排序,内存栅栏等
HashMap的并发问题
了解LinkedHashMap的应用吗
在工做中遇到过哪些设计模式,是如何应用的
因为阿里杭州目前社招都是P6起,自我感受和岗位要求有差距,二面在电话里和面试官交流了,没有再参加后面的面试。
两次面试,阿里给我留下的印象很好,面试官都是大牛,面试结束后次日,收到了阿里的邮件拒信,点赞。
阿里的岗位大都在杭州,面试结束特地关注了一下那边的生活成本,目前杭州房子均价不到两万,相比浙江一些县市的房价都破两万,杭州的房价应该比较正常。
若是拿到阿里和网易等几家互联网公司的高薪,买房和生活的确比北京要轻松不少,果断决定再沉淀一段时间,两年后P7再战。
优酷土豆
优酷的面试都是二对一,每轮面试两个面试官,一面比较顺利,主要是Java基础,Spring原理,JavaNIO,并发和集合框架等,多是由于视频网站,优酷考察网络原理的知识多,好比TCP/IP协议、长链接与短链接等。
一面提到了本身可能会在下半年学习大数据与机器学习相关的知识,二面就在这上面栽了跟头,问了不少海量数据的问题。
TCP/IP协议
长链接与短链接
mapreduce过程
多路归并的时间复杂度
海量url去重类问题
Java NIO使用
倒排索引的原理
对分词技术的了解
面试中给了一个具体场景,考察对MapReduce过程的理解,好比Map阶段和Reduce阶段是如何进行的等,Reduce阶段面试官但愿分析给出一个多路归并的时间复杂度,用外排序的知识简单分析了一下,回答的不太好。
回来之后搜索了胜者树和败者树的优化,发现这里面的内容还挺多,深入体会到有些知识点若是平时掌握的不够全面深入,很难信手拈来。
搜狐新闻
搜狐面试等待时间比较长。
作了笔试题,一面是个和我年纪相仿的面试官,针对笔试和简历提问了一些基础问题,聊得挺投机,二面技术经理就比较偏架构和中间件的应用,提问了项目,主要考察了服务治理和消息队列等中间件使用的问题,
消息中间件如何解决消息丢失问题
Dubbo的服务请求失败怎么处理
重连机制会不会形成错误
对分布式事务的理解
深刻分析几个设计模式
面试最后提问了一个不定长字符串转为定长字符串的问题,刚刚面过优酷,这个简单的问题被我想复杂了,没有Get到面试官的点,考虑了惟一性,性能等,扯了一大堆。
也提醒一下你们,面试过程当中要保持清醒,不要有思惟定式,除非是底层研发岗位,社招对算法的考察不会特别难,用正常的思路去解决就能够。
其余
值得一提的是一家创业公司的面试,过程十分简单粗暴。
没有自我介绍,面试官看完简历就在白板上提了一个多线程调度问题,递过来MAC就开始敲代码。写完之后我表示这题目意义不大,问了Redis,要求十五分钟实现一个LRUCache,再次现场写代码。
写到一半面试官看没问题就打断了,问对公司有什么想了解的,等了一会让我回去了,就这么被Pass,创业公司效率果真高(此处/dog脸)。
面试中要保持清醒,好比被问到十万个ip段查找这个问题,首先是一个典型的查找问题,明确了这个,就能够针对性的选择相关的算法实现,如二分查找、二叉查找树等。
推荐画图表达的方式。
作过的项目架构,各类框架和中间件的设计实现,经过画图的方式均可以很好的阐述,能够随身带着纸和笔,面试原本就是一次很好的学习过程,一些问题也能够记录下来。
通常来讲,面试过程相似一个寻路算法,交流过程当中若是提到了面试官感兴趣的某一点,就会就这个点展开,而后一直提出问题到你不能回答为止,或者你特别牛在这个领域直接秒杀面试官,这样一条路线走通,再换下一条路线。
程序员如何提升技术水平
相比程序员,我更喜欢攻城狮这个名字,程序员在不了解这个行业的人眼里已经被贴上了各类标签,诸如各类宅,不修边幅,其实写代码真的是高端大气上档次好吗?
仍是聊工(cheng)程(xu)狮(yuan)如何有针对性的提升技术水平,进入目标公司。
通常来讲,主流互联网公司都在用的就是业内比较成熟和流行的技术,最简单的方式就是看招聘要求,虽然大部分公司的Job Description都有抄袭的嫌疑,可是多比较几个招聘,仍是能够了解主流互联网公司的技术方向。
仍是拿熟悉的Java服务端业务开发来讲明,从拉勾上找几个招聘:
百度核心业务部门:
阿里巴巴:
美团酒店事业部:
既然是社招,必定的工做经验是必须的,三年以上最好,上面的几个JD里也体现了。因此若是想去大公司我的建议,在小公司积累2-3年经验而后开始跳槽。
建议
1.基础知识必需要扎实,包括语言基础,计算机基础,算法和基本的Linux运维等
针对Java语言,须要对集合类,并发包,IO/NIO,JVM,内存模型,泛型,异常,反射等都有比较深刻的了解,最好是学习过部分源码。
这些知识点都是相通的,在面试中也能够体现,好比集合类的HashMap,从源码的角度,能够深刻到哈希表的实现,拉链法之外的哈希碰撞解决方法,如何平衡内部数组保证哈希表的性能不会降低等;
从线程安全的角度能够扩展到HashTable、ConcurrentHashMap等其余的数据结构,能够比较两种不一样的加锁方式,RetreenLock的实现和应用,继续深刻能够考察Java内存模型,Volitale原语,内存栅栏等;
横向扩展能够考察有序的Map结构如TreeMap、LinkedHashMap,继而考察红黑树,LRU缓存,HashMap的排序等知识。
Java方向的中高级职位,会比较重视对虚拟机的掌握,诸如类加载机制,内存模型等,这些在程序的优化和并发编程中都很是重要。
算法方面,基本的排序和查找算法,对递归,分治等思想的掌握。若是算法基础不太好,推荐《编程珠玑》等,每一章都很经典。
另外计算机基础,好比TCP/IP协议和操做系统的知识也是必备的,这些都是大学计算机专业的基础课,也是作开发基本的素养。
2.设计模式,造轮子的能力,各类缓存和数据库应用,缓存,中间件技术,高并发和高可用的分布式系统设计
大型互联网公司天天要面对海量的请求,都会考察分布式系统的架构和设计,如何构建高并发高可用的系统,另外由于用户基数比较大,一个细微的优化可能会给带来很大的收益,因此对一些技术栈的掌握要求都比较深刻。
好比对MySQL数据库,须要知道相关的配置和优化,业务上来之后如何分库分表,如何合理的配置缓存,一个经验丰富的服务端开发人员,也应该是一个称职的DBA。
对经常使用的开发组件,好比中间件,RPC框架等都要有必定的了解,虽然工做中可能用不到咱们本身造轮子,可是掌握原理才会驾轻就熟。
这部分知识主要靠工做积累,推荐《大型网站技术架构与Java中间件实践》,还有曾贤杰的《大型网站系统架构与实践》,里面对大型网站的演变,服务治理和中间件的使用作了很详细的阐述。
做为业务开发人员,有必要了解压力测试相关的指标,好比QPS,用户平均等待时间等,能够帮助你更好的了解本身的系统。
3.软性指标,包括快速学习,良好的沟通能力,以及对相关行业的了解
公司招聘会比较看重一我的的学习能力,是否是值得培养,不少公司校招的毕业生薪资会倒挂工做多年的老员工,也是这样。
像沟通习惯,逻辑分析能力,这些都属于软实力,短期内很难提升,须要长期的养成和持续不断的投入。
好多公司还会看重所在行业,虽然是作业务,可是对产品和行业的了解也很重要。
好比互联网金融类公司的岗位,若是有过支付和银行相关的系统开发经验确定会有加分,这点和每一个人的长期规划有关。
有了方向,接下来就是如何提升,说一些本身的感想。
不少时候,除非你的工做内容就是要应对高并发,海量用户等场景,不然经过加班或者说重复性的工做,其实很难有提升。
技术人员最直接的提升方式,仍是须要跳出来,在工做之外审视本身,好比普遍的阅读技术书籍,多去论坛和各路牛人交流,了解主流互联网公司的技术栈,有针对性的去学习和了解。
同时也能够适当的了解一些产品或者设计的知识,以点带面,复合人才确定更受欢迎,对待面试,要像和妹子约会同样,表现本身日常的一面就能够了。
代码改变世界,要早日成为明日大牛,程序员肩上的担子但是很重啊,共勉。
欢迎工做一到五年的Java工程师朋友们加入Java高级架构:706315665群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用本身每一分每一秒的时间来学习提高本身,不要再用"没有时间“来掩饰本身思想上的懒惰!趁年轻,使劲拼,给将来的本身一个交代!