非科班Java程序员的学习过程和社招经历总结
个人发展目标首先我觉得个人今后想做什么方向也是比较重要的,除了数据结构常用算法、操作系统、网络、数据库这些常用基础外,国内互联网公司基本上虽然说刷题也是必须的,但光刷题肯定是不够的,多少还是有方向重点的。虽然说后端语言不是关键,要转也问题不大,但是毕竟时间有限,又要去把c++的stl源码看一遍再搞懂虚函数模板啥的再看看Linux主要系统调用接口,又要去把Java的常用集合跟多线程源码看一遍再看..
个人发展目标
首先我觉得个人今后想做什么方向也是比较重要的,除了数据结构常用算法、操作系统、网络、数据库这些常用基础外,国内互联网公司基本上虽然说刷题也是必须的,但光刷题肯定是不够的,多少还是有方向重点的。虽然说后端语言不是关键,要转也问题不大,但是毕竟时间有限,又要去把c++的stl源码看一遍再搞懂虚函数模板啥的再看看Linux主要系统调用接口,又要去把Java的常用集合跟多线程源码看一遍再看虚拟机,或者还要去看看go的协程是怎么回事估摸是来不及的。所以还是只能先找一个侧重点,以我个人来说的话,个人虽然是纯正的非科班完全不相关专业出身,但是对于并发和性能问题、中间件、基础架构这些东西有迷之执着,所以我个人在求职方向上比较侧重于中间件、基础平台方向。语言的话Java为主(其实基本上也只会这个,C++连入门都称不上,也就是能刷题的程度),事实上除了头条后端是没有指定也没问语言之外,其他公司都会问Java基础、多线程、JVM这些问题,猜测这也是老有人问C++/Java/php/python/go学哪个好的原因。
人数学或者ee数学和编程水平都至少够用以上去做算法那叫理论转实际应用,咱天坑及其衍生专业对自己数理水平没点索引树?先老实点把编程基础打好,有了做前后端、移动端的水平,本身数理能力还没有荒废又有余力的再尝试去做算法才是正途,不然矩阵论、高代啥的不跟看天书一样吗。也别觉得我XX名校出身,要不是当初选了个YY专业,我早就ZZ了。现在的情况就是,如果要做算法,因为坑位有限,萝卜却很多,竞争对手会是同等院校科班生甚至其中的保送生或者ACM获奖选手,这时候我不禁想说配钥匙的段子。
学习内容和面试常问点
因为每个面试官和面试者的具体情况不同,即使是同家公司同个部门方向也会有很多种考察方法,加上我没有及时整理记录,所以具体哪家公司的面经已经整不出来了。不过,这些基础内容终究大同小异,后端开发真正差别很大的估计是实际生产中遇到的花式问题的不同人不同的解决方法。具体每家可能有些侧重点,直接去牛客网之类的找下面经回忆吧。数据结构和算法很多都会现场撕题,所以至少中等难度的题要能自己写出来,最好是可以不借助IDE,有些视频面直接在网页上敲也不能debug。另外,头条面试撕的题目明显比其他的难,而且我面的两轮都有,听说是校招、社招初中级都是每轮要现场写的。
1.Java基础
各类常用集合(List, Map, Set, Queue, Stack)的主要实现类。
多线程部分,包括线程、线程池、原子类、阻塞队列、ConcurrentHashMap、ThreadLocal。
IO流和字符串,基本数据类型,装修拆箱。
推荐书籍,有C/C++或者其他面向对象语言基础的话Java编程思想。其他的话还是建议直接看JDK源码,在熟悉原理实现的过程中,练习如何看源码。
2.JVM和多线程相关
Java内存模型就是线程工作内存和主内存那张图,JVM内存模型。加锁的原理,内存可见性,volatile关键字和线程安全问题,CAS的原理,垃圾收集算法和常用收集器特别是CMS和G1。类加载过程,双亲委派的原理,热加载是怎么回事。动态代理,Proxy和CGLIB的区别。对象的内存布局和初始化的过程。一些查错的工具和命令,还有就是系统load factor或者CPU使用率过高,还有OOM、死锁、死循环怎么排查问题之类的,以及一些参数的作用。
必看书籍那两本:深入理解Java虚拟机和Java并发编程实战。其实关于这两本书,非常明显的感觉是自己做过的东西和掌握的知识程度直接关系到对这两本书上内容的认知,时间往回推半年的时候我完全看不懂。很简单的道理,都没有自己new Thread去处理过线程可见性和安全性问题,看天书是理所当然的。
3.数据库
也就是MySQL了,除了基本查询语句外,常问内容innodb和myisam的区别,包括B+树和B树的区别、原理,为什么用B+树,它跟操作系统的关联还有最左匹配原则。聚簇索引、覆盖索引和全文索引分别是什么。事务级别和幻读、脏读,各类锁的使用场景。主从库的同步方法和存在的问题还有相关一些中间件有没了解过。
入门书籍都差不多随便找本吧,入门之后推荐高性能MySQL
4.SSM框架
spring的话IOC和AOP的基本原理和有点是肯定要问的,spring scope,还有容器中bean的初始化和销毁顺序,以及bean的级别,BeanFactory和ApplicationContext各自的特点。还有一些衍生问题,比如两种动态代理方法各自使用场景,循环依赖之类的。
MVC模型其实问的不多,我被问到过一个后端接到请求到返回在各层之间是什么流程。
Mybatis印象中只有问到过查询分页,还有GitPage的分页是怎么实现的。其他的话了解下Spring的数据块事务是怎么回事。
书籍的话,Spring实战当操作手册还不错,不过我没看完,主要还是有需要的时候直接去网上找比较多。
5.操作系统和网络
反正Linux基本操作是肯定要知道的,被问到最多的就是top命令各个数据是什么意思,特别是load factor,以及epoll调度模型。还有IO和CPU密集型任务的处理方法。常见网路错误,TCP协议,HTTP报文等等。
这个书籍就多了,TCP/IP详解,鸟哥Linux私房菜,高级Unix编程。。。
6.缓存、分布式和微服务
接下来这部分属于非常扯淡的互联网公司很喜欢问,偏偏除了这类公司外基本用不到,反正我之前在某行IT部门是没用过下面讲的任何一个,俗称“面试造火箭,上班拧螺丝”,当然有些还是应该在一定规模的互联网公司工作中能用到的。
Redis的5种数据类型,常用操作,主从结构和复制方法,单线程复用模型,分布式锁的实现和超时锁的预防处理,持久化方法与各自的优点和使用场景。
微服务是什么,dubbo的基本架构,rpc的原理。然后肯定会说netty,那么要了解netty的线程模型和BIO NIO AIO、零拷贝原理,粘包的处理方式,直接内存。然后肯定要谈注册中心zookeeper是干吗的,怎么暴露服务,怎么订阅,怎么调用。如果注册中心挂了怎么办,为什么最多可以容忍不超过剩余台数机器挂掉,为什么集群的机器数是奇数。zookeeper集群的主从不一致问题等等。
消息队列,考虑国内互联网公司的情况特别是面阿里系,一般要了解RocketMQ。包括生产者消费者管理的总体架构,消息持久化的选择,推送还是拉取,分布式事务的分段式提交等。
限流和负载均衡,比如Nginx的常用负载策略,总体限流方法。还有个问题公司负载入口挂了或者压力太大怎么办?根据网上搜索结果,应该是Nginx的master/slave模式+keepalived的高可用架构。guava的漏桶算法和令牌桶算法,消息队列的限流削峰,容器或者Tomcat限制连接数
7.数据结构和算法
刷题是基本功就不多说了,词典树、bitmap、外部排序最好去了解下大致怎么实现。像头条每轮都很喜欢问这些东西,比如说我被问到过LRU怎么实现,我答的是Map+双向链表。
面试本身也是一个反馈交互再改进的过程,永远是会被问出问题的,要注意哪些常问点自己有缺口及时填上。所以不要太早投你的dream,但也别太晚,不然上一个offer都截止了晚的还没出结果,要犹豫要不要拒。总之,别因为面试表现一泡wu而气馁,屡败屡战呗,现在进不去dream以后再努力想办法社招进去嘛。
其他的话,可以多关注一些技术公众号和技术博客,自己最好也要尝试去写,多做输入输出,其实最主要还是帮助自己理解和建议,就像我在面试中基本上集合部分的问题是不需要针对面经去准备的,可以直接答上来。像看源码的话,也可以参考一些别人写的文章,然后顺着思路走一遍来尝试起步。另外设计模式也是需要看一下的。
项目经验
这个因人而异了,每个人能接触到的资源不同,包括但不限于全职或者实习工作经验(特别是互联网大厂)、学校导师跟公司合作的横向、学生工作室或者自己从网上找点demo玩,以上分先后,能给Apache孵化项目做贡献或者自己造成百上千star轮子或者剑指MSRA、HULU之类外企的神仙不在讨论范围内。对于互联网公司开发来说实战经验永远是很大的加分项,这其中又以同类型的互联网公司最占优势。但是,这也有点像循环,上一份工作是非互联网公司,下次跳槽想去互联网特别是大厂就比较费劲,可能比小跳大还困难,不过这个只是我身边工作的同学的比例情况而言。而且社招再跳的时候会薪水议价会受到上份薪水的影响,外加手头恰好没有其他大厂offer或者工作经历的时候对方知道你没有要价筹码(没错就是我)。所以有这个想法的同学抓住校招机会,不然开始工作的两三年要努力学习加积极尝试了,再加上工作强度,年龄越大越不好进而且要顾虑的东西也越多。
公司办的比赛的话,个人参加过阿里中间件性能挑战赛,这个强烈推荐!!!在每年五六月份。最近阿里云搞了个PolarDB的相关比赛,看起来好像也挺有意思的。
个人思考
其实吧,我觉得每个人有自己不同的目标,不是非要去互联网996,人不会永远二十多岁到三十前半。我个人的话,是受学校里一个老师的影响,有两门计算机核心课是他讲的,他上课的时候经常喜欢灌输“对技术有追求又喜欢竞争的同学应该去互联网”吧啦吧啦,恰好我还挺吃这套的,也有想证明自己大幅度转行是正确选择的意味。
关于那个日常话题,读研和本科毕业找工作的问题,每个人都有不同的体验吧,但就我个人观点,上面说的内容和很多导师方向有什么关联吗?没有什么关系。再加上读研主要靠自制力的学习,保持几个月半年不难,那么一年两年呢?所以做开发我站三年互联网公司工作经验优于三年读研。但前提是得进得去啊,所以本科期间有没有抓紧时间做了什么准备很关键,其他学校层次、专业相关性肯定也是影响因素,进不去那就只能读研期间继续学习等下一次实习和校招了。真的刚需硕士文凭、学习时间和实习经历的,名校两年制软院请。但是,算法优化加速、CV、NLP或者KVM、云容器之类的东西还是必须正经读研的,特别专的需要对口博士。
就互联网来说,形势时时在变,去年到今年年初还在相当规模招人的阿里,到现在为止已经挺长一段时间总部大量部门没社招HC了,除了个别新部门和蚂蚁金服等下属集团还在持续招人。没人知道三年后形势如何,就像17年为止算法形势一片大好人人都想去当风口上的猪(没有贬义的意味,钱多下班还早,听起来很高端,我能行我也上),今年不是自身条件很好的校招异常艰难。所以,要时刻准备拥抱变化,同时别过度透支消费力,是吧?
我有一个微信公众号,经常会分享一些Java技术相关的干货;如果你喜欢我的分享,可以用微信搜索“Java团长”或者“javatuanzhang”关注。
更多推荐
所有评论(0)