分享人:CyC2018
中山大学(硕士),计算机科学与技术专业。校招中获得百度、阿里、腾讯、头条、华为、网易游戏等七家企业offer,其中头条评级为SSP。
大家好,我是中山大学计算机科学与技术专业的研究生 CyC2018。我的昵称取自我的姓名首字母 zyc,改成 CyC 变成回文读起来顺口一些,而且也像是 OvO 这个表情,所以也更加生动。而 2018 是我找工作的年份。
我的求职经历并不顺利,但幸运的是最后的结果比较理想。
我在很早之前就意识到做好充分准备对于找工作的重要性,所以从上一届的同学结束秋招之后就开始复习,大概是十一月份左右。虽然以前上过数据结构、计算机网络和操作系统等课程,但是基本只够应付考试,而且没有多少项目经历,所以需要准备的内容也比较多。
最开始复习的时候我和大多数人一样不知道该看什么内容,也不知道哪些是重点,总感觉自己还有很多内容没有准备,所以处于一种焦虑的状态。后来找了一些整理得比较好的面经,对面试考察的内容有了大致的了解。然后开始按面经列的知识点来复习,但是发现这样复习效率并不高,一方面是因为网上很难找到比较好的讲解资料,另一方面是因为这些知识点过于零散,不利于构建自己的知识体系。后来回归到书籍,在看书过程会看看某个知识点在面经中有没有出现,从而明确它的重要性。
三月份左右开始找春招实习,这时候算是把基础知识复习了一遍,但只有一个非常简单的个人项目,而且对于新技术没有任何了解,所以写简历的时候就特别痛苦。最开始投了阿里、腾讯、虎牙,不出所料被虐得非常惨。主要有两个原因:一是理论知识的掌握情况确实不够理想,比如对于线程安全、ThreadLocal、ConcurrentHashMap 的并发机制这种 Java 常问的问题都还没复习到。二是没有多少面试经验,对面试官提的问题基本没回答到关键点上,而且对于自己熟悉的内容也没能继续扩展回答。
刚开始参加面试的时候每天都会关注面试结果,在得知这几场面试都挂了之后自信心受到了一点打击。不过每场面试我都有总结和反思,也会对还没掌握的知识点制定相应的学习计划,不断完善自己的知识体系。后面的百度、网易游戏和微众银行的面试比较顺利,也都拿到了实习 Offer。
七月到九月是我在网易游戏实习的时间,因为我的研究生方向是图形学,所以被安排在梦幻西游事业部做一个游戏引擎相关的课题。实习的时候并不轻松,因为这个时间点很多公司已经开始了秋招提前批招聘,有些公司甚至开始了秋招正式批招聘。实习期间不仅要完成实习任务,还要一边复习一边担心着错过了一些公司的招聘时间,压力可想而知非常大。
结束实习之后我没有急着投简历,因为实习的原因那时候还觉得自己准备地不够充分,所以又过了一两个星期才开始投简历,我的秋招大概是从九月中旬才开始。九月份的时候已经有很多公司在招聘,看到身边的同学一直在参加笔试和面试我开始担心找不到满意的工作。当然我也收集了几个想去的公司的招聘信息,了解了它们的招聘时间点,尽量选择最后一批招聘,从而让自己准备充分一些,因为我相信决定是否能通过面试主要看自己的准备情况。后来证明我的想法是对的,秋招参加的几个公司面试都非常顺利通过了,从十月份开始陆陆续续收到了 Offer。
经过了漫长的找工作之路,我的秋招也算是有了一个比较圆满的结局。虽然有一两个公司在我表示不会去之后没有给正式的 Offer,但参加面试的公司都通过了面试并且发起了 Offer 审批流程。加上实习转正 Offer,秋招总共收获了七个 Offer,分别是百度、阿里、腾讯、头条、华为、网易游戏和顺丰。
我最终选择了头条,也就是字节跳动。一方面是因为头条给的薪资比其它几家高了百分之三四十,另一方面是因为头条给了 SPP 的评级,应该更有机会选择对自己有帮助的工作内容。而且头条的企业氛围和发展前景都还不错。
下面说一下我对于Java后端学习的一些总结和心得体会。
首先是学习规划
在制定学习规划之前,最好先明确一下自己的求职目标,不同求职目标的学习路线有很大的不同。
如果求职目标是一二线大厂,就需要重点准备基础知识,因为这些公司更看重你的发展潜力,它们有能力和条件培养你。基础知识包括:数据结构与算法、计算机网络和操作系统。
而如果求职目标是其它互联网公司,更需要准备语言和框架等实践能力,因为这些公司需要你加入之后就能参与到实际项目开发中。
至于如何定位自己的求职目标,我觉得如果你满足以下条件中的一个,就可以以一二线大厂作为自己的求职目标:
有一两个实习经历
对开源社区有重要贡献
有不错的学历
有相当工作量的个人项目
有计算机相关的国家级大赛获奖经历
有高质量的个人博客
上面列的几点是按照我认为的重要程度进行排序。应该有很多人会在意学历的重要性,我把它排在了实习经历和对开源社区的贡献之后,因为对于大部分公司来说,这两点基本可以弥补学历上的不足,当然对于某些特别看重学历的公司除外。所以我觉得对于学历不太理想但想进大厂的同学,最有效的途径是先找一两个实习当做跳板。当然也不能随便什么实习经历都可以,最好找一些还有点知名度的公司,而且实习期间做的业务也很重要,例如交易之类的核心业务就更容易让面试官捞你的简历。
然后是学习理论
Java 后端岗位主要考察以下几个理论知识:
语言基础
设计模式
框架和中间件
数据库
数据结构与算法
计算机网络
计算机操作系统
系统设计
接下来我将分成几个部分来分享一下怎么准备这些理论知识。
(一)语言基础
如果刚开始接触 Java,那么建议先阅读《JAVA 核心技术》的前几章语法内容,并且安装 Java 环境并使用 IDEA 开发工具熟悉一下语法知识。不推荐阅读这本书后面几章内容,很多是在简单地堆 API,讲解地并不好。
学习完简单语法之后其实就可以开始学习设计模式相关的知识,因为 Java 源码涉及到大量的设计模式,如果没有相关知识很难理清 Java 众多类之间的关系。设计模式的知识会在下一个部分讲解。
学习完设计模式之后就可以开始学习 Java 的一些高级特性,推荐阅读《Java 编程思想》以及《Effective Java》。
虚拟机和并发编程也是 Java 面试经常考察的内容,但是建议在学习了计算机操作系统的知识之后再学习这些内容。虚拟机推荐《深入理解 Java 虚拟机》这本书,重点学习一下内存、垃圾回收、类加载机制这几部分内容。而并发编程推荐《Java 并发编程实战》,学习得越深入越好。
Java 面试也会涉及到一些源码分析问题,阅读源码除了需要有一定的编程经验,也要有一定的数据结构与算法知识,数据结构与算法知识会在后面讲解。对源码的考察主要是一些集合框架,例如 Hashtable、HashMap、ConcurrentHashMap 等等,你可以在牛客网或者 Github 上找一些源码分析的文章学习,比自己阅读源码更加高效。
(二)设计模式
前面提到 Java 类库中涉及到大量的设计模式知识,其实在面试中设计模式也经常被考察,比较常被问到的设计模式包括单例模式、几个工厂模式、代理模式。在回答的时候最好结合 Java 类库中的实现,或者 Spring 等框架中的实现。
学习设计模式推荐《Head First 设计模式》这本书,包含大量的原理图,生动形象,非常适合入门。
(三)框架与中间件
在做个人项目时不可避免要学习这些内容,框架主要是 Spring 框架,中间件重点是缓存和消息队列。
Spring 框架的入门推荐《精通 Spring 4.x》,虽然看看《Spring 揭秘》中对于 AOP 和 IOC 的讲解很有帮助,但是最好动手实践一下,可以找两个项目课程来学习,推荐牛客网上的项目课,就是适合Java方向的同学的。
缓存中间件主要是 Redis,推荐《Redis 实战》和《Redis 设计与实现》这两本书,消息队列可以看看 《RabbitMQ 实战指南》。
(四)数据库
学习数据库最开始要先学习 SQL 语法,推荐《MySQL 必知必会》,学完之后建议到 Leetcode 上刷一些题目,因为面试的时候有可能会考察手写 SQL 语句。
学完 SQL 语法之后可以再学习一些数据库管理系统相关的知识,推荐《数据库系统概念》,至少理解关系型数据库管理系统、事务、范式等内容理解清除。
互联网公司主要用 MySQL 数据库,所以接下来重点准备 MySQL 相关的知识,推荐《MySQL 技术内幕》以及《高性能 MySQL》,重点学习 InnoDB 存储引擎,索引、锁、事务、性能优化等内容。
(五)数据结构与算法
数据结构与算法在国内互联网公司面试中至关重要,特别是一二线大厂。零基础学习数据结构与算法推荐《算法 第四版》,并结合左神的算法基础班进行学习,基础部分会理解的非常透彻,而且会在最开始奠定非常好的基础和算法体系。
在学完一定的数据结构与算法知识之后,就可以开始刷 Leetcode 了,Leetcode 包含了大量的面试算法题。刚开始刷的时候可以先刷 Top100 的题目,按照通过率来排序,先从通过率最高的开始刷。在碰到不会的题目,可以看看讨论区的答案,找一些高票的答案来学习。或者在 Github 上找一些 Leetcode 题解来学习。
(六)计算机网络
对计算机网络的考察主要在于 TCP/IP、HTTP、Socket 编程,这些内容对于大厂面试非常重要,所以准备越充分越好。但是对于其它公司,其实找一些高频面试题看看就足够了。
计算机网络入门书籍推荐《计算机网络 自顶向下方法》,随后再学习《TCP/IP 详解》以及《图解 HTTP》。Java 后端开发对于 Socket 编程没有特别高的要求,但是至少要了解 IO 多路复用知识,可以看看《Unix 网络编程》。
(七)计算机操作系统
对计算机操作系统的考察主要在进程线程、死锁以及内存管理。前面提到要学习 Java 虚拟机和 Java 并发编程最好先学习计算机操作系统知识,可想而知这部分内容有多重要。入门书籍推荐《现代操作系统》,随后学习一下《深入理解操作系统》的部分内容。Linux 系统编程也是计算机操作系统中很重要的内容,但是 Java 后端岗位只需要了解一下 Linux 基本原理即可,Linux 的学习推荐《鸟哥的 Linux 私房菜》。
(八)系统设计
系统设计主要设计网站架构相关的内容,推荐先学习《大型网站架构》这本书来入门。之后再学习一些分布式知识,推荐《从 Paxos 到 Zookeeper》和《大规模分布式存储系统》。最后再看看微服务,推荐《微服务设计》。
最后是实践与项目
可能会有人觉得做个人项目多实现一些功能就行,其实这样的个人项目没有什么亮点。面试官希望通过个人项目了解你对业务的理解程度,以及热门技术的掌握程度。所以最好从业务的角度去分析项目的难点,并多用一些热门技术来解决,比如使用缓存、集群、消息队列等等。一定要从业务的角度去分析,说清楚你这么做有什么用,为什么不用其它方法。
对于 Java 开发岗位,项目难点主要是高并发场景下的各种问题,因此建议做高并发项目。如果没有高并发相关的知识,可以先看看大型网站架构的书籍,或者是高并发的项目课程。
项目最好能部署到云服务器上,并把访问地址附在简历上。也最好能把代码开源在 Github 上,并写好项目文档。
再给大家分享一些我的学习资源
对于找工作帮助比较大的几个学习资源:
书籍
牛客网的面经
求职相关的博客
我建议以书籍作为基本的复习材料,面经作为复习的方向,而博客作为补充。
书籍在上面已经做了推荐,牛客网的面经在讨论区的精华板块找找就有很多,包括牛客网也有整理好面经集合。
求职相关的博客我只推荐自己的开源在 Github 上的博客:
https://github.com/CyC2018/CS-Notes
因为把我的博客理解透彻,再看看书补充一些知识就完全足够了,而且我在文章中都有附上参考资料,如果觉得文章内容还不够,这些参考资料也是非常好的学习资料。这个博客从我找工作就开始更新,现在是Github上最受关注的面试相关项目,截止目前已经有六万多Star,在Github全部仓库中排在二十名左右。
以上是CyC2018大佬给大家分享的自己的秋招备战过程,后面还有对于自己网申、笔试以及面试还有其他求职过程中常见的问题分享,当然,这些不仅仅是文字版,更有视频版的,听大佬亲自讲解自己的学习、求职过程,从中学习经验,汲取养分。
那么视频怎么获取呢?
很简单,只需要1块钱就可以获得,点击下面“立即观看”即可立即获得CyC2018大佬的校招求职经验分享!
立即观看
不仅有Java方向,还有C++、前端、测试、大数据、机器学习、大数据几个方向,通通只要1块钱,就可以获得各位offer收割机大佬们的学习、求职经验分享。
立即抢购
注意:1元抢购截止今晚24点
之后即恢复原价10元
正值618年中大促,除了大佬们的求职经验分享课程优惠以外,牛客80%以上的课程也都有优惠,打造全年最低价!
1 左神算法课
学过左神算法课的同学无一不夸赞左神及其课程的。
1 叶神项目课
#超值福利#
现在报名叶神高级项目课,还可以免费赠送更新后的高级项目课,新课程预计下周上线~
618期间报名中级项目课的宝宝们只需要补400元差价,就可以升级为叶神高级项目课并免费获得更新后的高级项目课!
新项目课截图:
《牛客社区》,即牛客网讨论区
项目截图如下:
了解课程详细目录
1 超值精品课
阿里P8手把手带你学习机器学习,冲刺40W年薪!
1 编程基础课
适合编程语言入门或者基础不太好的同学。
!!特别注意!!
以上所有课程优惠价
全部截止今晚24点
之后即恢复原价
立即抢购
算法和项目是面试中必不可少的两部分,也决定了你是否能获得一个高薪offer,如果你还没有一个可以用来面试的项目,你的算法基础还比较薄弱,那么叶神、左神的课程绝对是你在最短时间内获得最大提升的不二选择。
趁现在时间还不晚,趁现在还有优惠,用最少的投资获得最大的回报!
点击阅读原文
查看更多大佬校招求职经验分享