軟件測試工程師的核心競爭力是什麼?

借這篇文章,我們來談談功能測試、測試開發、性能測試工程師等的核心競爭力。

在開始這篇文章之前,先問問自己,在軟件測試這個行業,你的核心競爭力是什麼?你有想過這個問題嗎?若想過,你的答案是什麼?有想明白嗎?

或者,你還在迷茫?

在茹炳晟的極客時間專欄《軟件測試52講》有這樣一個問題:「在日常工作中,我們很少會聽到開發工程師談論自己的核心競爭力,往往都是測試工程師更關注這個問題。這是不是從某個側面反映出測試工程師的核心競爭力不夠清晰或者是隨着互聯網時代的到來而發生了很大變化?」

有用戶留言說:「開發很少討論核心競爭力,是因爲開發的學習路線和發展路線比較清晰,而測試,大家都是在迷茫中摸着石頭過河。」

也有用戶說:「如果是開發轉測試,去做測試開發,可能更清楚自己的路線和規劃;但如果從功能測試入門,很容易迷茫,因爲入門很容易。」

以下內容來自於2018年11月23日晚19:30的直播整理。嘉賓是有着16年測試經驗的茹炳晟,前eBay中國研發中心測試基礎架構技術主管,極客時間《軟件測試52講》專欄作者。

\"\"

功能測試、測試開發、性能測試工程師等核心競爭力

茹炳晟:這是一個非常典型的問題,因爲現在我們看到一個很基礎的現象:

  • 功能測試工程師想去做自動化測試,他覺得寫自動化測試是價值,他能從中學到新的內容;
  • 自動化測試工程師想幹嗎呢?他覺得我自動化能力已經掌握了,我想更多地瞭解一些業務,瞭解這個產品的使用知識。

其實,他們都在追求自己所當前的一個角色下所沒有的能力與內容。

這是好事,也是壞事,爲什麼?

作爲一個工程師,你想清楚自己是在哪個階段上,你想往另一個方面去發展的話,那麼你一定需要在另一個方面去做額外的努力。那麼這個做努力的過程中,從知識積累的角度來講,它一定是從深度再到廣度。

那這個深度怎麼來?那就是在你所有深耕的領域裏,你應該去發揮你專家的作用。那麼我們回到三類工程師,測試開發工程師,業務的功能測試工程師,以及性能測試工程師。

1、功能測試工程師。非常簡單,他的核心價值是對產品的理解,對需求的理解,對產品使用的理解,以及在這些產品實現背後的一些實現邏輯。但,這類工程師本質上是有個短板的,這個短板來自於他的知識面會被侷限。也就是說,你在這個領域,你是有價值的,但是一旦你離開了這個領域,你怎麼能夠把你這些專業知識能夠很好得帶出去,這其實是值得這類工程師深思的一個問題;

2、對於第二類工程師,我們稱之爲測試開發。測試開發工程師是現在非常熱門的一個職業,可以說,所有的測試工程師基本上都想往那個方面去發展。爲什麼?因爲在這個時代,你說一個工程師,一個軟件方面的工程師,一個工程技術人員,如果他沒有掌握開發的技能,沒有代碼的技能,他不能稱之爲一個優秀的工程師。那麼在這種情況下,我們會去想測試開發的價值,無論從工程效能的角度來講也好,還是從具體的這種工具鏈上,測試開發的確帶來了很多幫助。有人說,這個職業工資高。工資高,說明企業願意出這個工資給你,一定是認可你能夠帶來更高的價值。

做測試開發也會遇到一個很現實的問題,如果你想做測試開發,你第一個要解決的是你的開發技能,因爲有很多半路出家或者非計算機專業的,信息類專業的,他對計算機領域的知識,或者說一些基本的編程語言知識是相對薄弱的,那麼在這種情況下,他要去轉成測試開發的話,他需要很大的開發工作積累。而且開發工作的積累,單靠你一些語言的學習並不能真解決很核心的問題。爲什麼這麼說?因爲你學的是書本上的東西,而真正的開發,一定來自於那些工程實踐,你只有做過真正的工程實踐,你對這個語言的理解,你心裏纔是有底氣的。

那麼更進一步的來講,我想問大家一個問題,測試開發工程師到底是測試重要還是開發重要?如果有兩個優秀的候選人A、B都去面試測試開發的崗位,A是測試的背景很強,開發相對薄弱,那B是開發相對很強,但是測試薄弱,那你怎麼來選人?

站在我個人的角度來講,或者站在我個人的經驗來講,我是覺得測試要比開發來的重要,爲什麼?因爲從整個行業來講,你不缺的永遠是優秀的開發人員。但是能夠站在測試的角度,能夠提煉測試的需求,並且把測試當中的一些難點,或者一些能夠提高工程效能的點進行提煉,並把它做成工具,這種測試人才是很稀缺的。

我在我的《軟件測試52講》專欄裏提到過很多方法,像我們做的Test  Data  Service、測試服務、測試執行服務,這些東西本質上並不是很難,它比業務系統的開發來的簡單,而且它的可用性,包括它各種各樣的要求也都要比傳統的市場上面向終端用戶的要求來的低。但是這類軟件的核心價值就在於你能想到去做這個事情,並且能很準確地打到這個點,並把這件事情做出來。完整作出這件事情,會很大程度上去提高你的開發、測試以及整個DevOps整個生命週期。這種情況下,這類人的核心價值應該更多的是在測試,開發只是輔助的,所以說測試開發工程師的核心價值,是對測試的生態的理解,以及對工具需求的提煉,以及把這些提煉出來的需求以最簡單的方式最容易落地的方式來做實現。

第三類,性能測試工程師。我爲什麼只講性能不講安全?因爲性能和安全是從一個能力的核心競爭力來講,他們很像,他們屬於專才。這類人的知識是需要經過很長時間才能積累起來,而不是一蹴而就,也不是通過一個簡單培訓就能夠把這類人培養起來。這種人,他看到的業務場景越多,看到過的問題越多,他能很快地根據這個問題的現象,去決定進一步做怎麼樣的測試,或者去拿哪些指標。有了這些指標之後,他可以快速縮小問題的範圍。

這種能力來自於哪裏?這種能力很大一部分都來自於實踐工作經驗,你在工作經驗中看到過這個問題,你才能去解決這個問題,你纔會這方面會有想法。性能測試工程師就像醫生,他去給病人看病的時候,醫生會讓病人去驗血,會拿到一個驗血報告,驗血報告上面說有大量不同血液的指標,但是一個血液指標拿到很容易嗎?現代化的儀器就能幫你拿到了,那麼性能測試指標能拿到嗎?也非常簡單,監控工具可以幫你拿到各種各樣的監控數據,這是很容易幫你拿到的,但是拿到的這些數據意味着什麼?你能通過這些數據裏面,看出什麼問題來嗎?

有經驗的人通過這些數據看到左右問題的本質,或者是這個問題的方向,進一步應該往哪個方向去看這個問題,但是沒有經驗的人,這對數據來講,就是一堆數據,它不能解決問題,所以說測試工程師,性能測試工程師,很大一部分來自於經驗的積累,一定是通過很長時間的去培養,總結出來的。

\"\"

爲什麼會講到「軟件測試開發者的核心競爭力」

茹炳晟:這是個非常有意思的話題,就像我們經常說的「團隊中的價值問題」,你經常看到測試人員自己在想,我們的價值在哪裏、是什麼?但我們很少看到軟件的開發人員或者架構師,或者運維團隊去問這樣一個問題,要去找自己的價值。這是因爲測試人員對這個價值本身是不太確定的,那麼這個價值本身不確定,就會帶來的一系列的問題。

你在整個快速發展的互聯網時代,整個IT的發展時代裏,你如何定位自己?你怎麼樣能夠成爲一個優秀的工程師?怎麼樣成爲一個不被時代所淘汰的,並且能夠緊跟時代步伐的這樣一個工程師?這樣的一個工程師你的核心競爭力又在哪裏?

記得剛一開始從事軟件的時候,有些大學的本科,或者研究生畢業,他們去面試工作的時候就會發現,面試下來的是代碼能力可能不是太好,這種情況下公司會問你願不願意去做測試?但隨着現在這個時代的變革,現在的軟件測試工程師,他的知識面,以及他需要掌握的內容已經遠遠超過了之前,可以說他的知識面是遠遠超過開發的,比如在一些技術的面上,以及對產品的理解上。

那麼這種情況下,我們再去提一個優秀的軟件測試工程師的核心價值,我們可以很自信地說,測試工程師是一個不可被替代的,並且是一個專業細分化的領域。像早年的時候,我們談到測試,就是軟件測試,沒有細分市場,但現在你去談測試,測試現在的領域太多了,除了傳統意義上的,基於業務領域的測試,然後還有測試開發。

測試開發裏面又分爲兩個大的分類:

  1. 一類是專門做測試基礎架構,做平臺,做工具開發的;
  2. 還有一類是專門去這些平臺去做測試用例的,自動化測試用例開發的。

這種情況下,又是兩類不同的工程師,那麼他所Deliver的價值也是完全同的,那麼更進一步,我們還會看到有很多所謂的安全測試工程師、性能測試工程師,這一類都是一些垂直領域的。在每個垂直領域上,大家都有自己非常專業的領域,而且有非常專業精神的知識,尤其是對於像那種性能測試工程師,他知識面的積累不管從廣度,還是從深度來講,都需要很強的系統架構師層面的支持,他才能夠成爲一個比較優秀的工程師。

當時在專欄裏寫《軟件測試工程師的核心競爭力是什麼?》這篇文章,我就是想讓大家走出迷茫期。因爲我相信,很多測試人是很迷茫的。因爲在整個IT行業的快速發展下,會出現很多的中小型企業,這些中小型企業處在一個快速去堆功能的階段,他對於軟件的測試及對軟件的質量本身,並不會有太多的投入。剛開始,他是想把整個功能堆起來,在這種團隊裏面會有測試,但測試的地位,或者他所扮演的角色、價值通常不會很高,因爲他通常是從功能做出來的,在後面去把這個東西快速地測一把。那麼這種角色多了之後,或者做了大量重複工作之後,他會對自己的職業發展產生很大的迷茫,不清楚我所做的這些重複性的勞動的意義何在?以及我的價值,我的將來在哪?

我想通過這樣一篇文章告訴大家,測試領域有很多東西是值得的做,如果你覺得重複做事情,非常煩瑣,那其實就是你的一個機會。也就是說,有很多東西都不稱心,比如工具不稱手,流程不稱手,或者說你的工作大量重複,那就意味着,從測試的角度,從自動化的角度,從工具的優化,從測試基礎架構的建設,你有很多東西可以去做。

去考慮把你身邊天天碰到的這些重複性勞動,用一個簡單的腳本,或者做一個簡單的工具去做優化,這就是你的一些價值。這種價值,一方面是來源於你對整個知識體系的理解,你的想法,你的思想方式,以及你的行動。那麼在這個過程中,你就體現了你作爲一個測試人員的價值。隨着你做的這種工具越來越多,隨着你做的知識面越來越廣後,你會發現,你能做的事情就會更多。

當你很肯定,很自信地確認自己所做的東西是有很大的應用場景的,解決很多問題的時候,你不會再回過頭去想,我今天所做的工作的Value在哪裏?我的價值在哪裏?

當測試人想往高處走時,是追求測試的深度,還是測試廣度?

這也是一個非常好的問題。
因爲早年的時候,我們學習新的技術,或者我們學習一些新的方法,學習資料的資源是比較有限的,我們只能認準一本書,認準一個學習資料慢慢去啃。但現在,整個互聯網的技術發展突飛猛進,一天一個樣,發展的速度真的實在是太快了,而且信息本身的體量,數據量都是成指數級的爆炸,在這種情況下,測試工程師就會比較迷茫,到底是把一件事情做精了,還是應該更廣泛地去掌握更多的知識。就像現在的測試工程師,如果你不懂系統的架構知識,如果你不懂容器知識,你是很難成爲一個優秀的互聯網時代測試工程師。

那你是怎麼去做權衡、去做取捨?因爲大家的時間、精力總是有限的。從我個人的經歷來講,一定是從深度再到廣度。

我所講的「深度入手」並不是說,你一定要把某一個點做得非常深,而是不要輕易放過!你在工作當中,如果接觸到了一個技術,或者接觸到了一種架構設計,或者接觸到了一些算法,你千萬不要把它輕易放過,你不是得過且過,我測了就測了,我知道了就知道了,你一定要刨根問底。比如說你碰到一個緩存問題,不是說解決這個緩存問題就OK了,你測試完就OK了,你需要把這個緩衝問題的來龍去脈,以及它的發展,以及整個緩存的基本原理,都搞清楚。

碰到一個擊破一個,碰到一個擊破一個。

如果你能堅持以這種方式來對待技術本身的話,你很快會發現,你每個接觸過的技術都會變得比較深入。隨着你的項目接觸的越來越多,做到的事情越來越多之後,你很快就會發現,你有了深度的同時你就有了廣度。

對於廣度我也有一些建議,我在我的測試專欄裏有一篇文章,「作爲一個測試工程師,我們儘可能應該去掌握的知識點有哪些?」。比如說如果你沒有互相網基礎架構的知識,你想做測試是很難的,或者說你不知道自己不知道,那麼會讓自己陷入一個很被動的局面。

對於這種軟件,我還提到了,我們還應該去學容器、雲這類知識。你要刻意去做這種廣度上的學習,因爲這類知識在整個體系下已經用的越來越多了,你所在的開發環境,你已經逃不過Docker了,已經逃不過容器了,你所有的應用都在雲端了,你怎麼樣通過雲端,你如果對AWS不熟悉,對PCF不熟悉,你怎麼樣來去部署你的測試環境?怎麼樣來部署你的開發環境?怎麼樣將你的測試執行環境,測試基礎架構建在雲端?

我個人的建議是通過一些額外的方式,通過自學習的手段,去做一些有意的積累。極客時間就提供了這樣一個很好的平臺,對於一些熱門的技術都有特定的專欄。雖然我是極客時間專欄的作者,但我自己也訂閱了很多極客時間的課程,因爲有文字且配有音頻,就可以利用很多碎片化的時間來學習。比如說我坐地鐵的時候,我就會用這段時間來聽一個5分鐘到15分鐘的音頻,比你刷微博、朋友圈收穫的更多。

測試想去轉測試開發,他需要積累哪些經驗?

一個普通的測試人員,可能更多想轉型爲測試開發工程師。那需要什麼知識點吶?

我覺得技術的路是沒有捷徑可以走的,如果你想轉成測試開發,那就意味着你要有開發的基礎,這種情況下,你做得第一件事情是掌握一門語言。不要多,只掌握一門語言就行。這意味着你是真正地掌握,從骨子裏掌握這門語言,而不是簡單寫個Hello  World。而是你要掌握編程語言很核心的東西,並且你能夠通過編程來做一些實際的項目。

從個人發展角度來講,我更傾向於學Java。因爲Java的面更廣,Python雖然好,它更多的還是在測試領域裏面。當你一旦跳出這個測試圈子,你想做更多的事情,Java語言還是會來的更好。這是我的一個建議,從開發的基礎職能入手,去實踐去編程。專欄告訴你的是一個方向,是一些思想方法,以及整個生態,以及工具體系的分析,而不是我手把手教你一個工具。手把手教你一個工具是沒有價值的,因爲學一個工具最好的路徑去看官方文檔,官方文檔一定是最新的,而且最全面的。

測試用例的力度怎麼去把控?

我們如果要把這個問題談清楚,就要看它是一個GUI的測試,還是一個API的測試。不同的測試用例的力度把控差別是非常大的,而且產品的不同階段、不同規模,還有項目的性質,對於測試力度的把控也是會有巨大差別。

舉個簡單例子,如果是一個長期的產品,自動化會進行長期維護的,那麼一定要做可複用很高的力度,並且這些可複用的腳本可以被儘可能的多測試用例去使用。但如果是一次性的項目,或者能夠短期項目性的產品,做完之後也就不維護了,但是你想做一些基礎的自動化,這個時候你就壓根就不需要去考慮自動化的力度,你只要用最快的自動化方式給測試用例實現了,那就可以。這種情況下我們就不用談力度。

用例的力度沒有說一定對,或者一定錯,而一定是基於上下文去找到最適合自己的東西。對於用例的力度,

那爲什麼別人能夠針對某一類測試系統,或者某一類東西給出比較好的測試解決方案吶?或者說是測試的策略?那是因爲感覺。經過長期積累,別人形成了對這種技術本身的一種感覺,在無形的情況下,形成一些有形有價值的東西,幫助你快速且準確地給出方案。這就比較重要了。

最後說一下,我的《軟件測試52講》專欄已經完結了,共62篇文章,碼寫了26萬3948個字。通過一系列行業最佳實踐案例的講解,爲大家呈現一幅包括GUI/API自動化測試、測試數據平臺、測試基礎架構建設、性能/壓力測試、代碼級測試、測試新技術和大型網站架構等在內的軟件測試技術全景視圖。