小土刀

数据科学工程师指南

公司的数据部门通常有三种角色:数据科学家、数据工程师和架构工程师,但许多事实证明这样的分类方法既不科学也不高效。结合工作中的经验,我认为『数据科学工程师』这一角色才是发展方向。这里我们来聊聊什么是,以及如何成为一个优秀的数据科学工程师。


为什么需要数据科学工程师

关于数据科学部门的现状,《工程师要不要写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 等等
  • 数据可视化

总结

真正动手去做一个像样的产品,并且真正用起来才是最锻炼人的。不要限制自己,其实没有条条框框,想做,就去试试。

唯一要注意的就是,累了的时候,想想那时意气风发豪情万丈的自己,别停下。

参考链接

捧个钱场?

热评文章