導讀:相信很多軟件開發企業都有專職 QA。然而,這些專職人員能否發揮其本身價值?我們是否需要專職的QA?針對這些問題,本文作者提出了他的看法。
以下為文章原文:
這個文章必然是有爭議的,我在我的微博上討論過很多次了,每次都是很有爭議的。對于不同的觀點,有爭論總是一件好事,這樣可以引發大家的思考。所以,對于我的這篇博文,如果你贊同我的觀點,我會感到高興;如果你會去認真地深入思考,我也會高興;如果你反對,沒關系,可以討論。
在此之前,我想先說明一下我觀點里的這個“專職QA”是怎么定義的:
一、兩篇文章
在我正在展開說明之前,我想先引用兩篇文章。一篇是《 On testers and testing》( 點擊查看中文翻譯)。本文的作者Sriram Krishnan是一名程序員,曾在Yahoo和微軟工作過,開發過很多軟件,寫過 一本書,并曾接受過 紐約時報的采訪。本文是他的一篇博客。他在文章中表達了以下這幾個觀點:
另一篇文章是鄒欣的《 現代軟件工程講義9 測試 QA 的角色和分工》。這是一篇很不錯的文章。他在文章里提到了分工的必要性,比如第三方的鑒定機構。并且也指出了分工的一些問題,比如 畫地為牢的分工、無明確責任的分工等等。這些問題直接命中了分工的要害。我隱約覺得,我和鄒欣的很多觀點是相同的,我們在內容上是相同的,只是形式上還有分歧。另外,我的觀點太鮮明了,從而容易引起極端的理解。
你看,我們都同意, Dev要懂測試,QA要懂開發,只不過分工不同。既然你中有我,我中有你,那就不要分彼此了,一起攜手開發測試吧。另外,我個人覺得不懂開發的測試人員不可能測試得好。
二、我的故事
我再說說我最糟糕的QA經歷吧。之前我在一家公司工作,這家公司的QA部門只做測試。他們的leader覺得所有的test design和test 的過程都不需要Dev參與,他們是獨立于Dev之外的部門,他們幾乎不關心Dev的設計和實現。他們只關心能跑通他們自己設計的測試用例。但是去執行測試用例的時候,又需要Dev的支持,尤其在環境設置、測試工具使用、確認是否是bug方面,全都在消耗著Dev的資源。最讓我感到絕望的是: 他們對任何線上的問題不負責,反正出了問題由Dev加班搞定。
我有一次私自review他們的測試用例的時候,發現很多的測試用例這樣寫到:“Expected Result:Make sure every thing is fine”。 什么叫“Every thing is fine”?!而在測試用例設計的時候,沒有說明測試環境是什么,沒有說明測試數據在哪里,測試用例、測試數據、測試配置都沒有版本控制,還有很多測試用例設計得非常冗余(多個測試用例只測試了一個功能),不懂得分析Function Point就做測試設計。
另外,我不知道他們為什么那么熱衷于設計一堆各式各樣的負向測試用例,而有很多正向測試用例沒有覆蓋到。為什么呢, 因為他們不知道開發和設計的細節,所以沒有辦法設計出高效的測試用例,只能從需求和表面上做黑盒。
在做性能測試的時候,需要Dev手把手的教怎么做性能測試,如何找到系統性能極限,如何測試系統的latency,如何觀察系統的負載(CPU、內存、網絡帶寬、磁盤和網卡I/O、內存換頁……),如何做Soak Test,如何觀察各個線程的資源使用情況,如何通過配置網絡交換機來模擬各種網絡錯誤等等,等等。
測試做得也不認真,大量的False Alarm,都是環境問題。比如:安裝新版本后沒有重啟服務,沒有使用新的配置文件,網絡配置等等,等等。
在項目快要上線前的一周,我又私自查看了一下他們的測試結果,我看到5天的Soak Test 的內存使用一直往上漲,很明顯這是內存泄露。這個情況發生在2個月前,但是一直都沒有報告,我只好和我的程序員每天都加班到凌晨,趕在上線前解決了這個問題。但是, QA部門的同學們就像沒發生什么事似的,依然正常上下班。哎……
為什么會這樣?我覺得有這么幾點原因(和鄒欣的觀點一樣):
三、我的觀點
鄒欣對于分工出現的問題給出了兩點解決方法:
我無意在這里貶低QA的工作,我也無意因為這個事走向另一個極端。但是,我在現在公司的經歷,還有很多新興公司的做法,讓我越來越覺得軟件開發,真的不需要專職的QA,更不需要只寫代碼不懂做測試的專職的Dev。 觀點如下:
1、開發人員做測試更有效
另外,我始終不明白,為什么不做開發的QA會比Dev在測試上更專業? 這一點都說不通啊。
2、減少溝通、扯皮和推諉
想想下面的這些情況你是否似曾相識?
一方面,QA說Dev不懂測試;另一方面Dev又說QA不懂技術。而我們還要讓他們隔離開來,沒有溝通。 我們應該讓Dev理解QA,也要讓QA理解Dev,減少公說公有理,婆說婆有理的現象出現。
3、吃自己的狗食
真正優秀的開發團隊都是要吃自己狗食的。 這句話的意思是:如果你不能切身體會到自己糟糕的開發成果帶來的痛苦,就不會真正地去思考;沒有真正的思考,就沒有真正的進步。
在我現在的公司,程序員要干幾乎所有的事:需求分析、設計、編碼、集成、測試、部署、運維、OnCall。因為:
4、其它問題
以下為文章原文:
這個文章必然是有爭議的,我在我的微博上討論過很多次了,每次都是很有爭議的。對于不同的觀點,有爭論總是一件好事,這樣可以引發大家的思考。所以,對于我的這篇博文,如果你贊同我的觀點,我會感到高興;如果你會去認真地深入思考,我也會高興;如果你反對,沒關系,可以討論。
在此之前,我想先說明一下我觀點里的這個“專職QA”是怎么定義的:
- 很多公司成立的專門做測試的技術人員,僅測試不開發。
- 這些 QA 對于軟件開發技術并不熟悉,甚至不懂。
一、兩篇文章
在我正在展開說明之前,我想先引用兩篇文章。一篇是《 On testers and testing》( 點擊查看中文翻譯)。本文的作者Sriram Krishnan是一名程序員,曾在Yahoo和微軟工作過,開發過很多軟件,寫過 一本書,并曾接受過 紐約時報的采訪。本文是他的一篇博客。他在文章中表達了以下這幾個觀點:
引用
大多數的開發團隊并不需要一個獨立的測試角色。即使要有,那么所有的開發時間比上所有的測試時間應該是 > 20:1的。證據嗎?光看看一些從古至今最成功的軟件開發團隊就知道了。不論是當今的Facebook,還是30年前最初的NT團隊,很多偉大的產品都是出自沒有或很少測試人員的團隊。
開發人員應該測試自己的代碼。這沒什么可說的。背后的道理并不重要。這包括單元測試,全覆蓋的自動化測試、手工測試或組合測試等。如果你的開發人員不能、不愿意或認為這“不歸我管”,那你需要更好的程序員。
開發人員應該測試自己的代碼。這沒什么可說的。背后的道理并不重要。這包括單元測試,全覆蓋的自動化測試、手工測試或組合測試等。如果你的開發人員不能、不愿意或認為這“不歸我管”,那你需要更好的程序員。
另一篇文章是鄒欣的《 現代軟件工程講義9 測試 QA 的角色和分工》。這是一篇很不錯的文章。他在文章里提到了分工的必要性,比如第三方的鑒定機構。并且也指出了分工的一些問題,比如 畫地為牢的分工、無明確責任的分工等等。這些問題直接命中了分工的要害。我隱約覺得,我和鄒欣的很多觀點是相同的,我們在內容上是相同的,只是形式上還有分歧。另外,我的觀點太鮮明了,從而容易引起極端的理解。
你看,我們都同意, Dev要懂測試,QA要懂開發,只不過分工不同。既然你中有我,我中有你,那就不要分彼此了,一起攜手開發測試吧。另外,我個人覺得不懂開發的測試人員不可能測試得好。
二、我的故事
我再說說我最糟糕的QA經歷吧。之前我在一家公司工作,這家公司的QA部門只做測試。他們的leader覺得所有的test design和test 的過程都不需要Dev參與,他們是獨立于Dev之外的部門,他們幾乎不關心Dev的設計和實現。他們只關心能跑通他們自己設計的測試用例。但是去執行測試用例的時候,又需要Dev的支持,尤其在環境設置、測試工具使用、確認是否是bug方面,全都在消耗著Dev的資源。最讓我感到絕望的是: 他們對任何線上的問題不負責,反正出了問題由Dev加班搞定。
我有一次私自review他們的測試用例的時候,發現很多的測試用例這樣寫到:“Expected Result:Make sure every thing is fine”。 什么叫“Every thing is fine”?!而在測試用例設計的時候,沒有說明測試環境是什么,沒有說明測試數據在哪里,測試用例、測試數據、測試配置都沒有版本控制,還有很多測試用例設計得非常冗余(多個測試用例只測試了一個功能),不懂得分析Function Point就做測試設計。
另外,我不知道他們為什么那么熱衷于設計一堆各式各樣的負向測試用例,而有很多正向測試用例沒有覆蓋到。為什么呢, 因為他們不知道開發和設計的細節,所以沒有辦法設計出高效的測試用例,只能從需求和表面上做黑盒。
在做性能測試的時候,需要Dev手把手的教怎么做性能測試,如何找到系統性能極限,如何測試系統的latency,如何觀察系統的負載(CPU、內存、網絡帶寬、磁盤和網卡I/O、內存換頁……),如何做Soak Test,如何觀察各個線程的資源使用情況,如何通過配置網絡交換機來模擬各種網絡錯誤等等,等等。
測試做得也不認真,大量的False Alarm,都是環境問題。比如:安裝新版本后沒有重啟服務,沒有使用新的配置文件,網絡配置等等,等等。
在項目快要上線前的一周,我又私自查看了一下他們的測試結果,我看到5天的Soak Test 的內存使用一直往上漲,很明顯這是內存泄露。這個情況發生在2個月前,但是一直都沒有報告,我只好和我的程序員每天都加班到凌晨,趕在上線前解決了這個問題。但是, QA部門的同學們就像沒發生什么事似的,依然正常上下班。哎……
為什么會這樣?我覺得有這么幾點原因(和鄒欣的觀點一樣):
- 給了QA全部測試的權力,但是沒有給相應的責任。
- QA沒有體會過軟件質量出問題后的痛苦(解決線上問題的壓力),導致QA不會主動思考和改進。
- QA對Dev的開發過程和技術完全不了解,增加了很多QA和Dev的溝通。
- QA對軟件項目的設計和實現要點不了解,做了很多無效的測試。
三、我的觀點
鄒欣對于分工出現的問題給出了兩點解決方法:
- 充分授權和信任(Empower team members)
- 各司其職,對項目共同負責(Establish clear accountability and shared responsibility)
我無意在這里貶低QA的工作,我也無意因為這個事走向另一個極端。但是,我在現在公司的經歷,還有很多新興公司的做法,讓我越來越覺得軟件開發,真的不需要專職的QA,更不需要只寫代碼不懂做測試的專職的Dev。 觀點如下:
1、開發人員做測試更有效
- 開發人員本來就要測試自己寫的軟件。如果開發人員不懂測試,或是對測試不專業,那么這就不是一個專業的開發人員。
- 開發人員了解整個軟件的設計和開發過程,開發人員是最清楚應該怎么測試的,這包括單元測試、功能測試、性能測試、回歸測試以及Soak Test 等。
- 開發人員知道怎么測試是最有效的。開發人員知道所有的function point,知道修復一個bug后,哪些測試要做回歸和驗證,哪些不需要。開發人員的技術能力知道怎么才能更好的做測試。
另外,我始終不明白,為什么不做開發的QA會比Dev在測試上更專業? 這一點都說不通啊。
2、減少溝通、扯皮和推諉
想想下面的這些情況你是否似曾相識?
- QA做的測試計劃、測試案例設計、測試結果,總是需要Dev來評審和檢查。
- QA在做測試的過程中,總是需要Dev對其測試的環境、配置和過程做指導。
- QA總是會和Dev爭吵某個問題是不是bug,爭吵要不要解決。
- 無論發現什么樣的問題,總是Dev去解決,QA從不解決問題。
- 我們總是能聽到,線上發生問題的時候,Dev抱怨QA這樣的問題居然沒測出來。
- QA也總會抱怨Dev代碼太差,一點也不懂測試,沒怎么測就給hand over 給QA了。
- QA總是會催促 Dev:這個bug再不修復,你就影響我的進度了!
一方面,QA說Dev不懂測試;另一方面Dev又說QA不懂技術。而我們還要讓他們隔離開來,沒有溝通。 我們應該讓Dev理解QA,也要讓QA理解Dev,減少公說公有理,婆說婆有理的現象出現。
3、吃自己的狗食
真正優秀的開發團隊都是要吃自己狗食的。 這句話的意思是:如果你不能切身體會到自己糟糕的開發成果帶來的痛苦,就不會真正地去思考;沒有真正的思考,就沒有真正的進步。
在我現在的公司,程序員要干幾乎所有的事:需求分析、設計、編碼、集成、測試、部署、運維、OnCall。因為:
- 只有了解了測試的難度,你才明白怎么寫出可測試的軟件,怎么去做測試的自動化和測試系統。
- 只有自己真正去運維自己的系統,你才知道怎么在程序里寫日志、做監控、做統計……
- 只有自己去使用自己的系統,你才明白用戶的反饋、用戶的想法和用戶的需求。
4、其它問題
- 關于SDET(全稱是Software Development Engineer on Test)。像微軟、Google、Amazon都有這樣的職位。但我不知道這樣的職位在微軟和Google的比例是多少。那么像這樣的懂開發的專職測試可以有嗎?我的答案是可以有!但是,我在想,如果一個人懂開發,為什么只讓其專職做測試呢?這樣分工合理嗎?把程序員分成兩等公民有意義嗎?試問有多少懂開發的程序員愿意只做測試開發呢?所以,SDET在實際的操作中,更多的還是對開發不熟的測試人員。
- 如果你說Dev對測試不專業、不細心、不認真,那么我們同樣也無法保證QA的專業、細心和認真。Dev遇到的的問題,QA可能也會遇到。而出了問題QA不會來加班解決,還是開發人員自己解決。所以,如果QA不用來解決問題,那么,QA怎么可能真正的細心和認真呢?
- 如果你說不要QA的話,Dev人手會不夠。你這樣想一下,如果把你團隊中現有的QA全部變成Dev。然后,大家一起開發,一起測試,親密無間,溝通方便,你會不會覺得這樣會更有效?你有沒有發現,在重大問題上,Dev可以幫上QA的忙,但是QA幫不上Dev的忙。
- 第三方中立,你會說程序員總是測不好自己寫的東西,因為有思維定式。沒錯,我同意。但是如果是Dev交叉測試呢?你可能會說開發人員會有開發人員的思維定式。那這只能說明開發人員還不成熟,他們還不合格。沒關系,只要吃自己的狗食,痛苦了,就會負責的。
- 磨刀不誤砍柴功。如果你開發的東西自己在用,那么自己就是自己天然的QA;如果有別的團隊也在用你開發的模塊,那么,別的團隊也就很自然地在幫你做測試了,而且是最真實的測試。
- 你可能會說吃狗食就是個笑話,倘若換成我,項目做得不好,就離職走人,讓后來者去吃我的狗食。這個的確是這樣的,但是想一想,你為什么在一開始不提醒他?另外,如果你的團隊在設計評審和代碼評審里沒有把好關,讓某位程序員蒙混過關,那么這為程序員離職后帶來的問題還是要由你的團隊來解決。于是整個團隊都在吃自己的狗食,這很公平。痛苦過一次,你的團隊就不敢隨意招人、不敢隨意評審代碼、不敢讓某位員工只做一塊東西了。而這最終還是沒有逃脫吃狗食的范疇。
- 關于自動化測試。這是一個機械的重復勞動。我想讓測試人員思考一下,你是否在做這樣的事?如果你正在做這樣的事,那么,你要思考一下你的價值了。但凡是重復性比較高的機械性勞動,總有一天要被機器所取代。
- 關于線上測試。我們都知道,無論自己內測的怎么樣,到了用戶那邊,總是會有一些測試不到的東西。所以,有些公司可能會做用戶驗收測試(做產品的公司會叫Beta測試)。無論怎么樣,你總是要上生產線做測試的。對于互聯網企業來說,生產線上測試有的玩A/B 測試,有的玩部分用戶測試。比如,新上線的功能只有10%的用戶可以訪問得到,這樣不會因為出問題讓全部用戶受到影響。做這種測試的人必然是開發人員。