秋招已经过半,突然想写篇文章总结下自己的 Java 转行之路和秋招提前批、暑期实习的面试经历及个人感悟。因为要写的东西比较多,拆分成三篇:
第一篇:Java 转行之路
第二篇:Java 面试必备知识点
第三篇:秋招面经集合
01
个人基本情况
本科:机械制造及其自动化专业
研究生:机械制造及其自动化专业
实验室项目:两项校企合作项目
实习:两段互联网实习经历:滴滴出行、拼多多
技术栈:Java 后端
02
学习时间轴
2017.08-2017.09:HTML5、CSS、JavaScript、JQuery
2017.10-2018.03:Java基础、Servlet、JDBC、JSP、MySQL、Spring、Struts2、Hibernate
2018.04-2018.05:数据可视化项目(SSH)
2018.06-2018.10:两网融合项目(SSH)
2018.11-2019.01:数据结构与算法、Java 集合类源码、Java 虚拟机、Java 并发编程、剑指 offer、计算机网络协议、计算机操作系统、设计模式、SpringMVC、MyBatis
2019.02-2019.04:滴滴出行实习、Maven、Git
2019.05-2019.06:刷题(左神、LeetCode)、Redis、RabbitMQ
2019.07-2019.09:拼多多实习、Dubbo、Kafka
03
暑期实习 offer
腾讯:(深圳)TEG 后端开发工程师
拼多多:(上海)后端开发工程师
华为:(杭州)CloudBU 软件开发工程师
思科:(杭州)大数据开发工程师
爱奇艺:(上海)后端开发工程师
04
秋招 offer
百度:(上海研发中心)后端开发工程师
字节跳动:(深圳)后端开发工程师
拼多多:(上海)后端开发工程师
顺丰科技:(深圳)后端开发工程师(offer 审批中、sp 专场)
腾讯:(深圳)IEG 后端开发工程师 复试
我为什么要转互联网?
01
专业兴趣
对机械专业缺乏兴趣爱好:本科虽然成绩排名还比较靠前,可能是因为一直觉得既然不知道自己喜欢什么,那就学好当前的专业。在本科毕设的时候接触了一些软件相关的东西,发现自己对软件相关的东西要比机械感兴趣的多,所以在研究生期间就和导师沟通参与的都是软件相关的项目。一直觉得兴趣爱好才是职业成长的最好驱动力,至少可以决定你在某个行业的深度。
02
未来学业规划
未来学业规划:研一开学就对读不读博进行了认真的思考,综合自己的性格、研究所的课题后决定不读博。因为如果读博的话,最好还是多搞一些基础研究,不要花过多的时间在软件项目上,因为都是简单的搬砖,对于博士大佬来说有点“浪费时间”。
03
薪资
机械专业的薪资和互联网行业的薪资着实差距太大,这也是很多人转行的最大动力之一吧。不过个人觉得还是兴趣为先,薪资只能作为职业选择的加分项,毕竟各行各业都有自己的优缺点。
04
就业城市
互联网城市相对来说都是在一线,北、上、广、深、杭,如果你要是没有打算留在一线城市,转行也要慎重,毕竟一线以下城市互联网公司可能比较少,发展也比较受限。
05
个人生活
每个人对生活的追求都是不一样的,有的人喜欢互联网的9、9、6,也有人喜欢国企/外企的 9、5、5。我了解到的国内大部分互联网行业的工作强度是要高于其他行业,但是也是要分公司的。有一些国企或者外企性质的互联网公司还是很舒服的,钱也不少。
Java的自学之路
我是2017年8月开始自学的 Java。
最开始花了大概两个月时间学习了 web 前端:HTML5、CSS、JS,后面都在学习后端的知识。我主要是通过视频、书籍、博客学习的,大概说下我的学习历程和一些觉得不错的书籍的推荐吧。
01
学习历程
第一阶段:视频学习
主要是看码邦主的培训视频(百度搜索,官网上就可以找到)。看视频学习的最大好处就是入门很快,看一遍,再跟着敲一遍,但是缺点就是时间会花费长一些。我入门阶段基本上都是看视频学习,建议是找最新的视频学习,因为培训机构也会根据公司每年面试的侧重点调整自己的教学方案。如果找不到资源,可以和博主说下,还是收藏了一些。
第二阶段:书籍学习
视频学习一般都是比较基础和偏向案例实现的的教学,如果要想系统的了解某一模块的知识,阅读专业书籍是少不了的。如果有时间肯定多读一些书好,但是最优的做法是在有限的时间内阅读完经典书籍。拿 Java 后端来说,《Java编程思想》、《深入理解Java虚拟机》,毫不夸张的说几乎每次面试都会有很多知识点都是出自这些书中。所以,这类书籍,多读几遍。最好看完后,能够写出自己的读书笔记。我一般是写读书笔记前,会看一看别人的读书笔记,看看自己对书中的知识点是否有理解偏差或者有遗漏的地方。
第三阶段:博客学习
这一阶段是一个持续的过程,主要是写博客和看博客。总感觉看了书很快就忘了,所以为了以后高效的复习,开始写了一些博客,当然博客内容主要来源自书本以及一些大牛的博客,再加上自己的理解。坚持写博客,先仿写/转载别人的,再进行自己的原创,这样一点点的深入,会有很大收获
第四阶段:实验室项目
一共做过两个校企合作项目,这两个项目虽然很简单,都是单点的 web 服务,但是却给自学 Java 带来了很大的帮助。 而且在最开始找实习的时候,这两段项目还是起了很大的作用。个人感觉项目简单也没有关系,只要你把项目中涉及到的知识点都搞清楚,还是很加分的。至少把自己做的东西弄懂了。
项目1:可视化项目。这个项目比较简单,采集机床的数据,然后存储到数据库里,最后再进行二维、三维的图、表展示。主要涉及的技术是:Java、Spring、Struts2、Hibernate、Json。
项目2:两网融合项目。负责其中一个服务,通过发布 WebService 接口的形式实现不同服务之间的文件上传、下发功能。主要涉及的技术是:Java、WebService、Spring、Struts2、Hibernate、XML。
第五阶段:实习
个人观点:实习是非常重要的。
我是在研一的暑假开始投递了一些公司,大公司基本上要么是没有面试机会,要么就是一轮游。但是还是比较建议大家尽早投递一些公司试试水,我一直觉得通过面试复习是非常高效的。
这里给大家几点建议:
1. 先投递一些小公司,锻炼自己的面试表达能力;
2. 再投递一些不会去的大公司,锻炼算法、完善基础知识;
3. 最后再投递目标公司,最好也是难度大的放在最后面。
资源推荐
1、书籍:
Java基础:《Java编程思想》、《深入理解Java虚拟机》、《Java并发编程之美》
数据库:《SQL必知必会》、《高性能MySQL》
计算机网络:《图解HTTP》、《计算机网络》
操作系统:《深入理解计算机系统》、《鸟哥的Linux私房菜》
数据结构与算法:《算法4》、《剑指offer》
设计模式:《大话设计模式》
2、github
3、csdn
付费
极客时间:
我是比较推荐这个付费软件的,我订阅过《数据结构与算法之美》、《MySQL 实战》、《趣谈网络协议》、《从0开始学微服务》。这种专栏最大的好处在于每篇文章都比较短,大概10-15分钟,可以在公交车、排队时阅读。知识都是积累出来的,而且每篇文章都是某个知识点的精华讲解,简单易懂。
左神算法:
算法在应届生求职面试中的重要性就不用“大写加粗”了。左神算法分为初、高级两部分。初级主要讲解基本的数据结构及其相关的题目,如:栈、队列、链表、树、图、贪心算法、动态规划等。高级主要讲解一些常用的算法,如:KMP、Manacher、BFPRT、蓄水池算法、滑动窗口、单调栈等。
牛客网项目:
牛客网项目分为初、中、高级,我做了中级《秒杀系统》的项刚要找实习并且没有项目的同学,我还是比较推荐做下秒杀的项目,虽然这个项目已经被很多人写进简历里了,但是只要你把其中涉及的知识点(扣库存、缓存、消息队列等)都弄清楚了,这就是你的项目。
工具推荐
思维导图 Xmind:很好用,基本上都用过。
印象笔记:在线同步笔记、好友分享。
IDEA:做 Java 开发的尽量使用 IDEA 代替 Eeclipse。
Git:版本控制更加推荐 Git,SVN 用的很少了。
Postman:一款功能强大的网页调试与发送网页 HTTP 请求的软件。
实习的那点事
无论是日常实习还是暑期实习,都要先想清楚一件事情:我为什么要选择这份实习?
个人建议是最好能有两段实习:暑期实习面试前(每年3月份)有一段日常实习经历,可以用在暑期实习的面试中。还有就是暑期实习,最好去能够转正的大厂,这样有转正 offer 保底,不至于很慌。
01
实习的好处
1. 暑期实习有转正机会:很多大厂,比如:阿里、腾讯、拼多多等都是很喜欢留用实习生的,毕竟企业培养一个实习生肯定是赔本的买卖,稍微有点贡献的基本上都可以留下来。甚至有一些公司的暑期实习 offer 就可以代表秋招 offer,因为面试难度都是一样的;
2. 面试加分:这也是我认为最重要的一点,实习可以增加简历筛选通过的概率,更会在面试过程中凸显出很大的作用。如果你有一段还不错的实习经验,在面试的时候可以挑这段实习中做的事情来说。如果没有实习经历,那只能狂怼基础知识了,而且有些公司和面试官更偏向于要有过实习经历的应届生;
3. 基础知识的巩固:我经常会有一种感受,很多学过的知识,看过的面经,只有在真正用到时,才会理解的很深刻,通过实习可以巩固自己的基础知识;
4. 编码习惯的规范:自己平时写代码可能不会注意那么多,只要实现功能就行了。但是实习过程中往往都是要先熟悉所在小组现有的工程代码,可以看看大佬们是怎么写代码的,比如:设计模式的使用、日志的规范格式、单元测试等等;
5. 工程业务开发能力的锻炼:一般实习生都会先分一些小需求做,可以学到如何和产品沟通需求、开发、测试、上线一整套流程。而且在互联网公司实习,特别是大厂,基本上都是分布式的服务,可以学到很多分布式的实际应用场景,可以利用这样的机会学习分布式框架、分布式事务等等知识;
6. 提前了解一个公司:这里我有一个个人建议,千万不要只听别人说某某公司怎么样,一定要自己深入的去了解下。因为很多人都“黑”我多的上班时间,去实习后发现并没有说的那么严重,而且我是在 C 端部门,如果是基础架构或者 B 端可能会下班更早一些。因为大厂部门很多,下班时间是要看部门和个人工作效率的。除了工作时间,最重要的是你去实习,你可以了解到公司的企业文化、价值观,Leader 的风格、团队的技术等等;
实习的弊端
1. 有些互联网公司对实习生要求还是比较高的,可能会分配比较多的需求。那么这样的话,就没有太多的时间复习;
2. 秋招笔试一般都是两个小时,如果在实习的话,多多少少会有些不方便;
3. 还有一种实习最坑的,实习快结束的时候,leader 说没有转正机会。遇到这种情况,也是欲哭无泪。
实习要做的事情
1. 实习最重要的事情肯定还是能够学到东西。要利用好公司的资源,尽量多学习一些实习团队项目中涉及的知识点。因为不懂的随时可以问团队中的大牛们,一般都会比较耐心的解答。毕竟实际工程中的应用还是和书本上学来的有所差别;
2. 记录好自己做的事情、遇到的坑,这样方便以后面试的时候用。不要等到实习结束的时候再去补充,可能会忘记一些东西,因为一般互联网公司日常开发都是使用自己内网的,离职后也没有权限去访问了;
3. 看公司的文档资料,一般团队都会有一个 wiki 文档,记录平时的开发需求及故障复盘。因为面试中经常会被问到“你开发中遇到过什么问题?你是怎么解决的?”,如果你觉得自己的问题比较简单,就可以看看团队的 wiki 故障记录,再问下 wiki 的记录者,只要把这个场景下的问题搞清楚了,就可以应用到面试中;
4. 一定要搞清楚自己做过的项目的全貌,一般面试中需要给面试官讲清楚整个项目的结构,而不仅仅是你做的那一点点。所以,做需求之余,要搞清楚整个服务的业务逻辑。不然面试官会觉得你是一个只做需求,没有思考的开发人员。
秋招提前批
01
什么时候开始复习?
如果你还在纠结这个问题,我可以很明确的告诉你:现在就开始复习。参加过暑期实习面试和秋招的同学都有一个共同的感受就是复习的时间不够。不要想面试前再去复习,那样很容易会被吊打的,除非你基础真的特别好,不然的话就从现在开始制定复习计划。可能你现在只是大二、研一的学生,那么还是要复习的,学过的东西,一定要及时复习,保留感觉,不然都堆积到最后复习,你会怀疑自己到底有没有学过这些东西。
02
怎么复习?
我觉得怎么复习取决于距离面试的时间和你当前的技术水平。如果时间还比较多的情况下,是比较建议认真过一下每一个知识点,不要遗留下什么问题,否则在后续的面试中你就很有可能因为遗留下的个别问题“跪”的很惨,我是有过这样教训的。复习过的问题可以使用一些笔记软件记录清楚,方便下次复习。
如果时间不是很充裕,基础又不是特别好,面试又得硬上的情况下,以面经为主,把要面试公司最近的面经都过一遍,然后再过一下每个知识点模块中常被问到的问题。为了面试,实在不行就“背”。
03
什么时候投递提前批最合适?
秋招提前批是非常重要的,大部分人都是希望在提前批能够拿到保底 offer。2019年秋招提前批大概是在6月上旬就开始了(VIVO),然后7月中旬-8月中旬开始大规模面试。投递提前批虽然重要,还是比较建议在复习差不多的情况下再投递,或者说没有怎么复习的情况下尽量不要投递秋招心仪的公司,否则大概率只会去当“炮灰”。当然,也不要等到都复习好了再去投递,因为大部分人都会发现永远没有复习好的那一天,感觉差不多了就开始投,边面试边复习。
04
复习的重点
1. 数据结构与算法:《剑指Offer》、LeetCode Top100、常考的一些算法:TopK、生产者消费者模式、多线程交替打印、HashMap 的简单实现等等;
2. 计算机网络:五层/七层协议、TCP 和 UDP 的区别、TCP 三次握手和四次挥手、HTTP 的特点、HTTP 与 HTTPS 的区别、HTTPS 过程等等;
3. 计算机操作系统:进程与线程的区别、死锁的概念/检测/避免、进程间的通信方式、内存管理等等;
4. 设计模式:单例模式、工厂三兄弟、适配器模式、代理模式、装饰者模式等等,以及项目中和 JDK/Spring中用到过的设计模式;
5. Java 语言基础:重载和重写的区别、抽象类和接口的区别、String/StringBuilder/StringBuffer 的区别、关键字(static、super、this、transient)、异常、IO 流、反射、动态代理、序列化等等;
6. Java 集合类:HashMap 的 get、put、resize、JDK1.7 和 1.8、多线程下会发生什么问题、HashMap 和 HashTable/ConcurrentHashMap 的区别、ArrayList 和 LinkedList 的区别等等;
7. Java 并发编程:线程的状态转换、wait 和 sleep 的区别、synchronized 关键字、volatile 关键字、锁:ReentranrLock、读写锁等、线程池:核心参数、类型等等;
8. Java 虚拟机:运行时数据区、垃圾回收算法、垃圾回收器、垃圾回收策略、JVM 监控和调优、类加载机制、Java 内存模型等等;
9. MySQL:常用的 SQL 语句、索引的数据结构、类型及其优化、事务、锁、存储引擎、主从复制、分库分表等等;
10. Spring:AOP:代理方式、JDK 动态代理的实现;IOC:Bean 的生命周期和作用域、单例 Bean 的线程安全问题;事务:隔离级别、传播特性等等;
11. SpringMVC:核心组件、处理请求的流程等等;
12. MyBatis:分页方式、延迟加载、一级和二级缓存等等;
13. Linux:需要掌握基本的操作指令;
14. Redis:基本的数据类型、使用场景、缓存穿透、缓存雪崩、持久化、缓存和数据库双写一致性问题等等;
15. 消息队列:使用场景、如何保证消息不被重复消费、如何保证可靠传输、如何保证顺序性等等;
16. Zookeeper:主要功能、部署模式、状态同步、通知机制等等;
17. 分布式:分布式框架 Dubbo :基本组件、协议、集群容错模式、负载均衡策略等等;分布式事务及其解决方案、分布式锁及其解决方案。
给初学者推荐学习资源免费下载地址。扣扣裙697888503(电子书,面试题,开发工具等都有)