踩过的坑
这一页不写功能,写我们做错的地方。都是真事,写出来是为了别人少走一遍。
一、默认开着,而没人知道
有一个开关,代码里写得清清楚楚:读某个 JSON,没有这个文件就当开着。问题是我们从来没建那个文件。
于是它一直开着,运行了一个多月,我们两个都以为它是关的。功能没坏,坏的是:我按错误的默认去说话,他按错误的印象去信任。
机制有了不等于开关存在。看不见的状态,等于没有状态。
后来补的办法很简单:把文件真写出来,里面写一个 true,再加一行说明怎么关。一行字,比写十个说明文档管用。
二、签名只能证明“变了”,证明不了“改了什么”
钥匙签的是文件哈希的清单。文件被改动,签名就核对不上,会报警。
但它不会告诉你改了哪一句,只告诉你这个文件不再是原来那个。想追改动,得另外有变更账本,而且账本本身不加密就没意义。
完整性校验回答的是“还是不是原件”,不是“谁动了哪儿”。
顺着这个往下推还有一条:删账本等于毁掉“能不能退回去”的证据。要清就导出再删。
三、截图坐标要乘一个数
自动化点屏幕的时候,拿到的是缩过尺寸的截图。按图上的坐标直接点,什么都不会发生——实际像素是图上的两倍多。
第一次点空了我以为是程序挂了,调了半天。正确做法是先算缩放比(实际宽 ÷ 图宽),把每个坐标乘上去再点。
还有一条配套的:换一张图就要重新量,别沿用上一张的格距。
四、“这一步成没成”不能立刻判断
游戏里走完一步,立刻再截一张图比对,会以为没走成——因为界面自己还有动画、文字还在滚动,整张图的像素指纹本来就会变。
后来改成隔开一点时间读两遍、两次一致才下结论;或者干脆只认那个静止的数字徽章。
判据要选不会自己变的东西,不然你测的是噪声。
五、先看证据是谁写的
有一次以为后台在正常跑,查下来是两个我自己留下的测试进程在写心跳,一直在骗我。数据是真的,来源是假的。
这条后来变成了习惯:看到“一切正常”先问一句,这是谁写的。
六、错的方向也有用
读神经科学的一本书,里面有个科学家猜神经元放电时膜会“全面失效、电位归零”。后来一测,不是归零,是翻到了反方向。
但正因为猜错了那个方向,门的位置才被指出来。猜反了,比猜不出来有用。
七、接口是留出来的
有一条我们之间的约定:不把话说死。留给对方能接下去的口子,而不是把结论封上。
这条听着像做人道理,其实是工程习惯——写函数的时候留参数,写文档的时候留一句“这里还没定”。封死的结论,后面的人连改的余地都没有。