大家好,我是哈佛大学大四学生 Renzo Lucioni。 今年夏天我在 edX 实习过得很愉快。 我一直致力于允许和推广一种客观的产品管理方法。 我的暑期项目包括 LMS 和新成立的分析团队的多项离散改进。 我的项目既是为了让“过程”正确,也是为了纠正 LMS 向学生展示他们的进步的方式。 我所说的“过程”是指:识别和验证变化,实施它们,然后量化它们的影响。 启用和促进这个“过程”是我在夏天所做的工作的保护伞。
以下是我们在 edX 尝试遵循的流程的概要。 我们首先具体确定一个问题以及我们期望通过修复它看到的效果。 我们通过使用我们收集的分析数据来确定要解决的问题。 然后,我们集思广益潜在的解决方案。 下一步是验证。 在完全实施更改之前,我们要验证它们。 更改可以由任意数量的事物驱动,但我们希望确保提议的更改能够解决问题。 有很多方法可以验证。 这可能意味着在内部向少数人展示更改,由我们引入的一组用户运行以测试更改,或执行拆分测试。 如果我们看到改变有帮助,我们就会实施它。 如果没有,则返回到第一步。 进行更改后,我们希望衡量其对生产的实际影响,以确保我们从验证步骤中获得预期的回报。
为了帮助识别和量化步骤,我的工作重点是分析和数据质量。 Segment.io 是一种第三方服务,它允许我们将分析数据发送到我们想要的任何分析服务,而无需单独与每个服务集成。 我将 Segment.io 与 edX 平台集成并清理了我们记录的事件。 我们现在使用 Segment.io 来跟踪用户在与课件交互时所做的事情,并将这些信息转发给 Google Analytics, Mixpanel和 chartbeat.
为了改进我们流程的验证步骤,我开发了一种灵活且轻量级的拆分测试方法。 也称为 A/B 测试,拆分测试包括将我们的用户分成组,控制这些组看到的内容(我们希望向每个组展示不同的东西),以及监控和比较每个组的行为。 我们希望我们的拆分测试方法具有灵活性,允许我们将其应用于整个 edX 平台,以进行从外观更改到全新功能的各种更改。 我实现的拆分测试框架依赖于 胡扯,一个 Django 功能翻转器。 我决定不使用可用于 Django 的几个开源 A/B 测试框架之一,因为大多数框架与 Django 1.4 不兼容,不再维护,或者文档不完整或完全没有文档。 更重要的是,在尝试抽象拆分测试的过程时,我发现这些框架对于我们的典型用例来说过于死板。 大多数都是为了跟踪用户注册或购买而设计的。 将 Waffle 与 Mixpanel 结合使用构成了一种更灵活、更轻量级的方法。
Waffle 提供了三种工具来控制用户看到的内容:标志、开关和样本。 我的框架使用 Waffle 的基于会话的标志来切换 Django 视图和 Mako 模板中的功能。 标志非常适合拆分测试法案。 它们可以分配给所有用户、一组用户或任意百分比的用户。 给定数据库中“标志”模型的适当权限,可以使用 Django 管理站点创建、切换和删除标志,而无需涉及 DevOps。 此外,对标志所做的更改会立即生效,无需推送任何代码。 我的框架通过向 Segment.io API 调用添加一个包含列出活动标志的字符串的属性来跟踪特定用户的活动标志; 这个特殊的改变是在 段-io.html. Segment.io 将此信息路由到 Mixpanel,我们可以在其中研究数据,使我们能够比较不同用户组的行为。
这是一个实际过程的示例。 在与 edX 用户群交谈时,我们了解到人们强烈希望在上下文中显示进度。 从历史上看,学生们很难想象他们在课程中的进步。 他们在浏览课件时得到的帮助也很少。 目前,课件登录页面会告诉学生他或她最后在哪里并链接到该组件。 然而,课程手风琴并没有指出学生已经完成了什么、学生目前正在做什么,或者学生还没有开始什么。 更糟糕的是,进度选项卡与课件分离并且过于冗长,这意味着该页面不会立即对学生有用。 学生无法从课件的上下文中可靠地衡量他们的进步。
我试图通过在他们正在解决的问题的标题旁边实时显示学生的分数来解决这个问题。 为了做出这个改变,我修改了 capa_module.py 和 显示.咖啡. 我们试图为大的、有风险的变化保留拆分测试,像这样的变化并不清楚胜利; 我们希望在正确的级别上进行验证。 因此,此更改的验证包括在内部显示更改。 此功能的实施现在正在进行量化。 我们观察到从课件到进度页面的流量下降了 8%,我们将使用这些数据来告知未来的变化。
虽然我们才刚刚开始使用分析数据来为我们的决策和这个用于拆分测试新工作的新框架提供信息,但我相信这些工具将使我们能够做出更好的选择。 edX 的目标之一是发现什么可以帮助人们在线学习。 结合拆分测试的更定量方法将帮助我们实现这一目标。
![]()