提高軟件質(zhì)量實(shí)踐――Google 篇
很多人應(yīng)該都看過(guò)James whittaker的博客或新書(shū) 《how google test software》,在這里我不想重復(fù)他的內(nèi)容,而是從另外一個(gè)角度來(lái)分析對(duì)比google是如何保障它的產(chǎn)品質(zhì)量的。
首先申明的是本人并沒(méi)有在google工作過(guò)所以沒(méi)有***手的經(jīng)驗(yàn),僅以一個(gè)旁觀者的身份來(lái)分析google的質(zhì)量控制實(shí)踐。主要信息來(lái)源于google測(cè)試博客,在西雅圖google工作的朋友聊天和項(xiàng)目上合作,以及James的新書(shū)<>。不過(guò)旁觀者有旁觀的優(yōu)勢(shì),可以看見(jiàn)整個(gè)森林;相比較許多在大公司工作的工程師往往專(zhuān)注于一個(gè)產(chǎn)品或者一個(gè)團(tuán)隊(duì),只看見(jiàn)了一顆樹(shù)木。不管如何,個(gè)人觀點(diǎn)僅供參考。
我們前面在微軟的質(zhì)量控制實(shí)踐中談到,因?yàn)槲④洿蟛糠值漠a(chǎn)品還是以桌面型產(chǎn)品為主,比如windows, office,sql server等等。桌面型產(chǎn)品的***特定就是產(chǎn)品召回或發(fā)布熱修復(fù)的成本太大,而且運(yùn)行很多關(guān)鍵業(yè)務(wù),這就迫使微軟必須在產(chǎn)品發(fā)布之前投入大量人力物力來(lái)充分測(cè)試產(chǎn)品用以保障產(chǎn)品的高質(zhì)量。與微軟不同的是,google采用不同的策略來(lái)保證軟件質(zhì)量。在理解分析google的質(zhì)量策略之前,我們必須了解google的采取該策略的根源:
1、Google質(zhì)量文化:google起源于校園。在有限的資金下,那時(shí)候創(chuàng)始人只能使用廉價(jià)的機(jī)器,把多個(gè)廉價(jià)的機(jī)器放在一起來(lái)提高處理能力。這些廉價(jià)的機(jī)器***的問(wèn)題是經(jīng)常死機(jī)或報(bào)廢,所以google在起始階段就必須有很強(qiáng)的容錯(cuò)能力。也就是說(shuō)在系統(tǒng)在部分機(jī)器死機(jī)或報(bào)廢的情況下仍然可以提供服務(wù)?;蛘哒f(shuō),系統(tǒng)部分可以出錯(cuò)但是整個(gè)系統(tǒng)不可以宕機(jī) (Graceful Degradation)。Google這個(gè)從一開(kāi)始因?yàn)楸黄戎萌氲母呷蒎e(cuò)能力反而成就了現(xiàn)在他們運(yùn)行在數(shù)據(jù)中心上的服務(wù)的巨大優(yōu)勢(shì)。我們知道通常硬件的出錯(cuò)概率大概在萬(wàn)分之一,如果有一萬(wàn)臺(tái)機(jī)器,其中一臺(tái)出錯(cuò)概率就達(dá)到***。在現(xiàn)在的數(shù)據(jù)中心里少則幾萬(wàn)臺(tái),多者幾十萬(wàn)臺(tái)的機(jī)器。所以產(chǎn)品的容錯(cuò)能力已經(jīng)不是可有可無(wú),而是必須有的功能。所以google信奉的原則是單個(gè)模塊可以出錯(cuò)可以有bug,它通過(guò)系統(tǒng)強(qiáng)大的容錯(cuò)能力來(lái)保障系統(tǒng)的整體高質(zhì)量。
2、互聯(lián)網(wǎng)產(chǎn)品:google是互聯(lián)網(wǎng)公司成功的代表?;ヂ?lián)網(wǎng)產(chǎn)品的***特點(diǎn)就是“快”:產(chǎn)品定義快,開(kāi)發(fā)快,反饋快,死掉的也快。所以為了有效利用有限的測(cè)試資源,google信奉的另外一個(gè)原則是:build the right it before you build it right.也就就是說(shuō)只有確認(rèn)了產(chǎn)品的確是用戶需要的產(chǎn)品(build the right it)之后才開(kāi)始提高它的質(zhì)量(build it right)。道理很簡(jiǎn)單如果未知產(chǎn)品是否正確的情況下,沒(méi)有必要浪費(fèi)資源來(lái)提高它的質(zhì)量。所以google的大部分產(chǎn)品測(cè)試人員介入較晚,開(kāi)發(fā)人員不得不自己先測(cè)試以保障基本質(zhì)量。
在理解了goolge對(duì)產(chǎn)品質(zhì)量認(rèn)識(shí)這兩個(gè)根本出發(fā)點(diǎn)后,就不難理解google采用什么樣的測(cè)試策略了:
1. Dev owns quality
Google認(rèn)為:誰(shuí)寫(xiě)的的代碼誰(shuí)負(fù)責(zé),誰(shuí)開(kāi)發(fā)的模塊誰(shuí)負(fù)責(zé)質(zhì)量。所以開(kāi)發(fā)在寫(xiě)代碼的同時(shí)也要花很多時(shí)間測(cè)試,主要是單元測(cè)試和模塊測(cè)試。Google堅(jiān)信軟件質(zhì)量是先天就創(chuàng)建出來(lái)的,而不是通過(guò)后天測(cè)試測(cè)出來(lái)的。讓開(kāi)發(fā)做測(cè)試對(duì)產(chǎn)品質(zhì)量負(fù)責(zé)不是件容易的事情,google通過(guò)主要三個(gè)途徑:一是減少測(cè)試人員數(shù)量,所以開(kāi)發(fā)不得不做測(cè)試;而是通過(guò)一些活動(dòng)比如test certificate program來(lái)正面影響開(kāi)發(fā)做測(cè)試;最重要的第三點(diǎn)是通過(guò)建立強(qiáng)大的完善的基礎(chǔ)設(shè)施,使得開(kāi)發(fā)很容易地寫(xiě)測(cè)試自動(dòng)化很容易地運(yùn)行測(cè)試。
2. Tester is to enable developer to test effectively
這個(gè)是對(duì)傳統(tǒng)意義上的測(cè)試人員的職責(zé)非常大的改變。傳統(tǒng)意義上的測(cè)試人員的主要職責(zé)是尋找產(chǎn)品中的bug。既然google要求開(kāi)發(fā)對(duì)質(zhì)量負(fù)責(zé),當(dāng)然就不太需要傳統(tǒng)意義上的測(cè)試人員了。所以google中的測(cè)試更多時(shí)間是在開(kāi)發(fā)測(cè)試自動(dòng)化,開(kāi)發(fā)測(cè)試工具,開(kāi)發(fā)基礎(chǔ)設(shè)施。相對(duì)花很少的時(shí)間做真正意義上的測(cè)試了。所以后來(lái)干脆把測(cè)試部門(mén)從原來(lái)的“Test Service”改名字為“engineering productivity”。測(cè)試的主要職責(zé)是讓開(kāi)發(fā)更為容易地做測(cè)試。
但是最近兩年,隨著它的產(chǎn)品的日趨成熟和越來(lái)越復(fù)雜,google開(kāi)始加強(qiáng)產(chǎn)品的后期測(cè)試。主要原因是雖然開(kāi)發(fā)可以做很多單元和模塊測(cè)試來(lái)保障模塊的質(zhì)量,但是很多bug是在和其它模塊集成的時(shí)候才被發(fā)現(xiàn)。所以google把測(cè)試工程師分成兩種:一種是和開(kāi)發(fā)一起負(fù)責(zé)開(kāi)發(fā)的,最要做單元測(cè)試,測(cè)試工具等。另外一種是面向用戶的測(cè)試工程師,主要做面向用戶的集成場(chǎng)景測(cè)試。
3.Continuous Integration
這個(gè)就不用多介紹了,搞互聯(lián)網(wǎng)或基于服務(wù)的產(chǎn)品的項(xiàng)目組,如果不使用持續(xù)集成的話有點(diǎn)太out了。Google的持續(xù)集成是行業(yè)的領(lǐng)先者,一方面有強(qiáng)大的測(cè)試自動(dòng)化和完善的基礎(chǔ)設(shè)施做為保障,使得開(kāi)發(fā)測(cè)試工程師不用在如何部署,如何運(yùn)行,如何分析結(jié)果等等上浪費(fèi)時(shí)間,而是專(zhuān)注于開(kāi)發(fā)和測(cè)試自動(dòng)化。代碼提交后會(huì)有成千上萬(wàn)個(gè)測(cè)試用例自動(dòng)運(yùn)行,并且很快返回結(jié)果以供進(jìn)一步分析之用。另一方面,google繼續(xù)優(yōu)化現(xiàn)有的工具和基礎(chǔ)設(shè)施來(lái)進(jìn)一步提過(guò)持續(xù)集成的效率。比如在做持續(xù)集成中最為頭疼的一個(gè)問(wèn)題是運(yùn)行那些測(cè)試用例?運(yùn)行多了當(dāng)然會(huì)延長(zhǎng)運(yùn)行時(shí)間從而降低了效率,運(yùn)行少了又有漏測(cè)的風(fēng)險(xiǎn)。Google開(kāi)發(fā)了一套測(cè)試用例分析工具用以分析代碼和測(cè)試用例的依賴關(guān)系。如果修改了某行代碼后,該工具決定哪些測(cè)試用例必須運(yùn)行,也就是說(shuō)不多不少。微軟也有類(lèi)似的工具在幫助測(cè)試人員決定運(yùn)行測(cè)試用例的優(yōu)先權(quán),但是個(gè)人感覺(jué)效果不太好。所以我也對(duì)google的工具到底效果如何應(yīng)用情況很感興趣。
另外一點(diǎn)就是持續(xù)集成是以自動(dòng)化做為基本保障的。測(cè)試自動(dòng)化不是***的,但是沒(méi)有測(cè)試自動(dòng)化是萬(wàn)萬(wàn)不能的。注意的是測(cè)試自動(dòng)化不僅僅解放了人,也不僅僅是為了回歸,更為重要的一點(diǎn)是逼迫開(kāi)發(fā)在設(shè)計(jì)的時(shí)候就考慮到如何自動(dòng)測(cè)試該模塊從而大大提高模塊的可測(cè)試性(我們知道這是提高軟件質(zhì)量的一個(gè)重要指標(biāo))。當(dāng)然除了測(cè)試自動(dòng)化外,google開(kāi)發(fā)了許許多多的工具和平臺(tái)來(lái)大大提高測(cè)試效率。
4. Measure everything
客觀上說(shuō)以上幾點(diǎn)我都覺(jué)得沒(méi)什么特殊之處,但是下面這個(gè)絕對(duì)讓我受益匪淺:measure everything。從***層的硬件驅(qū)動(dòng)器,到操作系統(tǒng)的CPU, memory, disk IO, 再到每個(gè)API的調(diào)用, ***到***層的用戶體驗(yàn),Google監(jiān)控和衡量所有的這些活動(dòng)。然后對(duì)監(jiān)控和衡量的數(shù)據(jù)進(jìn)行數(shù)據(jù)挖掘和分析,從而對(duì)整個(gè)系統(tǒng)的運(yùn)行情況了如指掌。一方面,如果有bug的話,它可以在最短的時(shí)間內(nèi)發(fā)現(xiàn)并根據(jù)監(jiān)控的數(shù)據(jù)很快找到bug的根源加以修復(fù);另一方面根據(jù)詳細(xì)的監(jiān)控?cái)?shù)據(jù)清楚地表明哪些地方需要改進(jìn),尤其是在系統(tǒng)性能方面;再一方面就是了解用戶的使用情況和規(guī)律從而為產(chǎn)品功能的改進(jìn)提供精確的數(shù)據(jù)和預(yù)測(cè)。Google認(rèn)為: If you can’t measure your product/component, don’t build it。
小結(jié),google是互聯(lián)網(wǎng)公司成功的代表,他在互聯(lián)網(wǎng)產(chǎn)品上的質(zhì)量控制實(shí)踐和經(jīng)驗(yàn)對(duì)于廣大的互聯(lián)網(wǎng)公司有值得借鑒意義。在產(chǎn)品發(fā)布速度和產(chǎn)品發(fā)布質(zhì)量的權(quán)衡和取舍中,google選擇發(fā)布速度。在保障基本產(chǎn)品質(zhì)量的前提下,用最快的速度把產(chǎn)品推到市場(chǎng)中,然后通過(guò)豐富的反饋渠道和工具再不斷演變。這樣即控制了用戶又保障了質(zhì)量,而且也做到了對(duì)沒(méi)有用戶的產(chǎn)品:fail fast, fail cheap。除了google之外,在西雅圖的另外一家公司也是互聯(lián)網(wǎng)產(chǎn)品的大哥大,特別是在在線銷(xiāo)售和云計(jì)算應(yīng)用服務(wù)類(lèi)型的產(chǎn)品。所以下一次和大家探討:提高軟件質(zhì)量實(shí)踐――Amazon 篇。
【編輯推薦】