不要将数据科学笔记本投入生产
我们遇到过很多客户,他们希望将数据科学家开发的计算笔记本直接放入生产应用程序的代码库中。数据科学的想法确实需要从笔记本中转移到生产中,但试图将笔记本作为代码工件部署会破坏许多良好的软件实践。可以预见的是,这会导致许多观察到的痛点。这种行为是更深层次问题的一个症状:数据科学家和软件开发人员之间缺乏协作。
2020 年 11 月 18 日
首先,让我们描述一下什么是计算笔记本。笔记本起源于 Wolfram Mathematica 语言,现在这个想法在数据科学界非常流行,尤其是在 Python 和 R 用户中。基本上,它结合了包含命令的脚本以及一些可视化和文档。您会看到已运行的代码及其结果,无论它是文本、格式良好的表格还是图形。文档可以解释正在发生的事情,使其对教程很有用。笔记本本质上是一个更友好的交互式 shell,可以在其中存储命令并轻松地重新运行它们,并进行更改。图形或输出就在一个窗口中,而不是保存在其他文件或弹出到其他窗口中。交互式会话可以保存在一个文件中并共享,以便任何其他人(在某些条件下)都可以使用相同的结果运行它。
笔记本在两方面非常出色。它们为数据科学家进行交互式探索性工作提供了一个友好的交互式 shell。它们也适合演示。它们不是进行数据科学的必不可少的工具,许多数据科学家根本不使用它们。
笔记本与电子表格有很多共同点,并且具有许多相同的优缺点。首先,优点。它们允许没有太多编程技能的人进行有用的定量工作。笔记本本质上是脚本,脚本是通用编程的第一步。例如,Excel 也允许使用脚本,例如使用公式。实际上,人们可以使用拖放操作完成很多有用的工作。它们都是将存储(代码和数据)、可视化和业务逻辑的关注点结合到一个应用程序中的工具。
让一个工具成为多个关注点的“一站式商店”既有优点也有缺点。优点是简单的事情简单。为什么我要使用数据库、Java 应用程序和 Javascript 前端来进行一些简单的操作,以计算我创业公司中 12 名员工的工资?这就是电子表格的优势所在。但这并不意味着应该使用电子表格来处理大型国际银行的工资单。它们没有用于此目的,原因很充分。这些情况更加复杂。有更多变量。它们有审计要求。数据可能非常大,等等。
团队可以成功地构建大型应用程序来解决复杂问题,但前提是他们能够控制这种复杂性。我们只有很少的工具可以做到这一点。其中最重要的一个就是将其分解成许多更小、耦合度更低的子问题。这就是为什么在表示域数据分层模式中,我们将 UI、域逻辑和存储分开。我们可以专注于计算的执行方式,而不会被显示方式或数据访问方式分散注意力。
将笔记本放入生产管道实际上将所有实验代码放入生产代码库中。其中大部分代码与生产行为无关,因此会让将来进行修改的人感到困惑。笔记本也是一个功能强大的 shell,将其包含在生产系统中很危险。安全操作需要可重复性和可审计性,通常避免在生产环境中进行手动调整。即使是好心人也会犯错,造成意外伤害。
我们需要投入生产的是最终的域逻辑(有时还有可视化)。在大多数情况下,这并不难,因为大多数笔记本并不那么复杂。它们只鼓励线性脚本,通常很小,很容易提取并放入完整的代码库中。如果它更复杂,我们如何才能知道它是否有效?这些脚本适合几行代码,但不适合几十行代码。通常,您需要将其分解成更小、更模块化、可测试的部分,以便您可以确保它确实有效,并且可能在以后出于其他目的重复使用代码,而无需重复。
因此,我们认为让笔记本直接在生产环境中运行通常没有那么有用或安全。将其合并到结构化的代码库中也不难。那么,为什么有人会谈论如何将笔记本投入生产呢?问题的本质是数据科学家和软件开发人员并不总是沟通良好,或者不了解对方需要做什么。许多数据科学家并不真正了解专业软件开发人员的关注点,例如自动、可重复和可审计的构建,或者彻底测试的必要性和流程,或者良好设计在使代码库可维护和灵活方面的重要性。反过来,许多软件开发人员并不真正了解数据科学家在做什么。
虽然两种类型的人通常可以在不了解对方必须做的事情的细节的情况下很好地合作,但这通常不是这种情况。当数据科学家和开发人员能够分享知识,并更多地了解对方必须做的事情以及他们为什么以这种方式做事时,将获得巨大的优势。也就是说,数据科学家应该努力学习软件开发,并完全融入负责交付生产软件的交付团队。他们不需要在这方面达到全部能力,但他们应该完全了解基础知识,并继续学习与他们在团队中的工作最相关的领域。
他们会发现,使用许多软件开发技术实际上会提高他们作为数据科学家的效率。他们会发现,当他们正确地构建代码时,他们可以处理更复杂的任务,并且花费更少的时间进行调试。开发人员会发现,当他们花时间更多地了解实际发生的事情时,他们可以更好地利用数据科学模型和方法。两者都不需要在另一个领域变得完全熟练,但他们至少应该精通其基础知识。
笔记本是用于交互式数据探索的有用工具,这是数据科学家在处理新项目早期阶段或探索新技术时所进行的主要活动。但是,一旦确定了方法,重点就需要转移到围绕这种方法构建结构化的代码库,同时保留一些实验能力。关键是将实验能力构建到管道本身中。一个例子是包含一个机器学习模型注册表,该注册表允许人们在运行时或构建时修改参数,并将性能指标等结果存储在数据存储中。这样做的好处是,实验始终是可重复的,因为它们使用版本化的代码运行,并且其结果被保留以用于比较,以及作为进展的可证明标记。这确保了任何效果差异都可以证明来自预期原因,这是任何良好实验的标志。毕竟,目标是了解对生产软件的哪些更改将创造更多商业价值。实验环境与实际实现之间的差距越小,我们越有信心这种变化确实创造了价值。另一个关键思想是构建数据科学管道,以便它们可以在多个环境中运行,例如在生产服务器、构建服务器和本地环境(如您的笔记本电脑)上。这使得在不影响生产中发生的任何事情的情况下,有更多实验的可能性。
总之,我们认为关于如何将数据科学笔记本投入生产的讨论忽略了重点。目标应该是赋予数据科学家及其整个交付团队权力,让他们共同构建能够交付所需业务功能的软件,同时仍然保留实验和改进的能力。这需要在初始探索阶段之后从笔记本式开发中转移出来,而不是将其变成需要持续集成支持的持续工作模式。这种工作方式不仅使数据科学家能够继续改进工作软件,还将他们纳入交付工作软件和实际价值给业务利益相关者的责任中。
重大修订
2020 年 11 月 18 日:发布