QA seven's blog
從QA的角度來(lái)談?wù)劥a質(zhì)量的改進(jìn)
Oct 31, 2016|?343?Hits大部分人看到這個(gè)題目時(shí),直接的反應(yīng)是QA關(guān)心代碼質(zhì)量干嘛,能看懂代碼嗎?怎么給dev feedback?
qa
如果還有人持這樣的觀點(diǎn)后,那么我只能說(shuō)too young too simple。
首先我們得談?wù)勈裁词谴a質(zhì)量?
創(chuàng)建優(yōu)秀的代碼涉及到正確性、可維護(hù)性甚至優(yōu)美性。
正確性,最起碼你的代碼實(shí)現(xiàn)的業(yè)務(wù)邏輯是正確的。
可維護(hù)性,公司中其他的小伙伴能看看懂你的代碼邏輯,便于修改代碼。
優(yōu)美性,符合各種代碼規(guī)范,其他人看到代碼后驚為天人。
但是要做到以上幾點(diǎn)絕非易事,首先你得有高超的編程能力,其次你對(duì)前端或后端的代碼規(guī)范有深刻的理解,但是能有這樣能力的人又有多少呢?
我們都知道軟件開(kāi)發(fā)是團(tuán)隊(duì)合作才能完成的工作。
那么項(xiàng)目的質(zhì)量與客戶(hù)的需求才是項(xiàng)目生存下去的關(guān)鍵。
所以怎么才能改進(jìn)項(xiàng)目代碼的質(zhì)量?我們先看看業(yè)界巨頭公司都是如何做的?
microsoft怎么做?
microsoft
我們都知道微軟是做操作系統(tǒng)出身的,其實(shí)微軟的測(cè)試能力與測(cè)試工具都是業(yè)界中領(lǐng)先的,以下是兩張表展示的是微軟如何從visual studio與開(kāi)發(fā)過(guò)程中提高代碼質(zhì)量
Visual Studio
| 使用代碼分析工具分析應(yīng)用程序質(zhì)量 | 靜態(tài)代碼分析工具可查找 C++ 和托管代碼里的設(shè)計(jì)、使用、可維護(hù)性和樣式問(wèn)題。 其中的許多問(wèn)題可能導(dǎo)致難以在標(biāo)準(zhǔn)測(cè)試環(huán)境中重現(xiàn)的 bug。 |
| 單元測(cè)試代碼 | “測(cè)試資源管理器”可以在開(kāi)發(fā)實(shí)踐中輕松地集成單元測(cè)試。 可以使用 Microsoft 單元測(cè)試框架或若干第三方和開(kāi)源框架之一。 |
| 測(cè)量托管代碼的復(fù)雜性和可維護(hù)性 | 代碼度量是一組軟件度量值,使開(kāi)發(fā)人員可以更好地了解他們正在開(kāi)發(fā)的代碼。 度量值包括函數(shù)和類(lèi)的可維護(hù)性指數(shù)、函數(shù)的圈復(fù)雜度、類(lèi)的繼承深度和類(lèi)耦合度的數(shù)值。 |
| 使用代碼克隆檢測(cè)功能查找重復(fù)代碼 | 代碼克隆工具可用于在整個(gè) Visual Studio 解決方案內(nèi)搜索 Visual C# 和 Visual Basic 項(xiàng)目中重復(fù)或高度相似的代碼。 可以經(jīng)常重構(gòu)代碼以消除重復(fù)代碼,從而創(chuàng)建更易于維護(hù)的解決方案。 |
| PreEmptive Analytics for Team Foundation Server | PreEmptive Analytics for TFS CE 有助于將反饋驅(qū)動(dòng)的開(kāi)發(fā)過(guò)程集成到開(kāi)發(fā)工作流中。 當(dāng)應(yīng)用程序在執(zhí)行過(guò)程中發(fā)生錯(cuò)誤時(shí),它會(huì)自動(dòng)將異常報(bào)告數(shù)據(jù)發(fā)回給 PreEmptive Analytics 服務(wù)。 然后,該服務(wù)將根據(jù)你定義的規(guī)則和閾值創(chuàng)建或更新 Microsoft Team Foundation Server 中的工作項(xiàng)。 |
| PreEmptive Dotfuscator 和 Analytics CE | PreEmptive Dotfuscator 是 .NET 模糊處理程序和壓縮程序,有助于防止程序遭遇反向工程,同時(shí)使程序更小更高效。 |
開(kāi)發(fā)過(guò)程中改進(jìn)代碼質(zhì)量
| 設(shè)計(jì)和代碼的檢查準(zhǔn)則 | 提供若干幫助進(jìn)行設(shè)計(jì)和代碼檢查的技術(shù),通過(guò)讓其他同事檢查代碼來(lái)發(fā)現(xiàn) bug 和不正確的假設(shè)。 |
| 安全代碼編寫(xiě)準(zhǔn)則 | 描述編寫(xiě)安全代碼的技術(shù)和策略。 |
| 高質(zhì)量代碼簽入準(zhǔn)則 | 列出以不同方式檢查代碼以確保代碼實(shí)現(xiàn)您的預(yù)期高質(zhì)量設(shè)計(jì)目的的準(zhǔn)則。 |
| 代碼分析工具使用準(zhǔn)則 | 提供幾條使用代碼分析工具的準(zhǔn)則。 |
| 檢測(cè)和更正 C/C++ 代碼缺陷 | 描述如何使用用于托管代碼的代碼分析工具檢測(cè)和更正代碼缺陷。 |
| 代碼分析簽入策略 | 描述如何創(chuàng)建與 Team Foundation 源控件簽入關(guān)聯(lián)的自定義簽入策略。 |
| 調(diào)試準(zhǔn)則 | 提供幾條查找代碼缺陷的準(zhǔn)則。 |
google 又是怎么做?
-
代碼審查。在你提交任何代碼改動(dòng)之前,你得找去代碼“主人”簽字確認(rèn)。為了實(shí)現(xiàn),評(píng)審者(被鼓勵(lì)去)建議大修代碼,而不是讓它成為根本沒(méi)有經(jīng)過(guò)思考的“圖章”代碼。
-
按語(yǔ)言可讀性要求堅(jiān)持代碼風(fēng)格指南(請(qǐng)參閱這里)。除了讓我們代碼有統(tǒng)一的外觀(所以我們能快速識(shí)別方法、變了等),我們的風(fēng)格指南禁止了一些復(fù)雜、混亂、易出錯(cuò)的 C++ 特性(比如:class 類(lèi)型的靜態(tài)和全局變量)。
-
整個(gè)團(tuán)隊(duì)都致力改進(jìn)我們代碼庫(kù)的質(zhì)量,維護(hù)我們的核心庫(kù),不斷做出更好的工具。
-
一個(gè)活躍的“code health”課題組。
- 發(fā)布軟件時(shí),不對(duì)外部期限承擔(dān)責(zé)任。一般而言,這讓我們可以正確做事,而非為了期限內(nèi)完成任務(wù)把亂七八糟的代碼拼湊起來(lái)。
- “Fix it.” 例如,一個(gè)工程師或許說(shuō),“我認(rèn)為我們真應(yīng)該別再用過(guò)時(shí)的 Cruft Map 類(lèi)(class)了。我打算在 1 月 20 日組織一次 Fix it。” 當(dāng) 1 月 20 日來(lái)臨時(shí),大家應(yīng)當(dāng)暫停其正常運(yùn)作,把他們代碼中的 Cruft Maps 都換掉。在 1 月 21 日,Google 就永遠(yuǎn)和 Cruft Map 說(shuō)拜拜了!不過(guò)最近,核心庫(kù)團(tuán)隊(duì)已經(jīng)很優(yōu)秀了,貌似沒(méi)有啥東西可再值得類(lèi)似的 fix it 了。
- 測(cè)試文化。單元測(cè)試覆蓋率可能接近 100%,我們有持續(xù)構(gòu)建/整合/測(cè)試,還有知名的 “Testing on the Toilet” (請(qǐng)參見(jiàn)Google Testing Blog)
facebook 呢? 又有什么不一樣
- 開(kāi)發(fā)對(duì)質(zhì)量負(fù)責(zé): 開(kāi)發(fā)從設(shè)計(jì),實(shí)現(xiàn),測(cè)試,到部署都要自己做。其它做工具,流程的工程師通過(guò)開(kāi)發(fā)工具和流程來(lái)幫助開(kāi)發(fā)人員更為簡(jiǎn)單方便地做測(cè)試,做部署和做監(jiān)控。每個(gè)開(kāi)發(fā)人員有自己?jiǎn)为?dú)的測(cè)試環(huán)境,測(cè)試環(huán)境就是運(yùn)行在開(kāi)發(fā)本地機(jī)器上,部署非常簡(jiǎn)單快速。測(cè)試環(huán)境用的是真實(shí)的用戶(hù)數(shù)據(jù)。
- 持續(xù)集成和測(cè)試自動(dòng)化:每周發(fā)布一次。星期天晚上,要發(fā)布的構(gòu)建從主線(xiàn)上分支出來(lái)到發(fā)布分支,到星期二的中午如果沒(méi)有大的問(wèn)題,就可以上線(xiàn)了。所有的測(cè)試運(yùn)行控制在10分鐘以?xún)?nèi),所以不需要考慮不運(yùn)行哪些測(cè)試用例。運(yùn)行所有測(cè)試用例。 (只是聽(tīng)說(shuō),沒(méi)有經(jīng)過(guò)考證。)
- 嚴(yán)格實(shí)施代碼審計(jì):在Facebook 做 code review時(shí)間大約占50%,管理者對(duì)代碼質(zhì)量負(fù)有一定責(zé)任 。甚至代碼質(zhì)量高于一切:Facebook Code review是重點(diǎn)KPI考核的對(duì)象,實(shí)行連坐制,如果因?yàn)榇a質(zhì)量問(wèn)題,那么產(chǎn)生的KPI責(zé)任包括領(lǐng)導(dǎo)30%、程序員50%、審核人員20%。 在代碼checkin之前,都要由專(zhuān)人進(jìn)行review。Facebook 創(chuàng)始人兼 CEO 馬克扎克伯格會(huì)親自對(duì) News Feed 每個(gè)代碼更新把關(guān)。在 Facebook,所有重大升級(jí)的代碼都進(jìn)行強(qiáng)制評(píng)估,任何一個(gè)改動(dòng)都至少由一人把關(guān)。但是,無(wú)論工程師對(duì) News Feed 做出任何改動(dòng),都將由扎克伯格親自把關(guān)。
- 內(nèi)測(cè) (dog food):發(fā)布之前,公司員工使用要發(fā)布的功能。2-3天之內(nèi)可以有幾百個(gè)或上千個(gè)人在使用新功能。負(fù)責(zé)要發(fā)布功能的開(kāi)發(fā)人員在星期天晚上到星期二中午之間會(huì)做大量的測(cè)試 。
- 通過(guò)灰度發(fā)布控制風(fēng)險(xiǎn):新功能本身質(zhì)量可能有問(wèn)題,新功能也可能影響其它現(xiàn)有功能。為了減少或控制這些風(fēng)險(xiǎn)。Facebook開(kāi)發(fā)了一整套完善的發(fā)布,控制,監(jiān)控流程和工具。做到:1.測(cè)試通過(guò)后,產(chǎn)品質(zhì)量基本有保證。2.即使有漏測(cè)的bug,只會(huì)影響很少量的用戶(hù)。3.及時(shí)監(jiān)控到問(wèn)題。4.及時(shí)修復(fù)。
- 產(chǎn)品監(jiān)控:通過(guò)社區(qū)討論的正負(fù)面輿情,及與歷史應(yīng)用數(shù)據(jù)的對(duì)比情況,監(jiān)控產(chǎn)品的系統(tǒng)的運(yùn)行狀態(tài)技術(shù)修復(fù)。
thoughtworks 業(yè)界以敏捷著稱(chēng)的軟件企業(yè)又是如何改進(jìn)的
thoughtworks
- 項(xiàng)目的初期,dev,BA,QA就會(huì)做到一起IPM,讓不同的角色都能了解story,讓dev盡早的分析story以及采用那種技術(shù)去完成工作。
pair
- 開(kāi)發(fā)階段,dev會(huì)采用pair的方式,和QA,其他dev共同完成story,這樣的好處是,一讓不熟悉的新人盡快的了解項(xiàng)目架構(gòu),二與QApair,QA將會(huì)提供dev考慮不足的點(diǎn),一起編寫(xiě)單元測(cè)試以及feature test。
- 當(dāng)dev完成代碼工作后,會(huì)在github上發(fā)出pull request 或邀請(qǐng)其他dev,一起評(píng)審代碼。
- 各個(gè)項(xiàng)目都有自己完備的cd流程,確保發(fā)布過(guò)程的正確性,減少人為手工操作的失誤。
從以上業(yè)界代表公司的改進(jìn)方式,我們可以看出它們都是從以下幾點(diǎn)出發(fā)的:
UI自動(dòng)化測(cè)試的覆蓋率很難被保證,不斷的改變的ui,使使用UI測(cè)試來(lái)驗(yàn)證產(chǎn)品的功能變得十分麻煩,但是單元測(cè)試則不同,各種語(yǔ)言都有自己的測(cè)試工具以及測(cè)試覆蓋率工具幫助我們更好的完善我們的代碼質(zhì)量,我們也可以用接口測(cè)試與pact測(cè)試來(lái)保證第三方集成服務(wù)的正確性,所以高覆蓋率的單元測(cè)試時(shí)產(chǎn)品的質(zhì)量的基礎(chǔ)。
facebook,google,微軟等公司嚴(yán)格的代碼審查機(jī)制,是確保代碼不被破壞的關(guān)鍵點(diǎn),不會(huì)因?yàn)閳F(tuán)隊(duì)成員的某次粗心的提交,造成整個(gè)項(xiàng)目的失敗。
強(qiáng)大的代碼分析工具
代碼級(jí)別的規(guī)范化,以及動(dòng)態(tài)與靜態(tài)掃描,進(jìn)一步的幫助軟件開(kāi)發(fā)人員、質(zhì)量保證人員查找代碼中存在的結(jié)構(gòu)性錯(cuò)誤、安全漏洞等問(wèn)題,從而保證軟件的整體質(zhì)量。與CI,CD的集成,能夠讓我們盡早的發(fā)現(xiàn)代碼中存在的錯(cuò)誤。
規(guī)范化的測(cè)試流程
各個(gè)公司規(guī)范化的測(cè)試流程,保證項(xiàng)目在每一階段都能夠輸出高質(zhì)量的代碼。
完善的風(fēng)險(xiǎn)控制,不僅僅表現(xiàn)的google與Facebook的A/B測(cè)試,也表現(xiàn)在當(dāng)有任何重大問(wèn)題時(shí),能夠隨意的切換到舊的版本,保證產(chǎn)品不因?yàn)樵搯?wèn)題,就造成宕機(jī)。
這些行業(yè)的巨頭,都有著非常強(qiáng)大的運(yùn)維團(tuán)隊(duì),從產(chǎn)品的開(kāi)發(fā)階段就開(kāi)始實(shí)施了各種監(jiān)控手段,監(jiān)控范圍包括編譯階段,部署階段,產(chǎn)品環(huán)境,硬件服務(wù)器的狀態(tài)等,幫助項(xiàng)目的中所有成員及時(shí)的發(fā)現(xiàn)產(chǎn)品中存在的問(wèn)題,快速跟蹤以及定位問(wèn)題。
最新內(nèi)容請(qǐng)見(jiàn)作者的GitHub頁(yè):http://qaseven.github.io/
總結(jié)
以上是生活随笔為你收集整理的QA seven's blog的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 通信大数据应用未来还有很大的想象空间
- 下一篇: 细节优化提升资源利用率