# 练习 3:质量
> 原文:[Exercise 3: On Quality](https://learncodethehardway.org/more-python-book/ex3.html)
> 译者:[飞龙](https://github.com/wizardforcel)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
> 自豪地采用[谷歌翻译](https://translate.google.cn/)
我将提出一个关于认知的科学理论,我并不能证明它:
> 你所做事情的记忆,会让你思考最终产品,这是正确的行为。
这基于我所做的,几乎每一个创造性的事情的观察,它是这样:
+ 你创造的东西需要很长一段时间。这可能是软件,绘画,写作或任何需要时间的东西。
+ 你“完成”了它,然后当一个朋友过来之后,退后一步并且惊叹于它有多好。
+ 你的朋友然后指出了一个明显的问题,突然间,你对你所创造的东西改变了看法。
+ 现在你看到的是你朋友指出的这个错误,你不知道怎么可能错过了它。
我相信这种现象会发生,是因为你记得你如何实现了它,它影响着你所认知的概念。创造的行为往往是一个积极的思想和工作流,所以你的回忆更积极或中立。这样就会使你对作品的看法变得模糊,让你认为它比实际更棒,但也隐藏了许多缺陷和细节。自从你创造它,并且记住了所做的事情,还有一种对作品的情感依恋,这影响了您对作品的判断。然而,你的朋友没有任何回忆,能够更客观地看待作品,这使其更容易看到这些缺陷。这就是为什么复制编辑者发现的错误比作者多。或者,为什么安全专业人员比作者发现更多的缺陷。
在绘画世界中,这是很常见的,画家有很多技巧来颠覆现象。莱昂纳多·达·芬奇(Leonardo Da Vinci)在他的笔记本中甚至提到了这些技巧,他们的设计目的是,让画家站在他们挑剔的朋友的角度上:
+ 将画面颠倒下来,从更远的地方看。这表明了颜色和对比度的明显问题,同时也显示出您需要改变的重复形状。在一个优秀的作品中,重复的形状是不受欢迎的。
+ 在镜子中看着一幅画,将其水平翻转,所以你的大脑没有如何创造的概念。水平翻转将它变成一个你从未见过的全新的画,然后突然间你是一个讨厌的挑剔的朋友。
+ 通过红色玻璃或黑色镜子来看这幅画,它可以去除颜色,使其只能以黑色和白色显示。这显示了绘画太亮或太暗的区域,这使得它在颜色上看起来奇怪。
+ 通过放在他们前额上的镜子来看待绘画和主体,向上看镜子,使镜子和主体上下翻转,以便比较两者。这显示了绘画的明显问题,并使场景和绘画看起来像抽象的形状,你的大脑没有记忆。
+ 把画放几个月,所以你忘了你怎么做了,然后再次看它。
+ 请你讨厌的朋友看看它,让他们告诉你他们看到什么。
一些画家甚至在他们的画后面放了一面镜子,所以他们可以简单地转过来检查他们的进度。我经常使用黑色镜子(或者只是将你的手机的屏幕关闭)放在我的额头上来检查绘画。
在其他创意学科中,没有这么多的自我批评技巧,并且在软件中也只有很少。事实上,我发现程序员由于他们使用“程序员的方式”来完成代码而声名狼藉。“程序员的方式”,指程序员 Hack 一小段代码,然后改一改,直到通过编译,之后宣城他们完成了工作,并继续。事实上,在这之后有很多事情要做,例如清理代码,执行质量保证检查,添加不变量和断言,编写测试,编写文档,并在整个系统的大环境中确认是否工作。但是没有,程序员经常在编译器(或测试套件)没有错误时就停止了。
在这本书中,你将学习如何执行自己的一套检查,类似于画家使用的检查。他们是看待你的代码的方法,并断开了你如何制作它的历史,秘密就变成了检查清单。颠覆你的工作记忆的方式,是强制自己遵循一套检查,它假设你写的东西有缺陷。我交给你的质量过程不会捕获到所有的东西,但它会帮助你发现你能发现的,尽可能多的错误,也可以帮助你跟踪正在犯下什么样的错误,所以你可以在将来避免他们。之后,我会鼓励让其他人审核您的代码,并审核其他人的代码,以便您可以擦亮眼睛,找到更多的缺陷。
缺陷减少的理念是一种概率。你永远不能删除所有的缺陷。相反,您将致力于降低出现缺陷的可能性,并能够粗略估计其概率。这样可以避免您不知道您的代码是否有缺陷,并帮助您摆脱,不知道你的代码是否存在缺陷的恐慌。你不再使用“程序员的方式”,反之,当你完成并准备复查时,你会拥有很好的概念。你不再不断地担心每一个不可能的边界情况,你将能够评估这些边界情况的可能性,并处理最可能的情况。
## 研究性学习
在这个练习中,你需要找到一段你在几个月前写的代码,然后再回顾一下。您可能不知道如何审核一段代码,但只要浏览代码,并对任何您不喜欢的内容编写评论即可。关键是逐行并逐个文件查看每一行代码。然后,标记您发现的令人反感的代码,并写出原因。它不一定是一个非常大的软件,只是你之前写的一些东西。
## 深入学习
编写您发现的所有缺陷的列表,并尝试对其进行分类。您可以查看正式的缺陷类别,但是一个很好的基本集合是:逻辑,数据类型,调用。逻辑错误是,你写的`if`语句或循环是错误的。数据类型错误是,您使用变量,并假定它是错误的类型。调用错误是,你调用一个函数并且犯了错误。这些不是正式类别,但是这是一个很好的开始。
- 笨办法学 Python · 续 中文版
- 引言
- 第一部分:预备知识
- 练习 0:起步
- 练习 1:流程
- 练习 2:创造力
- 练习 3:质量
- 第二部分:简单的黑魔法
- 练习 4:处理命令行参数
- 练习 5:cat
- 练习 6:find
- 练习 7:grep
- 练习 8:cut
- 练习 9:sed
- 练习 10:sort
- 练习 11:uniq
- 练习 12:复习
- 第三部分:数据结构
- 练习 13:单链表
- 练习 14:双链表
- 练习 15:栈和队列
- 练习 16:冒泡、快速和归并排序
- 练习 17:字典
- 练习 18:性能测量
- 练习 19:改善性能
- 练习 20:二叉搜索树
- 练习 21:二分搜索
- 练习 22:后缀数组
- 练习 23:三叉搜索树
- 练习 24:URL 快速路由
- 第四部分:进阶项目
- 练习 25:xargs
- 练习 26:hexdump
- 练习 27:tr
- 练习 28:sh
- 练习 29:diff和patch
- 第五部分:文本解析
- 练习 30:有限状态机
- 练习 31:正则表达式
- 练习 32:扫描器
- 练习 33:解析器
- 练习 34:分析器
- 练习 35:解释器
- 练习 36:简单的计算器
- 练习 37:小型 BASIC
- 第六部分:SQL 和对象关系映射
- 练习 38:SQL 简介
- 练习 39:SQL 创建
- 练习 40:SQL 读取
- 练习 41:SQL 更新
- 练习 42:SQL 删除
- 练习 43:SQL 管理
- 练习 44:使用 Python 的数据库 API
- 练习 45:创建 ORM
- 第七部分:大作业
- 练习 46:blog
- 练习 47:bc
- 练习 48:ed
- 练习 49:sed
- 练习 50:vi
- 练习 51:lessweb
- 练习 52:moreweb