乾貨無幾,水文續之。
嗯,作為乙個完全沒有哲學概念的人來說,寫這麼一篇筆記,那絕對比水文還水了。
接上一回簡化失敗,我們用delta
除錯法從大堆沙子輸入中淘到了,呃,炸藥。這些輸入放到熔爐裡,炸藥就會**,所以我們需要學會使用
delta
自動地完成沙中淘炸藥的過程。
從哲學的抽象層次來看,這堆炸藥就是**的起因(cause)了。
嗚,zeller
教授不是這麼說的,照剛才那麼一說就一點問題都沒有了。
zeller
說的是,
delta
除錯法不只是簡化了輸入——從沙子中淘到炸藥,關鍵的是這些簡化後的結果就是失敗的起因。這就是哲學上的理解。而問題就是為什麼這些簡化後的結果就是起因呢,為什麼delta除錯法這麼厲害,一來就找到失敗的起因呢?
算起來,起因這個東西,沒吃過豬肉還沒見過豬啊——這年頭可能還真有人沒見過豬跑,只見過豬肉了吧,但還是要有個比較準確的定義。
哲學上的因果(causality)
關係可能有點不太直觀。哲學中的起因(
cause
,原因)定義為:
如果存在a,b
兩個事件,a在
b前,所謂
a 引起
(cause) b
,就是如果
a沒有發生,則
b也不會發生的情況。
zeller教授舉的是球打爛玻璃這個事件。讓我想到快樂大本營某一期,應該是最近一次宋茜來的那期中,維嘉和何炅的心有靈犀第一題就是打爛玻璃,維嘉急得直叫「臣妾做不到」
扯遠了,話說有一些哲學家都置疑因果的存在——物理上,相對論挑戰了很多直觀的時間認知,但是因果關係上好像還是沒有挑戰。既然哲學家自己都置疑因果的存在了,為什麼還要講因果、起因,這個在除錯中很有用嗎?
答案是噎死!就像我自己舉的從沙子中淘炸藥一樣,炸藥會引起熔爐**,這一點很明顯,但假設這些炸藥長得跟沙子像近親一樣(顆粒炸藥嗎),就不知道是哪些「沙子」會**了。
太陽當空照,花兒對你笑,小鳥說早早早,這些跟你背上炸藥包有關係嗎?所以delta
除錯法就會把沙子(無關項)全部過掉,只留下炸藥(有缺陷項),而這些有缺陷地方就是程式失敗的罪魁禍首了。
最後,起因加強版重磅推出——實際起因(actual cause)
。可能應該要有個更規範的中文術語來代表才好。
為什麼會有實際起因這個概念?因為通用的起因會有一些誤導作用,比如說,
把mozilla
瀏覽器弄趴下了,那不用
mozilla
了唄,要麼,這家公司就不要成立,這個產品不就沒有了嗎?這些說話聽起來很荒謬,但不得不說,還真符合前面的起因(
cause
)的哲學定義。所以,就需要更加準確的實際起因這個概念了。
何謂實際起因:
an actual cause assumes and change as little as possible, yet changes the effect.
實際起因除了改變特定的結果——程式失敗的結果,其他影響會盡可能小。也就是***盡可能小。不要怪我,那個assume我確認不了。
delta
除錯法所實現的正是找到了實際起因——從紛繁複雜的背景中,找到了錯誤的實際起因——輸入中的乙個很小的子集,子集裡面每個元素、每個項、甚至每個字母都跟錯誤的產生有關。所以delta除錯法才這麼厲害,成為zeller教授的代表作了。
最後的最後,我們已經從delta
除錯法得到了實際起因的輸入了,要開始修復程式的缺陷了。在修復程式的缺陷時,要確認這個缺陷是否滿足兩點:
1、它是個錯誤。讓我想到了鄭愁予的《錯誤》,可惜我不是文藝青年,一向覺得那詩實在是無聊+八卦的典範。
2、是它引起了程式的失敗。
它得是個錯誤,我們才知道如何去修復它。就拿引起mozilla
瀏覽器崩潰的、由
delta
除錯法從
800行**中挑剩下的
標籤來說吧。這個標籤引起了錯誤,但它本身卻不是個錯誤,首先它語法是對的,其次再怎麼也不該把瀏覽器給弄趴下了。所以
delta
除錯此時返回的實際起因
是乙個導火索,真正「潛伏」在人民內部的還是**中的缺陷,不過我們此時很容易知道缺陷是什麼了,就是
mozilla
瀏覽器中處理
select
標籤的那段**。
它引起了程式的失敗,這樣在我們修復了它之後,程式才不會再度失敗,最起碼不會再出這個錯。
水文筆記一篇送上。
Udacity除錯課第五單元錯誤重現
定義 為什麼需要重現 對執行過程進行觀察,按需試驗,才能將缺陷隔離出來。只有能將錯誤重現,才能證明最終修復了這個漏洞。分類 以下錯誤好像都來自物理學 波爾錯誤 a repeatable bug one that manifests reliably under a possibly unknown ...
JS學習筆記(四)之除錯
使用控制台檢查變數值 console.log 使用 type of 檢查變數的型別 console.log typeof 輸出 string console.log typeof0 輸出 number console.log typeof 輸出 object console.log typeof 輸...
6 21(2)課堂筆記之String
string類有以下構造方法 string 建立乙個內容為空的字串物件 空串 string string value 按字串引數建立字串物件。string char value 按字元陣列引數建立字串物件。string byte value 根據本地平台預設的字元編碼,按位元組陣列引數建立字串物件。...