本文作者:小土刀 微博:@小土刀
公司的数据部门通常有三种角色:数据科学家、数据工程师和架构工程师,但许多事实证明这样的分类方法既不科学也不高效。结合工作中的经验,我认为『数据科学工程师』这一角色才是发展方向。这里我们来聊聊什么是,以及如何成为一个优秀的数据科学工程师。
为什么需要数据科学工程师
关于数据科学部门的现状,《工程师要不要写ETL?——教你构建高效的算法/数据科学部门》一文已经把最大的痛点写了出来,
总结归纳一下这部分,简单来说就是『数据科学家』没有工程思维,『数据工程师』没有统计思维,『架构工程师』成了运维人员。大家的目标都不一致,整个部门运作起来摩擦力当然是巨大的。
如何解决这个看似无解的问题呢?上文中提出的方案是工程师制造积木,数据科学家拼积木,但是这对数据科学家和工程师本身都提出了极高的要求,对于小团队来说,也很难找出一条分界线来划分科学家与工程师。
什么是数据科学工程师
我决定换一个思路,与其划分边界,不如模糊边界。于是,数据科学工程师这个角色就成了自然而然的选择。那么数据科学工程师的基本要求是什么呢?至少应该满足下面的要求,并在某一方面有深入思考与实践:
对业务逻辑和过程的理解和参与
对平台、服务和框架工作机制的基本理解
能够在已有系统的条件制约下,针对具体问题,利用数据给出解决方案
有足够的工程思维,在设计解决方案的时候考虑到性能、抽象、泛化以及复用
如果是偏工程的,那么在开发过程中需要考虑到数据上可能的需求
如果是偏数据科学的,那么在数据的整个生命流程能够重复利用平台和服务
数据全栈,从 ETL 到最终的数据分析每一步都要参与都能参与
这样一来,每个人都能互相理解和认同彼此的工作,即使人数不多,也足以成为一支极具战斗力的团队。依照个人在不同领域的优势进行扬长避短,而不是利用固定的角色来限制发展。
但是,这个角色的门槛非常高,需要在学术界和工业界都有一定经验,更需要有一定的商业嗅觉,最重要的是一颗开放且不断学习的心。
如何成为优秀的数据科学工程师
首先要强调的是,全知全能的人大约是不存在的,放到数据科学工程师这里同样如此,本文中的数据科学工程师,更倾向于把数据和分析结果真正应用到产品中这个方向(另一个方向是提供商业分析支持,这需要对市场、商业、金融和运营有比较深入的理解,我不太了解,暂时不涉及)。简单来说就是原来『数据科学家』和『数据工程师』两者的结合。
至于『如何成为』这类的问题,大约是有标准答案的,坚持刻意练习与思考总结,理论结合实践,向优秀前辈学习。不过这种漂亮话说出来没啥用,听起来也没啥用。
我这里倒有一个简单易行的办法:做一个自我数据管理平台。通过实际『做』来真正『学』,在不知不觉中『成为』数据科学工程师。
为什么这个主意不错呢?有以下几个原因:
自己是开发者,借助现有工具一点一点搭建平台,能够接触开发各个环节的各个方面
自己是产品经理,如何设计系统的功能和配套界面,如何在开发资源有限的条件下进行取舍,能够学会判断需求的优先级与排期
自己是数据经理,需要收集什么数据,收集回来的数据怎么用,能够从自身角度出发去思考数据对于产品和用户的意义
自己是用户,需要在日常使用中发现不足,给出可行的意见和建议
在我看来,没有什么比全程参与更能学到东西了,虽然每一环节都是『输入->处理->输出』,但是知道每个环节是如何处理的,更能协调好各个部分的效率和功能,让一加一大于三。
具体来说,能做要做的东西太多了,比如:
真正把产品用起来,热爱产品
每天关注数据,思考规模、趋势与关系
保持好奇心与想象力,深入思考,找到那些不太明显但是非常重要的需求
学会转换视角,从不同角度去解读数据
接入自己在不同社交网站上的数据,对我来说就是微博、知乎、豆瓣和博客了
根据这些数据分析和挖掘自己的行为,优化自己的时间安排
监测自己每天的工作和学习情况
根据自己的信息收集情况做一些推荐和信息筛选
搭建系统时设计架构,开发功能时梳理流程
结合数据挖掘、机器学习等相关技术建立预测与跟踪体系
如何解释结果是一个大问题(即让数据成为证据)
数据可视化与跨界思考能力
上面所说的内容,也就对应于下面的技能集。
数据科学工程师技能集
参考 Swami Chandrasekaran 制作的数据科学家地铁图,根据自己的理解进行了重新分类和总结(注:知识点不是百分百全)
基础
线性代数基础(主要是矩阵及相关知识)
基本数据结构(哈希、二叉树、图)
关系代数、关系型数据库与非关系型数据库(内积、外积、叉乘、NoSQL)
CAP 理论
分布式基础(分片、集群)
信息论与熵
基本的报告、商业智能及分析
JSON 和 XML 格式
正则表达式
计算机系统运行机制
基础计算机学科:操作系统、计算机网络
Linux 的基本使用
统计
了解各类数据集与获取方式
基本统计信息(均值、中位数、范围、标准差、方差、直方图)
概率论、贝叶斯理论、随机变量、概率密度函数、累积分布函数、连续分布(正态、泊松、高斯)
数据倾斜、方差分析、中心极限定理、蒙特卡洛方法、假设检验、最小二乘法
最大似然估计、核密度估计、回归分析、协方差、皮尔逊相关、各类距离度量(欧拉距离)
编程
面向对象
接口设计
Python / Go / Java / Shell
基本算法
读取各类数据
使用软件包
机器学习
机器学习基础知识
监督学习、非监督学习、半监督学习、强化学习
训练集与测试集
分类器、预测器、过拟合、偏差
分类:决策树、Boosting、朴素贝叶斯、K 近邻
回归:Logistic 回归、线性回归、感知机
聚类:K-Means
神经网络、SVM
情感分析、协同过滤、实体识别
数据处理流程
ETL 过程
MapReduce 基本理解
Hadoop 生态(Zookeeper, HDFS)
Spark 生态
NoSQL 数据库(MongoDB, Cassandra)
云服务的使用
各类配套工具:Flume, Scrapy 等等
数据可视化
总结
真正动手去做一个像样的产品,并且真正用起来才是最锻炼人的。不要限制自己,其实没有条条框框,想做,就去试试。
唯一要注意的就是,累了的时候,想想那时意气风发豪情万丈的自己,别停下。
参考链接
什么是好的数据科学家
如何成为一名数据科学家
数据科学家/统计学家应该养成哪些好习惯
工程师要不要写ETL?——教你构建高效的算法/数据科学部门