# 練習 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