信息来源:https://jiuye.uestc.edu.cn/career/news/newDetail.html?id=663
求职,筹谋从最初做起
从还未踏入校门,我就基本确定毕业要找工作的这个大方向,抱着这样的心态,下定决心四年好好学习课程,并利用尽可能多的时间在技术上下功夫,希望能在理论知识和技术深度上都有好的收获。这样使得我课程成绩和技术深度都有不错的收获,让我在大四有更多的选择。
我在大一入学前对安卓开发产生了一些兴趣,并利用高三暑假学习了C语言,在大一入学后参加凌睿工作室,学习方向是安卓开发,也就是在那个时候开始学习Java语言和安卓,直到大一下学期结束,我学完了安卓开发入门级的知识,发现自己并不适合做客户端开发这种跟界面和交互打交道的工作,于是转向跟数据打交道更多的后端开发。
在大一暑假,我用了假期时间学习了MySQL和Java后端相关的知识,还掌握了一些框架。在大二上学期,在辅导员那里帮忙做一个项目,将学到的东西在其中实践总结,并在大二寒假将剑指offer刷了一遍。在大二下学期,开始学习Java进阶相关的知识,在大二暑假开始掌握Java和后端原理。
大三上开始忙于找实习,主要是通过内推进行一些面试,面过百度、网易、美团,拿到网易和美团的offer,最后去了美团实习。
我也有一个BAT梦,在美团实习的我按捺不住,在过年前后准备了很长一段时间,在春招时向阿里投出了自己的简历,经过四轮面试后,拿到了阿里暑期实习的offer,在五月份进入阿里实习,并在八月份成功通过转正答辩,在九月份拿到意向书。
下面我就来分享一下找Java后端开发工作的经验,主要从准备、简历和面试这三个方面来说。
1 准备
不打无准备的仗,面试前的准备是重中之重,虽然说面试是一个主观性占比很大的考核方式,但是如果你能在将以下你能掌控的客观内容准备好,结果不会太差。
1.1计算机基础
1.1.1 计算机网络
计算机网络需要掌握的是计算机网络分层,主要掌握其中的应用层和传输层,应用层里的HTTP/HTTPS/DNS协议以及传输层里的TCP/UDP协议相关的内容要非常非常熟悉。另外经常考察的就是让你分析某个应用的网络传输协议是如何运作的,比如在浏览器里键入网址、当前视频面试涉及哪些网络协议等,要能结合计算机网络里的这些协议分析清楚。
1.1.2 操作系统
操作系统需要掌握好内存管理、进程管理、线程管理以及一系列的调度算法,尤其是进程和线程相关的内容几乎是必考察的内容。除此之外还有I/O相关的知识,同步、异步I/O,阻塞、非阻塞I/O,select、epoll等的实现原理,这些都比较重要。
1.1.3 数据结构与算法
首先要掌握一些常见的数据结构:数组、链表、栈、队列、堆、树、图,以及常见的算法思想:二分、贪心、递归、动态规划等,然后就使劲刷题,建议先从剑指offer刷起,因为剑指offer在国内公司的考察频率还是比较高的,可以在牛客网上提交代码,比较方便。刷完剑指offer就要开始刷LeetCode了,建议先将Top100刷完,然后再分tag刷,将同类题的技巧总结出来,能够极大地帮助你找到解题思路。
1.2语言
语言自然不必多说,好多公司的要求里至少有一条是要求“精通”Java语言。
1.2.1 Java基础
String以及常量池、抽象类与接口、一些诸如static、final关键字的含义和原理这些是经常问的。高级一些的就是反射、异常、泛型还有Java8新特性等的考察。
1.2.2 Java容器
这一部分需要去借助网上的一些博客或者文章看源码,将List、Set、Map这三大容器下的几个常考的容器源码和原理以及扩容相关的知识吃透,经常考察的是ArrayList、LinkedList、Vector、CopyOnWriteArrayList、HashMap、LinkedHashMap、ConcurrentHashMap,这些基本是是面试必问的内容。
1.2.3 Java并发
这里就是跟多线程相关的知识了,首先要掌握线程的生命周期,以及如何在Java里实现多线程:Runnalbe、Callable、Thread,还有一些多线程 的基本机制:睡眠和中断,两个多线程并发必问的关键字:synchronized、volatile。除此之外还要掌握好Java的多线程内存模型,即线程如何跟主内存交互的。最常问的是如何实现线程安全,用锁还是无锁的方式,除了锁之外经常问到CAS。最后,JUC里的一些并发组件也要掌握。
1.2.4 Java虚拟机
虚拟机可以说是Java里最难的部分,最基本的要对JVM里有哪些区域非常熟,然后就在这个基础上去掌握内存分配和垃圾回收的机制,包括垃圾收集算法、垃圾收集器、MinorGC、FullGC,除此之外就是类加载的机制,其中经常问双亲委派机制以及如何破坏该机制。
1.3框架
最核心的当属Spring了,Spring的IOC/AOP原理以及牵扯出来的反射、动态代理一系列需要去掌握。除此之外当今最流行的SringBoot用到也特别多,可能会问到SpringBoot对比Spring,以及SpringBoot的自动配置原理。还有就是一些常用的中间件比如MySQL:索引、事务、复制以及表设计等,Redis:字典、跳表,淘汰策略,常用的数据类型的原理等,Dubbo等RPC框架,这些都需要去理解和掌握。
1.4 项目
可能有些人会问,项目做了就做了,怎么在面试之前做好准备呢,这一部分恰恰是很多人忽视的,就是你需要站在面试官的角度来想,面试官不可能会对你项目里的CRUD感兴趣。
面试官感兴趣的是你对业务的理解:如何建立领域模型(即业务模型);感兴趣的是你对技术选型的理解:你选择了什么技术框架,做了哪些调研,你如何分析你的场景进行选择哪个技术的;感兴趣的是你对难点的攻坚:你项目里的难点在哪,如何发现问题,如何分析问题,如何解决问题的,结果是怎么样的。最后,面试官感兴趣的是你的成长:你在项目里学到了什么,在哪些方面有了进步,会不会做项目的总结和复盘。
通过这些你就可以提前着手开始准备,将自己项目这些要点写下来,在心里过几遍,做到问到的时候能有理有据,自圆其说,会在项目上加分。
2 简历
简历首先就是要选择一个简历模板,这一部分我推荐大家使用超级简历这个简历工具。它首先是模板简洁,引导非常好,基本上可以无脑填内容。其次,简历基本上都需要一页纸,才显得简洁,让面试官一眼看完,太长可能面试官都没有耐心看完或者翻页,这个工具还提供了自动一页纸,将内容压缩到一页纸上,比较方便。
接着就要正式地写简历了,重点就是要契合你面试的岗位和部门,最好能对着目标岗位的招聘JD去写,首先将你符合JD里的内容写上去。
对于基本信息,如果成绩比较好,可以突出地写出自己的排名,如果有ACM等比较硬、认可度比较高的竞赛获奖也可以写出来。
接着就是如果有实习经历最好写上,这是一个极大地加分点,就算实习的时候有一点点工作也可以作为面试的谈资,但注意要重点突出自己的工作部分,不要把同事的工作或者自己不熟悉的实习工作写上去,重点突出自己负责的小模块和使用的技术以及解决的问题。
其次就是项目经历,基本上可以从前期准备中提取出亮点作为项目经历的描述,要注意的是每一个亮点一行,要能体现出使用的技术和解决方案,以及项目的成果,最好能通过可量化的数字来增加体感,比如让性能提升了20%,中间成本节省了10%等。
其实很多面试官面试都没有固定问题的,而是先通过简历看你熟悉哪些内容,然后进行问题的发散,那么在简历你也可以有意对自己熟悉的地方用熟悉和掌握等词语进行形容,而对于不是很擅长的内容干脆不要写或者用了解或者知道这样的词进行形容。
最后注意的是,除非自己有特别突出的综合素质以及个人魅力,否则不推荐写个人评价,因为确实没有太大用,容易写空话,反而给看简历的人留下不好的印象。
对于简历的投递,最好是找到目标公司的学长学姐帮你内推,这样联系起来比较方便,不容易出现锁简历的情况,如果没有再选择通过牛客网寻找一些帖子帮忙内推,最后才是选择官网投递,因为官网投递的效率比较低,想了解面试相关的情况也联系不到人。
3 面试
首先,不得不说,面试是一个主观因素占比很高的考核,如果没有通过,不要气馁,不同的面试官考核的侧重点和看中的特质不一样,不一定是你的能力没达到要求,可能恰好碰到一个没有发掘你潜力的面试官,毕竟运气也是实力的一部分。
面试最重要的是要放得开,不要觉得面试官是老手,就束手束脚,尽可能跟面试官聊起来,如果遇到比较难的问题,把自己知道的和考虑到的内容都表达出来,让面试官知道你的深浅就够了。我们经常说就是跟面试官聊high了,看对眼了,一般面试都比较顺利地通过了。下面就聊聊面试中的一些技巧:
3.1 自我介绍
每次面试之前都会进行一个自我介绍,一般来说,简历上的内容比较多,自我介绍就是给面试官第二次认识你的机会,可以看做是简历的精简版,挑一两个最能体现你价值的地方来介绍自己。
如果你的Java基础比较扎实,你就可以说:“我熟悉的语言是Java,阅读过JDK源码,对JVM、并发编程较为熟悉”,那么面试官接下来可能就会开始问Java相关的内容。如果你对算法比较有信心,你就可以说自己熟悉数据结构与算法,做过一些算法比赛,可能面试官接下来就会让你手撕算法,总之自我介绍是突出你的核心价值,让面试官知道你最擅长的是什么。
当然如果你的自我介绍没有什么特点,那么自我介绍的时间也有可能变成给面试官看你简历的时间,所以一定要在面试之间就想好并写下自我介绍,多练习几遍,这样自我介绍的时候就不会太平淡了。
3.2 深度和广度
面试很大一部分是考核理论知识的掌握情况,一般会从深度和广度两个方面去考核。
对于深度,面试官不仅希望你能答出某个技术标准答案(基本原理),还希望能够知道这个技术为什么存在,解决什么样的问题,适用于怎么样的场景。
对于广度,面试官希望你能将某个技术跟类似的技术去比较,能从原理的角度分析它们的不同,以及在什么样的场景下使用哪种技术。
这里推荐一个结构化表达,可以使得你的回答能表现出深度和广度:这个技术解决了什么问题->基本原理是什么->使用场景是什么->和其他技术的区别,按这些步骤回答完之后,再提自己对哪些内容比较熟悉从而引导面试官往这些内容上去问。
3.3 引导
引导是十分重要的,面试过程中,要尽可能地把话题转移到自己所熟知的领域里去,而不是被面试官牵着鼻子走。
比如,面试官可能会问:“你熟悉计算机网络,计算机网络五层架构知道吗”,可能你熟悉应用层里的HTTP/HTTPS以及传输层里的TCP,但不熟悉网络层的IP协议,那么你可以简单地把每一层介绍一下,但只有在说到应用层和传输层的时候详细展开说HTTP/HTTPS以及TCP,并不断深入到你所熟知的细小的原理中去。
面试官的问题也会被你引导到这些方面上,也许他本来打算每一层都问一些问题,通过你这样引导,他可能就忘掉了一开始其实在问计算机网络的五层架构,你成功地避开了你不熟悉的网络层,但现在他反而觉得你答得有深度,比较不错。
最后:
希望我的求职攻略能对大家有所有用,能够帮助大家找到满意的工作,感谢大家的阅读。
CONTENT END