測試人的職業(yè)迷茫與破局:從測試小白的技術(shù)專家
大家好,我是宏夏
最近看到一篇關(guān)于測試職業(yè)發(fā)展和進(jìn)階的好文章,自己重新梳理了一下跟大家做個分享
文章很長,常看常新。相信讀完能夠讓你對測試的認(rèn)知又上一臺階
一、測試行業(yè)的困境
有這么個普遍現(xiàn)象:測試招聘者,特別是一、二線互聯(lián)網(wǎng)公司的招聘者最苦惱的事兒就是招人。
想找到一個合適的人難于上青天,每天各種撒網(wǎng),簡歷看幾百份,面大幾十人,能撈到一個中意的小伙伴就謝天謝地了。
但同時很多測試小伙伴發(fā)現(xiàn)找工作很難,特別是進(jìn)大一點的廠,他們特別挑:代碼要會寫,要有軟件架構(gòu)能力,問一大坨平時根本用不到的技術(shù)問題,還挑經(jīng)驗,挑溝通能力,挑這挑那,有時候還特么挑學(xué)歷、挑年齡。
供求總難以匹配起來,造成了雙方都很痛苦。
二、為啥出現(xiàn)這種局面
能力要求不匹配是最核心的問題。
軟件、互聯(lián)網(wǎng)近 20 年來飛速成長,其實也經(jīng)歷了很多階段。行業(yè)軟件興盛階段和外包興盛階段(2000 - 2010 年)行業(yè)進(jìn)入了大量的測試人員,當(dāng)時最主流的測試實踐是:重心放在系統(tǒng)驗收階段。測試人員的主要工作基本都投入在了基于業(yè)務(wù)的黑盒測試上,對代碼能力、系統(tǒng)理解的能力要求不多。
2010 年后,互聯(lián)網(wǎng)行業(yè)的真正興起讓國內(nèi)軟件開發(fā)模式開始緩慢調(diào)頭,快速迭代的模式逐步興起,開發(fā)周期越來越短,迭代越來越快,但系統(tǒng)越來越龐大、復(fù)雜。
原來的測試工作模式和工作范圍越來越無法滿足要求了。但大量從業(yè)人員技能范圍轉(zhuǎn)變是一件很難的事情,行業(yè)是有巨大慣性的。
從宏觀上看大量 QA 技能轉(zhuǎn)變跟不上需求轉(zhuǎn)變是造成市場供求不匹配的主要原因。
三、測試人如何破局?
三個觀點:
- 只做手工測試,不懂系統(tǒng)實現(xiàn)的測試工程師的職業(yè)發(fā)展會越來越受限。
- 能夠轉(zhuǎn)型成適應(yīng)市場需求的同學(xué)將在近幾年的時間獲得超額回報(因為市場供不應(yīng)求,企業(yè)不得不抬高價格來尋找這樣的人)。
- 對于個體來說,自我成長永遠(yuǎn)最重要。自己永遠(yuǎn)要對自己的發(fā)展負(fù)責(zé),別依賴外部環(huán)境,自己想辦法變成市場的香餑餑才靠譜。
四、到底什么樣的人搶手?
到底什么樣的人搶手?按照我一點理解講一講什么樣子的人會搶手吧,限于篇幅會偏重技術(shù)角度來講。個人之見,歡迎討論和拍磚。
(一)測試的底子 - 項目經(jīng)驗
有比較復(fù)雜系統(tǒng)的測試實戰(zhàn)經(jīng)驗,你就超過了 50% 以上的應(yīng)聘者。什么叫做比較復(fù)雜系統(tǒng)呢?投入 50 人年開發(fā)出來的系統(tǒng)就可以稱作一個復(fù)雜系統(tǒng)了。
因此,復(fù)雜系統(tǒng)并不是很罕見。但是,如果你只接觸一個簡單的模塊,甚至只是測試一個穩(wěn)定模塊的維護(hù)性開發(fā),而不是通盤理解,不能說是測試過復(fù)雜系統(tǒng)。
有從頭到尾接觸一個完整項目的經(jīng)歷很寶貴。
(二)測試的底子 - 基礎(chǔ)知識
對照三本書:《ISTQB 基礎(chǔ)教程》《高級軟件測試設(shè)計》《高級軟件測試管理》(后兩本是 ISTQB 的高級認(rèn)證教程)。
這里邊的內(nèi)容你都能熟練應(yīng)用(真的是熟練應(yīng)用,而不只是有概念),你就能超過 80% 以上的應(yīng)聘者了。
面試過數(shù)百人,我經(jīng)常會問幾個問題:如果測試時間不夠,你會怎么辦? 如果讓你去測試一個你完全不熟悉的系統(tǒng),你會怎么辦?你平時會使用那些測試設(shè)計方法?
看似很稀松平常的問題,非??简炄?。因為大部分從業(yè)者都沒有經(jīng)受過系統(tǒng)訓(xùn)練和學(xué)習(xí),工作多年,依然技能不足,意識跑偏。
(三)熟練使用一門主語言
滿足這條,你就超過了 70% 的應(yīng)聘者。
什么叫做熟練呢?拿 Java 來說吧:
- 系統(tǒng)學(xué)習(xí)過 Java 的教程,高頻面試 50 題這樣的題可以自測一下,可以回答上 35 個以上;
- 熟悉最主流的 Spring 框架,能夠?qū)懗鲆粋€簡單的網(wǎng)站,實現(xiàn)基礎(chǔ)的 Restful 服務(wù);
- 讀懂過一個測試框架,如 mockito 或者 Junit 的源碼;
- 能夠熟練實施接口測試(基于一些測試框架 如:rest-assured+Junit);
能夠讀懂開發(fā)的業(yè)務(wù)代碼,對他們的代碼進(jìn)行 Code Review;
(四)對一門語言有比較深入了解
滿足這條,你就超過了 90% 的應(yīng)聘者。
什么叫有深入了解呢?還拿 Java 來說吧:
- 熟練使用 Java 的常見 API;
- 深入理解基于語言特性 / 系統(tǒng)特性的知識,如 Collections 的實現(xiàn)機制、類型系統(tǒng)、I/O、網(wǎng)絡(luò)、多線程等;熟知設(shè)計模式(廣義范圍的設(shè)計模式,不局限于 GOF 的設(shè)計模式);
- 熟悉 JVM 的工作模式;
- 熟練使用調(diào)試排查工具解決性能問題;熟練掌握市面上常見的腳手架;
- 熟練掌握周邊知識(OPs 相關(guān),網(wǎng)絡(luò)知識相關(guān))有不錯的實戰(zhàn)開發(fā)經(jīng)驗(做過真正被生產(chǎn)檢驗的東西);
對于測試開發(fā),AOP,Java 字節(jié)碼技術(shù)是很重要的知識。這是一個很長的學(xué)習(xí) list,需要幾年時間來養(yǎng)成。做到這點,其實你可以勝任普通的開發(fā)崗位了,這也是高級測試開發(fā)崗位的技術(shù)底子。
(五)在一個領(lǐng)域知識有不錯的了解
人不可能什么都懂,但工作幾年之后,會在工作的域內(nèi)一定要有積累才行。
例如,你測試一個核心電商系統(tǒng)的交易模塊三年了,業(yè)務(wù)上你一定要熟練講出來:商品列表、購物車、下單、退單、廢單、支付、發(fā)貨、庫存、退款、優(yōu)惠使用等等一坨業(yè)務(wù)流程,和可能出現(xiàn)的常見的坑(各類問題產(chǎn)生的資損、各類問題產(chǎn)生的服務(wù)不可用、邏輯矛盾),不然根本無法體現(xiàn)你經(jīng)驗沉淀和深入思考;
技術(shù)角度上,你要能夠畫得出來系統(tǒng)的交互圖,熟悉最核心的接口和最核心的參數(shù),能夠讀懂開發(fā)的代碼,熟練使用 trace 和監(jiān)控工具,診斷定位線上問題到代碼行。
(六)用技術(shù)保障質(zhì)量的能力
測試開發(fā)崗一定會問到一個問題:你能夠舉一個你用技術(shù)手段提高測試效率,增強測試能力的例子么?
這是面試時最大的一個坎。 很多人會講一些自動化測試回歸的例子,但是真正成功的例子非常少,因為為什么做,怎么做都沒有想好就照網(wǎng)上一個教程攢了一個,結(jié)果變成了玩具。
做好自動化,不僅僅是會使用工具、框架,其實要對被測物特性,軟件生命周期有很深的理解并且有很強的開發(fā)知識才行。
實際上,在環(huán)境、CI、數(shù)據(jù)、測試用例生成、數(shù)據(jù)比對的很小的一些點上,都能有不錯的提效產(chǎn)出,從這些點能夠做得好,會得到不錯的加分。有一個不錯的成功案例,你勝出的幾率就超過了 80%,沒有短板,就十拿九穩(wěn)了。
(七)技能以外的東西 - 實戰(zhàn)案例
以前的工作印證了你的能力。能夠講清楚一件特別拿得出手的工作,證明你能力的案例是面試時候最有用的投名狀。
(八)技能以外的東西 - 你的個人特質(zhì)
一般有如下特質(zhì)會大大加分:
- 快速學(xué)習(xí)、系統(tǒng)性學(xué)習(xí)
- 學(xué)以致用
- 系統(tǒng)性思考
- 強大的推動力
- 技術(shù)思維
- 突出的溝通能力
- 抗壓性
- 樂觀精神
- 抗挫折能力
- 迅速調(diào)整的能力
- 迭代改進(jìn)的意識
- ownership
- 團(tuán)隊合作
- 愿景和規(guī)劃
這些特性體現(xiàn)人的內(nèi)核,有強大內(nèi)核的人,做什么都行,技能暫時不足,也一定能補足。所以,在招聘的時候往往對是否錄用的判斷起決定性作用。
高級測試的需求
1、計算機領(lǐng)域知識的通盤理解
這條范圍非常大,人不可能什么都懂。但最最基礎(chǔ)的知識是不能有盲點的:
操作系統(tǒng)工作基礎(chǔ)原理與基礎(chǔ)操作:如 linux,要通讀過 linux 操作系統(tǒng)的書,熟悉最基本的概念,基本命令要熟悉,shell 要能寫和讀;
網(wǎng)絡(luò)知識特別是 TCP/IP, HTTP 知識:推薦兩本書《圖解 tcp/ip》《圖解 Http》這兩本書里的東西要懂。
數(shù)據(jù)庫知識:市面常見數(shù)據(jù)庫(redis,mysql,oracle)的常見 DBA 操作,問題排查;SQL 的熟練使用;
Web 及移動端知識:能夠懂 HTML,CSS,能夠讀懂 Javascript 代碼,能夠讀懂 Android 或者 iOS 的代碼,做簡單開發(fā)最好。
安全知識:常見的安全防護(hù)方法、工具使用;基本的安全攻防原理;軟件工程/開發(fā)過程管理:實戰(zhàn)中各種磨練,建議系統(tǒng)的學(xué)習(xí) PMP,敏捷開發(fā)的一些認(rèn)證課程。
2、在一個領(lǐng)域的深耕
人不可能什么都懂,但在一個領(lǐng)域是需要深耕的。
比如,在做了四、五年移動端測試以后。android 和 iOS 都要具備一定的開發(fā)能力了,能讀懂開發(fā)的業(yè)務(wù)代碼是最基礎(chǔ)的,能夠代替開發(fā)實現(xiàn)部分業(yè)務(wù)功能,完成部分組件開發(fā)是個非常好的自檢點。
能夠?qū)σ苿佣俗詣踊ぞ邨?、監(jiān)控工具棧(如友盟、bugly、newrelic 等)、內(nèi)存泄露檢測、卡頓檢測、耗電量、弱網(wǎng)、流量、埋點、灰度、版本控制、兼容性、用戶體驗、安全等等的質(zhì)量保障方案有通盤搞定能力。
什么叫搞定呢?舉個例子:比如,使用多種手段把崩潰率降低到千分之一以下。
對于一個小團(tuán)隊,這是個很不容易實現(xiàn)的坎。
做到這點,你需要
了解如何收集崩潰率,使用一系列工具來定位核心問題
如何推動開發(fā)改動,并且預(yù)防,包括
- 靜態(tài)代碼掃描工具引入,
- 阻止亂用第不成熟的第三方插件,
- 代碼 reivew 防止常見 pattern 如空指針引發(fā)的崩潰,
- 推動開發(fā)養(yǎng)成良好的 log 習(xí)慣,
- 推動移動端防御性編程編程開發(fā)習(xí)慣,
- 推動后端開發(fā)按照規(guī)范吐接口,
- 幫助開發(fā)引入內(nèi)存泄露、卡頓工具,趨勢報表,警鐘長鳴,各種灰度方式設(shè)置,線上監(jiān)控。。。
一個數(shù)據(jù)的改觀,背后要有大量的質(zhì)量相關(guān)工作
也就是使用綜合手段來保障軟件質(zhì)量提升效能的能力。
聽起來很抽象,舉幾個例子吧。
例子 1:你所在的 team 總在被開發(fā)抱怨測試用的時間太長。如何能縮短一下測試時間呢?
通過調(diào)研,發(fā)現(xiàn)測試小伙伴詬病的最多的就是環(huán)境不可用。環(huán)境到底多不可用呢?
你基于 Grafana 和 Prometheus 做了一個環(huán)境可用的監(jiān)控報表,使用后,發(fā)現(xiàn)環(huán)境在工作日整體可用率只有 35% 左右,主要原因是:幾個核心熱點應(yīng)用經(jīng)常掛了沒人管。
你拉了整個 team,明確了部署責(zé)任人,約定了部署規(guī)則:只能中午飯和晚飯時間部署,并且部署后要自己看一下是不是 OK。
一周后,環(huán)境可用度上升到了 65%。再深入分析,發(fā)現(xiàn) 2 個同學(xué)不守規(guī)矩,總是他們在破壞規(guī)則,你去找他們單獨談話。
一周后,環(huán)境可用度上升到了 80%。還是有少量人不守規(guī)矩。
你找 SRE 的同學(xué)提需求,做了部署卡點,非部署時間部署必須 TL 審批。
一周后,環(huán)境可用度上升到了 85%。有些 TL 也不守規(guī)矩。
你建了個報警,環(huán)境亂部署,壞掉了,在大團(tuán)隊的群里 @ 全體,告知誰搞壞了環(huán)境。
一周后,環(huán)境可用度達(dá)到了 92%。你加了一個 feature:應(yīng)用掛了一段時間無人響應(yīng),自動重啟服務(wù)功能,仍然有問題,就自動回滾上一版本。
你推動了開發(fā)解決了某個應(yīng)用啟動時間過長的問題。
你推動了環(huán)境分組。
你推動了測試環(huán)境版本上線的規(guī)范流程實施。
你推動了冒煙自動化用例卡點。
你推動了環(huán)境部署人備份機制。
你推動了全員基礎(chǔ)環(huán)境部署培訓(xùn)。
你總結(jié)了部署手冊。
你做了。。。。。
最后,環(huán)境可用度穩(wěn)定到了 97% 以上。你為測試節(jié)省了 60% 以上 block 時間(原來可用度為 35%)
例子 2:上面的問題,除了環(huán)境,還有一個槽點:開發(fā)提測質(zhì)量不高。
測試的頭幾天,很多主流程都走不通,導(dǎo)致測試總是在等待,或者是跟著開發(fā)一起聯(lián)調(diào)。而這段時間,已經(jīng)被習(xí)慣性的認(rèn)為是測試時間了,因為:提測了。
你推動了:測試提供冒煙用例,開發(fā)必須完成一定程度的自測才能提測。
你推動了:測試和開發(fā)做自動化同期共建,在開發(fā)過程中,核心功能就被自動化用例保護(hù)起來了。
你推動了:開發(fā)切分 feature 提測,而不是攢一個大招一下子提一坨。
你推動了:代碼 Codereview 變成團(tuán)隊常規(guī)活動,QA 在早期跟進(jìn)核心代碼,把問題坑殺在萌芽階段。
你推動了:外部資源聯(lián)調(diào)非常早的進(jìn)行,不會讓它在測試后期成為測試 blocker。
。。。
例子 3:你發(fā)現(xiàn)測試時間長,QA 自己也有問題。
你推動了:有明確的測試計劃,并讓所有干系人都有明確的預(yù)期。
你推動了:測試依據(jù)風(fēng)險測試,最大的風(fēng)險得到最快的 cover,科學(xué)分配時間,明顯縮短 bug 反饋時間弧。
你推動了:bug 嚴(yán)格管理,所有重要 bug 都及時修復(fù)。
你推動了:良好的溝通和匯報機制,每天讓團(tuán)隊主要干系人清晰的知道,距離發(fā)布還差多遠(yuǎn)。
你推動了。。。。
你能講出自己做過 5 個以上這樣的成功例子,我敢保障,你會被 1 線大廠瘋搶。職級基本都是專家起。
3、持續(xù)學(xué)習(xí)能力和復(fù)雜問題解決能力
例子 1:你近期的工作是幫助團(tuán)隊提升后臺服務(wù)穩(wěn)定性。你看到了 netflix 內(nèi)部使用一個叫做 ChaosMonkey 的東西來隨機對生產(chǎn)服務(wù)期進(jìn)行攻擊,而逼迫工程師提高穩(wěn)定性,所以,你也實現(xiàn)了類似(更溫和)的內(nèi)部機制,推動團(tuán)隊穩(wěn)定性的提高。
你怎么知道這個叫做 ChaosMonkey 的東西呢? 因為你會習(xí)慣性瀏覽一線廠商的技術(shù)博客,參與行業(yè)大會,關(guān)注各類新技術(shù)。持續(xù)性的養(yǎng)成習(xí)慣。
例子 2:做大規(guī)模接口自動化好難,外部數(shù)據(jù)依賴太難搞,參數(shù)構(gòu)造太費勁,assert 太難寫。如果能夠簡單的錄制回放就好了。
但是,外部依賴是個天坑,寫操作 mock 也是個天坑,assert 也是個天坑。
實際的案例是,經(jīng)過幾年多個團(tuán)隊持續(xù)不懈的填坑,阿里內(nèi)部已經(jīng)有應(yīng)用級的錄制回放工具了,數(shù)百個應(yīng)用成功的是用了它,把不可能回歸的任務(wù)變成了可能(上萬數(shù)量級的 case 當(dāng)天生成,當(dāng)天投入使用,并可以分析覆蓋率),自動化測試實施需要付出的工作時間革命性降低(不足原來付出時間的 10%)。
你能講出自己做過 5 個以上這樣的成功例子,我敢保障,你也會被 1 線大廠瘋搶。職級基本都是專家起。
其它能力
測試是個萬金油,高階一些的職位需要什么都要會一些 ,因為越高階的職位需要解決的問題越綜合,需要打交道的人的種類越多。
不然很容易變成你職業(yè)短板,做個 list 吧(一定不全):
很好的項目管理能力,至少與開發(fā)經(jīng)理能力同級,甚至要強于他。
一定的軟件架構(gòu)能力。
一定的產(chǎn)品 sense:可以跟一個資深的產(chǎn)品經(jīng)理能夠順暢的交流,明白知道他為什么會這么想,所要實現(xiàn)產(chǎn)品的意義,路徑;從產(chǎn)品質(zhì)量方面的考慮要超過產(chǎn)品經(jīng)理,給他輸出。
極好的溝通能力。
團(tuán)隊管理能力(這個太重要)
目標(biāo)管理能力
有一個好的內(nèi)核(上面提到過)
測試人怎么轉(zhuǎn)型/進(jìn)階?
其實不難,沒有什么高端的方法。下面這 4 條就夠了,核心秘密就是堅持不懈。
1、熟悉你的被測系統(tǒng)。
能夠從技術(shù)、業(yè)務(wù)角度做到對被測系統(tǒng)熟悉是做一個好 QA 的最基本職業(yè)素養(yǎng),也是能力提升的最主要源泉。
自檢點:
我能夠畫出系統(tǒng)的架構(gòu)圖么?
我能夠讀懂開發(fā)的代碼么?
我熟悉常見的業(yè)務(wù)監(jiān)控系統(tǒng)么?
熟悉日志系統(tǒng)么?
知道開發(fā)是如何調(diào)試和定位問題的么?
給我一個線上問題,我能定位么?
我能給別人完整的介紹這個域的核心業(yè)務(wù)么?
我能自己直接動手發(fā)布上線一個系統(tǒng)么?
知道如何回滾么?
灰度是如何做的?
我知道所有關(guān)鍵的技術(shù)點么,如一個交易的冪等性是如何實現(xiàn)的?
我在團(tuán)隊中有:“這家伙對系統(tǒng)最熟” 的口碑么?
如果自檢點全部是否定答案。。。 花一年時間把它全變成肯定答案。這一過程,你一定被迫學(xué)到了很多很多,并且獲得了極為長足的成長,這是進(jìn)階的必由之路,也是卡了很多人的地方。 如果說做不到,后面不用看了,前面的也全部忘掉吧。
方法:通讀所有文檔,強迫自己讀代碼,積極參與開發(fā)所有討論,不懂的狂問,觀察開發(fā)如何上線,如何排查問題,模仿,學(xué)習(xí),善用搜索引擎,總結(jié)。。。
2、找到問題解決問題。
你一定有一堆問題,如果你覺得自己做得挺好,沒有問題要解決,那必然是你自己有巨大的問題!
自檢點:找一支筆,寫出你覺得質(zhì)量方面,你的 team 的 10 個問題,做排序。排出最重要的 3 個。
方法:找到 top3 的問題,選一個,列個接話,去解決。如果找不出來,使勁去觀察,然后去看看做的好的同行,比比你比人家差在哪里。
嘗試去解決這些問題,從小問題,能夠見到效果的問題入手,設(shè)置一個時間點。你真正解決了 5 個以上問題以后,感覺一定會有。
3、系統(tǒng)學(xué)習(xí)
自檢點:我系統(tǒng)的學(xué)過一門知識么?我能講清楚我這么操作,我寫的這行代碼的原理么?
方法:從工作出發(fā),確認(rèn)你需要補足哪些知識。從網(wǎng)上找一個具體知識的學(xué)習(xí)路線圖,訂個計劃,照著來。 參加學(xué)習(xí)小組,找到幫你解決難題的人,多請他吃飯,多請教他。獲取知識后,馬上回到工作中做檢驗。還是學(xué)以致用才能有所增長。結(jié)合工作來系統(tǒng)學(xué)習(xí)的效果是最好的。
再舉個例子:
上家公司有個小伙伴(他應(yīng)該也會泡這個社區(qū)),開始應(yīng)聘的時候,他說熟悉 jenkins,用的很多。所以第一份工作是:把所有 CI 的日常工作交給了他,并告知 2 個月內(nèi)要全部搞定。 他一下懵逼了,原來那些不深入的理解支撐不了工作要求。后來他每天死磕,看了 jenkins 所有的文檔(對,幾乎所有文檔通讀了一遍),翻了無數(shù)問題的解決帖子,記錄了上百個問題解決的過程,寫了上百篇 jenkins 的小 blog(現(xiàn)在還沒公布出來)。
幾個月以后,他比我熟了,他的一項基礎(chǔ)能力成長為:可以獨自給一個小公司完整的搞定前端、后端、移動端的一整套 CI 解決方案。其實單憑這一套,就能找到不錯的工作了。這是依托工作,系統(tǒng)性學(xué)習(xí)的結(jié)果。
看到有同學(xué)說要裸辭,去接受培訓(xùn)。我的建議是,別這樣。裸辭你就失去了學(xué)以致用的陣地,失去了真正解決問題的機會,還失去了資金來源。依托工作,自主學(xué)習(xí)是王道。自己饒過不去坎,其實有很多網(wǎng)上教程和非脫產(chǎn)培訓(xùn)班啊。
4、選擇有挑戰(zhàn)的團(tuán)隊
自檢點:
在團(tuán)隊里有很多人比我強么?
周圍的同事都是我佩服的么?
我做的事兒有挑戰(zhàn)么?
方法:如果這三點都是否定的,并且你處于職業(yè)生涯的早期。也許(只是也許),你該考慮一下?lián)Q個團(tuán)隊了。
#職業(yè)發(fā)展##測試開發(fā)學(xué)習(xí)路線##測試#