把老师给的每一条结论先当成待检验的假设,而不是要背下的答案。具体做法是:在你自己正在做的那个页面上,人为构造一个能让这条结论失效的条件,看页面表现是否真的变化。如果结论在反例下依然成立,说明你理解了它的适用边界;如果立刻失效,说明你原先记住的只是结论的措辞,而不是它成立的前提。下面以你手里任意一个静态页面为对象,说明怎么把结论转成可执行的反例练习。
培训里给出的结论大致分两类,处理方式完全不同。
分错的代价很直接:把偏好型结论当条件型去证伪,你会得出“老师讲错了”的错觉;把条件型结论当偏好型去比较,你会一直停在“两种都行”的模糊状态,练不出判断力。
拿你手上那个页面,挑一条结论,填进这个句式:在____条件下,做____,会得到____结果。三个空必须都能在页面上观察到,否则这条结论还没法练。
假设你学到的结论是“导航项超过七个就该收进折叠菜单”。改写后是:在导航项为八个、屏幕宽度为手机尺寸的条件下,展开全部导航,会出现换行或横向溢出。这时“换行或溢出”是可观察的,练习才成立。
如果三个空里有一个填不出来,说明这条结论目前只能先记着,等遇到能观察的场景再练,不必强行编一个反例。
反例练习最容易失败的地方是一次改太多。正确做法是固定其余条件,只动一个变量,然后记录页面发生了什么。
这一步的实际动作是建立对照版本,它的结果直接决定下一步:如果现象随变量改变而改变,说明你找到了结论的边界;如果现象不变,说明你改的变量不是真正起作用的那一个,需要回到上一步重新找变量。
下面是一个纯假设的对比,用来演示怎么量化代价,不涉及任何真实项目。
假设你要练“表单校验放在前端还是后端”这条结论。两种做法都成立,但代价不同:
选择条件很清楚:如果这个表单只在受控环境内使用,前端校验够用;如果提交入口对外公开,后端校验不可省。练习时你可以只改“提交入口是否公开”这一个条件,观察自己需要补写哪一部分代码,这就是把结论转成了可执行的判断。
一个反例有效,需要满足两点:现象可重复出现,且只由你改动的那个变量引起。如果换个时间、换个文件再试就不复现,先怀疑是不是缓存、文件没保存或改错了位置,而不是急着推翻结论。
另外,页面某处表现没变化,不能单独证明你的改动正确。它还有别的解释:改动没生效、被其他样式覆盖、或者这个位置本来就不受该变量影响。要排除这些解释,最省事的办法是回到对照版本,确认两个版本的差异确实只有你改的那一处。
练习该停的信号是:你能说出这条结论在什么条件下成立、什么条件下不成立,并且能指出不成立时你会改用哪种做法。达到这一步,结论就从记忆变成了你自己的判断依据,剩下的时间应该花在下一条结论上,而不是继续在同一个页面上加变量。