收集一些软件工程中常见的一些概念
橡皮鸭调试法
传说中程序大师随身携带一只小黄鸭,在调试代码的时候会在桌上放上这只小黄鸭,然后详细地向鸭子解释每行代码。
许多程序员都有过向别人(甚至可能向完全不会编程的人)提问及解释编程问题,就在解释的过程中击中了问题的解决方案。一边阐述代码的意图一边观察它实际上的意图并做调试,这两者之间的任何不协调会变得很明显,并且更容易发现自己的错误。如果没有玩具小鸭子也可以考虑向其它东西倾诉,比如桌上的花花草草,键盘鼠标。
类似的,有一种现象叫做 ConeofAnswers,这是一个常见的现象。你的朋友跑来问你一个问题,但是当他自己把问题说完,或者说到一半的时候就想出了答案走了,留下一脸茫然的你。是的,这个时候你就起到了那只小黄鸭的作用。
相似的概念还有不少,列如自白调试、纸板程序员或程序员的假人、想出脑外等等。总的来说,在你试图表述自己的想法的过程中,自然地在促使自己去整理思路,重新考虑问题。
《程序员修炼之道》
零知识证明
“零知识证明”(zero-knowledge proof),证明者在不透露“任何有用信息”的情况下,使验证者相信某个论断是正确的。
举例:
你拥有一个宝库,可以通过念咒语来开门。有天你想在朋友面前证明你能打开宝库,但又不想让他听到咒语。这该如何解决? 正好,他知道你的宝库里有个独一无二的宝物,如果能取出来给他看,自然就能证明你能打开。这样就无需带他到场,自己单独打开取出宝物,然后拿给他看就行了。于是,就可以在不暴露咒语的同时,证明你能打开。
无形验证码 - POW“算力验证”
PoW(Proof-of-Work),一种鉴定对方是否投入计算工作的机制。并且只需花费少量的资源,即可鉴定大量的工作。
使用散列函数实现的 PoW,就叫做Hashcash。现实中比特币使用了类似的原理,它使用了 SHA-256 作为散列函数。有权威的密码学算法作为保障,因此只能暴力穷举,而无法使用投机取巧的方法获得结果,保障了挖矿工作的价值。
目的:增加攻击者计算成本 引用: 【探索】无形验证码 —— PoW 算力验证
鸭子类型
鸭子类型(Duck-Typing),它弱化了对象的 类型,强化了对象的 功能。
JavaScript 识别对象是否属于某个类有2种办法,一种是 instanceof 运算符和 constructor 属性,但描述的检测对象的类的各种技术多少都会有些问题,至少在客户端 JavaScript 中是如此。
解决办法就是规避掉这些问题:不要关注「对象是什么」,而是关注「对象能做什么」。这种思考问题的方式在 Python 和 Ruby 中右学普遍,称为「鸭子类型」
像鸭子一样走路、游泳并且嘎嘎叫的鸟就是鸭子
引用《蝙蝠侠》里面的台词:
It’s not who you are underneath, it’s what you do that defines you
FIRST 原则
- Focused:专注
- Independent:独立
- Reusable:可重用
- Small:小巧
- Testable:可测试
能够降低应用复杂度,同时提升测试能力与重用率。


