怎么减少啰嗦?
计算机原理 · 小纸条
选一章打印。双面打印(按长边翻页)后沿虚线剪开,每张卡片正面题目、背面答案。
为什么要分开?
至少要做什么?
这和断言什么关系?
循环怎么处理?
这为什么有用?
它和测试的根本区别?
那什么场景值得?
这说明什么?
它的瓶颈是什么?
参考答案(家长):bug 应该立刻暴露,而不是被 catch 掉悄悄继续。
参考答案(家长):用语法糖,比如一个符号表示"出错就直接往上返回"。
参考答案(家长):断言是契约的可执行形式。
参考答案(家长):记日志,并且想清楚为什么这里可以忽略。
参考答案(家长):能自动化,是程序验证工具的核心机制。
参考答案(家长):找循环不变量,你在算法课里学过。
参考答案(家长):航空、轨道交通、医疗设备、密码库、操作系统内核。
参考答案(家长):测试证明存在错误,验证证明不存在错误。
参考答案(家长):状态爆炸,状态数随组件数指数增长。
参考答案(家长):形式化不能消除人的理解错误,只能消除实现错误。
抽象会带来什么风险?
它和模型检验怎么选?
这个发现有多重要?
它能保证什么?
投入产出比最高的一步是什么?
排序函数有什么性质?
它能替代单元测试吗?
为什么这个功能重要?
动手做。
它为什么会有误报?
参考答案(家长):有限状态用模型检验自动化程度高,无限状态用定理证明。
参考答案(家长):抽象掉了关键细节,可能验证出假的正确结论。
参考答案(家长):比如数组访问永不越界,编译期就证明了。
参考答案(家长):它把逻辑学和计算机科学统一了起来。
参考答案(家长):输出有序、且是输入的一个排列。
参考答案(家长):通常是引入静态类型和关键处的断言。
参考答案(家长):随机生成的反例往往很大很乱,缩小后才看得懂。
参考答案(家长):不能替代,两者互补,具体用例更好定位问题。
参考答案(家长):受莱斯定理限制,只能做保守近似。
参考答案(家长):很多人第一次跑就能发现边界 bug。
安全扫描该偏向哪边?
这样能得到什么结论?
它的瓶颈是什么?
它和属性测试的区别?
它的困难在哪?
它的门槛在哪?
它容易被误用在哪?
什么时候继承才合适?
它的好处是什么?
数据处理流水线适合哪种?
参考答案(家长):如"这个除数区间不含零",从而证明不会除零。
参考答案(家长):宁可误报,漏掉漏洞的代价更大。
参考答案(家长):模糊测试主要找崩溃,属性测试检查语义性质。
参考答案(家长):路径数随分支指数增长。
参考答案(家长):思维转换,以及某些场景下性能需要额外考虑。
参考答案(家长):状态多了以后,很难推理某一刻的整体状态。
参考答案(家长):确实是"是一个"的关系,且父类接口稳定。
参考答案(家长):过度继承、为了对象而对象、把过程硬套成类。
参考答案(家长):函数式,映射过滤归约的组合天然适配。
参考答案(家长):实现可以被优化和替换,而你的描述不用改。