[译] 解密 Airbnb 的数据科学部门如何构建知识仓库

顽疾

Airbnb的数据团队很重要的一个职责就是传播基于数据的决策方法。我们将数据的获取民主化,使得每一个Airbnb的成员都可以量化他们基于数据的决策影响力并且借此洞察用户偏好,提升数据产品的用户体验。最近,我们开始解决一个令人头疼的问题。随着组织的扩大,如何确保我们的一个洞见有效地在社交网络传播开,这在我们内部称之为知识扩张。

当我们团队仅由几个乐于分享和发现研究技巧的人组成这不是什么难题。但是当我们团队开始快速扩张时,这个问题一下就被放大了。Jennifer是一位新来的数据科学家,她正在研究如何通过房东拒租的话题和同事开展工作。
这里是我们所看到的:

  1. Jennifer 找到了一堆的PPT、Email、Google Docs 并且询问团队其他成员有关这个项目的历史。

  2. 前人的代码已经不是最新的了,但 Jennifer 还是从 GitHub 或者原来作者的机器上弄下来代码。

  3. 在和代码一顿混战之后, Jennifer 意识到之前的项目有些许问题,她决定从头开始撸代码。

  4. 在浪费大量重复工作之后,Jennifer 又放弃了重头开始的想法,她感到精疲力尽。

  5. Jennifer 留下了一堆的 PPT、Email、Google Doc, 循环往复。

基于其他公司的对话,我们发现这个现象实在太普遍了。随着组织的扩张,跨团队跨时期的知识传输成本不断增长,一个低效、乌合的研究环境使得这种情况雪上加霜,放慢了分析和决策的速度。因此,一个更加一气呵成的解决方案可以加快决策落地的速度并且保持公司在知识洪流中立于不败之地。

药方

随着我们看到这个问题工作流的不断发生,我们意识到我们可以做得更好。作为一个团队,我们在一起决定了做研究的五个关键原则:

  • 可重复性 - 代码不应该分离,整个查询、转化、可视化、文档撰写应该一气呵成,并且保证结果是尽量更新的。

  • 质量 - 没有经过正确性和准确性审查的研究都不应该被共享。

  • 用户体验 - 研究结果应该是让读者容易理解的,我们也应该将美感和品牌延伸考虑在内。

  • 可得性 - 任何人都可以发现、浏览并且保持在相关工作话题上的更新。

  • 学习价值 -  与可重复性,其他研究者应该能够通过工具和技术从其他人的工作中增益自己的能力。

根据这些原则,我们单独调查了现有的工具来解决这个问题。我们注意到Rmarkdown和 iPython notebook 是一个可重复性研究的一个优秀解决方案。 GitHub 提供了一个审查框架,但是对于代码之外的内容和文档,比如图片就没有什么好的解决方案。 可得性通常是基于文件夹的形式的,但是类似Quora这样的其他站点内在对标签和话题又有特殊的审查机制。

综上,我们将这些想法集成到一个系统里面。我们的解决方案整合了贡献和审查的工作,用一个工具来呈现和传播知识。我们内部称之为"知识仓库"。

图片描述

这里的核心其实是一个我们提交工作成果的 Git 仓库。我们在 Jupyter 笔记、Rmarkdown 文件或者纯 markdown都会发布在这里,所有的文件(包括查询文件和脚本)都会被提交。每个文件都从一个很小的结构化元数据开始,包括作者、标签以及TLDR,再用一个Pyhon脚本验证内容并用Markdown格式转化为纯文本。我们使用 GitHub 从审查流程中拉取请求系统。最后,用一个 Flask的 web-app 来渲染Repo的内容作为一个按时间、话题、内容排序的内部博客。

这些工具集的最顶层,我们有一个流程 专注于确保所有研究是高质量和高可用的。和工程代码不同,低质量的研究是不会产生指标下降或崩溃日志的。相反,低质量的研究表现为知识的环境嘈杂,而团队只能信任他们自己创建的研究。

为了避免这种现象的发生,我们将流程封装在工具里面,结合了工程上的代码评审和学术上的同行评议方法,保证我们的研究结果以一个startup的速度在推进。在代码评审的环节,我们检查代码的正确性、最佳实践和工具。在同行评议上,我们检查方法论的改进、现有工作的关联性以及准确的解释性声明。我们通常不指望一个研究是面面俱到的,但是也不能草率迭代,这些对他们都是有正确的和透明的限制的。我们能够驾驭内部的R和Python包并维护品牌调性、整合数据仓库的函数库、以及基于GitHub的R和Python笔记的文件处理流程。

图片描述
图一 - 一个两篇文章的总结卡牌的知识流截图

图片描述
图二 — 一篇房东同意接待的缺口天数的研究文章示例

这些工作为我们的智囊团提供了强大的功能。

可重复性 — 这个工作从核心的ETL表查询到转化、可视化到整理文章都是在一个文件里完成的。通常是 Jupyter 笔记, RMarkdown, 或 markdown 文件。
质量 — 通过学习GitHub来发表、审查以及版本控制直接推动了我们整个工作流。
高可用 - markdown 将我们的 web-app 隐藏在代码之后并且我们使用了内部一致的美学风格,对非技术读者也更加友好。同行评审用评论也能提供反馈和交流并提高了项目的影响力。
可得性 - 元数据的结构非常有利于通篇浏览历史研究。每个文章都有一组tag,并有一个类似于知乎话题的多对一的内置话题机制。用户可以订阅话题并且收到新消息提醒。文章可以以书签收藏、通过读者浏览或者在博客流中订阅。
学习价值 - 通过之前一系列的工作,现在数据科学家可以分享自己的新方法论、代码技术并且加快品牌化推广,让团队之外的人可以快速了解自己的领域。

这个知识仓库囊括了海量的内容。大量的工作都是和某个非尝试性问题的深挖,但是对实验结果的检验没有被我们的实验记者记录也是很普遍的。此外也有一些纯粹关于如何扩展数据分析的文章,包括新方法论的撰写、工具或包的示例、使用SQL和Spark的教程等等。我们也在知识仓库上公开数据博客文章,当然也包括这一篇。总的来说,这个原则就是:如果这个东西将来可能对一些人有用就可以发。

未来

知识仓库仍然是个在建工程。小团队正在持续满足新需求特性。我们也在公司内部的其他团队推广这种方法,比如一些不使用GitHub的量化研究。最后,我们正在测试一个基于Markdown的内建审查编辑应用,这个应用另一个可能的特性是主编对研究议题的管理,我们也正在考虑现有文章的迁移问题。

原作者:Chetan Sharma 和 Jan Overgoor 翻译:Harry Zhu
英文原文地址:Scaling Knowledge at Airbnb

推荐阅读

作为分享主义者(sharism),本人所有互联网发布的图文均遵从CC版权,转载请保留作者信息并注明作者 Harry Zhu 的 FinanceR专栏:https://segmentfault.com/blog...,如果涉及源代码请注明GitHub地址:https://github.com/harryprince。微信号: harryzhustudio
商业使用请联系作者。


FinanceR
循环写作,持续更新,形成闭环,贵在坚持
2.2k 声望
2.2k 粉丝
0 条评论
推荐阅读
[译] 层次时间序列预测法
大多数关于时间序列预测的文章都侧重于特定的聚合程度。但是,当我们能够深入分析聚合的数据,以便在更细粒度的层次上观察同一个序列时,挑战就出现了。在这种情况下,我们往往会发现,对较低水平的预测与总体预...

HarryZhu阅读 2.7k

封面图
Ubuntu20.04 从源代码编译安装 python3.10
Ubuntu 22.04 Release DateUbuntu 22.04 Jammy Jellyfish is scheduled for release on April 21, 2022If you’re ready to use Ubuntu 22.04 Jammy Jellyfish, you can either upgrade your current Ubuntu syste...

ponponon1阅读 4k评论 1

日常Python 代码片段整理
1、简单的 HTTP Web 服务器 {代码...} 2、单行循环List {代码...} 3、更新字典 {代码...} 4、拆分多行字符串 {代码...} 5、跟踪列表中元素的频率 {代码...} 6、不使用 Pandas 读取 CSV 文件 {代码...} 7、将列表...

墨城2阅读 336

Unicode 正则表达式(qbit)
前言本文根据《精通正则表达式》和 Unicode Regular Expressions 整理。本文的示例默认以 Python3 为实现语言,用到 Python3 的 re 模块或 regex 库。基本的 Unicode 属性分类 {代码...} 基本的 Unicode 子属性Le...

qbit阅读 4.4k

Python + Sqlalchemy 对数据库的批量插入或更新(Upsert)
由于不同数据库对这种 upsert 的实现机制不同,Sqlalchemy 也就不再试图做一致性的封装了,而是提供了各自的方言 API,具体到 Mysql,就是给 insert statement ,增加了 on_duplicate_key_update 方法。

songofhawk1阅读 2k评论 4

封面图
打脸了兄弟们,Go1.20 arena 来了!
大家好,我是煎鱼。大概半年前,我写过一篇文章《Go 要违背初心吗?新提案:手动管理内存》。有兴趣了深入解的同学,可以再回顾一下。当时我们还想着 Go 团队应该不会接纳,至少不会那么快:懒得翻也可以看我再次...

煎鱼1阅读 3.3k

uwsgi 注意事项
http 和 http-socket 选项是完全不同的。第一个生成一个额外的进程,转发请求到一系列的worker (将它想象为一种形式的盾牌,与apache或者nginx同级),而第二个设置worker为原生使用http协议。

zed2015阅读 2.2k

2.2k 声望
2.2k 粉丝
宣传栏