我們需要專職的QA嗎?

這個文章必然是有爭議的,我在我的微博上討論過很多次了,每次都是很有爭議的。有不同的觀點,有爭論總是一件好事,這樣可以引發大家的思考。所以,對於我的這篇博文,如果你贊同我的觀點,我會感到高興,如果你會去認真地深入思考,我也會高興,如果你反對,沒關係,可以討論。

在此之前,我想說明一下我觀點裏的這個“專職QA”是怎麼定義的。

其是很多公司成立的專門做測試的技術人員,僅測試不開發。
這些QA對於軟件開發技術並不熟悉,甚至不懂。
我經歷過一些公司都有專職的QA團隊(專職的測試人員),自從上個公司我的開發團隊在一個項目上被QA部門搞得一團糟,我越來越懷疑專職QA存在在意義。我的觀點不一定對,但請讓我鮮明地表達一下——我覺得是不需要全職的QA的,甚至不需要QA這一專職角色或部門,因爲,不懂開發的人必然做不好測試。就像不懂開發的研發經理必然管不好研發團隊一樣。我越來越覺得Dev應該應該是做測試最合適的人選,這必然是未來的趨勢 (因爲我已經看到了中國程序員的進步,相比起10年前,今天的程序員已經是非常全面了,再來十年,必然證明我的觀點是對的)。

在我正在展開說明之前,我想引用兩篇文章:

兩篇文章
一篇是 “On testers and testing”(中文翻譯),本文的作者Sriram Krishnan是一名程序員,曾在Yahoo和微軟工作過,開發過很多軟件,曾被紐約時報報道,寫過一本書,本文是他的一篇博客。他在文章中表達了這幾個觀點——

大多數的開發團隊並不需要一個獨立的測試角色。即使要有,那麼所有的開發時間比上所有的測試時間應該 >20:1的。。證據嗎?光看看一些從古至今最成功的軟件開發團隊就知道了。不論是當今的Facebook,還是30年前最初的NT團隊,很多偉大的產品都是出自沒有或很少測試人員的團隊。

開發人員應該測試自己的代碼。沒什麼可說的。背後的道理並不重要。這包括單元測試,全覆蓋的自動化測試或手工測試或組合測試。如果你的開發人員不能/不願意或認爲這“不歸我管”,那你需要更好的程序員。
另一篇文章是鄒欣的“現代軟件工程講義 9 測試 QA 的角色和分工”,這是一篇很不錯的文章。他在文章裏提到了分工的必要性,比如第三方的鑑定機構,並且也指出了分工的一些問題,比如,畫地爲牢的分工,無明確責任的分工,等,這些問題直接命中了分工的要害。我隱約覺得,我和鄒欣的很多觀點是相同的,我們內容上是相同的,只是形式上還有分歧。另外,我的觀點太鮮明瞭,從而容易導向極端的理解。

你看,我們都同意,Dev要懂測試,QA要懂開發,只不過分工不同,既然你中有我,我中有你,那就不要分彼此了,一起攜手開發測試吧。(另外,我個人覺得不懂開發的測試人員不可能測試得好)

—- update—- {

 //本篇文章出來後,網上出現了一些對此討論的文章,我一併更新在這裏

【 《對《我們需要專職QA嗎?》的迴應》作者:@段念-段文韜 】
【 《關於“我們需要專職的QA嗎”》作者:@Jacky郭 】
【 《我們需要專職的QA嗎?(評)》作者:@Monkey陳曄曄 】
【《 《我們需要專職的QA嗎?》讀後感》作者:@ 花生色魔叔】

}

我的故事
我再說說我最糟糕的QA經歷吧,這個公司的QA部門只做測試,他們的leader覺得所有的test design和test 的過程都不需要Dev參與,他們是獨立於Dev之外的部門,他們幾乎不關心Dev的設計和實現,他們只關心能跑通他們自己設計的test case。但是去執行Test Case的時候,又需要Dev的支持,尤其在環境設置,測試工具使用,確認是否是bug方面,全都在消耗着Dev的資源,最扯的是,他們對任何線上的問題不負責,反正出了問題由Dev加班搞定。

我有一次私自review他們的test case的時候,發現很多的test case這樣寫到 – “Expected Result:Make sure every thing is fine” ,WTF,什麼叫“Every thing is fine”?!而在test case design的時候,沒有說明test environment/configuration 是什麼?沒有說明test data在哪裏?Test Case、Test Data、Test Configuration都沒有版本控制,還有很多Test Case設計得非常冗餘(多個Test Case只測試了一個功能),不懂得分析Function Point就做Test Design。另外,我不知道他們爲什麼那麼熱衷於設計一堆各式各樣的Negative Test Case,而有很多Positive的Test Case沒有覆蓋到。爲什麼呢,因爲他們不知道開發和設計的細節,所以沒有辦法設計出Effective的Test Case,只能從需求和表面上做黑盒。

在做性能測試的時候,需要Dev手把手的教怎麼做性能測試,如何找到系統性能極限,如何測試系統的latency,如何觀察系統的負載(CPU,內存,網絡帶寬,磁盤和網卡I/O,內存換頁……)如何做Soak Test,如何觀察各個線程的資源使用情況,如何通過配置網絡交換機來模擬各種網絡錯誤,等等,等等。

測試做得也不認真,大量的False Alarm,都是環境問題,比如:安裝新版本後沒有重啓服務,沒有使用新的配置文件,網絡配置,等等,等等。

在項目快要上線前的一週,我又私自查看了一下他們的Test Result,我看到5天的Soak Test 的內存使用一直往上漲,很明顯的內存泄露,這個情況發生在2個月前,但是一直都沒有報告,我只好和我的程序員每天都加班到凌晨,趕在上線前解決了這個問題。但是,QA部門的同學們就像沒發生什麼事似的,依然正常上下班。哎……

爲什麼會這樣?我覺得有這麼幾點原因(和鄒欣的觀點一樣)

給了QA全部測試的權力,但是沒有給相應的責任,
QA沒有體會過軟件質量出問題後的痛苦(解決線上問題的壓力),導致QA不會主動思考和改進。
QA對Dev的開發過程和技術完全不瞭解,增加了很多QA和Dev的溝通。
QA對軟件項目的設計和實現要點不瞭解,導致了很多不有效的測試。
注:我無意在這裏貶低QA的能力工作。只是我看到了QA因爲沒有參與開發的一些現實問題。

我的觀點
鄒欣對於分工出現的問題給出了兩點解決方法:

充分授權和信任(Empower team members)
各司其職,對項目共同負責(Establish clear accountability and shared responsibility)
我的觀點是,理論上正確,操作上太虛了。這就像我們國家喊的“爲人民服務”的口號一樣,沒有具體的方法,根本無法落實。
我無意在這裏貶低QA的工作,我也無意因爲這個事走向另一個極端。但是,我在現在公司的經歷,還有很多新興公司的做法,我越來越覺得軟件開發,真的不需要專職的QA,更不需要只寫代碼不懂做測試的專職的Dev。觀點如下:

1) 開發人員做測試更有效

開發人員本來就要測試自己寫的軟件,如果開發人員不懂測試,或是對測試不專業,那麼這就不是一個專業的開發人員。
開發人員瞭解整個軟件的設計和開發過程,開發人員是最清楚應該怎麼測試的,這包括單元測試,功能測試,性能測試,迴歸測試,以及Soak Test 等。
開發人員知道怎麼測試是最有效的。開發人員知道所有的function point,知道fix一個bug後,哪些測試要做迴歸和驗證,哪些不需要。開發人員的技術能力知道怎麼才能更好的做測試。
很多開發人員只喜歡寫代碼,不喜歡做測試,或是他們說,開發人員應該關注於開發,而不是測試。這個思路相當的錯誤。開發人員最應該關注的是軟件質量,需要證明自己的開發成果的質量。開發人員如果都不知道怎麼做測試,這個開發人員就是一個不合格的開發人員。

另外,我始終不明白,爲什麼不做開發的QA會比Dev在測試上更專業? 這一點都說不通啊。

2)減少溝通,扯皮,和推諉

想想下面的這些情況你是否似曾相識?

QA 做的測試計劃,測試案例設計,測試結果,總是需要Dev來評審和檢查。
QA在做測試的過程中,總是需要Dev對其測試的環境,配置,過程做指導。
QA總是會和Dev爭吵某個問題是不是BUG,爭吵要不要解決。
無論發現什麼樣的問題,總是Dev去解決,QA從不fix問題。
我們總是能聽到,線上發生問題的時候,Dev的抱怨QA這樣的問題居然沒測出來,
QA也總會抱怨Dev代碼太差,一點也不懂測試,沒怎麼測就給hand over 給QA了。
QA總是會push Dev,這個bug再不fix,你就影響我的進度了。
等等,等等。
如果沒有QA,那麼就沒有這麼多事了,DEV自己的幹出來的問題,自己處理,沒什麼好扯皮的。

而一方面,QA說Dev不懂測試,另一方面Dev說QA不懂技術,而我們還要讓他們隔離開來,各幹各的,這一點都不利於把Dev和QA的代溝給填平了。要讓Dev理解QA,讓QA理解Dev,減少公說公有理,婆說婆有理的只站在自己立場上的溝通,只有一個方法,那就是讓Dev來做測試,讓QA來做開發。這樣一樣,大家都是程序員了。

3)吃自己的狗食

真的優秀的開發團隊都是要吃自己狗食的。這句話的意思是——如果你不能切身體會到自己乾的爛事,自己的痛苦,你就不會有想要去改進的動機。沒有痛苦,就不會真正地去思考,沒有真正的思考,就沒有真正的進步。

在我現在的公司,程序員要幹幾乎有的事,從需求分析,設計,編碼,集成,測試,部署,運維,OnCall,從頭到尾,因爲:

只有瞭解了測試的難度,你才明白怎麼寫出可測試的軟件,怎麼去做測試的自動化和測試系統。
只有自己真正去運維自己的系統,你才知道怎麼在程序裏寫日誌,做監控,做統計……
只有自己去使用自己的系統,你才明白用戶的反饋,用戶的想法,和用戶的需求。
所以,真正的工程師是能真正明白軟件開發不單單只是coding,還更要明白整個軟件工程。只明白或是隻喜歡coding的,那只是碼農,不能稱之爲工程師。

4)其它問題

關於SDET。全稱是Software Development Engineer on Test。像微軟,Google, Amazon都有這樣的職位。但我不知道這樣的職位在微軟和Google的比例是多少,在Amazon是非常少的。那麼像這樣的懂開發的專職測試可以有嗎?我的答案是可以有!但是,我在想,如果一個人懂開發,爲什麼只讓其專職做測試呢?這樣的程序員分工合理嗎?把程序員分成兩等公民有意義嗎?試問有多少懂開發的程序員願意只做測試開發呢?所以,SDET在實際的操作中,更多的還是對開發不熟的測試人員。還是哪句話,不懂開發的人是做不好測試的。
如果你說Dev對測試不專業,不細心,不認真,那麼我們同樣也無法保證QA的專業,細心和認真。在Dev上可能出現的問題,在QA也也會一樣出現。而出了問題QA不會來加班解決,還是開發人員自己解決。所以,如果QA不用來解決問題,那麼,QA怎麼可能真正的細心和認真呢?
如果你說不要QA的話,Dev人手會不夠。你這樣想一下,如果把你團隊中現有的QA全部變成Dev,然後,大家一起開發,一起測試,親密無間,溝通方便,你會不會覺得這樣會更有效?你有沒有發現,在重大問題上,Dev可以幫上QA的忙,但是QA幫不上Dev的忙。
第三方中立,你會說人總是測不好自己寫的東西,因爲有思維定式。沒錯,我同意。但是如果是Dev交叉測試呢?你可能會說開發人員會有開發人員的思維定式。那這隻能說明開發人員還不成熟,他們還不合格。沒關係,只要吃自己的狗食,痛苦了,就會負責的。
磨刀不誤砍柴功。如果你開發的東西自己在用,那麼自己就是自己天然的QA,如果有別的團隊也在用你開發的模塊,那麼,別的團隊也就很自然地在幫你做測試了,而且是最真實的測試。
你可能會說吃狗食就是個笑話,因爲如果是我,我把事幹爛後,就離職走人了,讓別人去吃我的狗食。這個在現實中的確會發生,也是很現實的。但是想一想,你爲什麼在一開始讓他把事幹爛了?另外,如果你的團隊在設計評審和代碼評審裏沒有把好關,讓某人把事給幹爛了,那麼這個人的離職帶來的問題還是這個團隊來扛,於是整個團隊都在吃自己的狗食,挺公平的。痛苦過一次,你的團隊下次怎麼幹了,就不敢亂招人了,就不敢隨意評審代碼了,就不敢讓人只做一塊東西了。最終還是沒有逃脫吃狗食的範疇。
關於系統集成測試。所謂集成測試,就是把多個開發團隊開發的模塊集中起來測試。因爲開發人員可能無法看到全局,不瞭解別個團隊的系統,而且步調不一,所以需要有統管全局的專職的QA進行統籌規劃並做測試。對這個方面,我並不反對,在實際操作過程中,好像的確用專職的做集成測試的QA統一調度各團隊的時度更有效一些。不過,這還是不能讓我停止去思考兩個問題,1) 如果開發人員看不到全局,他能開發出更好的軟件嗎?2)這個全職的做集成測試的QA難道不能是各個團隊的骨幹Dev來組成嗎?3)統一調度這個事,不更像是Project Manager要做的事嗎?
關於自動化測試。所謂自動化的意思是,這是一個機械的重複勞動。我想讓測試人員思考一下,你是否在幹這樣的事?如果你正在幹這樣的事,那麼,你要思考一下你的價值了。但凡是重複性比較高的機械性的勞動,總有一天都會被機器取代的。
關於線上測試。我們都知道,無論自己內測的怎麼樣,到了用戶那邊,總是會有一些測試不到的東西。所以,有些公司會整出個UAT,用戶驗收測試。做產品的公司會叫Beta測試。無論怎麼樣,你總是要上生產線做真正測試的。對於互聯網企業來說,生產線上測試有的在玩A/B測試,有的玩部分用戶測試,比如,新上線的功能只有10%的用戶可以訪問得到,這樣不會因爲出問題讓全部用戶受到影響。做這種測試系統的人必然是開發人員。
好吧,我暫時寫這麼多,我會視大家的討論再補充我的觀點的。

—– update 2012/4/11—–

一些人覺得我是在泄私憤,我能夠理解爲什麼我會被這樣誤解,但是沒有關係,很多新東西新觀點總是會被誤解的,我坦然面對。請大家拋開我的這些情感因素,單純的思考一下,沒有專職QA的的團隊架構是否有積極的意義在裏面?

再補充一點,大家思考一下,QA是保證質量的,但是很多QA是在做測試,軟件質量是測試出來的嗎?如果不從需求分析,軟件設計,代碼實現上做好控制,到測試的時候你還怎麼保證質量呢?

[1].http://coolshell.cn/articles/6994.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章