第三章02
三、专业技能准备与提升
3.1 专业技能准备与提升
对大数据开发岗专业技能的准备主要可以分为三类
- Java部分:规划自己的学习路线,建议是每天持续学习,使用视频+经典书籍+小项目练手(安利一下牛客网上的项目实战:https://www.nowcoder.com/project/recommend)的方式来学习Java部分。
- 大数据部分:建议的是在对Java部分学习完成之后进行大数据部分的学习,一定要自己动手搭建集群框架,而且大数据部分关于每一个框架的细碎知识点都比较多,建议是在每学习一个框架的同时多去看看博客以及GitHub上一些对应的分享,把大量细碎的知识点理解并记忆(在笔试中会遇到这些细碎知识点)。
- 计算机基础部分:这部分理论及概念较多,且在笔试及面试中出现频率较高,对于该部分的学习建议就是多花费些时间理解记忆,可以将一些关键的知识点存于云文档中,则利用空余时间进行理解记忆。
3.1.1 JAVA基础
3.1.1.1基础语法
关于Java的基础语法问题,范围比较广,毕竟以后是走大数据开发这条路嘛,所以对于大家来说这些“基本功”还是要熟练掌握的,这部分的内容比较偏向于理解,推荐大家可以仔细研究研究《Head First Java》。
其次基础语法涉及到的概念比较多,诸如Java语言的特性、JVM JDK JRE的理解与比较、Java和C++的区别、Java程序主类的理解、字符型常量和字符串常量、常用的关键字、标识符、流程控制语句的使用、自增自减运算符、泛型与类型擦除、基本数据类型、方法、重写与重载、面向对象特征、对象与类的区别、构造方法的作用等都需要熟练掌握,而且这些知识点也都是笔试面试中的常客,也属于Java的入门基础知识点,对于这部分的知识点来说是重在理解、重在思考的,大家最好多读几本关于Java基础的书(《Java 核心技术卷 1+卷 2》 《Java 编程思想 (第 4 版)》),然后通过自己的深入思考进行总结理解,真正理解Java的基本思想。
在学习的同时一定不要忘记自己动手多敲代码,多敲多练对于我们的学习之路至关重要!
3.1.1.2核心概念
集合:在笔试面试中都是考察的重点,常用的一些集合诸如HashMap、ConcurrentHashMap、ArrayList、LinkedList都是建议大家仔细研究一下源码和底层数据结构的,在面试过程中会被挖的比较深,除此之外,需要熟练的掌握各类集合的区别以及在不同场景下的应用,熟练使用各类集合API以及Collections工具类。
反射:需要熟练掌握反射机制的使用、静态编译和动态编译的区别、反射机制的优缺点、反射的应用场景,而且建议大家手撕一下反射的基本使用。
JVM:特别重要!!在面试中还是对自身技术的提升上来讲都是特别重要的一个技术点,熟练掌握JVM内存模型(面试必问,需要详细深挖各个细节)、直接内存定义、类加载机制详解、双亲委派模型、JVM垃圾回收(必问)、类加载器、常用的GC调优策略、Java文件是如何运行的、内存的分配过程等,该部分知识点也是重在理解,重在思考的(安利下《深入理解Java虚拟机(第3版)》)。
并发与多线程:该部分的内容可能会比较难以理解和上手,在前期可以先简单的了解一下基础,等到后边学习边进行理解,主要需要掌握的知识点有 进程与线程的关系、区别及优缺点、并发与并行、线程生命周期和状态、线程死锁、多线程的优缺点、线程池原理理解(ThreadPoolExecutor类)、synchronized 关键字及JDK1.6对其底层的优化、volatile关键字原理、Java内存模型(JMM)、ThreadLocal原理、乐观锁与悲观锁等,推荐大家仔细阅读《Java 并发编程之美》这本书,该部分的学习在锁(synchronized)、线程池、volatile关键字的部分建议挖的深一些,建议看一下源码,理解底层结构,面试中如果可以讲的比较深一些的话是一个很好的加分项,其余部分则需要进行理解记忆学习,可以精读阅读《深入浅出 Java 多线程》),对我们自身的提高十分有帮助。
其他部分:常用的设计模式一定要会,如单例模式的几种实现,面试中的手撕代码常客,以及框架部分(Spring、SpringMVC、Mybatis、SpringBoot等),是一个加分项,如果不是主动提及的话,在面试中一般不会被问到。
学习重点导图总结(面试重点)
3.1.2 计算机基础知识
计算机网络:计算机网络部分的内容,可以首先掌握一些基础的知识,随后再慢慢的进行深入研究,因为一般如果不是专业做网络方面的,在面试中对这方面的要求不高,推荐学习《网络是怎样连接的》 、《图解 HTTP》,对其中的诸如七层/四层网络模型、TCP与UDP协议区别、三次握手四次挥手、HTTP与HTTPS区别、输入网址到展示页面的背后流程等理解的前提上进行记忆,在面试中可以通过自己的话总结回答出来就足够了(面试中多以概念问答方式考察)。
操作系统:这方面我觉得掌握操作系统的基础知识和 Linux 的常用命令以及一些重要概念就行,如操作系统的概念、什么是虚拟内存、什么是进程与进程表、多线程的好处、死锁出现的四个条件、进程间通信方式、调度算法、什么是僵尸进程、内存管理、CPU寻址等,操作系统的相关书籍比较枯燥,大家可以搭配在第二章推荐的网课以及《深入理解计算机系统》搭配起来进行学习,对提及到的重点知识也是需要大家在理解的基础上进行记忆,面试及笔试中也多是也概念理解的方式进行考察。
数据结构与算法:首先掌握基本的集中排序选择算法如 快速排序、归并排序、堆排序、冒泡排序、插入排序、选择排序等,其次没得说,就是多刷多练多总结,可以先看一下《大话数据结构》后进行算法刷题,安利一下《剑指offer》、牛客题霸、力扣,每一道题都建议大家多看题解,从多种角度多种方法来理解学习每一道算法题,从时间复杂度、空间复杂度、算法执行是否最优等方面进行分析学习总结,也建议刷题的时候不要使用IDEA等工具,因为现在公司在面试中对算法题的考察都是全手撕代码,基本功很重要。
数据库:MySQL的相关知识是必问必考的,如存储引擎、MyISAM和InnoDB的区别、索引的使用及底层数据结构、查询缓存、事务、事务四大特性、事务隔离级别、MySQL默认隔离级别、读写锁、视图、MVCC、SQL语句执行流程、数据库三大范式、MySQL行锁与表锁区别、SQL语句优化等,其次大数据开发岗位,对SQL语句的编写有较高的要求,所以熟练的编写SQL语句十分重要(大家可以在牛客网上进行练习),而且面试中经常会要求手撕SQL语句,推荐大家阅读《SQL 基础教程(第 2 版)》(入门级)、《高性能 MySQL : 第 3 版》(进阶)、《MySQL 必知必会》进行学习,当然在学习的同时一定要动手联系!!!除此之外,Redis也是一个比较高频的知识点,需要大家掌握Redis作用、为什么要使用Redis、Redis的基本数据结构、Redis内存淘汰策略、Key的过期策略、缓存雪崩、穿透、击穿等,推荐大家学习《Redis设计与实现》,当然在学习的同时也建议大家实际操作,联系实际来思考Redis出现的原因及作用。
常用工具:熟练的掌握IDEA、Git、Docker、Maven等工具的使用。
学习重点导图总结(面试重点)
3.1.3 大数据与数据仓库
大数据部分需要学习的知识点比较多,Hadoop(三大基本组件HDFS、MapReduce、Yarn)、Zookeeper、Hive、HBase、Kafka、Flume、Spark、Flink等,在学习的时候一定要自己在虚拟机上搭建框架集群,所以说需要给电脑加配置,最好是16G内存。其次学习的时候建议是每天进行笔记总结,视频+书籍+博客的方式进行学习,大数据部分的细碎知识点比较多,在面试中一般会让你自己挑选比较熟悉的框架进行深挖,所以说每一个框架都需要掌握,但最还是有两三个特别熟的!
其次以学习方法来说,以Hadoop为例,我在学习的时候,首先是去了解为什么会出现这个框架、这个框架的出现解决了什么问题、该框架包含哪些基本组件,其次是跟着视频去动手搭建单节点框架、练习基本命令、理解所配置文件的原理,然后就是在虚拟机上搭建集群框架,跟着视频学习框架原理与应用,同时搭配着书籍与博客(安利GitHub上的两个大佬https://github.com/heibaiying/BigData-Notes和https://github.com/wangzhiwubigdata/God-Of-BigData)。每个框架的细碎知识点都会比较多,建议大家在学习的时候每天都对所学的知识点进行总结,有助于在准备面试的时候进行复习**(可以在学习的同时多去牛客网讨论区搜索大数据面经进行相关框架重点知识点的考察总结)。**
学习重点导图总结(面试重点)
3.2 项目经历准备与提升
因为没有去实习,则我的项目是通过自己构思设计所完成的(会在第五章将作者的小项目进行注释文档以及源代码的分享)。
项目的选择:需要基于实际的应用来选择项目,大概的几个方向分为:数据仓库、实时数仓、推荐系统、离线海量数据处理、实时日志分析等,而我选择的则是实时流日志分析,因为在当下的实时推荐、微博热搜、热点新闻展示等都是基于实时的统计分析用户的行为日志而做出的操作,所以我选择了这个方向来作为自己的秋招项目。
项目技能树:
项目的结果:1、存储至HBase中的结果数据可以作为实时推荐、热搜、热点新闻等的数据支撑 2、可以实时的对存储至Redis中的数据进行可视化展示。
项目的技术难点:
- 如何使用 Kafka高效的缓存从 Flume 传输过来的用户行为数据;
- 如何使用 SparkStreaming 消费 Kafka 中的数据时达到数据去重的目的;
- 如何使用SparkStreaming达到 exactly-once 目的;
- 如何选择对大对象的共享以提高程序性能。
如何解决技术难点:如何解决技术难点,总的来说就是要对自己项目所涉及到的技术框架有深入的理解,只有对自己所选项目的技术框架有深入的理解才能设计出更高效更优的程序,除此之外,还可以通过网络搜索以及请教老师或者网络上的大数据大牛博主,一般关于各种常见的技术问题都可以比较容易找到的,善用Gooole、Stackoverflow、GitHub、Csdn可以解决我们所遇到的绝大部分问题。
总结:曾经在面试中,有一位面试官对我说,一般对于没有实习的学生来说,对项目的提问主要就是为了确认学生简历上所写的项目是否亲自做过,所以说我们一定要把自己写在简历上的项目的整体脉络、所设涉及到的技术点、项目的各个细节都要搞得十分清楚,最好自己动手做过项目,并且所做的项目要一定要具有实际的应用意义。
项目的选择需基于实际应用出发,建议同学们准备两个项目,一个是数仓方向的项目,另一个是实时开发、离线开发、推荐系统等方向的项目,而对于没有实习的同学来说,可以给大家推荐几个相关的项目: 1、GitHub上一个完整的推荐系统:https://github.com/bjmashibing/Recommender(有源代码与数据,缺点是没有视频讲解) 2、基于阿里云的实时数仓项目(https://pan.baidu.com/s/12vxmNtNepzOwX75***5bKg 提取码:abcd 有视频讲解以及源代码) 3、电商数仓项目(https://pan.baidu.com/s/1gKfLvHeY2b8NKK9L5LoQbQ 提取码:abcd 有视频讲解以及源代码) 4、电商推荐系统(https://pan.baidu.com/s/1Ds8VIbiy_rSOrg3FY-tyKw 提取码:abcd 有视频讲解以及源代码) 5、电商项目(实时处理)(https://pan.baidu.com/s/1OgV47ViAF8U_tlVSdt8DBg 提取码:abcd 有视频讲解及源代码)6、Flink项目(GitHub高start项目 https://github.com/CheckChe0803/flink-recommandSystem-demo )7、机器学习及推荐系统(https://pan.baidu.com/s/1AEGRAhaWDrRg2JpDeHwX2w 提取码:abcd 有视频讲解以及源代码 ) 以上给大家推荐的几个项目方向,不需要全部都做,都是比较完整比较大的项目,建议时间充足的同学可以选择一个数仓项目以及一个实时处理或推荐系统相关的项目去做,重要是自己动手做!!!把项目的所有细节以及所涉及到的知识点都吃透(深挖)!!!切忌不要只看一遍不自己动手做,这样只会给自己挖坑!!!