海牛学院的
第期
本文预计阅读
9分钟
大家好,我是你们的老朋友,蒙牛。
今天为大家带来的是一篇面试经验分享文,一位参加了去年字节跳动秋招面试的同学,为我们讲述一下他的面试经验和这个过程所引发的总结与反思。让我们一起听听他的故事,看看能够从中得到什么收获~我是有经验的分割线
1、对于秋招的建议
秋招真的是一言难尽,一路被刷到底,不过这次我并不想过多地叙述失败的经历,更多的是想要分享一下我在秋招中提炼出来的学习方法和一些感悟。
对于秋招的准备:
首先需要明确自己想要从事的工程师岗位,然后再确定所从事工程师岗位的技术栈,要有针对性地去学习,学太多没用的东西既浪费时间也消耗精力。
对于秋招的策略:
第一步:如果学习基础不错,在毕业当年的3月和4月都可以直接去实习,无论最后能不能转正,对于之后的秋招都具有重大的意义。
第二步:如果没有实习机会,我们就要学会面向简历复习,从基础知识点到项目细节,都必须不断深挖,还要对常规算法题达到熟练掌握的程度。
第三步:正式的秋招其实从7月就已经陆陆续续地开始了,这里面的策略还是一样,如果知识储备充分就去参加提前批,如果没有那就等待正式秋招。如果提前批挂了会有面试记录,影响后面的面试(字节跳动就是如此)。
另外不要急着去面大厂,先去小厂去锻炼锻炼面试经验(只要有面试机会),很多大厂的面试批次都有三四批之多,要计算好时间安排到每个大厂的二三批。提前面大厂,面试经验不足很容易被刷,后面的批次很少有hc,所以对于面试批次和时间的安排也是非常重要的。
2、提炼学习方法论
秋招虽然没有拿到很好的offer,但是我提炼出了自己的学习方法,增强了自己的学习能力,这才是我最大的收获。在这里想跟大家分享一下我的学习心得。
我把我的学习方法提炼为五个层次-三个阶段,在五个层次的基础之上,把每个阶段的知识逐步系统化。具体的学习内容和方法如下所示:
1)第一阶段
第一阶段的学习以实操为主,建立具体的思维模型,不要钻牛角尖。基础的内容掌握以后,快速通过,不明白的内容在后面的学习中再查缺补漏。
①第一层次:如果是科班,肯定学过计算组成原理、操作系统、计算机网络还有数据结构与算法,如果不是,那就去看一遍,不需要第一遍看得多懂,有个印象就行。对于计算机的基础架构和网络组成还有基础的数据结构具备一定的思维模型就够了。并且算法刷题是一个比较持久的过程,无论是剑指Offer,还是力扣,重要的是要开始刷起来,为笔试和面试手撕算法做准备。
②第二层次:就是学习Java,首先掌握那些关键字、封装、多态、继承、组合等的概念,对于Java每一个模块的知识都去实操一下,重要的是敲代码,很多东西能懂就懂,不懂敲一下代码就过,后面自然会明白。并且尽可能的去熟悉一下JVM的基础内存结构和多线程的编程模型。
③第三层次:数据库的学习,我们需要学习典型的关系型数据库MySQL、非关系型数据库Redis,不需要对数据库深入的研究,在第一层次我们会安装,学会基础的DDL、DML语言操作,基础的SQL语句会编写即可。
④第四层次:就进入大数据的学习,从大数据采集层(Flume、Sqoop)、大数据存储层(Hive、Kafka、HDFS)、大数据计算层(MR、Spark、Flink)、还有调度组件Yarn和协调组件Zookeeper,不需要深入太多的原理,还是实操为主,学会安装、配置以及基础操作即可。
⑤第五层次:大数据项目,如果没有实习经历,还是需要自己做两个项目来支撑一下的,大数据里面最经典的两个项目就是数据仓库和推荐系统,可以尝试去看教学视频试着构建一下,如果时间不充裕,把视频看完,文档研究透,知道项目里的所有细节,也就算实操了这个项目。
2)第二阶段
第二阶段我们就要面向简历复习,抓住关键东西,不断深究原理了。很多不明白的知识要去不断地研究视频和博客,直到把问题弄懂。这个阶段的重点是知识的深度。这里给大家安利一下B站上面海牛大数据的课程,那个青牛老师讲得非常不错,可以当做参考资料来用。
①第一层次:有了对计算机基础知识的基本了解,我们就要去研究面试的重点问题了。计组的面试题几乎没有,更多的是计算机网络和操作系统,例如在操作系统中进程与线程的区别、虚拟内存的实现、分页分段的区别等。在计算机网络中网址解析过程、TCP三次握手和四次挥手的原因等都需要深入了解。再次重申一遍,算法不能扔,要持续的去刷,要不断回顾以往刷过的题,持之以恒。
②第二层次:有了Java基础知识的学习,现在只需要针对面试重点就行。Java当中各个关键字的原理和区别(final、Static、interface、abstract)、Java面向对象的体现(多态、继承、封装)、Java集合(LinkedList和ArrayList、HashMap的原理)、以及以下基础方法的理解(equals、hashcode);另外也要去重点突破JVM、多线程的相关重点知识,在这里不再赘述。
③第三层次:数据库也是需要深入原理的,例如MySQL的SQL执行顺序、索引结构、事务特性以及隔离级别等、Redis的基础数据结构原理、数据备份机制以及单线程的原因等都需要重点掌握。
④第四层次:对于这个层次的大数据目标,我们需要重点掌握核心组件的核心原理,核心组件MR、Yarn、HDFS、HIVE、Spark等,都是重点,其他组件在掌握好这几位之后再去研究,内部原理和比较都需要不断去理解和记忆。
⑤第五层次:这一层次还是基于对大数据知识的深入理解,去不断扩展对于项目的理解,去实操项目,并且去锻炼自己的HiveSQL能力,面试中能够手撕HiveSQL。
3)第三阶段
第三阶段我们就要去不断地突破自己的技术深度和奠定工程师的开发能力,去系统性的构建自己的知识体系,因为面向简历学习的知识比较碎片化,并且不够系统性。在第一、第二基础之上我们已经差不多知道哪些是重点,我们的核心突破点在哪。
①第一层次:我们需要系统地学习计算机基础知识,每门计算机基础知识都应该架构自己的知识主线,就比如计算机组成原理,以冯诺依曼计算机体系为主线,不断扩展计算机各个组件的功能和运行状态、随着计算机性能的不断要求,就是对这些组件的不断优化,加缓存、多核CPU以及流水线处理指令都是在冯诺依曼计算机体系结构上不断发展而来,才满足了现代人对于计算的各种要求。
操作系统应该建立:
从磁盘引导区启动-
对各个计算机组件的抽象(进程是CPU的抽象,地址空间是对内存的抽象、文件是对磁盘的抽象)-
启动图形化用户界面(用以监测计算机整体性能和提供便于访问计算的接口)-
启动驱动程序来检测硬件的状态和输入输出-
在操作系统上启动任意的应用程序(操作系统提供应用程序访问计算机硬件的接口)
这样的主线。
其他细节和管理,都应该围绕着这个主线去不断丰富。
另外数据结构也应该深入理解其原理和算法的应用。在此基础之上,分布式系统概念与设计我认为也应该深入学习一下,因为任何大数据组件都是在虚拟化技术和分布式系统原理的基础之上进行开发的,对于架构分布式技术有很大裨益。
②第二层次:对于Java的学习,如果对于基础知识没有任何问题,我们应该结合实战去深入Java当中的设计模式、网络编程、高并发等内容,这些内容是对于理解大数据源码和自己构建中间件都是十分重要的基础,设计模式中的动态代理实现RPC模型的重要内容,网络编程NIO、AIO是分布式计算机通信的基础,高并发更是检验一个优秀组件的重要标准。另外也应该深入JVM的调优实战等内容,只有这样才算是奠定了深厚的Java基础。
③第三层次:对于数据库的学习,我觉得应该暂时先告一段落,如果后面工作又遇到时,Mysql的主从备份,以及Redis的分布式锁实现和缓存集群都可以实践一下。
④第四层次:在前面的基础之上,去深入研究Spark、Flink,不出意外,我们在日后的工作中,打交道最多的就是Spark和Flink,对于源码的研究与不同场景下的调优,具备深层次的理解能力还有实战能力具有很重要的意义。
⑤第五层次:这一层次的学习,需要不断地磨练自己的架构能力,不同的场景下搭建数据处理架构,相同处理功能的组件很多,如何去选择合适的组件去搭建适应场景的大数据架构,不断去实践和打磨,锻炼自己的架构能力。另外应该深入了解一些前沿的数据仓库、数据湖的概念,丰富自己的技术视野,为职业突破做准备。
我是帅气的分割线
总结以上就是今天的内容了,如果对你有帮助,希望你能够