楼主是19届应届生,去年在牛客学到了很多东西,在实习和秋招也收获了一些offer(Java后端开发工程师)。在20届春招即将开始之际,把整理了很多资料给大家分享一下,顺便打个广告233。
有点标题党,学习Java可能有两年时间,不过春秋招复习加起来大概就花了三个月(但是感觉比之前学的内容加起来都多...)。
复盘
首先要说的我自己肯定不是什么大神,也拿不到一堆ssp,只是想分享给大家,一个不是很聪明的人(我高中是文科生,数学什么的很差),如何能尽自己所能找到一份程序员的工作。
学习历程
大一的时候因为自己学习的专业就业前景一般,并且没有做学术的志向,家境一般很想找份薪资高点的工作,然后知乎一股CS至上的风气让我下了转专业的决心。大一的时候也并不清楚自己适不适合、能不能做这一行,尤其是转专业很容易,一直以来心里都没什么底。大一的时候自学了JavaSE,当时看了一吨的各种培训机构的教学视频,然后读了几本《Java核心技术》、《Java编程思想》等语法书,然后自己照着培训结构的视频做了个XX管理系统,然后大一就结束了。
大二一年过得很艰难,一年要上两年的课(补大一的课),但还是自己抽了一些时间去学JavaEE的技术(也是为了做课程设计),比如Spring、Hibernate、Spring MVC等框架,还有MySQL、Redis等存储技术,然后学了一点前端,勉强能自己写个网站的demo。这时候对Java的原理以及框架的原理都不懂,只能说会用。而且当时培养了一种错误的观念,就是框架学的越多,学的框架越牛逼,就好像自己也牛逼了,大把时间都跑去学各种框架了,写了一堆demo。
大二下不知自己几斤几两地参加了菜鸟的春招,结果一面还不到10min就GG了。原因大概是一些专业课比如OS、网络等都没学过,记得当时问了一些比如Spring原理、Redis原理等问题,自然是啥都不会,还问了有没有正式的项目经历,写了一堆demo的我自然也是没有...
大二下大概也是正常上课,因为有门课的课程设计跟数据分析有关,又跑去学Python、Numpy、Pandas啥的,半途而废了...
春招失败,但还是想去找个实习。在大二暑假开始前,学长介绍有个公司招暑期实习,然后就屁颠屁颠去了。结果当时准大三的我,还有几个准大四的学长,面试好像就随便问了几个问题,就莫名其妙GG了...听说最后是要了准大四的学长...
大二暑假意识到只学框架是不够的,最好是能有项目经验,但是项目经验也是要实习才能拿到的。此处可以祭出这张图。
没有正式上线的项目经验,就只能靠基础知识补了。
暑假补了补Java的并发、NIO相关的基础,写了一个聊天室项目(不知道为啥后来就100+star了...);然后是读了一些并发的书《Java并发编程实战》。
然后是想起学JavaSE时候有个教程教如何手写(只用JavaSE API)一个WebServer,然后就模仿着自己写了一个,最初的版本也就1000行,后来春招又完善了一下。
当然又补了一些框架/中间件,比如SpringBoot、Dubbo、RocketMQ的学习,又写了一堆demo。有一个demo(自己)觉得还不错的,就是自己在本机上搞了一堆虚拟机模拟分布式,分库分表,还有用MQ来解分布式事务的问题(其实也没啥技术含量,只不过比单机的demo强一点...)
学框架/中间件的教程(一些什么架构师教程233...)中看到了Netty,了解到Netty是一个网络编程框架,做分布式网络通信的(也就是做中间件的,不是搞应用开发的),读了《Netty权威指南》,又写了一些demo。
再后来...一言难尽,自制力不足去打王者荣耀了emmmm。
大三上的话课程也是有点多的,还有课程设计,为了课程设计学了Vue.js和PHP(这部分对找工作来说实践证明是没用的...),然后想要读一读框架源码的,就花了大概一两周读了Spring源码,读了《Spring源码深度解析》,还写了一些源码解析文章(当然和网上流传的大同小异),然后又自己模仿着《架构探险-从零开始写JavaWeb框架》,自己又写了一个简化版的Spring IOC+AOP(不过后面面试的时候讲这个项目讲着讲着就讲到了Spring源码)。
大三上快结束的时候意识到马上要决定以后的去向了,顿时慌得一批,自己分析了一下去向。成绩应该能保研,但是最后是放弃了,给自己找了一些理由:
只能保研本校本专业,不能去更好的学校
读研最好是能搞机器学习之类的,做Java开发搬砖啥的好像也不用读研
懒吧,觉得要读研就要在两年后再经历一场春招秋招...还不如现在把这个事解决掉,要不又要提心吊胆担心失业
另外自己觉得前两年也算是为找工作做了一点准备,也不至于说从零开始
决定了之后就开始迷茫,不知道要学哪些东西,学到什么程度。然后就花了好几天的时间去牛客网上找面经,大概看了有100篇+的面经,把问题分类都记了下来,算是心里有了点底。
之后就进入寒假,回家准备复习春招了。
春招
大概是从1月中旬开始复习,然后3月上旬开始投简历,中旬开始面试,一直面试到4月中旬。
复习的内容大概是以下这些,我自己是文科生,在高中时时候就有个习惯是记笔记,因为自己记性很差,看过的书过几天就忘光了,所以自己记了很多笔记,之后在春找面试期间/秋招复习可以只看笔记快速复习。
这些笔记我不太确定是否合适放到网上,因为在记笔记的时候是到处抄(当前自己也有总结),有抄书上的,有抄别人博客的,图省事都没记录下出处。所以在这想问一下大家这些资料是否合适上传到网上,被原作者发现有什么后果.....
复习顺序大概是先去复习数据结构和算法,这部分因为自己不太聪明吧,学的很吃力。当时也买了牛客网的直通BAT面试算法精讲课。然后刷了《剑指Offer》,本来打算刷leetcode的,但是这里想讨点巧,自己确实不擅长,如果公司真的要求很高,干脆就放弃好了(对,说的就是你,头条)。
然后是看操作系统、计算机网络、数据库理论之类的,这部分就看的当前上课时候整理的笔记
之后是Java、分布式还有框架/中间件的复习。这部分是看了好多书,感觉这个寒假看的书比前两年加起来的都要多emmmm。
《Java并发编程实战》
《Java并发编程的艺术》
《深入理解Java虚拟机》
《Java编程思想》(这本不建议突击看,最好是平时看)
《分布式Java应用 基础与实践》
《大型网站技术架构 核心原理与架构分析》
《大型网站系统与Java中间件实践》
《Head First 设计模式》
《Spring 源码深度解析》
《架构探险 从零开始写JavaWeb框架》
《深入分析Java Web技术内幕》
《Redis实战》
《高性能MySQL》
《从Paxos到Zookeeper 分布式一致性原理与实践》
《深入剖析Tomcat》(这本看的比较粗略,看博客也行)
《深入分布式缓存 从原理到实践》
《剑指Offer》(神书!除了头条、腾讯或者外企或者其他国内比较重视算法的公司,这本书足够应付面试了,当然对算法比较感兴趣的建议刷leetcode,更稳一些,笔试也不容易被刷,另外左程云的《程序员代码面试宝典》也很好,有时间可以看)
《Netty实战》
此外还要看操作系统、计算机网络、数据结构和Linux相关的教材。
另外还有一些我还没来得及看,但感觉非常好的书:
《Redis设计与实现》
《MySQL技术内幕 InnoDB存储引擎》
《大规模分布式存储系统》
《亿级流量网站架构核心技术》
因为学了Netty、Dubbo等技术,打算再深入一点,把Netty用在一个稍微正式一点的项目上,不要只停留在demo上。所以花了一些时间手写了一个RPC框架,最初版本也就1000+行。
这个时候觉得写一些网站的(尤其是非正式上线的项目,自己写着玩的)之类的写不出什么花来,翻来覆去还是用别人的东西。但是面试,尤其是阿里巴巴,对原理要求挺高的,你在项目里用了啥,你最好是能说得出来它是怎么work的。如果自己去造个轮子之类的,你会对某个组件或框架变得很熟悉,比读一遍源码在理解上要深一些(而且没有SSM那么low...)。
然后就开始春招了,总共投了18家公司,最后是收到了5家公司的offer(酷家乐、快手、菜鸟、携程、网易),最后是选择了菜鸟,主要是因为阿里巴巴对Javaer吸引力确实很大。说到菜鸟还是挺有意思的,一方面是去年就透过实习,另一方面内推名额不是找人要的,而是一位师兄在Github上爬虫爬到我的,然后就给我发了邮件说你的Github上的项目很让人印象深刻balabala,然后发了内推。后来实习入职以后问这位师兄,因为特别好奇是哪个项目被阿里大佬看上了,结果人家说是全发了...没有筛选(这可太尴尬了....)
之后5月份中旬就跑去实习了,虽然学校规定是7月份期末考完才能出去,但是自己算了一下7月份实习到9月份转正答辩的话实习时间太短了,感觉做不了什么事情,所以提前就溜了。当然另一方面是课程也比较少,不过考试很多,要考好几次。实习了大概三个月就买了十几张南京——杭州的高铁票(感觉实习完全没赚到钱,全花在路费上了emmmm)
4月中旬到5月中旬也是忽然颓废的一个月,明明后面还有秋招,但又去打游戏(那时候frostpunk刚出,玩了好几天),看小说。技术上就只是把WebServer这个项目又完善了一下,把原来的网络实现从BIO改成了BIO/NIO/AIO。
实习
然后就开始了实习,实习的时候大概做了几件事,比如给师兄研发的中间件开发一个Web控制台,做一个快递相关的业务系统,还有一个类似于ABTest的系统。
第一件事其实业务很简单,只是熟悉了集团内部的一些中间件,但是后来觉得这样后面面试的时候实在没得聊,就把师兄自研的中间件的源码读了一遍,自己总结了一下。
第二件事花的时间最多,但是代码快写完了突然收到通知说项目取消,业务没谈成...这件事对我来说打击挺大的,至此对业务开发就产生了很多负面情绪,这也是我后来离职重新秋招的主要原因。
第三件事也是挺简单的,基本上没学到什么新东西。
在实习后期觉得自己做的事情技术难度不大,学不到什么新的东西;而且觉得业务开发不好,很想去做中间件或者基础设施相关的研发。在一番纠结后(大概是7月下旬)决定重新秋招。但是自己情况很差劲,一方面实习任务还是挺重的,没有时间学新的技术;另一方面春招复习的内容也忘得七七八八了。
之后打算先做点新的东西,总不能跟春招一个水平吧。然后就花了两个多周(主要是晚上和周末)把RPC项目重新写了一遍(模仿着Dubbo的分层结构),最后大概有4000行左右。
另外抽时间把Dubbo、RocketMQ等中间件的源码也看了一遍。
之后就决心要离职了,白天也开始复习春招时候的笔记,复习了大概一周,然后就离职了。
秋招
秋招时候一门心思想找偏技术的方向,先是联系了一些阿里的其他部门,包括集团的中间件、蚂蚁的中间件等,外面的面的比较少,只面了PDD和网易。比较遗憾的是集团的中间件没有面过,还是自己的水平不足。其他的拿到了offer,最后是选择了蚂蚁中间件。
建议
Java方向的话最好是写点有自己思考的项目,不仅限于CRUD的那种。比如我简历中写了4个项目,一个是Web项目,其他都是小轮子,大部分面试官明显都对小轮子感兴趣,对全是套路的JavaWeb项目感觉兴趣不大。
简历中项目中的各个实现要尽量熟悉,如果做得时间久了,可以考虑画一个类图或者时序图来加深印象
有真实的、在线上运行的、有一定用户量的项目会加分的
笔试的话一定要给后面的编程题留足时间
不够熟悉的技术干脆不要往简历上写,比如我会写Vue.js,但仅限于使用,而面试官一定是会问基础的,做Java的前端基础不够好的话就不要写熟悉前端了...
多刷刷牛客的面经
面经
这里简单的总结了一下面试过程中经常被问到的,自己记性不太好,没有在每次面试完之后记一遍问到的问题(明明是懒...)
Java集合框架源码,几乎每个公司直接间接地都问过
Java并发相关的知识,源码问的较集合少一些
Linux常用命令,列举一些
关系数据库的事务、索引、锁、范式
JVM, 基本都在《深入理解Java虚拟机》上
基础数据结构(链表、二叉树、队列、栈)以及排序查找算法
TCP UDP等网络协议,OSI七层,三次握手四次挥手等
设计模式
项目,这部分看个人情况,你在项目上写过什么技术,面试的时候就更容易被问到,而且往往会侧重原理
- 关注公众号「黄小斜」后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。