迁移

表明您已被专有格式锁定的警示信号

锁定很少源于某一个决定。它是逐渐累积的,每次一个方便的捷径,直到一个最初与某家服务商合理集成的代码库,悄无声息地变得很难再与这家服务商分开。有几种具体模式值得识别为警示信号,因为每一种在发生时单独看都显得无害。

服务商的确切字段名贯穿了您自己的数据模型。如果您的数据库结构、内部 API 响应和前端代码都使用某家服务商的字段命名,比如 formatted_addressdisplay_name,或者那家服务商碰巧使用的任何名称,而不是在边界处一次性转换成您自己选定的命名,那么您应用的每一层都已经吸收了对这一家供应商约定的依赖。

针对服务商特有怪癖的变通代码写在了业务逻辑里,而不是隔离在集成边界处。如果针对某家服务商在格式化边缘地址时的特定怪癖所写的变通代码,位于通用业务逻辑之中,而不是位于与该服务商通信的那个狭窄函数之中,那么迁移就意味着要从表面上与地理编码毫无关系的代码里找出并理清这段变通代码。

没有人能快速回答代码库中有多少处按名称引用了该服务商。如果回答“我们在哪些地方依赖这家供应商”需要仔细审查,而不是能快速而有把握地回答,那么这种不确定性本身就是锁定的迹象,因为它说明依赖的扩散范围已经超出了任何人一直在主动跟踪的范围。

客户端库的特定对象类型在代码其他地方被用作函数签名。如果与地理编码无关的函数把某家服务商 SDK 的响应类型作为参数,那么该服务商的类型系统实际上已经成为您应用自身类型系统的一部分,要移除它就必须修改每个引用它的函数,而不仅仅是地理编码代码。

在集成上线的这些年里,从未测试过迁移,哪怕是部分测试。一个理论上可以迁移到另一家服务商、却从未真正针对其他服务商试过的集成,在实践中与一个根本无法迁移的集成并没有实质区别,直到有人真正去测试它。

这些模式单独看都不是灾难性的,大多数集成都至少存在其中一种,而且很长时间内都没有造成实际后果。识别它们的价值在于,能让锁定成为一个经过深思熟虑、可以接受的取舍,而不是一个没人选择过的意外。有时便利确实值得这种耦合,尤其是对小项目来说,完整迁移所耗费的工程时间可能超过灵活性本身的价值。问题只在于锁定是在不知不觉中发生的,并在最糟糕的时刻被发现,也就是在截止日期压力下被迫迁移的时候,而不是事先就有意识地承认并接受它。

如果您当前依赖的服务商已经有对应的兼容主机,这部分风险自然会更低,因为 17 个兼容主机意味着至少有一条可能的迁移路径完全不需要理清字段层面的锁定,只需更换主机和密钥。即使对于一个您近期没有迁移计划的集成,准备好这样一份保险也是合理的。