项目 · 2010 · 作者 · 已归档

SAMS:空间自动营销系统(本科毕业项目 2010)

约旦大学毕业项目:一个 GIS 驱动的位置感知营销系统,带有服务器后端、Windows Mobile 和 Symbian 客户端--是的,Symbian--以及关于分布式系统在你第一次构建时会教给你什么的第一课。

Client-server architecture diagram showing request-response flow, hero image for architecture topic posts.

那是 2010 年。iPhone 上市三年了,在安曼还是个稀罕物。「移动」意味着诺基亚,BlackBerry 是给高管的,Android 出来两年但感觉像个开发者实验。我正在约旦大学完成计算机信息系统学士学位,为毕业项目构建一个位置感知营销系统。

这份胆气。我喜欢那时候的我。

SAMS 是什么

Spatial Automated Marketing System(空间自动营销系统)。名字是我自己起的,这就是你知道它是 2010 年的原因—那时我们还在用四词缩写命名项目,好像在写 RFC。

这个系统围绕一个简单前提构建:如果你的手机知道你在哪里,一家商户知道它的客户在哪里,你就能在客户地理上接近门店或场地时向他们发送定向促销。基于位置的营销,2010 年这是一个新颖的工程问题,2024 年是每个广告平台里的一个功能开关,2010 年我得把整个东西从头建起来。

架构—我在对一个毕业项目慷慨使用这个词—是三层的:

  1. 服务器后端:Java/PHP,关系型数据库(SQL Server),GIS 数据层。商户用地理坐标注册他们的场地,客户档案用选择加入的偏好维护,营销引擎将场地接近度与客户档案匹配,并将促销消息加入队列。

  2. Windows Mobile 客户端:一个用于 Windows Mobile 手机的 .NET Compact Framework 应用程序。GPS 轮询,地图渲染—2010 年这是真正痛苦的,因为移动端地图 SDK 不是今天这个样子,你经常要自己渲染瓦片。客户端把位置更新发送到服务器,在接近规则触发时接收促销通知。

  3. Symbian 客户端:因为 Windows Mobile 不是 2010 年约旦市场的主导平台—诺基亚才是。Symbian Series 60,具体来说。第二个客户端应用程序,不同的 SDK,不同的运行时,相同的协议。这就是我学到「一次编写,处处运行」是 Java 营销口号而不是移动现实描述的地方。

真正难的技术问题

2010 年消费手机上的 GPS 不可靠。好天气下精度在几十米,室内或密集城区更糟。200 米半径的接近触发器在露天停车场运作正确,在购物中心里会不断误报。服务器端的地理围栏逻辑必须考虑 GPS 漂移,这意味着它必须把客户位置当作概率分布而不是点来处理。我用最后 N 个位置样本的移动平均和触发前的置信度阈值来处理这个问题。这不在我的课程里,我从第一原理推导出来,当时感觉像研究,回头看就是调试。

Symbian 网络栈不宽容。Symbian Series 60 上的 HTTP 需要显式网络会话管理,平台的不同代 API 在不同设备型号上有不兼容的行为。我在能从同学和家人那里借到的诺基亚设备上测试,这意味着我的测试矩阵是「2010 年初安曼人手里的诺基亚手机」。这不严格,非常本科。

电池是持续的约束。每 30 秒轮询一次的 GPS 应用会在几小时内耗尽 2010 年诺基亚的电池。轮询间隔是可配置的,我在项目报告里写了一节解释为什么正确的权衡取决于部署上下文(场地密度、客户移动速度、商业需求)。这节大概比它需要的长。我为想到这件事而自豪。

这个项目真正教给我的

「在我的机器上能用」和「在现实中能用」之间的差距。

我有两个客户端和一个服务器,每个都有不同的故障模式:服务器可能宕,GPS 可能不可用,移动网络可能断,数据库查询可能超时,促销可能因为客户端重试而重复。每一种故障模式都需要一个决定—重试、忽略、优雅降级或大声失败—而每种情况的正确答案都不同。

这是我的第一个分布式系统,很小,但也是真正分布式的:三个独立的运行时环境,独立的故障域,每对之间有网络。关于部分失败和优雅降级的 lessons—我在 Elevatus、Bytro 以及此后工作过的每一个多服务系统里应用的—第一次是在构建 SAMS 的过程中学到的。

我还学到了,把一个项目命名为 SAMS 并不能让它听起来更严肃,只是意味着你要在每次展示里解释这个缩写。未来的我:先把东西建出来,然后再起名字。

委员会答辩

我的毕业项目由约旦大学的一个评审小组审查。我在一栋卫星信号很差的楼里,用从同学那里借的设备演示 Windows Mobile 客户端,外挂了一个 GPS 接收器。GPS 定位花了四分钟,委员会在旁边看着。我为这种可能性做了准备,录制了完整流程在室外正常运作的视频。委员会对意外情况规划的欣赏,超过了他们对干净现场演示的欣赏—一位教授事后告诉我,我预料到了故障模式这件事「比 GPS 就那么顺利定位更让人印象深刻」。

那个反馈一直跟着我。有经过排练的降级方案的优雅失败,胜过以不可预测的方式成功的系统。

它在哪里

已归档。Windows Mobile 已经消失,Symbian 已经消失,我测试过的特定诺基亚手机是博物馆文物。我不得不用移动平均解决的 GPS 精度问题,现在每个现代位置 SDK 都自动处理。我解决的那个问题,此后被拥有远更多资源的团队多次解决,整合进了数十亿人不假思索使用的平台。

然而:我在大学最后一年,在三种不同的运行时上,没有云提供商、没有值得一提的地图 SDK、一个在室内要四分钟定位的 GPS 接收器的条件下,构建了一个运作中的端到端位置感知系统。

我接受这个结果。