咳咳咳!我也当了一回标题党,毕竟为了写好这篇文章内容,我自己前前后后花了一周的时间来总结完善,当然希望被更多人看到。
文章内容适用于每一个学习 Java 的朋友!我觉得这篇文章的很多东西也是我自己写给自己看的,比如从大厂招聘要求中我们能看到哪些重要的能力,我们该朝什么方向努力?
共勉!
下面的文章的部分内容在我早期文章中出现过,老读者应该一眼就可以看出来了。废话不多说,开始正文!
我觉得每一个技术人的梦想大概就是能够找一份大厂的 offer,我觉得这很正常,这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等大厂的技术氛围还是要明显优于一些创业型公司 / 小公司,如果说能够在这样的公司锻炼几年,相信对自己能力的提升还是非常大的。
当然,很多创业公司的锻炼也很大,不过大部分都是 CRUD 的工作,你甚至还要同时去写前端。刚毕业的时候做 CRUD 的工作没什么,如果一直这样做下去就有问题了。
不论是笔试还是面试都是有章可循的,但是,一定要不要想着如何去应付面试,糊弄面试官,这样做终究是欺骗自己。这篇文章的目的也主要想让大家知道自己应该从哪些方向去准备面试,有哪些方向可以提高自己的能力。
网上已经有很多面经了,但是我认为网上的各种面经仅仅只能作为参考,你的实际面试与之还是有一些区别的。另外如果要在网上看别人的面经的话,建议即要看别人成功的案例也要适当看看别人失败的案例。看面经没问题,不论是你要找工作还是平时学习,这都是一种比较好地检验自己水平的一种方式。但是,一定不要过分寄希望于各种面经,试着去提高自己的综合能力。
“ 80% 的 offer 掌握在 20% 的人手 ” 中这句话也不是不无道理的。决定你面试能否成功的因素中实力固然占有很大一部分比例,但是如果你的心态或者说运气不好的话,依然无法拿到满意的 offer。
运气暂且不谈,就拿心态来说,千万不要因为面试失败而气馁或者说怀疑自己的能力,面试失败之后多总结一下失败的原因,后面你就会发现自己会越来越强大。
另外,我只是在这里分享一下自己对于 “ 如何备战大厂面试/如何提高自己能力 ” 的一个看法,以下大部分理论/言辞都经过过反复推敲验证,如果有不对的地方或者和你想法不同的地方,请您敬请雅正、不舍赐教。
从招聘要求看大厂青睐什么样的人?
先从已经有两年左右开发经验的工程师角度来看: 我们来看一下阿里官网支付宝Java高级开发工程师的招聘要求,从下面的招聘信息可以看出,除去Java基础/集合/多线程这些,这些能力格外重要:
- 底层知识比如jvm :不只是懂理论更会实操;
- 面向对象编程能力 :我理解这个不仅包括“面向对象编程”,还有SOLID软件设计原则,相关阅读:《写了这么多年代码,你真的了解SOLID吗?》(我司大佬的一篇文章)
- 框架能力 :不只是使用那么简单,更要搞懂原理和机制!搞懂原理和机制的基础是要学会看源码。
- 分布式系统开发能力 :缓存、消息队列等等都要掌握,关键是还要能使用这些技术解决实际问题而不是纸上谈兵。
- 不错的sense :喜欢和尝试新技术、追求编写优雅的代码等等。
再从应届生的角度来看: 我们还是看阿里巴巴的官网相关应届生 Java 工程师招聘岗位的相关要求。
结合阿里、腾讯等大厂招聘官网对于 Java 后端方向/后端方向的应届实习生的要求下面几点也提升你的个人竞争力:
- 参加过竞赛( 含金量超高的是 ACM );
- 对数据结构与算法非常熟练;
- 参与过实际项目(比如学校网站)
- 熟悉 Python、Shell、Perl 其中一门脚本语言;
- 熟悉如何优化 Java 代码、有写出质量更高的代码的意识;
- 熟悉 SOA 分布式相关的知识尤其是理论知识;
- 熟悉自己所用框架的底层知识比如 Spring;
- 有高并发开发经验;
- 有大数据开发经验等等。
从来到大学之后,我的好多阅历非常深的老师经常就会告诫我们:“ 一定要有一门自己的特长,不管是技术还好还是其他能力 ” 。我觉得这句话真的非常有道理!
刚刚也提到了要有一门特长,所以在这里再强调一点:公司不需要你什么都会,但是在某一方面你一定要有过于常人的优点。换言之就是我们不需要去掌握每一门技术(你也没精力去掌握这么多技术),而是需要去深入研究某一门技术,对于其他技术我们可以简单了解一下。
技术面可能会问哪些方向的问题?
你准备面试的话首先要搞清技术面可能会被问哪些方向的问题吧!
我直接用思维导图的形式展示出来吧!这样更加直观形象一点,细化到某个知识点的话这张图没有介绍到,留个悬念,下篇文章会详细介绍。
上面思维导图大概涵盖了技术面试可能会设计的技术,但是你不需要把上面的每一个知识点都搞得很熟悉,要分清主次,对于自己不熟悉的技术不要写在简历上,对于自己简单了解的技术不要说自己熟练掌握!
如何获取大厂面试机会?
不论是对于社招还是校招,我们都有下面几种方式来获得面试机会:
- 各种招聘网站上投递简历或者关注大厂官网,随时投递简历(走流程的网申)
- 找到师兄师姐/认识的人,帮忙内推(能够让你避开网申简历筛选,还是挺不错的,不过也还是需要你的简历够棒);
- 博客发文被看中 /Github优秀开源项目作者,大厂内部人员邀请你面试;
如何做自我介绍?
自我介绍一般是你和面试官的第一次面对面正式交流,换位思考一下,假如你是面试官的话,你想听到被你面试的人如何介绍自己呢?一定不是客套地说说自己喜欢编程、平时花了很多时间来学习、自己的兴趣爱好是打球吧?
我觉得一个好的自我介绍应该包含这几点要素:
- 用简单的话说清楚自己主要的技术栈于擅长的领域;
- 把重点放在自己在行的地方以及自己的优势之处;
- 重点突出自己的能力比如自己的定位的bug的能力特别厉害;
从社招和校招两个角度来举例子吧!我下面的两个例子仅供参考,自我介绍并不需要死记硬背,记住要说的要点,面试的时候根据公司的情况临场发挥也是没问题的。另外,网上一般建议的是准备好两份自我介绍:一份对hr说的,主要讲能突出自己的经历,会的编程技术一语带过;另一份对技术面试官说的,主要讲自己会的技术细节和项目经验。
社招:
面试官,您好!我叫独秀儿。我目前有1年半的工作经验,熟练使用Spring、MyBatis等框架、了解 Java 底层原理比如JVM调优并且有着丰富的分布式开发经验。离开上一家公司是因为我想在技术上得到更多的锻炼。在上一个公司我参与了一个分布式电子交易系统的开发,负责搭建了整个项目的基础架构并且通过分库分表解决了原始数据库以及一些相关表过于庞大的问题,目前这个网站最高支持 10 万人同时访问。工作之余,我利用自己的业余时间写了一个简单的 RPC 框架,这个框架用到了Netty进行网络通信, 目前我已经将这个项目开源,在 Github 上收获了 2k的 Star! 说到业余爱好的话,我比较喜欢通过博客整理分享自己所学知识,现在已经是多个博客平台的认证作者。生活中我是一个比较积极乐观的人,一般会通过运动打球的方式来放松。我一直都非常想加入贵公司,我觉得贵公司的文化和技术氛围我都非常喜欢,期待能与你共事!
校招:
面试官,您好!我叫秀儿。大学时间我主要利用课外时间学习了 Java 以及 Spring、MyBatis等框架 。在校期间参与过一个考试系统的开发,这个系统的主要用了 Spring、MyBatis 和 shiro 这三种框架。我在其中主要担任后端开发,主要负责了权限管理功能模块的搭建。另外,我在大学的时候参加过一次软件编程大赛,我和我的团队做的在线订餐系统成功获得了第二名的成绩。我还利用自己的业余时间写了一个简单的 RPC 框架,这个框架用到了Netty进行网络通信, 目前我已经将这个项目开源,在 Github 上收获了 2k的 Star! 说到业余爱好的话,我比较喜欢通过博客整理分享自己所学知识,现在已经是多个博客平台的认证作者。生活中我是一个比较积极乐观的人,一般会通过运动打球的方式来放松。我一直都非常想加入贵公司,我觉得贵公司的文化和技术氛围我都非常喜欢,期待能与你共事!
如何介绍自己的项目经历?
如果有项目的话,技术面试第一步,面试官一般都是让你自己介绍一下你的项目。你可以从下面几个方向来考虑:
- 对项目整体设计的一个感受(面试官可能会让你画系统的架构图)
- 在这个项目中你负责了什么、做了什么、担任了什么角色
- 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用
- 另外项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的又或者说你在这个项目用了什么技术实现了什么功能比如:用redis做缓存提高访问速度和并发量、使用消息队列削峰和降流等等。
我该如何学习?
如何学习?
最最最关键也是对自己最最最重要的就是学习!看看别人分享的面经,看看我写的这篇文章估计你只需要10分钟不到。但这些东西终究是空洞的理论,最主要的还是自己平时的学习!
如何去学呢?我觉得学习每个知识点可以考虑这样去入手:
- 官网(大概率是英文,不推荐初学者看)。
- 书籍(知识更加系统完全,推荐)。
- 视频(比较容易理解,推荐,特别是初学的时候。慕课网和哔哩哔哩上面有挺多学习视频可以看,只直接在上面搜索关键词就可以了)。
- 网上博客(解决某一知识点的问题的时候可以看看)。
这里给各位一个建议,看视频的过程中最好跟着一起练,要做笔记!!!
最好可以边看视频边找一本书籍看,看视频没弄懂的知识点一定要尽快解决,如何解决?
首先百度/Google,通过搜索引擎解决不了的话就找身边的朋友或者认识的一些人。
学会各种框架有必要吗?
一定要学会分配自己时间,要学的东西很多,真的很多,搞清楚哪些东西是重点,哪些东西仅仅了解就够了。一定不要把精力都花在了学各种框架上,算法、数据结构还有计算机网络真的很重要!
另外,学习的过程中有一个可以参考的文档很重要,非常有助于自己的学习。我当初弄 JavaGuide:https://github.com/Snailclimb/JavaGuide 的很大一部分目的就是因为这个。客观来说,相比于博客,JavaGuide 里面的内容因为更多人的参与变得更加准确和完善。