喜获蚂蚁offer,定级p7,⾯经分享,万字长⽂带你⾛完⾯试全过程前⾔
在今天,我收到了蚂蚁⾦服A级的实习录⽤offer。
springboot推荐算法从开始⾯试到拿到⼝头offer(四⾯技术+⼀⾯HR)战线⼤约拉了半个⽉,
从拿到⼝头offer到收到正式录⽤邮件⼤概⼜是半个⽉。
思前想后,决定还是做⼀个整理与总结。
⼀⽅⾯是回顾并记录⾃⼰的努⼒过程,
⼀⽅⾯也是希望对后来者起到⼀些帮助。
前⽅⾼能预警,本篇⽂章万字有余,通读可能要很久。
⽬录
如何进⾏知识积累
如何把握实践与理论的天平
我应该如何整理笔记
怎么复习才不会忘
⾯试前
怎么写出让⼈眼前⼀亮的简历
如何突击⾯试
⾯试前焦虑该怎么办
⾯试开始
⾃我介绍到底要怎么说
⾯试中
技术⾯试的时候应该注意些什么
⾯试尬场怎么办
如何学会埋坑
⾯试结束
⾯试官:“你有什么想问我的吗”,该说什么?
我怎样才能知道我是否通过了
我两年半的技术⼈⽣
如何进⾏知识积累
在讲⾯试技巧之前,显然知识积累是不可或缺的。不然即使⾯试侥幸通过,在之后的⼯作中也会体验极差。
如何把握实践与理论的天平
实践是什么?
⽐如你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去检查执⾏计划并实践优化等等。
我应该如何整理笔记
⾸先要强调笔记是很重要的。⾄少我认识的那些能够⾯试进⼤⼚的同学,每个⼈都会为⾃⼰做笔记。
⽽⾄于到底应该如何整理笔记,我认为最重要的有两点:⼀是分门别类,⼆是控制粒度。
(1)分门别类
我们⼀定要能够清晰地把我们要整理的知识模块化,⽐如说JVM基础,我们可以这样分模块:
运⾏时数据区
垃圾回收
类加载
JMM
JVM调优
然后分别根据每⼀个⼩模块,单独整理⼀篇笔记。
并且在篇末,或者另开⼀篇笔记,专门记录针对这个模块的⽐较⼤⽽⼴的问题。
例如运⾏时数据区,我们就可以记录这样⼀些问题:
讲讲JVM运⾏时数据区的各个组成,是什么,有什么⽤
讲讲对象。它是如何创建的,⾥⾯包含⼀些什么信息,如何定位到对象
记录这种⼤的问题,有助于我们进⾏⾃测。不要问⾃⼰太多细⼩的问题,除⾮你切实觉得它很重要。
什么叫细⼩的问题呢?⽐如:类⾥静态的基本数据类型存在⽅法区还是堆⾥?
这种问题枚举你是枚举不完的,它其实已经包含在了”讲讲JVM运⾏时数据区的各个组成,是什么,有什么⽤“这个问题⾥。
(2)控制粒度
什么叫控制粒度?其实就是控制你笔记记录的详细程度。
如果你笔记中对于知识点的描述⾮常简洁,带来的好处是阅读起来就会很快,坏处是可能在阅读时导致你忽略掉⼀些本不该忽略的细节,或者甚⾄是:”咦,我这记的是啥,我怎么看不懂了。“
那如果记得太详细呢?很显然,就会导致阅读起来⾮常繁琐,可能达不到⼀个理想的迅速复习的效果。
那到底应该控制在⼀个什么程度上呢?
我认为⼀篇良好的笔记应该满⾜以下两个条件:
这段笔记切实提到了所有应该提到的知识点,不需要我去联想;
这段笔记对于这些知识点都有简单的描述性⽂字,并且能够⾔简意赅,尽可能以列表列举的形式,不要有叙述性的内容。
tips:什么叫叙述性内容?
举个例⼦,⽐如下⾯这是⼀段对于垃圾回收算法⾥的标记-清除算法的笔记:
标记-清除算法:
标记出所有需要回收的对象,根据标记统⼀回收。
问题:1. 低效率
2. 产⽣⼤量不连续内存碎⽚
带有叙述性内容的写法是怎么样的呢:
标记-清除算法:
它的基本原理是,标记出所有需要回收的对象,然后根据标记统⼀回收。
它有两个问题,⼀是在于效率⽐较低,⼆是在于可能产⽣⼤量不连续的内存碎⽚。
⾮常显然,阅读前者的效率远⾼于后者。
整理笔记时,我们尽可能省去不必要的铺垫,例如”它的基本原理是“这句话就是完全不必要的。
我们也可以尽可能省去⼀些联结词,例如”⾸先“、”然后“、”最后“这种。以及对于⼀些枚举性内容,我们尽可能采取列表⽽⾮⽂字形式表达,会更加直观易懂易记。
怎么复习才不会忘
每天都反复复习当然可以保证你不会忘,但会⾮常疲惫⽽且费时。
严格遵守⽹上的某些号称贴合⼈类记忆曲线的复习⽅式,坚持起来压⼒很⼤,最终往往也很难达到⾃⼰理想的效果。
实际上这种所谓”曲线“是有⼀定道理的,但是也要结合我们每个⼈⾃⾝的特殊情况,去到最适合⾃⼰的⼀种记忆⽅式。
我认为这样⼀种记忆法是⽐较有效的:
从第⼀次复习并记忆的时候开始算,隔⽐较短的⼀段时间再复习并记忆⼀次,隔不太短的⼀段时间再复习⼀次,然后坚持每隔较长的⼀段时间就复习⼀次。
那么这个**”⽐较短的⼀段时间“、”不太短的⼀段时间“、“较长的⼀段时间”**⼜分别是多久呢?我们可以⾃⼰来决定。但需要知道的是,我们的复习间隔时间应该是不断变长的,直到⼀个⽐较稳定的值。
⽐如我个⼈的话,就喜欢第⼀次记忆完后,两⼩时再复习⼀次,隔⼀天再复习⼀次,然后隔四五天复习⼀次,之后可能就⼀直是7-10天会复习⼀次。
⽆需刻意,⽐如我本来打算三天后复习⼀次,但是三天后突然有什么事耽搁了。所以我提前到前⼀天,或者滞后到后⼀天,⼜能怎么样呢?记忆是量变的过程,⼀天两天的偏移根本不会有什么质变可⾔。
但让记忆周期⼤抵符合⼀个慢慢变长的规律,我想是有必要的。⽽如果你觉得最后每隔7-10天复习⼀次都会压⼒很⼤,那你也可以半个⽉甚⾄⼆⼗天才看⼀次。不过这样的话,等⾯试要来临的时候,你
可能就难免需要简单突击⼀下了。
⾯试前
怎么写出让⼈眼前⼀亮的简历 按照⼀般流程来说,你的简历会先给懂⼀点技术/不懂技术的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句话就好,让别⼈知道你这是个什么项⽬。⽐如是个后台管理系统?⽐如是个电商平台?之类的
个⼈技术⼯作:请以列表形式列举⾃⼰的核⼼⼯作,不要⼤段叙述性⽂字!! 后⾯是⼀些可选项,不⼀定要写:
技术关键词:项⽬中涉及到的技术关键词
项⽬中的收获
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论