複製鏈接
請複製以下鏈接發送給好友

軟件心理學

鎖定
《軟件心理學》是一本測試書籍,該書是用實驗心理學的技術和認知心理學的概念來進行軟件生產的方法,即將心理學和計算機系統相結合而產生的新學科。
中文名
軟件心理學
別    名
software psychology
類    型
測試書籍
叢書系列
心理學

目錄

軟件心理學簡介

軟件心理學(software psychology)用實驗心理學的技術和認知心理學的概念來進行軟件生產的方法,即將心理學和計算機系統相結合而產生的新學科。

軟件心理學相關摘要

在理想情況下,我們會測試程序的所有可能執行情況,而在大多數情況下,這幾乎是不可能的。即使一個看起來非常簡單的程序,其可能的輸入與輸出組合可達到數百種甚至數千種,對所有的可能情況都設計測試用例是不切合實際的。對一個複雜的應用程序進行完全的測試。將耗費大量的時間和人力資源,這樣在經濟上是不可行的。
另外,要成功地測試一個軟件應用程序,測試人員也需要有正確的態度(也許用“願景”(vision)這個詞會更好一些)。在某些情況下,測試人員的態度可能比實際的測試過程本身還要重要。因此,在深入探討軟件測試的本質之前(指技術層面),我們先探討一下軟件測試的心理學問題。
測試執行得差,其中一個主要原因在於大多數的程序員一開始就把“測試”這個術語的定義搞錯了。
他們可能會認為:
“軟件測試就是證明軟件不存在錯誤的過程。”
“軟件測試的目的在於證明軟件能夠正確完成其預定的功能。”
“軟件測試就是建立一個‘軟件做了其應該做的’信心的過程。”
這些定義都是本末倒置的。
每當測試一個程序時,應當想到要為程序增加一些價值。通過測試來增加程序的價值,是指測試提高了程序的可靠性或質量。提高了程序的可靠性,是指找出並最終修改了程序的錯誤。
因此,不要只是為了證明程序能夠正確運行而去測試程序;相反,應該一開始就假設程序中隱藏着錯誤(這種假設對於幾乎所有的程序都成立),然後測試程序,發現儘可能多的錯誤。
那麼,對於測試,更為合適的定義應該是:“測試是為發現錯誤而執行程序的過程”。
雖然這看起來像是個微妙的文字遊戲,但確實有重要的區別。理解軟件測試的真正定義,會對成功地進行軟件測試有很大的影響。
人類行為總是傾向於具有高度目標性,確立一個正確的目標有着重要的心理學影響。如果我們的目的是證明程序中不存在錯誤,那就會在潛意識中傾向於實現這個目標;也就是説,我們會傾向於選擇可能較少導致程序失效的測試數據。另一方面,如果我們的目標在於證明程序中存在錯誤,我們設計的測試數據就有可能更多地發現問題。與前一種方法相比,後一種方法會更多地增加程序的價值。
這種對軟件測試的定義,包含着無窮的內藴,其中的很多都藴涵在本書各處。舉例來説,它暗示了軟件測試是一個破壞性的過程,甚至是一個“施虐”的過程,這就説明為什麼大多數人都覺得它困難。這種定義可能是違反我們願望的;所幸的是,我們大多數人總是對生活充滿建設性而不是破壞性的願景。大多數人都本能地傾向於創造事物,而不是將事物破壞。這個定義還暗示了對於一個特定的程序,應該如何設計測試用例(測試數據)、哪些人應該而哪些人又不應該執行測試。
為增進對軟件測試正確定義的理解,另一條途徑是分析一下對“成功的”和“不成功的”這兩個詞的使用。當項目經理在歸納測試用例的結果時,尤其會用到這兩個詞。大多數的項目經理將沒發現錯誤的測試用例稱為一次“成功的測試”,而將發現了某個新錯誤的測試稱為“不成功的測試”。
這又是一次本末倒置。“不成功的”表示事情不遂人意或令人失望。我們認為,如果在測試某段程序時發現了錯誤,而且這些錯誤是可以修復的,就將這次合理設計並得到有效執行的測試稱做是“成功的”。如果本次測試可以最終確定再無其他可查出的錯誤,同樣也被稱做是“成功的”。所謂“不成功的”測試,僅指未能適當地對程序進行檢查,在大多數情況下,未能找出錯誤的測試被認為是“不成功的”,這是因為認為軟件中不包含錯誤的觀點基本上是不切實際的。
能發現新錯誤的測試用例不太可能被認為是“不成功的”,也就是説,能發現錯誤就證明它是值得設計的。“不成功的”測試用例,會看到程序輸出正確的結果而沒發現任何錯誤。
我們可以類比一下病人看醫生的情況,病人因為身體不舒服而去看醫生。如果醫生對病人進行了一些檢查和化驗,卻沒有診斷出任何病因,我們就不會認為這些檢查和化驗是“成功的”,因為病人支付了昂貴的檢查和化驗費用,而病狀卻依然如故。病人會因此而質疑醫生的診斷能力。但是,如果醫生診斷出病人是胃潰瘍,那麼這次檢測就是“成功的”,醫生可以開始進行相應的治療。因此,醫療行業會使用“成功的”或“不成功的”來表達診斷結果。我們當然可以類推到軟件測試中來,當我們開始測試某個程序時,它就好似我們的病人。
軟件測試就是證明軟件不存在錯誤的過程”,這個定義會帶來第二個問題。對於幾乎所有的程序而言,甚至是非常小的程序,這個目標實際上也是無法達到的。
另外,心理學研究表明,當人們開始一項工作時,如果已經知道它是不可行的或無法實現時,人的表現就會相當糟糕。舉例來説,如果要求人們在15分鐘之內完成星期日《紐約時報》裏的縱橫填字遊戲,那麼我們會觀察到10分鐘之後的進展非常小,因為大多數人都會卻步於這個現實,即這個任務似乎是不可能完成的。但是如果要求在四個小時之內完成填字遊戲,我們很可能有理由期望在最初10分鐘之內的進展會比前一種情況下的大。將軟件測試定義為發現程序錯誤的過程,使得測試是個可以完成的任務,從而克服了這個心理障礙。
諸如“軟件測試就是證明‘軟件做了其應該做的’的過程”此類的定義所帶來的第三個問題是,程序即使能夠完成預定的功能,也仍然可能隱藏錯誤。也就是説,當程序沒有實現預期功能時,錯誤是清晰地顯現出來的;如果程序做了其不應該做的,這同樣是一個錯誤。如果我們將軟件測試視作發現錯誤的過程,而不是將其視為證明“軟件做了其應該做的”的過程,我們發現後一類錯誤的可能性會大很多。
總結一下,軟件測試更適宜被視為試圖發現程序中錯誤(假設其存在)的破壞性的過程。一個成功的測試用例,通過誘發程序發生錯誤,可以在這個方向上促進軟件質量的改進。當然,最終我們還是要通過軟件測試來建立某種程度的信心:軟件做了其應該做的,未做其不應該做的。但是通過對錯誤的不斷研究是實現這個目的的最佳途徑。
有人可能會聲稱“本人的程序完美無缺”(不存在錯誤),針對這種情況建立起信心的最好辦法就是儘量反駁他,即努力發現不完美之處,而不只是確認程序在某些輸入情況下能夠正確地工作。 [1] 
參考資料