在今天,我收到了蚂蚁金服A级的实习录用offer。
从开始面试到拿到口头offer(四面技术+一面HR)战线大约拉了半个月,
从拿到口头offer到收到正式录用邮件大概又是半个月。
思前想后,决定还是做一个整理与总结。
一方面是回顾并记录自己的努力过程,
一方面也是希望对后来者起到一些帮助。
前方高能预警,本篇文章万字有余,通读可能要很久。
以下内容普适于技术岗,非技术岗请部分参考。
目录
如何进行知识积累
如何把握实践与理论的天平
我应该如何整理笔记
怎么复习才不会忘
面试前
怎么写出让人眼前一亮的简历
如何突击面试
面试前焦虑该怎么办
面试开始
自我介绍到底要怎么说
面试中
技术面试的时候应该注意些什么
面试尬场怎么办
如何学会埋坑
面试结束
面试官:“你有什么想问我的吗”,该说什么?
我怎样才能知道我是否通过了
我两年半的技术人生
如何进行知识积累
在讲面试技巧之前,显然知识积累是不可或缺的。不然即使面试侥幸通过,在之后的工作中也会体验极差。
1
如何把握实践与理论的天平
实践是什么?
比如你new Object()
初始化了一个对象来使用;
比如你用HashMap结构作为容器存储了一些数据;
比如你拿SpringBoot搭建了一个web网站后台;
比如……
理论是什么?
初始化对象有什么代价?背后的底层实现逻辑是怎么样的?初始化太多对象可能导致什么问题?为什么我经常初始化对象,明明是空间消耗大,反而导致程序在运行时间上变得缓慢?
HashMap适合什么场景?我现在这个场景真的是用HashMap最合适吗?运用的时候有没有什么需要注意的?有时候遇到一些特殊需求,在HashMap基础上可以再优化性能吗?
天天用SpringBoot,IOC、AOP到底是什么概念,背后怎么实现的?它们适用场景如何,我的用法是最佳实践吗?会不会有什么弊端,导致在生产环境出现问题?
……
实践与理论的学习,到底应该侧重实践一些呢,还是侧重理论一些呢?
都说实践与理论要两相结合,缺一不可,在我看来这是一句废话。重点是如何权衡两者,并且在不同的发展阶段,两者的侧重比例是否又要发生变化呢?
在我看来,实践决定方向,理论填补细节。
(1)首先要实践,然后填补理论
程序员首先要实践,才能够收获基本的技术视野和处理问题的能力,这两者都是不可或缺的。
有了基本的视野之后,就可以根据自己学习的方向,去填补你的细节,例如:
我学习了Java,会写一些应用程序了,也知道如何利用应用服务层的Java来对数据库层的数据做一些处理,那么接下来: 1. 对数据怎么处理会更快(这里可能就会引出多线程,然后就可能引出线程池,又引出JDK提供的线程池有什么并发问题,怎么解决,然后可能又引入并发包,一下子串出好多) 2. 各种优化(比如初始化太多对象导致频繁GC,全局变量太多导致占存一直很高blabla)
我学习了MySQL,会用SQL语句操作数据了,知道建索引可以加快访问速度了,那么接下来: 1. 在SQL语句上是不是也可以做一些优化来提升性能(比如很有名的延迟关联) 2. 索引到底应该怎么建才好(这就涉及到索引的很多知识,比如B+树,比如一些匹配原则例如最左适配原则等等)
这种细节的填补是有逻辑性的,从我上面举的两个例子就可以看得出来。这种逻辑性的存在会使你在学习的过程中不会感到虚浮,会发现这些理论都是切实有用且有价值的。
但这样的理论学习还不够,因为它不系统。充分的发散思维使你能够在实践之外追求到很多理论知识,但那些你发散不到的部分就接触不到了。这个时候你就需要系统性的学习,例如读书。
当你第一次学会实践,就好像在自己的脑海中制作了一个知识星球。它里面几乎是空白的,但是球体本身存在,帮助你去界定、区分知识——借助这个球体的框架,当你在遇到一个新知识的时候,你会它有一个模糊的概念:这个知识到底是有用知识还是无用知识,它又在哪个范畴或层面里?
所以借助了一开始的实践,然后你再去逻辑地发散、或者系统地读书的时候, 就不会让新知识成为无根之萍,而是切实地进入你的知识星球中,成为你知识架构的一部分。
(2)理论再返回到实践中
知识架构建立起来了,但它没有经历实践的检验,就依然是不可用的。
一方面在于我们学习的理论知识可能是过时的,甚至是谬误的;另一方面我们可能以为自己懂了但其实没懂,这一点相信大家都能理解。
那么如何实践呢?有些理论可能是很难实践出来的,但是至少我们要对能实践的一部分去做一下尝试。就比如简单的JVM排查和调优,通过MySQL EXPLAIN去检查执行计划并实践优化等等。
2
我应该如何整理笔记
首先要强调笔记是很重要的。至少我认识的那些能够面试进大厂的同学,每个人都会为自己做笔记。
而至于到底应该如何整理笔记,我认为最重要的有两点:一是分门别类,二是控制粒度。
(1)分门别类
我们一定要能够清晰地把我们要整理的知识模块化,比如说JVM基础,我们可以这样分模块:
运行时数据区
垃圾回收
类加载
JMM
JVM调优
然后分别根据每一个小模块,单独整理一篇笔记。
并且在篇末,或者另开一篇笔记,专门记录针对这个模块的比较大而广的问题。
例如运行时数据区,我们就可以记录这样一些问题:
讲讲JVM运行时数据区的各个组成,是什么,有什么用
讲讲对象。它是如何创建的,里面包含一些什么信息,如何定位到对象
记录这种大的问题,有助于我们进行自测。不要问自己太多细小的问题,除非你切实觉得它很重要。
什么叫细小的问题呢?比如:类里静态的基本数据类型存在方法区还是堆里?
这种问题枚举你是枚举不完的,它其实已经包含在了”讲讲JVM运行时数据区的各个组成,是什么,有什么用“这个问题里。
(2)控制粒度
什么叫控制粒度?其实就是控制你笔记记录的详细程度。
如果你笔记中对于知识点的描述非常简洁,带来的好处是阅读起来就会很快,坏处是可能在阅读时导致你忽略掉一些本不该忽略的细节,或者甚至是:”咦,我这记的是啥,我怎么看不懂了。“
那如果记得太详细呢?很显然,就会导致阅读起来非常繁琐,可能达不到一个理想的迅速复习的效果。
那到底应该控制在一个什么程度上呢?
我认为一篇良好的笔记应该满足以下两个条件:
这段笔记切实提到了所有应该提到的知识点,不需要我去联想;
这段笔记对于这些知识点都有简单的描述性文字,并且能够言简意赅,尽可能以列表列举的形式,不要有叙述性的内容。
tips:什么叫叙述性内容?
举个例子,比如下面这是一段对于垃圾回收算法里的标记-清除算法的笔记:
标记-清除算法:
标记出所有需要回收的对象,根据标记统一回收。
问题:1. 低效率
2. 产生大量不连续内存碎片
带有叙述性内容的写法是怎么样的呢:
标记-清除算法:
它的基本原理是,标记出所有需要回收的对象,然后根据标记统一回收。
它有两个问题,一是在于效率比较低,二是在于可能产生大量不连续的内存碎片。
非常显然,阅读前者的效率远高于后者。
整理笔记时,我们尽可能省去不必要的铺垫,例如”它的基本原理是“这句话就是完全不必要的。
我们也可以尽可能省去一些联结词,例如”首先“、”然后“、”最后“这种。以及对于一些枚举性内容,我们尽可能采取列表而非文字形式表达,会更加直观易懂易记。
3
怎么复习才不会忘
每天都反复复习当然可以保证你不会忘,但会非常疲惫而且费时。
严格遵守网上的某些号称贴合人类记忆曲线的复习方式,坚持起来压力很大,最终往往也很难达到自己理想的效果。
实际上这种所谓”曲线“是有一定道理的,但是也要结合我们每个人自身的特殊情况,去找到最适合自己的一种记忆方式。
我认为这样一种记忆法是比较有效的:
从第一次复习并记忆的时候开始算,隔比较短的一段时间再复习并记忆一次,隔不太短的一段时间再复习一次,然后坚持每隔较长的一段时间就复习一次。
那么这个”比较短的一段时间“、”不太短的一段时间“、“较长的一段时间”又分别是多久呢?我们可以自己来决定。但需要知道的是,我们的复习间隔时间应该是不断变长的,直到一个比较稳定的值。
比如我个人的话,就喜欢第一次记忆完后,两小时再复习一次,隔一天再复习一次,然后隔四五天复习一次,之后可能就一直是7-10天会复习一次。
无需刻意,比如我本来打算三天后复习一次,但是三天后突然有什么事耽搁了。所以我提前到前一天,或者滞后到后一天,又能怎么样呢?记忆是量变的过程,一天两天的偏移根本不会有什么质变可言。
但让记忆周期大抵符合一个慢慢变长的规律,我想是有必要的。而如果你觉得最后每隔7-10天复习一次都会压力很大,那你也可以半个月甚至二十天才看一次。不过这样的话,等面试要来临的时候,你可能就难免需要简单突击一下了。
面试前
1
怎么写出让人眼前一亮的简历
按照一般流程来说,你的简历会先给懂一点技术/不懂技术的HR初审,然后再交给研发的同事过审,经过这两层都ok了,才会给你进面试的流程。
也就是说,你的简历不仅要让专业人士看着厉害,还要让非专业人士看着也厉害。
那么作为技术人员,简历到底应该怎么写呢?
(1)综述
我们不妨先概括后具体,先总体看一下简历应该写一些什么东西,写多长篇幅,排版成什么样子,然后再分析每个模块应该如何去写。
写什么东西
一个正常的简历应该有如下内容:
基本信息及联系方式
学习经历
工作经历(或实习经历)
项目经历
专业技能
自我评价(这个不一定要有,看前面篇幅)
写多长篇幅
作为技术人员,我觉得简历1-2页就好,3页未免太过冗长。
排版成什么样子
首先格式上来说,现在一般都是网申,也就是提交电子材料,所以HTML或者PDF格式为佳。
具体排版的话,尽可能简洁明了,不要花里胡哨。技术人,又不是去做UI设计,搞那么好看,人家也不会欣赏,反而觉得你不务正业。
我个人建议简历的好看程度,达到markdown能支持的极限就可以了,不要超过markdown的能力。
(2)基本信息及联系方式
可能会包括以下一些信息:
姓名,电话,邮箱:这几个是必须的,不多说了。
求职意向:单独列这条出来,我建议要写。不然你本来做后端的,人家给你安排到测试开发,你哭都来不及。
个人网站/博客/GitHub:如果有厉害的一定要记得写,如果很水的话建议别写了。
(3)学习经历
可能会包括以下一些信息:
学历(或者毕业年份)
绩点:如果不好看,请不要写,不要写,不要写
专业:如果不是计算机相关专业,请不要写,不要写,不要写
奖项:尽可能多写,从高到低排。先写厉害的,最后写不厉害的。如果没什么拿的出手的奖项,建议干脆什么也不要写。不要孤零零写个什么XX大学优秀团员上去,还不如不写。
(4)工作经历(或实习经历)
这里就如实说就好,切记一定要准确,包括在职时间也写明白,一两个月的偏差也是在给自己埋炸弹。
应该包括以下信息:
在职时间:例如2018.2~2019.3
工作单位:如果不是大家熟知的大厂,最好附上行业
部门:这个是可选项,不一定要写。
如果是厉害的部门请记得写,比如腾讯微信
岗位:建议具体。如果公司里岗位就叫“研发工程师”,
你可以写成“JAVA研发工程师”或者“GO研发工程师”之类的。
(5)项目经历
这是第二重要的部分!!第一重要的部分是下面的专业能力。但这也是决定你是否能简历过审的很重要的一部分,并且是可能导致面试官疯狂追问你的来源。
一般写2-3个项目经历比较好,相对来说,要挑最厉害的、最对口的、最近的。
那么每个项目经历中,应该写一些什么呢?
项目名称
项目简介:1-2句话就好,让别人知道你这是个什么项目。
比如是个后台管理系统?比如是个电商平台?之类的
个人技术工作:请以列表形式列举自己的核心工作,
不要大段叙述性文字!!
后面是一些可选项,不一定要写:
技术关键词:项目中涉及到的技术关键词
项目中的收获
项目成果:项目上线后有什么成果。
比如抗住了多大的QPS,比如做到了多大的规模等等。
请注意这两者是有区别的,前者可能更强调峰值,后者是长期的稳定性。
当然还可以有其他的,但最好要有技术视角。
给一个优秀的范例(来自敖丙大大):
如果觉得这个有点太高大上了,再看一个普通一点的:
(6)专业技能
专业技能方面应该尽可能讲得全面,把自己确定会的一个都不要漏掉。
但是一定要和岗位对口。比如你投个Java后台,你非得写个摄影技能上去,反正我个人感觉不是很好。
如果你不知道怎么写,可以看一下岗位描述。一般投递简历前你看到的岗位描述上都会有对于技术要求的说明,比如:
=======我们的要求=======
全日制211本科以上学历,计算机相关专业,毕业时间2020.11-2021.10
JAVA基础扎实,理解io、多线程、集合等基础框架,对JVM原理有一定的理解
熟悉分布式、缓存、消息、搜索、推荐等技术,并能合理应用,解决实际问题
学习能力强,对代码质量及系统性能具备精益求精的精神
良好的团队沟通协同能力,抗压能力,勇于接受挑战
有作品或者实习经验优先
我们可以根据岗位的要求,结合我们自身的优势,来写我们的专业技能。像这样:
2
如何突击面试
我个人觉得,突击面试是在面试前1-10天的这个阶段。
(1)笔试突击复习
这个是毋庸置疑的。之前在怎么复习才不会忘里说,最后坚持每7-10天复习一次。如果你坚持了这种频率,我觉得笔记突击复习对你来说几乎是不需要的。不过如果你觉得心有不安,可以在突击阶段每天复习一次。
切记一点,笔记突击复习时,请记得自己问自己问题,然后模拟一下在面试官面前你会怎么回答。别只是记忆,你还要学会如何表达。
(2)针对性复习
针对性复习包含两方面:把握公司面试特点+刷特定面经。
首先是把握公司特点。打个比方,如果你去面试字节跳动,可能就需要多准备一点算法、网络,他们很喜欢问这些。如果你去面试美团,你可能就更需要准备一些JUC并发包、框架。
把握公司特点很重要,你会发现即使同样是面试JAVA岗位,不同公司的面试内容差别也会很大。
甚至不只是公司。到部门层面,差别也会很大。某公司A部门的JAVA岗,和该公司B部门的JAVA岗,就是要求不一样的。也许一个更注重并发能力,一个更注重排查调优能力等等。这一点你可以从岗位要求里去了解,或者问部门里相关的人员。
其次是刷特定的面经。现在网上有很多人分享面经。可能不一定能直接找到你现在面试的部门的面经,但你至少可以找到同一家公司下、业务类型相近的面经。把他们题目拿过来,给自己模拟面试一遍。和前面说笔记突击复习一样,模拟你的表达,别只是心里想一想答案就过去了。
(3)每日一道算法
如果你面试中可能会出现算法题,建议你在突击阶段每天一道LeetCode以保持手感。不过这因人而异,有些人即使很久不做算法,临阵磨枪也不虚。
3
面试前焦虑该怎么办
什么深吸一口气?站在阳台看看窗外?我觉得效果不是很大。
深呼吸在面试前半小时是有效的,它可以缓解你面试前过分紧张的情绪。但它是缓解紧张的,无法缓解焦虑。
焦虑的源头在于:害怕意外的发生。我觉得缓解焦虑最有效的方式就是,为自己规划好一切。
在突击面试之前,时间尚早,相信你也不会有太多焦虑。当突击面试阶段开始,你就要开始学会为自己规划。让一切有条不紊地进行,你会发现你不再会为面试和其结果感到焦虑,因为你知道你自己做到了最好。
那如何规划呢?
不妨给个例子:
比如我在下周六(2020-04/18)是阿里的一面。而今天是周日(2020-04-12),接下来我怎么安排呢?
2020-04-12 周日
复习单线程容器、JUC包,整理出相关的大而广的面试问题,进行自测。
2020-04-13 周一
复习网络、操作系统
2020-04-14 周二
复习JAVA常见面试题、JVM
2020-04-15 周三
复习MySQL和Redis
2020-04-16 周四
复习Spring、IO、设计模式
2020-04-17 周五
网上查阅面经自测,做两道算法恢复一下手感
2020-04-18 周六
盯着自己准备好的各种大而广的问题反复车轮式复习,直到面试前半小时。
半小时里再背一遍自我介绍,复习一下简历里的项目。
迎接面试。
如果这样规划以后,依然让你感到十分焦虑,很简单:把规划再细化。
你会发现,当规划的细致程度达到某种阶段以后,你的焦虑会转化成压力和动力,不会再让你手足无措。
最后说一个小tip。其实让你面试前不焦虑还有一个非常简单的办法,就是多投递简历,多面试,面多了你就会感到麻木,不会焦虑了。
面试开始
1
自我介绍到底要怎么说
如果是一面/二面,一般是纯技术面,这个时候我建议可以遵照这样一种自我介绍模板:
自报家门
介绍自己的技术方向和技术能力
我主攻的方向是XX,从技术上来说,我对于XX、XX(枚举一些技术点)比较熟悉(以引导面试官问你熟悉的内容)
介绍项目经历(什么项目,在里面做什么事情,有什么难点,怎么克服的,有什么收获)
我在之前XX(读大学?在XX工作?之类的)的时候,很喜欢并善于研究 / 做过一些有价值的项目,比如blabla。期间遇到过一个问题至今印象深刻,blabla。经过这个项目,我吸收了一些blabla的知识。
tips:在介绍项目经历的阶段中,“在里面做什么事情”是最重要的模块,一定要讲清楚,做什么事情决定你在面试官第一印象中的高度。而“有什么难点,怎么克服的”是给你一个埋坑的机会,让面试官更有可能在这个点上去追问你。
收尾
希望在未来,可以把这些知识(之前项目中提到的知识)运用在工作中。
也希望在本次面试中,可以得到面试官的一些建议和指导。
如果是三面/四面/HR面,并且你切实觉得可能不再那么纯技术了,你的自我介绍可以向软实力角度偏移,这里拿我的自我介绍给个例子:
tips:整理你自己的自我介绍的时候,请切记不要太书面语,背起来不舒服不说,真正到自我介绍的时候也会显得生硬。
您好,我是来自XX大学XX专业的XX。
我想从技术理论、项目实践、工作能力上来简单介绍一下自己。
首先是技术理论。我主攻的方向是Java后台。技术上来说,我对于Java基础、JVM、并发容器、线程池等等还是比较熟悉的,另外在框架方面用SpringBoot比较多,读过Spring的源码。而数据库层面的话,磁盘数据库中我对于MySQL尤其是InnoDB引擎比较熟悉,内存数据库中对于Redis比较熟悉。
而在项目实践方面,我对于理论和实践的结合一直是比较看重的。从大一入学两个月我就有带领大一的学生队伍参加院里的项目比赛,之后陆陆续续到今天累计也做了不下十几个项目了。而在这些项目中,在综合方面我主要担任的也都是一个负责人的角色,而在技术方面我主要做的则都是Java后台的部分。我开过会议,出过文档,写过代码,也参加过有好几百人作为听众的大型答辩,应该说不管在硬实力还是软实力上,都得到了很不错的锻炼。
最后是我的工作能力。我现今任我们专业XX班的班长,已经历时一年半,对于组织工作应该说是非常熟悉了。另外,我也有参与学校里一个较大型的信息技术工作室,出任其中的技术部负责人,偶尔会带领学弟学妹们进行一些项目实践,以及参与引导部门及工作室的规划安排。事务很多很杂,也培养了我强大的规划力和执行力,相信这也能够使我在未来的工作中得心应手。
面试中
1
技术面试的时候应该注意什么
要从表达和内容两方面来讲。
(1)表达
表达切记一定要口齿清楚,逻辑清晰。
口齿清楚
口齿清楚这一点相信大家都能领会。但是也不排除有些小朋友一紧张口齿就不利索,这个一定要注意。
更有甚者有时候遇到不太确定的问题,想要以口齿不清来蒙混过关,这种更不可取,基本是搬石砸脚。
逻辑清晰
如何保证这一点呢?有时候当遇到一个措手不及的问题,很难保证我们的逻辑又快又清晰。
所以最简单的方式,就是用速度的牺牲来换取逻辑的明了。甚至有时候你可以短暂地沉默一会儿,好好整理一下思路,千万别张口就来,导致说得乱七八糟不成体系。
(2)内容
对于一些切入点非常小的问题,直接回答就可以。比如说:
Q:对象的锁信息是存在哪里的?
A:在对象头MarkWord里
但是对于一些切入点比较大的问题。例如:
Q:讲讲垃圾回收?
Q:集合里ArrayList和LinkedList有什么区别?
回答的内容切记不可过于简短,但也不能胡乱堆砌。最好的方式是水平扩展或者垂直扩展。
不妨就拿上面的一个问题来举个例子。比如说讲讲垃圾回收。
水平扩展的话,应该怎么讲呢?
A:
有关垃圾回收,我们首先要考虑两个问题。一是如何判断对象可回收,二是用什么样的方式来回收。
首先对于前者,有引用计数法和可达性分析两种方法,它们分别……(讲讲它们的含义,优缺点)
而对于后者,市面上主要有标记-清除,标记-整理,复制三种回收算法,它们分别……(讲讲含义,优缺点)
结合这些算法,市面上就出现了很多垃圾收集器,例如Serial,ParNew,CMS,G1……(顺便讲讲它们的回收逻辑,优缺点)
面试官:(暗自点头)
水平扩展也就是从一个问题出发,把与它相关的整棵知识树或者整颗知识树的一部分(如果树太大的话)讲出来,体现你的知识是有架构有体系的。
垂直扩展的话,又应该怎么讲呢?
A:
垃圾回收的话,自JDK1.8后,市面上就非常流行G1垃圾回收器了。它是不分新生代和老年代的,基本原理是……(讲讲含义,优点)
但是垃圾的频繁回收势必会导致用户体验的下降,虽然G1已经很优秀了,作为开发者我们还是需要关注JVM的优化(话锋一转,开始走向深度)
(讲一些具体的优化策略)
面试官:(暗自点头)
垂直扩展主要是需要自行找到一个切入点。或者面试官已经把切入点给到你了,那么接下来你要引入自己的思考,按照一个没有漏洞的逻辑走向深度,体现你是勤于思考并且善于发现并解决问题的人。
2
面试尬场怎么办
首先如果是因为你答不上来而尬场,你就乖乖说你不会,千万别强撑。
如果不是这个情况,是面试官一时沉默的话:
有时候面试官可能很忙,他可能都没来得及看完你的简历就来给你面试。换言之,他并没有做太多的准备。所以临时尬场也是非常正常的。
所以现在你要做的就是:让面试官不要尬场。
打个比方:
Q:你说你熟悉线程池,那你说说看线程池都有些什么重要的参数?
A:比如有核心线程数、最大线程数、允许存活时间、阻塞队列等等(顺便简单说一下这几个参数都是什么含义)
Q:嗯不错……(开始沉默)
一般面试官的沉默可能是你回答完这一个问题之后,他一时间想不到问什么。这个时候你可以继续沿着这个问题扩展下去:
A:关于线程池还有一些需要注意的地方。比如当一个任务添加进来的时候……(讲一下任务添加到线程池的流程)
A:考虑到这样一个流程,所以我们在控制最大线程数、阻塞队列的时候是需要注意的。如果最大线程数设置过大,或者阻塞队列设置上限过长,可能导致OOM(又联系回前面参数的问题)
是不是联系回去不要紧,但是只要你依然在讲这个问题相关的知识树里的东西,就可以有效地缓解尬场,还会让面试官觉得:
面试官:(嗯这小伙基础还挺扎实)
3
如何学会埋坑
埋坑是非常重要的一个技巧。
什么叫埋坑?就是在回答前一个问题的时候,适当地对面试官进行引导,让他能够问你想让他的问题。
面试前是最容易埋坑的。一是简历里的项目经历,专业技能;二是自我介绍阶段,讲一些自己擅长的技术点等等,引导面试官去问你。
而在面试的过程中,应该如何埋坑呢?
打个简单的比方。
比如现在面试官问你:”ArrayList和LinkedList有什么区别?“
你先中规中矩地回答。回答完之后,我们可以根据我们的擅长点做一些不同的策略:
如果你比较擅长并发容器,你可以说:
ArrayList和LinkedList都属于单线程框架,是并发不安全的。如果要并发安全的话,需要使用CopyOnWriteArrayList或者ConcurrentLinkedQueue
如果你比较擅长线程池,你可以说:
ArrayList和LinkedList分别是对数组和链表的封装。JAVA中比较重要的对于数组、链表的封装集合类还有线程池中的阻塞队列,例如ArrayBlockingQeque和LinkedBlockingQueue
当然了,埋坑只能启到一定的导向作用,最终决定权还是在面试官手上。不要太刻意,不然会适得其反。
面试结束
1
面试官:“你有什么想问我的吗”该说什么?
这个问题可以给几个例子:
您对我有什么建议吗?
您平时工作中主要做些什么呢?
如果我有幸能够被录取的话,主要会做一些什么样的工作呢?
2
我怎样才能知道我是否通过了
我个人不建议在面试完后直接问面试官:”我通过了吗?“
而且面试本来就是双向选择,你是在众多offer中挑一个最喜欢的,人家也是在众多面试者中挑最好的那一批。
所以如果你想要知道自己是否通过了,最好的方式是从面试官对你的态度中窥探。
比如你最后问:”您平时工作中主要都做些什么呢?“
他给你回答得非常详细,而且还会主动跟你聊一点别的,比如告诉你进来以后会做什么之类的,那说明他还是很认可你的。
如果他只是简单说一下,有点敷衍的样子,不排除只是他工作忙的可能,但你最好也可以考虑一下,找找其他出路了。
另外,等面试结束后,如果你有推荐你去面试的推荐人或者HR的联系方式,你也可以直接问他们面试的结果。
我两年半的技术人生
最后附上我两年半的技术生涯,中间不免有些弯路,但总体还是令我满意的。
希望给有需要的人以参考。
1
2017(入学
7-8月
参加社会上的Java语言基础培训课程,学习Java,基本上到可以简单使用Swing的程度,对于反射泛型等中高级知识一窍不通;
10月
拉了五个也是大一的小伙伴参加学院的创新创业比赛,基于Java Swing写了一个井字策略游戏,拿到学院的优胜奖;
11月
机缘巧合认识了一位研二的研究生,经他推荐进入一位教授的实验室做商业网站;
12月
在研究生的带领下认识SpringBoot和Mybatis,原理一窍不通,但是可以写一点CRUD;
总结
Java语言最基础内容的使用比较熟练了
有了可怜到几乎可以忽略不计的web后台开发经验
当时学院算法学习氛围比较好,到年末我大概相当于共计刷了一百道LeetCode中等题
2
2018(大一~大二)
1-3月寒假
进入培训机构学习web前端,了解了html-css-js,学会ajax;
4-6月
划水度过,我不知道我在干嘛,就好好上课;
7-8月暑假
做一些基于SpingBoot的简单实践,初步学习Unity游戏引擎;
9-10月
划水;
11-12月
学校各种创新比赛启动,我都参加了,最后同时启动了大约6-7个校园小项目;
总结
这是我多角度尝试的一年(比如web前端、游戏开发),因为我还并没有决定以后从事什么方向。大约在暑假后(9月),我才觉得自己未来应该会做Java后台;
在后台技术上提高不多,只是熟练了那么一丢丢;
项目启动很多,那个时候觉得项目很重要很能锻炼人,后来觉得其实做那么多差不多级别的项目并不是很有意义。
4
2019(大二~大三)
1-2月寒假
我启动了太多项目,CRUD崽忙不过来了!!
3-6月
各种项目比赛遍地开花的几个月:
3月:两个创新培育项目,一个国创一个市创评级
4月:上海市计算机应用能力大赛二等奖
6月:校大夏杯创业大赛铜奖
但只有我自己心里清楚,奖是拿得很不错,但是技术上其实都是一样的东西,而且非常简单非常基础。全是传统的小型单体web项目,业务驱动。
还是3-6月
比我大两级的拿到蚂蚁金服正式offer的学长来讲了Java面经,我终于意识到自己太菜了。但是跟着大三春招的洪流,我也没忍住投了几个简历试试:
携程:一站式面试,我不知道一站式是什么意思,去面了一面自我感觉良好,就直接走了!走了!没在那等着继续面下去,就没了。
字节跳动 · 北京:视频面试,在第二面挂了,评价是”相对大二学生来说比较优秀,但是暂时还没达到实习岗位的要求“
7月
买了一堆蚂蚁学长推荐的书籍,例如《高性能MySQL》、《深入理解Java虚拟机》、《Java并发编程实践》、《图解HTTP》等,开始有计划地阅读起来;
8月
去安徽会场参加全国大学生计算机设计大赛的答辩,荣获一等奖。还是那句话,真没啥技术含量。但是提升了我答辩的能力和吹嘘的水平;
9-12月
继续读书。
总结
这是我从实践逐步转战理论学习的一年。之前的我太过于知其然而不知其所以然了,写项目都是不考虑原理的。自蚂蚁学长分享了Java面经之后,为我指出了方向。
这一年我仔细阅读了《高性能MySQL》前七章,《深入理解Java虚拟机》近整本,也买了《MySQL技术内幕 InnoDB存储引擎》看完了一整本,做了很多笔记。
我还买了很多其他杂七杂八的书,例如《轻量级微服务架构》、《图解TCP/IP》、《大型网站架构》等等,有些是几乎读不懂,有些是没怎么读,大抵算是这一年走的弯路。
5
2020(大三)
1月
疯狂整理、复习,中旬参加了携程的日常实习面试,通过了,年前进入携程实习;
2月
过年几天还带了两本书回老家,但是真的学不进去。回来后因为疫情远程办公,同时不断进行复习与整理,准备春招;
3月
开始进入春招面试阶段。只投了字节和阿里,都通过了;
4月
一直到今天4.11,一直是静待offer。没有什么事情,就不疾不徐地学一学SpringCloudAlibaba,平时就谈谈恋爱,打打游戏,看看电影。
我两年半的技术生涯,主要走的是 实践学习 → 理论学习 → 实践理论相结合 这样一条路线。
一开始的实践学习就像是培训班生活,只不过是自我培训;
然后到理论学习层面,有幸听到蚂蚁学长的面经讲座,加上有之前的实践基础,让我的理论学习有方向感且不会太虚浮;
最后是实践理论相结合层面,主要就是把我一些新学习的没实践过的理论付诸实践。就比如学习了JVM调优和问题排查,就自己写一个死锁程序或者OOM程序然后用排查工具来排查一下问题。
最后祝认真阅读到这里的你,一定会拿到心仪中的offer!
END
史上最全的延迟任务实现方式汇总!附代码(强烈推荐)
因为我说:volatile 是轻量级的 synchronized,面试官让我回去等通知!
有人说:轻量级锁一定比重量级锁快!我忍不住笑了
关注公众号发送”进群“,老王拉你进读者群。