数据科学中“专业化”意味着什么
作为一个专业的数据科学程序员需要具备些什么?

我作为一个数据科学家的经历跟我在书本和博客上所读到的根本不一样。我曾读到过为数字超级新星公司工作的数据科学家,他们听上去像是英雄,可以写出自动化(近乎有感知能力的)算法并不断地大量获取认知结果。我也读到过像百战天龙那样的数据科学家黑客,他们可以通过将他们周围有的任意原始材料拼凑出数据产品来拯救世界。

我的团队创建的数据产品并没有重要到可以评价大型的企业级基础设施。只是我觉得,投资超高效的自动化以及产品控制是不值得的。另一方面,我们的数据产品影响了企业中的重要决策,并且我们的努力是可测量,这一点十分重要。我们负担不起总是将所有的事情人为来做,但我们也需要高效的方法来为成千上万的人们共享结果。

现实中大部分还是 “常规”的数据科学家。我们比黑客们更有组织但是并不需要一个超级英雄般的数据科学老巢。我们一组人聚在一起进行思维碰撞,我们在此对于写出稳定的代码的最佳实践进行头脑风暴。这篇文章是对这次对话的一个总结,并且试图将我们的知识收集起来,取其精华至于一处。

如何变得专业化

数据科学家需要具备一些软件工程的技能,只不过并不是一个专业的软件工程师所需要的所有技能。我将具备必要的数据产品工程技能的数据科学家称为专业的数据科学程序员。专业并不是指类似一个证书或者多少小时的经验,我所指的是方法上的专业性。专业的数据科学程序员在他们建立数据产品的过程中是可以自我改正的。他们有着常见的策略来识别工作中的问题并纠正错误。

专业的数据科学程序员不得不将一个假说用一个可以测试的程序来表达出来。数据科学编程在软件工程中是独特的,这是因为数据科学家所处理的那些问题类型。巨大的挑战在于数据科学本质就是实验性的。这些挑战经常是困难的,数据是混乱的。对于很多这类问题,并没有已知的解决方案和策略,通往解决方案的路是前所未有的,可能的解决方案都是步步为营取最优来得出的。在下面的内容中,我会介绍一个规范的、有生产力的试错的常见策略:将问题分成多个小步骤,分别尝试解决方案,在过程中一直做出纠正和改进。

像专业人士一样思考

为了成为一个专业的数据科学程序员,你必须了解比系统是如何构造的更多。你必须知道如何设计一个解决方案,在你有一个解决方案时你必须能够识别出来,你也必须在你没有完全理解你的方案时有所察觉。最后一点是你必须能够自我纠错。当你识别出你方法中的概念差异的时候,你能够自己将其完善。为了以一个你可以自我纠错的方式来设计数据科学解决方案,我发现依照以下基本步骤是很有用的:观察、理解、想象以及展示

第一步:观察。从扫描环境开始。做背景研究并对所有可能与你试图解决的问题有关的细枝末节有所了解。以尽量宽广的视野来看待你的问题。尽量多的发现场景并且收集各类不同的信息。

第二步:理解。将你发现的各种信息碎片抽象成符合黑板模式的元素。在这个阶段,你正在将问题中的元素转化为有意义的技术性的概念。理解问题是为可行的设计奠定基础的关键步骤。

第三步:想象。根据你理解的技术概念,想象一些可以使你往目标更近一步的实现。如果你不能想象出一个实现,那么你可能在你观察问题的时候错过了什么。

第四步:展示。首先将你的解决方案解释给自己听,然后是你的伙伴,然后是你的老板,最后是你的目标客户。每一次解释只需要以传达到你的观点的正式程度即可:一次饮水机旁的短暂谈话,一封电子邮件、一次15分钟的散步。这是在成为一个自我纠错的专业数据程序员的过程中最重要的常规实践。如果你的方案有任何漏洞,那么他们将会在你尝试解释的时候发现它。花点时间来填充这些沟通代沟,并且确保你可以恰当地解释问题和针对它的解决方案。

像专业人士一样设计

创建和发布一个数据产品的活动是多样且复杂的,但是,一般来说,你将要做的会在阿利斯泰尔克罗尔(Alistair Croll )描述的大数据供应链中所包含。

 

big-data-supply-chain-db64a51ee8a3c650b65532d5e037e074

图片由Jerry Overton提供

由于数据产品依照一个范式(实时、批量或者两者的混合)来执行,你很有可能发现你自己正在一个数据供应链活动和一个数据范式的整合之中:注入和清理批量更新的数据,建立一个算法来分析实时数据,将批处理的结果进行共享等。幸运的是,黑板架构模式给予了我们一个基础的蓝图来应用良好的软件工程应对这些场景。

黑板模式

blackboard-pattern-f9060016f0aa09932deb83696161ce81

图片由Jerry Overton提供

黑板模式告诉我们通过将整个任务进行划分来找到一系列更小的自包含的子任务的方式来解决问题。每一个子任务将你的假说转化为一个更容易解决或是解法已知的假说。每一个任务逐渐改进解决方案,并且理想的情况下通向一个可行的解决方案。

数据科学被工具所淹没,每一个都有其独特的优点。生产力是很重要的,我喜欢让我的团队选择任何他们最熟悉的工具。使用黑板模式使得从一系列不同的技术来构建数据产品变得可行。算法之间的协作通过共享数据仓库来发生。每一个算法可以获取数据,将它们作为输入并且将结果返回给数据仓库为其他的算法作为输入。

最后,所有的算法都通过使用单个代表用来解决问题的启发者的控制组件来互相协作。控制器是你已经选择的解决问题的策略的实现。这是最高层面的对问题的抽象和理解,这是由可以交互的并且决定所有算法顺序的技术所实现的。控制器可以是像一个cron的定时任务或者脚本一样的自动化组件。或者可以是人工的,按照顺序执行不同步骤。但总体来说,这是解决问题的根本策略。这是一个你可以从头到尾了解问题解决方案的地方。
elements-of-the-blackboard-pattern-8f53565530715d8f041190f0781bb18d

图片由Jerry Overton提供

这一基本的方法已被证明在构建必须通过不完全数据解决不确定的、假设的问题的软件系统时是有用的。最棒的一部分是它使得我们通过确定的部分在不确定的问题上获得进展。不幸的是,我们并不保证你的努力真的一定会解决问题。你最好尽早知道如果你走的路是不起作用的。你需要通过你实现系统的顺序来完成。

像专业人士一样构建

你不一定非要以固定的顺序来构筑数据产品的元素(例如,先建立数据仓库,然后是算法,然后是控制器)。专业的方法是按照最高的技术风险来构建。从最高风险的元素先开始。一个元素会因为很多原因成为技术风险。最有风险的部分可能是那个有着最高工作负载的或者是你最不了解的部分。

你可以通过专注于单个元素然后解决其他的方式以任意顺序构建组件。例如,如果你决定从构建算法开始,无视数据输入并且定义一个临时点来写入算法输出。

implementing-the-blackboard-pattern-a8b64a73f354daa644d07fc4e1a41d0c

图片由Jerry Overton提供

然后,以技术风险高低的顺序实现数据产品:风险最高的元素最先开始。专注于一个特定的元素,无视其他的,稍后再替换它们。

这里的关键是以小块的方式构建并执行:以你理解的小步骤来写算法,一个数据源一次的方式构建数据仓库,以及一个算法执行步骤一次的方式构建你的控制器。目标是总是有一个可以工作的数据产品,只不过它只有到最后才是功能完备的。

专业人士的工具

每一个专业人员需要有质量的工具。有太多的选择可以使用。下面列出了一些公认最常用的工具,我附上了链接使得你们可以了解更多信息:

数据可视化:

  • D3.js: D3.js (或者D3, 数据驱动文档) 是一个JavaScript 库,旨在在浏览器中建立动态的可交互的数据可视化。它利用了广泛被实现的SVG, HTML5以及 CSS 标准。

版本控制:

  • GitHub: GitHub 是一个基于网络的Git仓库服务,它提供了所有的Git的分布式修订控制和源代码管理功能,也添加了它自己的功能特性。GitHub提供了一个基于网络的图形化界面和移动端的桌面应用。

编程语言:

  • R: R 是一个针对统计计算和图形化的编程语言及软件环境。R语言在统计学家和开发统计软件和数据分析的数据挖掘者中被广泛使用。
  • Python: Python 是一种被广泛使用的通用的高层次的编程语言。它的设计理念强调代码的可读性,它的语法允许编程人员用比C++和Java更少的代码来表达概念。
  • Scala: Scala 是一种针对通用软件应用的对象函数式编程语言。Scala有着对函数式编程的全面支持,以及一个非常健壮的静态类型系统。这使得用Scala写的程序非常简洁因而比其他通用编程语言尺寸更小。
  • Java: Java 是一种通用的计算机编程语言,它是并发的、基于类的、面向对象的、特别为了减少实现依赖而设计的。它旨在让应用“一次编写,随处执行”

Hadoop生态系统:

  • Hadoop: Hadoop 是一个用Java开发的开源的软件框架,为了在基于商业硬件的计算机集群上进行分布式存储和分布式处理海量数据集。
  • Pig: Pig 是一个为了创建Hadoop之上MapReduce程序的高层平台
  • Hive: Hive 是一个在Hadoop之上构建的数据仓库基础结构,旨在提供数据汇总、查询和分析。
  • Spark: Spark的内存原语操作为某些应用提供了高达100倍的性能提升

结束语:本文来自哪里

这篇文章起始于一次偶然的关于我的团队中正面临的生产力问题的讨论。我们最终将问题追溯到技术平台和我们的软件工程知识。我们需要在我们的软件工程实践中补上漏洞,但是每次的经验都太抽象或是太细节(对于专业的软件开发者来说)。我是一个由外至内数据科学方法的拥护者,我决定主办一个开放的群聊来讨论这些事。

我们获得了相当大的参与度:30分钟之内有179条发布;600个观点,以及28000多个访问。我主持了讨论并基于最有影响力的答案总结了我们的发现,然后我将那个总结作为本文的基础。我想要感谢所有那些参加了这一过程的人们,并花一些时间来认可他们的贡献。

 

 

Jerry Overton

Jerry Overton是一名英联邦科学委员会的数据科学家以及杰出工程师,下一代IT解决方案的全球领军人物。Jerry是高级分析研究的带头人以及英联邦科学委员会高级分析实验室的创始人。在他的博客“做数据科学”(Doing Data Science)中,Jerry分享了他在领导数据科学的公开研究中的经验。

Noah's Ark - Nuremburg Chronicle 15th century (source: Noah's Ark - Nuremburg Chronicle 15th century).