作为一个完整的堆栈Virta &参与球队的经验的软件工程师,我帮助开发的经验与患者在我们的糖尿病治疗逆转。指数增长Virta用户基础的驾驶我们的球队面临的主要挑战之一:扩展的教育和鼓舞人心的内容。特别是,有一个巨大的多样性各种患者的需求,我们需要支持一个大语料库对继续教育和掌握的内容。病人查看此内容的主要表面叫做发现,原名资源中心。发现包括数以百计的出版文章,在线研讨会,食谱,和导游。
在过去,这些内容主要是托管,使用内容管理系统(CMS)Wordpress,内容显示在我们的手机应用程序使用WebView。这个设置允许临床和内容策略团队创建和分享新的内容没有任何工作需要从工程初始设置后。虽然这是一个可行的系统好几年了,去年的几个已知功能的限制变得更加紧迫的加速增长。
现有关键限制:
关键需要改进:
此外,现有过程提供个性化内容不是可伸缩,作为教练是非常耗时的手动为每个病人找到最好的内容。这些需要改进我们的内容管理系统也将使我们能够使用软件推荐个性化内容。这将创建一个更吸引人的用户体验,如算法可以使用已知的用户偏好数据提出建议更准确地比人类。
在一个早期的创业公司,通常是有价值的严重依赖外部服务的快速迭代,因此我们追求一个“买入”软件时可行的策略。放弃某种程度的控制或设计使用一个即用的解决方案有时必要权衡的能力迅速采取行动,而不是构建自己的所有。这是我们的情况当我们第一次选择了WordPress,真正为我们好多年。然而,在某种程度上,有更多的控制变得越来越可取的。在我们的例子中,我们现在觉得控制我们的内容数据,交付,和表示将允许我们建立更丰富的经验。它还将帮助我们更好地了解用户与内容,使我们的应用人工智能团队使用这些数据以及自然语言处理算法提出个人相关内容。因此,我们决定将混合“购买+建设”战略,我们仍然会利用外部软件,但会选择了更大的灵活性与自建集成软件创建所需的经验。
一旦我们为我们的内容对齐Virta需要一个新家,我们确定了以下要求:
基于我们的技术堆栈和上述要求,Sanity.io被选为最佳解决方案。
在传统的CMS像Wordpress,一切从后端,内容管理,表示层是由CMS。理智,另一方面,是一个无头CMS。无头CMS,演讲内容不包括(头部)。服务的内容是通过一个API,因此应该表示不可知论者。本质上,该平台处理数据,我们处理报告。这个模型需要大量的前期投资在前端(头),它允许的灵活性如何显示内容应用程序,并提供了一个平台建造更多的迷人的游戏体验。
理智让我们定义我们的内容使用JavaScript对象的结构。在理智中,每一个面向用户的内容被称为文档。文档中定义的结构模式,通过组合简单等领域文本,图片,数量,日期,以及更复杂的类型对象。一个对象是一个用于定义一个自定义的字段集合类型。
使用对象和文件,我们可以定义一个结构的内容。例如,一个配方包含一些简单的字段:
我们可以进一步分解这些领域更好的可重用性。在下面的示例中,我们定义一个文档成分。一个文档是一块的内容,可以重用。我们可以创建一个成分文档橄榄油,用标题“橄榄油”。一旦创建,我们可以参考这个成分在多个配方。
这是一个非常简单的文档由一场-成分的名称。配方,我们需要知道成分的名称以及数量。数量由数量和计量单位,如“5克”。我们可以定义以下对象:
注意:与文档,一个对象的数据不是可重用,不能引用。允许我们定义复杂类型的对象分组字段。在我们的示例中,它可能是有用的重用“橄榄油”作为原料,但这并不是像“2汤匙”所必需的数量。
现在我们可以两者结合,创建一个recipeIngredient字段。在这里,我们参考文档的一种成分。这意味着,如果引用的成分被更新,所有文档引用它会自动反映这种变化。
注:如上所述,“成分”是一个文档引用字段一个成分,而“数量”是一个对象:一个分组的字段描述。
我们在配方现在可以使用这个recipeIngredient场模式:
注意:对象数量也被用来捕捉配方的准备时间和总时间字段,这些可以被分解成一个数字和单位,如“30分钟”。
使用开箱即用的类型,如字符串、图像和数组,以及我们自己的自定义类型,如recipeIngredient,我们定义了一个模板,现在我们可以使用所有的食谱。
也许最有趣的字段类型是块,它提供了模仿富文本功能便携式文本。这个富文本存储在数据库作为一个JSON对象数组,并且可以在许多不同的方法如HTML或反应组件。
在Virta,我们有一个组件库编写的原生的反应。用理智的block-content-to-react帮手,我们可以使用相同的组件时使用整个应用程序反应呈现内容。这为我们的用户提供了一个连贯的体验,因为内容外观和感觉就像其他应用程序一样。
我们的新内容平台的要求之一是部分内容由某些用户属性。Virta用户群的持续增长和多样化,那么他们的需求。在2021年,我们推出了Virta诊所扩张,最终促成我们的第一组糖尿病管理用户,比我们逆转糖尿病患者需要不同的内容。出于这个原因,我们必须想出一个可伸缩的方式部分内容由这些不同用户保健计划(管理或逆转)。理智使我们能够通过简单地扩展我们的内容模型。通过添加保健协议字段的文档模型,我们能够轻易过滤这些属性查询。展望未来,我们不需要做任何工程段内容额外护理协议,作为我们的内容团队只是适当地对内容进行分类。
另一个要求我们的新平台支持多种语言的内容的能力。我们通过使用得到的理智的插件组织翻译文档。使用该插件,我们为文档级别的翻译奠定了基础。这意味着,对于每个英语文档,我们可以创建一个翻译不同的语言,原始文档的引用。
我们考虑另一种方法是字段级翻译,顾名思义,就是翻译个别字段级别上实现相对于整个文档。虽然这种方法比文档级别的翻译有更大的灵活性,它增加了更多的复杂性的内容表示和没有提供任何功能,我们的最终用户将会从中受益。
有了这个架构我们可以确保系统的组织添加多语言内容。
搜索实现使用Algolia。在理智更改文档时,我们可以使用webhook功能来创建、更新或删除的记录Algolia中的内容。当一个用户搜索一个查询时,结果将直接从Algolia减少往返时间和延迟。Algolia记录也包含所有相关字段需要支持细分用户属性的搜索结果,如保健协议和首选语言。通过使用Algolia的方面的过滤器,我们可以设置一个用户偏爱的语言和护理协议在搜索查询,以确保我们不显示无关的结果。这可以防止用户看到无关结果,不可避免地需要不必要的人力支持。
左边的图片是我们的旧资源中心。右边的图片是我们新发现的经验,构建整个应用程序使用相同的组件,我们使用反应。内容提出了通过一排排的旋转木马,我们可以无缝地与个性化的补充建议。
这个图表显示了我们的资源中心的日常用法(绿线)和新发现的经验(蓝线)后发现广泛的在2021年8月发射。常见看到大幅飙升,当你发布一个新特性和驱动用户使用推送通知,但真正的问题是如何使用后比较新奇消退。正如你所看到的,我们发射之后很久,发现功能是参与2 x尽可能多的用户资源中心。阵容,重视用户参与,这是一个量化成功!
在Virta只是我的头两年,我看到了5 x人口增长我们的病人。我们继续迅速增长,,我期待着提供更多参与经验,指导我们的用户在他们的旅程更健康。我很兴奋地看到未来为我们的治疗,与AI-driven内容推荐和个性化学习等功能模块。