身边的朋友或者公众号的粉丝很多人都向我询问过:“我是双非/三本/专科学校的,我有机会进入大厂吗?”、“非计算机专业的学生能学好吗?”、“如何学习Java?”、“Java学习该学那些东西?”、“我该如何准备Java面试?”......这些方面的问题。我会根据自己的一点经验对大部分人关心的这些问题进行答疑解惑。
希望这篇可以给已经在Java方向走了几年的朋友或者正在准备往Java后端方向发展的朋友们一点帮助。道理懂了如果没有实际行动,那这篇文章对你或许没有任何意义。
如果觉得内容不错的话,可以分享给到朋友圈让你的朋友看到,感谢!
我自己也是非985非211学校的,结合自己的经历以及一些朋友的经历,我觉得让我回答这个问题再好不过。
首先,我觉得学校歧视很正常,真的太正常了,如果要抱怨的话,你只能抱怨自己没有进入名校。但是,千万不要动不动说自己学校差,动不动拿自己学校当做自己进不了大厂的借口,学历只是筛选简历的很多标准中的一个而已,如果你够优秀,简历够丰富,你也一样可以和名校同学一起同台竞争。
企业HR肯定是更喜欢高学历的人,毕竟985,211优秀人才比例肯定比普通学校高很多,HR团队肯定会优先在这些学校里选。这就好比相亲,你是愿意在很多优秀的人中选一个优秀的,还是愿意在很多普通的人中选一个优秀的呢?
双非本科甚至是二本、三本甚至是专科的同学也有很多进入大厂的,不过比率相比于名校的低很多而已。从大厂招聘的结果上看,高学历人才的数量占据大头,那些成功进入BAT、美团,京东,网易等大厂的双非本科甚至是二本、三本甚至是专科的同学往往是因为具备丰富的项目经历或者在某个含金量比较高的竞赛比如ACM中取得了不错的成绩。一部分学历不突出但能力出众的面试者能够进入大厂并不是说明学历不重要,而是学历的软肋能够通过其他的优势来弥补。 所以,如果你的学校不够好而你自己又想去大厂的话,建议你可以从这几点来做:
- 尽量在面试前最好有一个可以拿的出手的项目;
- 有实习条件的话,尽早出去实习,实习经历也会是你的简历的一个亮点(有能力在大厂实习最佳!);
- 参加一些含金量比较高的比赛,拿不拿得到名次没关系,重在锻炼;
当然可以!现在非科班的程序员很多,很大一部分原因是互联网行业的工资比较高。我们学校外面的培训班里面90%都是非科班,我觉得他们很多人学的都还不错。另外,我的一个朋友本科是机械专业,大一开始自学安卓,技术贼溜,在我看来他比大部分本科是计算机的同学学的还要好。参考Question1的回答,即使你是非科班程序员,如果你想进入大厂的话,你也可以通过自己的其他优势来弥补。
我觉得我们不应该因为自己的专业给自己划界限或者贴标签,说实话,很多科班的同学可能并不如你,你以为科班的同学就会认真听讲吗?还不是几乎全靠自己课下自学!不过如果你是非科班的话,你想要学好,那么注定就要舍弃自己本专业的一些学习时间,这是无可厚非的。
建议非科班的同学,首先要打好计算机基础知识基础:①计算机网络、②操作系统、③数据结构与算法,我个人觉得这3个对你最重要。这些东西就像是内功,对你以后的长远发展非常有用。当然,如果你想要进大厂的话,这些知识也是一定会被问到的。另外,“一定学好数据结构与算法!一定学好数据结构与算法!一定学好数据结构与算法!”,重要的东西说3遍。
对于学习路线的话,我说一条我比较推荐的,我相信照着这条学习路线来你的学习效率会非常高。下面提到的书籍以及相关学习视频都答主已经整理好,公众号JavaGuide后台回复关键“1”即可领取。
- 掌握 Java 基础知识(可以看《Java 核心技术卷1》或者《Head First Java》这两本书在我看来都是入门Java的很不错的书籍),当然你也可以边看视频边看书学习(推荐黑马或者尚硅谷的视频)。记得多总结!打好基础!把自己重要的东西都记录下来。
- 掌握多线程的简单实用(推荐《Java并发编程之美》或者《实战Java高并发程序设计》)。
- (可选)如果你想进入大厂的话,我推荐你在学习完Java基础或者多线程之后,就开始每天抽出一点时间来学习算法和数据结构。为了提高自己的编程能力,你也可以坚持刷Leetcode。
- 学习前端基础(HTML、CSS、JavaScript),当然BootStrap、VUE等等前端框架你也可以了解一下。
- 学习MySQL 的基本使用,基本的增删改查,SQL命令,索引、存储过程这些都学一下吧!
- 建议学习J2ee框架之前可以提前花半天时间学习一下Maven的使用。(到处找Jar包,下载Jar包是真的麻烦费事,使用Maven可以为你省很多事情)
- 学习Struts2(可不用学)、Spring、SpringMVC、Hibernate、Mybatis 等框架的使用,(可选)熟悉 Spring 原理(大厂面试必备),然后很有必要学习一下SpringBoot。我也遇到很多公司对于应届生直接上手SpringBoot,不过我还是推荐你把Spring、SpringMVC好好学一下。
- 学习Linux的基本使用(常见命令、基本概念)
- 学习Dubbo、Zookeeper、常见的消息队列(比如ActiveMq、RabbitMQ)的使用.(这些东西可以通过黑马最后一个分布式项目来学,边看视频,边自己做,查阅网上博客,效果更好)
- 可以学习一下NIO和**Netty,**这样简历上也可以多点东西。
- (可选),如果想去大厂,JVM 的一些知识也是必学的(Java内存区域、虚拟机垃圾算法、虚拟垃圾收集器、JVM内存管理)推荐《深入理解Java虚拟机:JVM高级特性与最佳实践(最新第二版》,如果嫌看书麻烦的话,你也可以看我整理的文档,在下面有链接。
我上面主要概括一下每一步要学习的内容,对学习规划有一个建议。知道要学什么之后,如何去学呢?我觉得学习每个知识点可以考虑这样去入手:官网(大概率是英文,不推荐初学者看)、书籍(知识更加系统完全,推荐)、视频(比较容易理解,推荐,特别是初学的时候)、网上博客(解决某一知识点的问题的时候可以看看)。
这里给各位一个建议,看视频的过程中最好跟着一起练,要做笔记!!!最好可以边看视频边找一本书籍看,看视频没弄懂的知识点一定要尽快解决,如何解决?首先百度/Google,通过搜索引擎解决不了的话就找身边的朋友或者认识的一些人。
没有实习经历没关系,只要你有拿得出手的项目或者大赛经历的话,你依然有可能拿到大厂的 offer 。笔主当时找工作的时候就没有实习经历以及大赛获奖经历,单纯就是凭借自己的项目经验撑起了整个面试。
如果你既没有实习经历,又没有拿得出手的项目或者大赛经历的话,我觉得在简历关除非你有其他特别的亮点,不然,你应该就会被刷。
下面是我总结的一些准备面试的Tips以及面试必备的注意事项:
- 准备一份自己的自我介绍,面试的时候根据面试对象适当进行修改(突出重点,突出自己的优势在哪里,切忌流水账);
- 注意随身带上自己的成绩单和简历复印件; (有的公司在面试前都会让你交一份成绩单和简历当做面试中的参考。)
- 如果需要笔试就提前刷一些笔试题,大部分在线笔试的类型是选择题+编程题,有的还会有简答题。(平时空闲时间多的可以刷一下笔试题目(牛客网上有很多),但是不要只刷面试题,不动手code,程序员不是为了考试而存在的。)另外,注意抓重点,因为题目太多了,但是有很多题目几乎次次遇到,像这样的题目一定要搞定。
- 提前准备技术面试。 搞清楚自己面试中可能涉及哪些知识点、那些知识点是重点。面试中哪些问题会被经常问到、自己改如何回答。(强烈不推荐背题,第一:通过背这种方式你能记住多少?能记住多久?第二:背题的方式的学习很难坚持下去!)
- 面试之前做好定向复习。 也就是专门针对你要面试的公司来复习。比如你在面试之前可以在网上找找有没有你要面试的公司的面经。
- 准备好自己的项目介绍。 如果有项目的话,技术面试第一步,面试官一般都是让你自己介绍一下你的项目。你可以从下面几个方向来考虑:①对项目整体设计的一个感受(面试官可能会让你画系统的架构图;②在这个项目中你负责了什么、做了什么、担任了什么角色;③ 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用;④项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的又或者说你在这个项目用了什么技术实现了什么功能比如:用redis做缓存提高访问速度和并发量、使用消息队列削峰和降流等等。
- 提前知道有哪些技术问题常问: 索引、隔离界别、HashMap源码分析、SpringMVC执行过程等等问题我觉得面试中实在太常见了,好好准备!后面的文章会我会分类详细介绍到那些问题最常问。
- 提前熟悉一些常问的非技术问题: 面试的时候有一些常见的非技术问题比如“面试官问你的优点是什么,应该如何回答?”、“面试官问你的缺点是什么,应该如何回答?”、“如果面试官问"你有什么问题问我吗?"时,你该如何回答”等等,对于这些问题,如何回答自己心里要有个数,别面试的时候出了乱子。
- 面试之后记得复盘。 面试遭遇失败是很正常的事情,所以善于总结自己的失败原因才是最重要的。如果失败,不要灰心;如果通过,切勿狂喜。
我本人更加赞同自学(你要知道去了公司可没人手把手教你了,而且几乎所有的公司都对培训班出生的有偏见。为什么有偏见,你学个东西还要去培训班,说明什么,同等水平下,你的自学能力以及自律能力一定是比不上自学的人的)。但是如果,你连每天在寝室坚持学上8个小时以上都坚持不了,或者总是容易半途而废的话,我还是推荐你去培训班。观望身边同学去培训班的,大多是非计算机专业或者是没有自律能力以及自学能力非常差的人。
另外,如果自律能力不行,你也可以通过结伴学习、参加老师的项目等方式来督促自己学习。
总结:去不去培训班主要还是看自己,如果自己能坚持自学就自学,坚持不下来就去培训班。如果要去培训班还要擦亮双眼,很多培训班现在都是为了圈钱,不道德!!!
从现在开始做!
如果实在没有实际项目让你去做,我觉得你可以通过下面几种方式:
- 在网上找一个符合自己能力与找工作需求的实战项目视频或者博客跟着老师一起做。做的过程中,你要有自己的思考,不要浅尝辄止,对于很多知识点,别人的讲解可能只是满足项目就够了,你自己想多点知识的话,对于重要的知识点就要自己学会去往深出学。
- Github或者码云上面有很多实战类别项目,你可以选择一个来研究,为了让自己对这个项目更加理解,在理解原有代码的基础上,你可以对原有项目进行改进或者增加功能。
- 自己动手去做一个自己想完成的东西,遇到不会的东西就临时去学,现学现卖。
不光要做,还要改进,改善。另外,如果你的老师有相关 Java 后台项目的话,你也可以主动申请参与进来。
如果有自己的博客,也算是简历上的一个亮点。建议可以在掘金、Segmentfault、CSDN等技术交流社区写博客,当然,你也可以自己搭建一个博客(采用 Hexo+Githu Pages 搭建非常简单)。写一些什么?学习笔记、实战内容、读书笔记等等都可以。
多用 Github,用好 Github,上传自己不错的项目,写好 readme 文档,在其他技术社区做好宣传。相信你也会收获一个不错的开源项目!
先从已经有两年左右开发经验的工程师角度来看: 我们来看一下阿里官网支付宝Java高级开发工程师的招聘要求,从下面的招聘信息可以看出,除去Java基础/集合/多线程这些,这些能力格外重要:
- 底层知识比如jvm :不只是懂理论更会实操;
- 面向对象编程能力 :我理解这个不仅包括“面向对象编程”,还有SOLID软件设计原则,相关阅读:《写了这么多年代码,你真的了解SOLID吗?》(我司大佬的一篇文章)
- 框架能力 :不只是使用那么简单,更要搞懂原理和机制!搞懂原理和机制的基础是要学会看源码。
- 分布式系统开发能力 :缓存、消息队列等等都要掌握,关键是还要能使用这些技术解决实际问题而不是纸上谈兵。
- 不错的sense :喜欢和尝试新技术、追求编写优雅的代码等等。
再从应届生的角度来看: 我们还是看阿里巴巴的官网相关应届生 Java 工程师招聘岗位的相关要求。
结合阿里、腾讯等大厂招聘官网对于 Java 后端方向/后端方向的应届实习生的要求下面几点也提升你的个人竞争力:
- 参加过竞赛( 含金量超高的是 ACM );
- 对数据结构与算法非常熟练;
- 参与过实际项目(比如学校网站)
- 熟悉 Python、Shell、Perl 其中一门脚本语言;
- 熟悉如何优化 Java 代码、有写出质量更高的代码的意识;
- 熟悉 SOA 分布式相关的知识尤其是理论知识;
- 熟悉自己所用框架的底层知识比如 Spring;
- 有高并发开发经验;
- 有大数据开发经验等等。
从来到大学之后,我的好多阅历非常深的老师经常就会告诫我们:“ 一定要有一门自己的特长,不管是技术还好还是其他能力 ” 。我觉得这句话真的非常有道理!
刚刚也提到了要有一门特长,所以在这里再强调一点:公司不需要你什么都会,但是在某一方面你一定要有过于常人的优点。换言之就是我们不需要去掌握每一门技术(你也没精力去掌握这么多技术),而是需要去深入研究某一门技术,对于其他技术我们可以简单了解一下。
最最最关键也是对自己最最最重要的就是学习!看看别人分享的面经,看看我写的这篇文章估计你只需要10分钟不到。但这些东西终究是空洞的理论,最主要的还是自己平时的学习!
如何去学呢?我觉得学习每个知识点可以考虑这样去入手:
- 官网(大概率是英文,不推荐初学者看)。
- 书籍(知识更加系统完全,推荐)。
- 视频(比较容易理解,推荐,特别是初学的时候。慕课网和哔哩哔哩上面有挺多学习视频可以看,只直接在上面搜索关键词就可以了)。
- 网上博客(解决某一知识点的问题的时候可以看看)。
这里给各位一个建议,看视频的过程中最好跟着一起练,要做笔记!!!
最好可以边看视频边找一本书籍看,看视频没弄懂的知识点一定要尽快解决,如何解决?
首先百度/Google,通过搜索引擎解决不了的话就找身边的朋友或者认识的一些人。
一定要学会分配自己时间,要学的东西很多,真的很多,搞清楚哪些东西是重点,哪些东西仅仅了解就够了。一定不要把精力都花在了学各种框架上,算法、数据结构还有计算机网络真的很重要!
另外,学习的过程中有一个可以参考的文档很重要,非常有助于自己的学习。我当初弄 JavaGuide: https://github.com/Snailclimb/JavaGuide 的很大一部分目的就是因为这个。客观来说,相比于博客,JavaGuide 里面的内容因为更多人的参与变得更加准确和完善。
如果大家觉得这篇文章不错的话,欢迎给我来个三连(评论+转发+在看)!我会在下一篇文章中介绍如何从技术面时的角度准备面试?


