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

网络安全侠
• 阅读 6802

顽疾

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这样的其他站点内在对标签和话题又有特殊的审查机制。

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

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

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

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

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

[译] 解密 Airbnb 的数据科学部门如何构建知识仓库
图一 - 一个两篇文章的总结卡牌的知识流截图

[译] 解密 Airbnb 的数据科学部门如何构建知识仓库
图二 — 一篇房东同意接待的缺口天数的研究文章示例

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

可重复性 — 这个工作从核心的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
商业使用请联系作者。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这