0x00 前言
今天和朋友在聊天,聊到怎样在面试和与人沟通的过程中体现自己的技术广度,感觉挺有意思,整理分享一下。分两个点来聊:1.有哪些方面的技术广度可以提高;2.怎样提高。其中第一个点可以近似地转换为数据开发工程师的技能树,有所不同,但是可以按照这个思路来考虑。
数据开发工程师这个职位其实可以干很多事情,因为凡是和数据相关的东西基本上都会有数据开发工程师的身影。比如说推荐系统,虽说会有推荐算法的存在,但是最后的工程实现也会有数据开发工程师的深度参与。而且经常出现的情况的是没有算法工程师,是数据开发工程师来实现的算法和系统,因此这就要求数据开发懂算法和系统开发;再比如说运维,一般很难有专业的运维来帮你搭集群,尝试各种组件,即使有这样的运维(我们就是),但是当你需要尝试新的组件的时候,仍然需要数据开发来承担前期的安装和运维的工作,只能是成熟后再交出去,因此这就要求数据开发懂很多运维的知识,至少是能熟练玩Linux,有时候甚至还要会去机房装机器(之前干过这事);然后说系统开发,很多系统定制性很强,比如Olap系统,初期很难找到专业的前端帮你做,那就要自己搞了,有些开源的组件可以直接用,比如Kylin+Saiku,但是很多时候要定制开发,因此这就要求数据开发懂不少前端和Web开发的东西。
上面说的很多东西不一定要求精通,但是很多还是要知道一些,至少老板提到说想做一个数据可视化的系统,你要能想到数据可视化能用Zeppelin做个简单的展示,或者可以用Superset、Gephi,然后如果需要做成系统了你要能想到我们可以用Echarts来做图表的展示,专业一点的话可以用D3.js,如果这个系统的后台数据源是ES,我们还可以用Kibana来直接出图。
0x01 数据开发工程师的技能树
前面吐槽有点多,进入一点正题。下图是一个大致的数据开发工程师的技能树。我把它分为了几个模块。其中大数据组件就不用说了,然后还包括了开发能力、数据仓库、算法和其它技能。下面挨个过一遍。
1.大数据组件
大数据组件非常多,可以说这两年太多了,但是总的来讲,还是有几个代表的系统在。存储领域有HDFS、BigTable,计算领域有MapReduce和Spark,它们引领了一波波浪潮。然后还有一些十分重要组件,比如作为数据仓库引擎的Hive、作为检索系统的ES、作为消息队列的Kafka、作为日志收集的Flume、数据库同步工具Sqoop、各种NoSql。
对于这么多的组件,我们该怎么办?
首先,HDFS一定要玩明白,十分熟悉它的原理,最好深入理解,能解决各种问题。MapReduce和Hbase要熟悉原理和应用场景,但不用精通,工作中常用到的除外。因为即使MapReduce和Hbase在工作中用不到,HDFS肯定也会用到。(Google的三篇论文分别衍生出三个系统:HDFS、MapReduce、Hbase。HDFS和MapReduce同属于Hadoop)
然后,对于各种组件,如果在工作中遇到了,就深入搞一两个,没遇到的,要去做三件事:1.看懂它的架构;2.明白它的使用场景;3.看一下其它公司的使用案例。
最后,还是要看一些组件的核心源码,组件太多了,挑其中核心的组件,看这些组件的核心内容。比如说实时处理的框架有Spark Streaming、Storm、Flink, 我们可以考虑只看其中代表性强的Storm,然后看Storm的话,不用全看,只看其中最核心的设计,核心设计和代码还是人力能看完的。
2.开发能力
开发能力暂时分三部分来聊吧,数据清洗、系统和语言。
数据清洗就不用谈了,大部分数据开发都要搞,写写Spark、MapReduce或者Hive脚本。要注意的是,我们要有升华,要尝试总结一些规律来,有一些升华。比如说数据倾斜怎么搞,怎么样保证实时数据清洗一条数据不丢一条不重复,怎么处理异常数据。
系统的话,是各种系统的开发,数据开发一般跑不掉报表系统,这是能给老板看的最基本的价值体现点。然后对于后台系统来讲,最好了解元数据系统、调度系统这些系统的设计方法。然后就是推荐系统和广告系统,如果没机会接触,至少知道一些他们的设计思路,明白整个框架,要能达到让你现在设计一个推荐系统你能设计出来一个简单的版本。
语言的话Java是必学的,而且要特别深。Python最好要搞一下,因为越来越多的系统来支持了Python,特别是机器学习和深度学习,清一色的Python。Scala、Go这些可以略作了解,用到了学就好。不得不提的是Sql,Sql能解决很多的问题,千万不要看不起Sql,很多和逻辑都可以用Sql轻易解决,即使在SparkStreaming中也可以套Sql来解决问题。
3. 数据仓库
不得不重点聊一下数据仓库,很多大数据开发对数据仓库不太了解,可能还会认为我们是互联网公司只有传统公司才搞数据仓库吧。其实不然,数据仓库是一套完整的理论体系,它包括数据清洗、管理、建模和展示等一套的理论。后面我会专门分享,之前也写了几篇数据仓库的文章,可以在简书中搜一下,比如:《漫谈数据仓库之维度建模》、《大数据场景下该如何优雅地设计数据分层》。
数据仓库的东西我还是想单独详细地写,这里不再细致讨论了。 需要大家了解的是,最好能明白维度建模、OLAP和数据集市是做什么的,为什么要有大宽表、维度表和事实表,为什么要有数据分层。
然后用户画像和特征工程最好也要有所了解,特征工程居士了解就相对少一点。
4. 算法
算法是个好东西,说起来算法大家会主要想到经典算法和机器学习算法,最近火起来的还有深度学习算法。
经典算法就不说了,属于基本功。其中的图论和树还是要好好看看,决定有用。比如说调度系统的设计要看图论吧,社交关系算法要看图论吧,文件系统目录树要看树吧,数据挖掘算法也有很多和树相关的。
数据挖掘算法最好还是要懂一些,即使不做算法研究,但是实现算法还是很必要的,不然功劳都被算法工程师抢了。 而且作为大数据开发,更应该肩负起数据挖掘算法在分布式系统中的设计和优化,这里的技术含量十足。 在这里,懂一些各个算法的大致原理,明白使用场景,有工作需要的话最好能亲自实现一下。
深度学习算法就不提了。
然后是大数据算法,什么才是大数据算法?这个不好说,但是不能把数据挖掘算法都放这,数据挖掘算法解决的问题不是大规模数据处理,而是从数据中挖掘价值。 大数据算法我们可以理解为是为了处理海量数据而设计的算法,目前我接触到的有基数统计算法的Hyperloglog应该算是一种,它在Redis和Druid中都有使用,然后还有《大数据算法》书中提到的外存算法和亚线性算法等。这一类算法目前学习还不够深入,后续慢慢边写边学。
5. 其它
算法之外就是其它的一些东西了,不必要但是我认为还是挺重要的。
先说Linux,这个我感觉必要性比较高,本文前面也提到了,我感觉大部分大数据工程师都应该会具备,只是会的深浅而已,比较接触底层的童鞋应该要对Linux了解的更深,比如我在一段时间内就经常去装系统换硬盘。
然后是爬虫,爬虫前面也写了两篇文章,我一直感觉爬虫是数据工程师的一项基本技能,无他,好玩。自己能拿到数据,想干什么都行。当然爬虫工程师还是要搞的很深的。
云计算的东西也很值得了解,最开始的时候,我一直认为Hadoop、Spark这类平台的应该算是云计算的内容,不过到底是什么无所谓,就当他们有联系但是又有区别好了。云计算主要分三层IaaS、PaaS、和SaaS,容器技术火起来之后又有了DaaS这种容器即服务的概念。随着云市场和大数据技术的成熟,微软的Azure、亚马逊的AWS、阿里的阿里云这些大佬们也都正在把Hadoop、Spark这些大数据组件嵌入到它们的云产品中,因此我可以理解为我们用的不少大数据组件应该算是PaaS,即平台即服务。
0x02 怎样提高技术广度
前面的内容写的有点多,这里就少写一点,后续有空继续搞。
个人认为。技术广度的提高还是有几个点要注意:
兴趣最重要,不然是很难有动力去学很多东西的
多听听讲座,和大家聊聊天,认识认识自己的不足,来点危机感。
自己做点有意思的小东西玩。尽可能多地用到新技术。
说点实际的吧,最近在搞一个小系列:自己写爬虫爬数据,然后在上面跑PageRank算法、LPA算法,然后用上图数据库来玩,再把这些算法变成MR和Spark的版本,再接着自己再用D3.js出点图看看。然后再爬些文本数据,做做NLP的处理,接着准备搞点信息检索的东西试试,然后是一些数据挖掘的算法各种跑着玩,比如LDA跑个主题提取。总之是一系列的东西吧。在这中间会穿插着算法的理解、个人的想法、方案的设计和一些代码的实现,偶尔再尝试分享一下用到的系统的设计。
上面提到的很多东西其实是之前就会的,但是很久不碰就忘了,还有一些事不太熟悉的,趁着这一波一网打尽,多学一点是一点。 我感觉这也是一种扩充技术广度的方式。
0xFF 写在最后
一家之言,自己写着玩,算是吐槽+闲扯。很多东西自己也不会,但是还是希望早点掌握了,可以出去吹。
看完有想法的可以互相交流,只求轻喷。
有很多技术不是靠几句话能讲清楚,所以干脆找朋友录制了一些视频,很多问题其实答案很简单,但是背后的思考和逻辑不简单,要做到知其然还要知其所以然,如果想学习Hadoop、大数据应用开发、挖掘、算法分析的朋友可以加我的大数据技术分享群:615997810,群里有阿里大牛直播讲解技术,以及Bigdata大型互联网技术的视频免费分享给大家。
每天一篇技术文章,欢迎关注我们公(zhong)号:大数据开发学习院,获取更多大数据学习资料资讯。
网友评论