"刚刚好"的分析
Junkdrawer/Labbox 系列的下一篇文章是关于分析的,但不是那种"请在你的网站上安装这个监控吊灯"意义上的分析。
这个痒点很简单:我想要一点 Google Analytics 的能量,但没有 Google Analytics 的包袱。我想知道我的小页面是否被使用,哪些页面受到关注,人们打开了什么工具,以及一个原型是 quietly useful 还是 quietly dead。但我不想把数据泄露给大公司,不想引入一个庞大的第三方跟踪脚本,不想搭建企业级分析管线,也不想把每个小网页都变成一场隐私谈判。
这是整个项目反复出现的主题:如果问题很小,解决方案也应该允许保持很小。一个 Junkdrawer 页面不需要和十亿美元广告平台一样的分析栈。它只需要足够的信号来回答实际问题。有人打开页面了吗?他们访问了哪个路由或页面?大概什么时候?来自哪个引荐来源(如果有的话)?也许还有屏幕尺寸、用户代理或一个轻量级事件名称。足以了解使用情况。不足以构建一个令人毛骨悚然的行为档案。
所以,与其硬塞一个第三方分析提供商,更明显的做法是让 Labbox 来做这件事。
Labbox 已经作为共享持久化层存在,用于那些超出纯浏览器本地存储范围的项目。它处理那种每个小原型都不应该重建的无聊后端工作:项目范围界定、数据捕获、图片/文件处理、令牌和持久化。分析正好也符合这个模式。它只是另一种项目范围的事件流。
实现思路很直接:给 Labbox 添加一个新的分析端点和控制器。一个 Junkdrawer 页面发送一个小的事件负载。Labbox 接收它,验证它,附加项目上下文,打上时间戳,然后存储它。仅此而已。没有宏大的分析宗教。没有十个服务的架构。没有 Kafka 集群在角落里 quietly sobbing,因为有三个人点击了一个野猫页面。
一个简单的事件可能会说:这个项目,这个页面,这个事件类型,这个时间戳,这个路径,这个引荐来源,这个用户代理,这个屏幕尺寸,也许还有一个小元数据对象。对于早期原型来说,这绰绰有余。目标不是了解访问者的一切。目标是知道这个工具是否还活着。
JavaScript 客户端是模式的另一半。每个页面可以包含一个小型分析助手,它知道如何向 Labbox 发送事件。在页面加载时,它可以发送一个基本的页面浏览。在有用的时候,它可以发送明确的事件,比如"AI 摘要已点击"、"新目击已开始"、"图片已上传"、"设置已打开"、"导出已下载"或"OpenRouter 密钥已本地保存"。页面决定什么重要。客户端只是让报告变得容易。
这很重要,因为并非所有页面都需要相同的事件。Weather Nerd 可能关心位置变化、警报检查和 AI 简报运行。Wildlife Field Recorder 可能关心目击提交、照片附件和行程日志会话。Top Hat Ferals 可能关心公共页面浏览、个人资料浏览、图片上传和管理员捕获活动。OpenRouter 辅助页面可能关心人们是否阅读了说明或点击创建密钥。一个一刀切的分析产品要么过度收集,要么解释不足。一个了解项目的小型客户端可以保持专注。
然后,仪表盘就是回报。一旦 Labbox 接收事件,它可以显示一个简单的分析视图:页面浏览、事件计数、近期活动、项目细分、热门页面、事件类型,也许还有按天使用情况,以及足够的过滤功能来回答"发生了什么?",而不必假装是 Adobe Omniture 的疯狂表亲。仪表盘不必花哨就能有用。它只需要让不可见变得可见。
访问模型也遵循同样的 Labbox 理念:在足够的地方使用共享密钥。并非每个内部仪表盘都需要完整的用户系统、OAuth 舞蹈、邀请流程、密码重置页面和合规性扮演。如果这是一个针对一小部分页面的小型私有仪表盘,共享密钥可以是适当的安全级别。密钥可以限制写入访问或仪表盘访问。它并不完美。它本就不追求完美。它只是适合项目的规模和风险。
这就是我不断回到的那条线:如果它不需要扩展,它就不需要复杂。
人们说"它无法扩展",好像这总是一种侮辱。但大多数东西还不需要扩展。有些东西永远不需要扩展。这没问题。一个用于个人原型集群的小型分析系统不需要处理超级碗广告活动。它需要帮助我理解是否有人在使用我构建的东西,以及哪些部分值得改进。
这并不意味着马虎。这意味着相称。事件应该最小化。不应收集敏感数据。端点应该验证输入。仪表盘应该受到保护。客户端应该小巧。数据应该按项目范围界定。整个系统应该能被一个人理解,即使他三个月后回来,也不想挖掘一个微服务埋葬堆。
这也是拥有自己的分析感觉不同的地方。当数据留在 Labbox 中时,事件流属于项目。它没有被喷入一个巨大的广告生态系统。它没有被喂给一个第三方档案机器。它不是用来因为某人看了一个浣熊相关的猫档案就重新定位他。它在那里是为了回答产品问题:什么被使用了,什么被忽略了,以及工作流的哪些部分足够有趣值得继续开发。
这完全契合 Junkdrawer 的精神。那些页面都是实验,但并非盲目的实验。轻量级分析为它们提供了反馈循环。一个没有反馈的原型不过是一个带着 URL 的猜测,而有简单分析的原型则能让你从中学习。
它也完美契合 Labbox。Labbox 不只是“后端”,它是有用的小工具获得持久化、结构和连续性的地方。分析是另一种形式的连续性——它能告诉你页面发布后发生了什么,帮你区分“我喜欢这个想法”和“人们确实在用这个部分”。它能显示哪些页面值得继续打磨,哪些流程让人困惑,哪些实验可能只是抽屉里的装饰垃圾。
最妙的是架构保持无聊:一个控制器、一个端点、一张事件表或事件集合、一个轻量 JavaScript 客户端、一个共享密钥、一个仪表盘。这就够了。如果使用量增长或需求变化,设计可以随之演进。也许以后需要汇总、保留策略、按项目分配的令牌、速率限制、按日期范围的仪表盘,或者更清晰的管理员角色模型。很好,等到真正感到痛点时再添加。
但不要从那里开始。
从痒点开始。
我需要有用的分析。
我不需要监控泥石流。
我不需要第三方数据泄露。
我不需要基础设施表演。
我只想知道页面是否被使用。
这是一个完美的 Labbox 问题:小巧、实用、限定在项目范围内、且横跨多个工具。
浏览器发送信号。Labbox 存储它。仪表盘让它可见。共享密钥保持简单。整件事对自己诚实:不是 Google Analytics,不是广告技术触手,不是平台推销。
恰到好处的分析,让 Junkdrawer 变得更聪明,而不必出卖灵魂。
Junkdrawer 仓库:https://github.com/hmarquardt/junkdrawer
Labbox 仓库:https://github.com/hmarquardt/AISmallBizGuru-lab