程序員的“認知失調”
“不可能啊”、“一定是服務器的原因”、“我的程序不應該有問題啊”,這些年工作聽到的最多的就是這些話了,程序員都是比較自信的,總是覺得自己的程序肯定沒問題。
程序就是程序員的自我延伸,花了幾個小時甚至幾天時間構建的結果,最后它以“正確”的形象印入你的意識里,你自然不希望別人找出什么紕漏,即便找出什么紕漏了,自己也意識到了“不足”,感情上很難接受,所以大部分人都會習慣性的“辯護”,甚至試圖找一些迂回手段證明自己是對的。實際上很多時候,只要我們稍微回歸一下,跳出自我守護的那一畝田地,也許我門就會很輕易的發現:我們的確錯了。
心理學上有一個學術名詞叫做“認知失調”,所謂認知失調就是指在一個人的認知系統里即將出現新的認知與就舊認知(舊的信念,自我建立的理論)產生沖突引起的心理上的不適,為了調節這種不適感,一方面為舊的認知辯護,另一方面希望在新的認知和舊的認知上找到共存的平衡。例如,你告訴吸煙者吸煙有害健康,應該要戒煙,吸煙者就會出現認知失調,但是他們很快就會從中解脫出來,因為他們會以“吸煙能減輕壓力,令他們輕松”的理由來說服自己。
認知失調是一種很常見的心理現象。在我們設計到實現我們的程序的過程中,我們在心理上已經慢慢的建立了自己對程序的相信。再到代碼審查階段或測試階段,總會有人指出其中不完美之處,于是出現了認知失調,所以我們會習慣性的“辯護”。一個開發團隊中,要形成良好的氛圍,首先要克服認知失調現象,提高程序員的認知是比較重要的。
我們的前輩們很早就意識到這個問題了,并且有些程序開發組已經克服了這種認知的局限。遠在計算機剛剛成為可能之初,我們的前輩馮·諾依曼很早就意識到了自己在檢查自己的工作方面的能力的確不足,他或許是第一位能夠認識到這一點的程序員。而在他的朋友中,有人回憶,馮·諾依曼總是很別人說他自己是一名蹩足的程序員,并且總是不厭其煩的請人幫他讀程序,希望能發現一些錯誤和紕漏。在今天我們看來,馮·諾依曼無疑是一個天才,就是這樣一位天才的程序員都能有會不足之處,我們又有什么不能面對自己的錯誤呢?
再來轉述一個故事。比爾是早期空間跟蹤系統的一名成員,他負責寫一個模擬器,對整個網絡中的空間跟蹤站以及實時輸入進行模擬,這個模擬器的核心是一個非常緊湊的循環。實際上,它只有13條指令。比爾研究了很多個小時以后,覺得自己終于有些信心了,但是他還是希望找到一些要求比較苛刻的人來幫他檢查程序。
比爾找到了馬里琳,她愿意細讀他的程序,他也讀她的程序,這是他們工作組里再平常不過的事了,這種相互批評的方式能讓當事人不會感到自己在接受別人的批評。而比爾認為自己這方面訓練有素,沒必要通過這種交換來保護自己的自尊心。在他的程序開發價值觀里,那種隱秘的、保守的開發方式很不好,只有開放的、分享的開發方式是好的。在他的程序中可能發現錯誤是人人可見的簡單事實,暴露這些錯誤,不過是為了將來更好的改進,所以并非是對他個人的攻擊。
在這個例子中,比爾經歷了他程序開發生涯中最“糟糕”的一天。經歷反復的檢查,馬里琳發現了很多錯誤,隨著錯誤一個一個的被發現,比爾反而變得越來越開心。要是比爾和我們大多數程序員一樣,肯定是開始在為自己辯解了。最后,在他們的一次學術會議上,他向全世界公布了一個驚為天人的事實:13行代碼中,馬里琳成功發現了17個錯誤。他認定那天并非他寫程序的“良辰吉日”,在那天剩下的時間里,他干脆把程序放到一邊,然后向周圍的人講述這一小插曲中的每一個令人捧腹的細節。
同時,馬里琳并沒有覺的自己發現這么多錯誤而竊喜,而是清醒的認識到:她發現17個錯誤,那么是不是還有可能有更多的錯誤。她經過長時間的修改之后,和比爾一樣,同樣找來另一位閱讀者。那天下班前,一邊是比爾繼續向周圍同事講述這件快事,另一邊是馬里琳和其他人一起又發現了3個錯誤。
故事的最后,當這段程序加載到計算機后,哪怕是經歷任何“魔鬼似的”測試也沒有發現任何錯誤。實際上,這個模擬器已經被至少十個以上的計算機中心使用,至少九年之內沒有發現其他錯誤。對于每個發現的錯誤,比爾并不認為是對自己自尊的傷害,事實上,這種自尊恰恰體現了一個人的愚蠢,否則試想一下這個故事的結局會是怎樣?
兩個故事說明認知的重要,最后總結幾條觀點:
1、每個程序員的會出現認知失調的現象,應該正常對待。
2、再牛逼的人都會有自己的認知盲區,需要別人去發現。
3、理性對待別人發現的錯誤。