自己從事軟體開發工作不算久,但也有十幾年的時間了,在這十幾年來,有時候會看到一個奇怪的誤解,關於這個誤解,我時常覺得,有點不吐不快,但是,似乎又不是三言兩語可以說清楚,所以,在這十幾年來,也就一直很少在工作場合裡,向合作的伙伴或同事解釋。直到最近,覺得還是可以利用撰寫一篇文字的方式,來表達我的看法。

這個誤解是什麼呢?其實也是我們很常會遇到的,就是關於 QA(Quality Assurance)和 QC(Quality Control)的分別。

我在工作中最常遇到的情況是,把軟體測試的部門或團隊稱為 QA 部門。

或許在有些人的想法裡:「QA 就是品質確保,而軟體測試的目的就是要確保品質啊!軟體測試當然是屬於 QA 的工作呀!」

在之前,我甚至看過大學教授在軟體測試的課程中,將軟體測試工作列為 QA 領域的一環。

好吧,就且看我一一道來。

從軟體品質的定義,來細部剖析QA和QC之間的不同之處
首先,什麼是品質?

對軟體產品而言,品質就是其功能及特性滿足所制定需求的能力。

我舉一些更實際的例子,像是軟體規格裡的全部功能都有、所有的功能執行起來都不會發生錯誤、軟體不會突然意外的異常中斷、還有軟體執行的效能符合制定的要求、 ……等等。

簡單地說,像是該有的功能都有、也都能正常運作、而且還運作得夠快,就是品質好。

想到品質,許多人腦海中首先會浮現的,恐怕是像「ISO 品質標準」之類耳熟能詳的詞語。沒錯,ISO,也就是國際標準化組織,它制定了許多標準,包括我們也同樣時常聽到的 ISO 9000 的品質標準。有些公司會強調,他們已經通過ISO 9000的標準,表示他們的產品是有品質的。

在 ISO 9000 裡,對Quality Assurance 的定義是:「為了提供實體滿足品質要求的足夠信心,而實作的所有計畫性以及系統性的活動」。同樣的,ISO 9000 裡也定義了何謂Quality Control,也就是「為達品質要求而採用的作業性技術及活動」。

或許看完這定義,你還是不見得能理解其義。

簡單來說,品質保證——即QA的目的,是要在產出產品的過程中,使用正確的方法來進行,而 QC 的作用,則是當產品完成時,會去檢查所產出的產品是否正確。

從這個角度,你可以回頭來檢測一件事‥我們所熟知的軟體測試工作,究竟是屬於 QA?還是 QC 的一部份呢?

答案其實很明顯,軟體測試是透過檢測已完成的軟體,找出其中不符合軟體規格的瑕疵,以便有機會予以修正,所以,測試工作是在檢查所完成的軟體產品是否正確,因此,這應該屬於 QC 工作過程的一部份。

如果了解到二者的差異,你可以很容易明白, QA 的重點放在製造方法,有了正確(能滿足品質要求)的方法,照著執行,就應該要能夠產出滿足要求的產品。

而 QC 的重點,則放在開發完成的結果,無論如何,針對最後的產物來做檢查,看看是否當中能夠滿足要求。

所以說,QA 是事前的、是在產品完成之前的整個過程,而 QC 是事後的,當產品完成後檢查工作。QA 目標是在預防產品發生瑕疵,而QC則在找出完成的成品中潛在的瑕疵。

在有些人的軟體開發工作中,或許大家所接觸到最多的,其實可能都歸在 QC 裡頭,因為大家所意識到的軟體品質,大多都是透過軟體測試來達成。開發團隊透過各種型態的測試,來找出待測產品中所含的問題,並且搭配瑕疵追蹤機制,監看、管理瑕疵被找出來以及被修正、被檢驗的情況。

那麼,在軟體工作中的QA,又該是什麼呢?

我們回歸到原意,QA 的重點是方法,而產出軟體的方法是什麼?就是我們的產品開發方法及開發流程(process),或者,甚至像所用的技術,都在範圍內。

所以,在軟體QA中的工作,主要應該是確保使用了正確的開發方法、流程,以及技術、…… 等等。

所以說,執行QC工作的人員,通常是開發團隊中的成員,受團隊管理者所領導及管理,因為 QC工作通常是軟體開發階段中的一環。

但QA工作人員通常是獨立於開發團隊之外,因為,他們關心的重點,主要包括:像是所用的方法和流程是否正確,是否能更好,以及開發團隊是否有依據所制定的方法、流程、甚至是規範,來開發軟體。

產品開發規範的制定與落實,屬於軟體品質保證的範疇
我們在軟體的開發過程,可能會制定很多規範,其中包含了一些小地方,像是程式碼中的命名慣例、排版原則,或像版本控制系統的使用規範,大到軟體需求規格書的寫法、設計書的內容、測試案例、……等等。

更大的範圍,則可能涉及到開發的方法和流程,例如,採XP方法開發,所以,必須要做搭檔編程、也必須測試先行、更必須執行重構、……等等。

而且,我們為什麼需要這些規範?是因為,我們相信這麼做,可以產出符合品質要求的軟體。

因此,這些規格、流程,都應該是產出正確軟體的方法,所以,讓開發團隊使用正確的方法,並且,確保開發團隊都照著這些方法來做,就應該是落在 QA 的工作範疇裡。

單就以開發流程來看,QA的工作過程中,可能就包括了:制定流程、監控管理開發團隊是否依據流程來進行工作,以及收集開發團隊對於流程的回饋,進而甚至持續改善流程。

因此,QA的工作中,可能就包括了為數不少的審查,例如:審查計畫書、審查規格書、審查設計書、審查程式碼、審查測試案例、……等等,它們施行的目的,就是在於審查開發各階段的各項產出,是否符合所制定的規範。倘若沒有,代表開發團隊並沒有採用了「正確的方法」,那麼產品的品質自然可能受到影響。

所以說,QA 是一個預防性的工作,同時是個事先性質的工作,在產品開發過程中的前、中、後期,都透過不斷的審核過程,來確保開發團隊依循流程、依循方法、依循規範。

正因為QA的工作如此,所以,QA 人員自然是獨立於開發團隊之外,因為,他們是輔助開發團隊的角色。

人們對於品質確保意義有不同的理解,因此產生認知上的歧異
QA和QC的工作,雖然最終目的都是希望產品滿足所規範的品質要求,兩者之間,卻有著諸多不同的特性。

或許,從QA字面上的「品質確保」意思,讓許多人因而誤解了QA的性質,進而造成了目前QA、QC混為一談的情況。

另一方面,QC的工作在大多數人的開發生活中都會接觸到,但是QA卻相對少的多,然而,它的作用事實上並不小。

如果能明白它的真正作用,或許,也可以讓一些開發團隊開始重視QA吧。

專欄作者

熱門新聞

Advertisement