内容提要
Verifone架构师Yuri Geronimus在KotlinConf 2026分享:支付系统需满足多国监管规范,他用Kotlin类型系统将规范写入代码,让编译器强制校验。通过值类、密封接口、非空边界、脱敏默认等十种模式,使非法状态无法构造。成果:开发提速2.7倍,认证一次通过,代码减少30%。他强调遗留系统应渐进重构而非重写。
延伸解读
类型系统如何成为合规工具
在支付行业,监管规范往往长达数千页,且不同国家的规则可能相互矛盾。Yuri的方法是将规范中的名词和动词直接映射为Kotlin类型,例如用值类区分格式相同的ID,用密封接口表示交易状态。这样,编译器就能在构建阶段强制检查代码是否符合规范,而不是依赖人工审查。这相当于把合规性检查左移,让错误在开发阶段暴露,而非在生产环境造成资金损失。
从事故模式看类型安全的价值
Yuri列举的六类事故都源于代码与规范对同一词汇的理解偏差,例如可空字段的静默回退、卡号泄露到日志、超时后的重复扣款等。这些问题的共同点是:错误在运行时才被发现,且难以追溯。通过非空边界、默认脱敏、将超时建模为领域结果等模式,非法状态在构造时就被阻止,从而避免了这些具体事故。这提示我们,类型安全不仅是代码风格,更是风险控制手段。
遗留系统迁移的务实路径
Yuri明确反对将迁移视为重写项目。他的系统包含25年历史的Java和C++代码,且要求零停机。因此,他提出四条并行轨道:优化现有代码结构、转向验收测试驱动、构建合规等非功能属性的适应度函数、增量迁移(从适配器到领域模型再到频繁变更部分)。Kotlin与Java的互操作性使得新旧代码可以共存,避免双维护。这种渐进式重构降低了风险,也更容易获得业务方支持。
可读的测试与业务对齐
Yuri将认证测试重写为Kotlin DSL,使不熟悉Kotlin的认证专家也能直接阅读并对照规范签字。这改变了测试的受众:从仅测试工程师可验证,变为业务和合规人员可评审。同时,由于编译器捕获了状态遗漏等错误,代码审查的重点从查找缺陷转为逐句比对规范。这种转变促进了工程师与产品、监管方的直接沟通,甚至能主动提出规范修改建议。
Q&A
Verifone架构师Yuri Geronimus在KotlinConf 2026上提出的核心方法是什么?
用监管机构或卡组织规范的原话编写代码,并让编译器强制执行这些规范,而不是依赖开发人员的纪律或文档来发现代码与规范之间的差距。
Kotlin的类型系统如何帮助支付系统满足多国监管规范?
通过值类、密封接口、非空边界、脱敏默认等十种模式,让非法状态无法构造。例如用值类区分格式相同的ID防止参数错位,用密封接口在边界处解析外部字段并强制穷尽处理,用非空类型在边界处大声失败而非静默回退,用私有构造函数和重写toString()默认脱敏卡号。
Yuri Geronimus提到的十种Kotlin模式具体包括哪些?
1. 用值类表示规范中的名词(如各种ID);2. 在边界处用验证工厂将外部字段解析为密封结果;3. 在边界处使用非空类型,失败时大声报错;4. 默认脱敏敏感数据(如卡号);5. 每个状态拥有自己的类,而非仅状态字段;6. 不可变性和命名转换;7. 删除else分支,让新增状态导致编译错误;8. 根据规范选择协程作用域(coroutineScope快速失败 vs supervisorScope隔离);9. 将超时建模为领域结果而非异常;10. 让测试成为监管机构可读的规范。
采用这些Kotlin模式后,Verifone的支付系统取得了哪些实际成果?
开发速度提升2.7倍,认证首次尝试即通过且仅有一个缺陷(异常到监管机构询问变化),代码库缩小约30%,代码审查从查找遗漏的状态检查转变为逐句对照规范,新工程师入职从2-3周缩短到几天内即可提交生产PR,工程师能在设备团队和后端团队之间流动,并能直接与产品经理、销售和监管机构沟通。
对于遗留的Java或C++支付系统,是否必须重写才能使用这些Kotlin模式?
不需要。Yuri明确反对将迁移视为重写项目。他的替代方案是四条并行轨道:先优化现有代码库(不改变语言),转向验收测试驱动开发,构建适应度函数检查合规性等,增量迁移(先新适配器,再新领域模型,然后是最常变化的遗留代码),利用Kotlin与Java的互操作性实现增量路径。
为什么在支付系统中,纪律或代码审查不足以捕获这些bug?
在Yuri运营的规模下(全球20个团队),纪律无法均匀扩展。编译器检查在任何地方、任何时间都一致地应用,无论谁值班或某个审查者当天多仔细。