我如何用三个月备战春招 | 掘金技术征文。

·  阅读 1271

前言

本文所有内容均为bestsort个人总结。不一定适合所有人,请注意甄别

bestsort 目前大三,就读于山东某二本院校软件工程专业。大一、大二期间参加过ACM并有幸担任了一年的负责人。以下是我自己觉得稍微能看的地方。

  1. 拿到的奖项有蓝桥杯(国二)、ACM省赛(二等奖)、区域赛优胜奖(这是炮灰哈哈,简历上没写这条)。
  2. 在大三上花了2个月时间写了个半成品项目, 其中大部分功能都是我自己参考知乎、掘金、CSDN设计的。
  3. 我还有一个个人博客,访问量预估应该是15W左右(去年暑假没用CSDN了,搭在了自己服务器上,这是CSDN的统计),总字数11W左右。
  4. 我给开源项目Halo贡献过两个Pull Request, 其中一个PR对某一模块性能提升较明显,减少了附件上传时的内存开销(不过这是开始面试后的事情了,大概在3月10号左右的样子)

目前到手的 offer 只有 CVTE, 腾讯约了4.7的HR面,阿里周五刚结束三面。需要注意的是:本文不涉及面试题目,如果是因为想看面试题目而进来的同学可以直接右上角退出。 因为我觉得千人千面,别人遇到的不一定自己能遇到,至于一些基础知识,反正是都要考的嘛~ 了解了面试官想考察的点,问题自然就会了,哪怕不会(其实腾讯一面问我的问题我大部分都不会)也能够在分析的过程中体现你的能力,对于校招生来说这就够了。而对于一些基础,其他面经都有写,我就不再赘述了。如果现在提起SQL中的事务特性、JVM内存区域划分、索引的底层结构这些基础你都一头雾水的话,建议抓紧抓紧抓紧时间学习。别感慨这些上课的时候听都没听过, 现在的大学教育和实际应用有较大的脱节。

本文适合人群

本文适合准备冲刺大厂的应届生,需要读者有一定辨别能力(因为本文只是从笔者的角度去分析、总结。可信,但不可全信)和一丢丢丢丢的毅力,笔者准备面试排除项目和算法用了3个月左右(这三个月还打了近150联盟~)还有一点点检索能力。

由于作者投递的均是Java相关岗位,所以Java岗位的同学食用更佳,其他语言的同学可适当参考。

我准备了什么?

一月份

在整个一月份期间,我做了以下事情:

  1. 阅读了JDK、CGLIB动态代理的源码并将JDK源码分析写了一篇文章发布在我的博客
  2. 了解了MySQL常见的面试问题包括MVCC、事务、隔离性、索引数据结构、InnoDB和MyISAM的区别等一些较基础的知识,当时对于间隙锁、意向锁、optimizer trace、回表、聚簇索引非聚簇索引这些都没有了解过。
  3. 将《深入理解Java虚拟机》粗读了2-3遍并且我认为可能成为面试考点的地方我做了纸质笔记。
  4. LeetCode刷题,每天3道。这个没坚持下来,20天做了Top100里的50道题左右。
  5. 将《TCP/IP详解卷一》的17-24章看了两遍(这一部分主要是讲TCP协议)并做笔记。
  6. 和在牛客群里结交的小伙伴进行了5场左右的模拟面试,每一场针对某一块详问,持续时间每次大概1H左右。

整个一月份是我准备时间最多的一个时间段,包括接下来的二、三月份工作量都减少了很多。

二月份

二月份我没有准备太多,因为这个时间点一些公司已经在开始进行面试了,所以这一时间段主要围绕面试过程中遇到的不会的知识点去进行一个查漏补缺。在整个二月份我做了下面的事情:

  1. 回顾我的整个项目,因为时间一长一些项目细节可能就记不太清楚了,这在面试中是非常致命的问题。
  2. 思考项目中有哪些可扩展点以及优化空间,和在大流量下的一些解决方案。
  3. 看完了《Java并发编程的艺术》和《Redis设计与实践》这两本书,针对Redis的底层数据结构画了个导图同时复习了一下《深入理解Java虚拟机》。
  4. 掘金购买了《从根上理解MySQL》这本小册并试读了几节。
  5. 面了CVTE、东方金信(一个小公司)和阿里淘系的一面+CBU一面。二月底收到了前两个公司的Offer。
  6. 写了一点毕设(一个整合各对象存储的个人网盘,想用做秋招项目就提前写了),同时看了Halo部分模块的源码。

三月份

三月份的笔试渐渐多了起来,这时候我反而没做什么事情。。

  1. 给Halo提了俩PR并被项目成员merge进主分支
  2. 看完了《从根上理解MySQL》(只是粗读了一遍)
  3. 各种笔试+面试(面试其实也就阿里、腾讯~)
  4. 学习了操作系统的一些知识,包括I/O模型、进程线程这些基础。这部分主要是面向面试~使用的话我其实还好,因为我一直都是在Linux环境下开发。
  5. 完善了HTTP、HTTPS相关的一些知识。
  6. 看了一些设计模式并且自己写了一下(这个主要是因为给Halo提交PR的时候和我写网盘的时候用到的)

如何去准备?

首先要明白一点,面试的几个重点:基础、算法/数据结构、项目、发展潜力,任何一场面试都是围绕这几块进行的。其中基础和算法/数据结构是核心中的核心,而算法这东西是没办法短时间提高的。三个月的时间内也很难真正拿出一个可用的项目(哪怕拿出来了,能保证大多数是自主思考的吗?又会消耗多少精力?)所以我们需要定下一个大致的复习路线:

1. 算法是不可或缺的,推荐每天刷固定题数。3个月的时间已经足够提升到一定水平了。

2. 基础是重中之重,包括但不限于网络、操作系统、语言相关、数据库、中间件等。对于某些点可以适当多挖掘一点,突出自己的学习能力和潜力。比如说大多数人可能会在简历中填:熟练使用MySQL,能够调优什么的。那我们准备的时候就可以去专门建立一个百万级/千万级的大表尝试调优,然后总结调优过程。比如说一般的同学可能用explain查看,我们就可以用optmizier trace去查看具体的执行路径,进行一个较深的一次探索,绝对比花时间去背面试题亮眼得多。
3. 推荐大家找一些志同道合的小伙伴,四五个即可,约定好复习哪一模块,然后定期进行模拟面试,不管是作为模拟面试中的面试官还是被面试者都应该尽力尝试一下,一是巩固知识,二是在这过程中挖掘自己可能没顾及到的地方,三是提升自己的表达能力。
4. 多看书,不要以为书上的都是又臭又长。恰恰相反,看完一整本优秀的书籍能够在脑海中形成一个完整的知识体系,而且书中会介绍很多坑点。如果面试的时候是背面经的话很容易一扩展问就露馅。
5. 在复习的过程中多问为什么。比如说哈希表这个东西,为什么Java中的HashMap是用的红黑树+链表?相对于Redis的字典又有哪些不同和优劣点,渐进式扩容和多线程协作扩容的细节这一类。再比如说MySQL的索引使用的是B+树,为什么不是二叉树?在排除I/O次数的情况下两者谁更优?(这里我是真的算过。。)
复制代码

上面为什么没有提到框架?

我可以毫不犹豫地讲:我面过的所有面试官没有一个问我框架的,原因我认为在于2点:

  1. 我简历上没有写任何关于框架的条目(有的同学可能会纳闷这样怎么过的,参照如何去准备里的第二条)。
  2. 面试官觉得我的潜力、基础都不错,对于框架要求不大。
  3. 我太菜了 这里我觉得主要是第二和第三点,现在真的很多项目都是秒杀/商城,很多同学说关键点全对着视频里讲的一阵乱抄,没有经过自己的一个较深的思考。这就好比抄作业,都抄的一样怎么去区分?

我的项目只是一个半成品,但是单单是缓存这一块,我自己的选型就从用MyBatis的二级缓存 -> Spring Boot Redis Cache -> 手写aop注解,每一次换组件都经历过了我自己的思考,对于其中的优点和痛点都有我自己的想法。 再比如说我做的是一个社区,为了设计评论和点赞这些功能我参考了掘金、知乎、CSDN等一堆社区网站,每一个网站我都用拦截器去查看了他们这些接口的返回值和设计,而这些我觉得是跟着视频做的同学所不能体会到的。

我自己的缺点很明显,不会IO不会分布式没写过微服务没有实习还是个二本本科。但是我明白自己的优势在哪里,我的学习能力和潜力我能够在面试中通过回答让面试官清楚的了解到。我觉得这就是我为什么能拿到Offer的原因。

如何准备一个项目

这部分项目在绝大多数情况下都是不可或缺的,但是对于大多数应届生,并没有能力去独立的完成一个比较优秀的项目。这时候就可以多多参看一些资料。包括但不限于:已上线且有大量用户的产品、视频、各技术博客。 其中多数同学可能都会选择 视频 的方式去学习,因为跟着视频走能够避免很多的坑,但是我需要提醒的是当心舒适区陷阱(自造组合词~)。

私以为当你在学习过程中发现某些逻辑、设计、思想和之前学习的过程中有重合的时候,就应该停下视频了。 然后自己尝试去实践一下某个模块的实现,写完后再回头对比视频中的设计,并且可以尝试着去比对一下各自的优缺点和看看有没有什么优化空间。

其实和刷算法题的时候是很简单的道理,有些题可能想破头皮也不知道怎么去做。但是看到人家的解法的一瞬间自己就懂了。那为什么大家刷算法题的时候不一开始就点开答案?我相信刷过题的诸位都有自己的答案。AC某一道题并不是我们刷题的目的,目的是通过刷题提升自己的思维能力,让我们能够在面试的时候举一反三快速AC(格局小了、小了哈~)。 同样,对于大多数而言项目也并不是目的,目的是在面试过程中能够展现自己的实际操作能力、学习能力、工程化思维、发展潜力、etc... 如果只是单纯的照着视频把上面的代码搬运下来,记了记常见面试题而没有经过自己的深入思考的话,面试过程中很容易暴露问题的。这里我列举几个问题,如果你简历里有以下关键词,可以检验一下自己的学习成果。问题瞎想的,别当真...我比较菜想不出比较妙的问题,大佬无视即可。

  1. 动态代理: JDK动态代理中的缓存是如何实现的, 有什么好处
  2. ConcurrentHashMap: ConcurrentHashMap的扩容机制, 为什么选择从后往前
  3. HashMap: Redis也有类似的Hash结构,二者实现的区别,为什么
  4. 事务: 为什么InnoDB的默认隔离级别是RR,出于什么考虑
  5. 单例: 为什么枚举实现要优于Double Check
  6. MySQL: MySQL 的 Redo Log 和 Redis 的 RDB、 AOF 两种持久化方式的对比
  7. MySQL: SQL语句有些时候即使避开了会引起索引失效的查询方式也可能不会走索引,那么查询优化器是如何选择执行路径的?
  8. CAS: CAS操作中,到底会不会上锁,单核和多核环境下进行CAS有没有区别?

限于水平,只能提出这有限的几条问题抛砖引玉。如果大家有更好的问题,欢迎评论区留言~

分类:
阅读
标签:
分类:
阅读
标签:
收藏成功!
已添加到「」, 点击更改