我们怎么审查自己的产品
DisplayPilot 由一个人开发,是没有评价的付费产品。与其让你相信我们,不如把真实的记录摆出来:我们怎么找问题,以及找到了什么——其中两次是我们在检查方法上犯错,而不是产品出错。
方法
- 四个角度。每个功能按四种方式读一遍:它与系统其余部分的连接点、每条失败分支上会发生什么、我们对它的说法与代码是否一致、以及行为在语义上是否正确(而不只是看起来合理)。
- 先怀疑检查器。检查失败时,更可能出错的是检查本身。下面就有好几条正是如此。
- 检查必须能在植入缺陷时失败。每一道自动检查都被验证过:故意改坏一处,确认它变红。不会失败的检查只是装饰。
- 检查必须报告它量了什么。最安静的失效方式是「什么都没匹配到,于是打印全部通过」。我们的每道检查都会打印它看了多少项,并且有一道元检查断言这些数字不会下降。
我们找到了什么(节选)
错在哪 → 代价 → 怎么修。
- 隐私页写着我们看不到你的邮箱,而代码把它明文存储、且长期保留。这是最糟的一类错误——一句被代码推翻的公开说法。页面与存储都已修正,而这条说法现在本身就是自动检查与代码比对的对象之一。
- 我们标价 US$14,实际收 ¥99,按汇率约 US$14.82——等于把自己的价格说低了 5.9%。已改为与实际收款一致。
- 发布验证器会在两个主机都坏掉时报成功。它只比对内容哈希,于是两个一模一样的 404 也算「一致」。现在它同时要求真实的 200 响应。
- 许可页的一句话描述了一个我们从未使用的支付渠道,而且不像我们激活码的输入仍会被送到第三方接口。该接口已被完全移除:激活只在这台 Mac 上发生。
- 每个 Release 页面上都有一个指向从未发布文件的链接。正文里的「技术细节」指向 404。文件现在已发布,链接形式也一并修好。
- 钱路的最后一环在本项目里从未被测过。签发激活码依赖登录钥匙串里的签名私钥;若那把私钥被重新生成,新签发的每一枚码都会被所有已安装的应用拒绝,而且无声无息。现在我们跑一个 2 秒检查,比对钥匙串公钥与应用内嵌公钥。
- 钱可能到了却没人知道。未匹配的转账只写日志、从不通知。现在会触发通知。
- 译文缺格式符会导致崩溃。译文漏一个 %d 或 %@ 会运行时崩溃或显示错值;现在的检查会比对格式符,而不只是覆盖率。
我们在「检查本身」上错在哪
- 一个看起来没签名的构建。我们自己的脚本报「没有签名」,因为某次 codesign 调用不打印 Authority 链。构建是好的,检查不是。
- 424 个「缺失」的文件其实一个都不缺。一个链接检查器不会解析上级目录路径,把几百个正常链接报成断链。
- 一道「通过了」却什么都没量的守卫。某道检查在量测静默失败时报告「全部通过」——正是它被写出来要防的那种失效。
现在跑什么
在发布任何东西之前,会先跑 16 道自动检查,然后是完整测试套件与编译。它们覆盖:应用的说法与代码是否一致、本地化、价格、站点页面与元数据、隐私与许可文本、发布文案,以及站点的每一个站内链接与资源(包括大小写——因为 macOS 大小写不敏感,而 Web 敏感)。任何一道失败都会中止发布。
完整清单与各自对应的命令在项目仓库里。如果你在这个网站上发现任何我们的代码支撑不了的说法,那是一个值得报告的 bug——告诉我们,我们会公开修正。