實踐中,質量保障體系的建設,主要針對兩個目標: 一是不斷提升目標業務測試覆蓋率,保障面向客戶的產品質量;二就是儘量的提升人效,加強迭代效率。而構建全鏈路質量卡點就是整個體系建設的核心手段。筆者用下圖來描述這整個鏈路:
git
能夠看到,雖然保障業務迭代的方向性正確排在最前面,但在具體操做上,這一步須要的是強化流程規範和構建企業文化,同時對各負責人技能培訓,能夠說多數是軟技能。而保障基礎代碼質量環節發力於自動化建設鏈路之始,是能夠經過技術手段來消滅潛在的質量問題,因此構建好的話能極大的下降心智負擔,很是值得關注。程序員
咱們都知道,代碼的好壞會直接影響到業務質量,團隊協做,以及後期技術債等。有一個經典的圖來描述代碼質量的好壞,當能深切表達程序員的心裏:
github
而同時咱們相信,絕大部分程序員都有追求卓越的初心,且會盡量的在本身能力範圍內編寫高質量的代碼。golang
可是,保障基礎代碼質量光靠程序員的我的素質必定是不全面,是人就會犯錯,可能會疏忽。咱們最須要的是一種自動化的機制來持續確保不出問題。這也是自動化的魅力,一次構建,持續收穫價值。工具
此類工具在業界通常叫linter,不一樣的語言有不一樣的實現。本文主要探究Go語言相關的。
在介紹相關工具以前,咱們先看看幾個經典的代碼壞味道:
這段代碼常規運行不會有問題,可是在一些場景下循環執行,那可能就會有問題了, 咱們來看看:
(注:ex2是上述代碼編譯出的可執行文件名字)
測試
很明顯,有句柄泄露。緣由也很簡單,http response的body沒有關閉。但這個關閉語句,一不注意也容易寫錯:
google
這時候若是百度掛了,上述程序程序就會由於空指針引用,形成非預期的panic,很是的不優雅。因此正確的作法應該是在err判斷以後再行關閉body(關於Client.Do 具體的各類限制,你們能夠參考這裏: https://golang.org/pkg/net/http/#Client.Do)編碼
如此種種,此類小問題在實際編碼活動中很是常見,且不容易一眼看出問題。甚至常規的測試可能也難檢測出來,可謂很是棘手。好在Go語言的開發者們爲咱們想到了這一點,內置工具鏈中的vet命令,就能方便的檢測到不少相似的問題。
指針
還好比下面的代碼場景,我在實際的測試用例和業務代碼都看到過:
blog
go vet 能夠很容易檢測出這個問題(其餘vet功能,能夠參考這裏: https://golang.org/cmd/vet/)。
go的工具鏈中,還有一個不得不提,那就是大名鼎鼎的go fmt,其了卻了其餘語言常常陷入的代碼風格之爭,是Go語言生態構建很是巧妙的地方。另外golint也是google主推的go語言代碼代碼風格工具,雖非強制,但強烈建議新項目適用。
上面主要說到Go工具鏈的內置工具,還有一些非官方的工具也比較有名,好比 staticcheck, errcheck在github上Star都較多。此類工具備個專門的的github庫,收集的比較全,參見 awesone-static-analysis
同時還有些項目旨在聚合此類工具,提供更方便的使用方式,以及一些酷炫的產品化。好比golangci-lint, 其衍生的商業化項目,能夠自動針對github PR作代碼審覈,對有問題的地方自動comments,比較有意思。
linter工具必須爲產品質量服務,否則就是作無用功。實踐中,咱們應該思考的是如何才能優雅的落地linter檢查,如何才能創建有效的質量卡點。
推薦針對PR,作代碼檢查,保障入庫代碼質量。基於PR作事情是我比較看好的,由於這是調動全部研發力量,自然契合的地方。且進一步講,這也是測試基礎設施更能體現價值的地方。
目前Github上有不少這方面的集成系統作的都比較好,可以快速的幫咱們落地PR測的檢查,好比Travis, Circle CI等。另外就是著名的Kubernetes社區,也自行構建了強大的Prow系統,其不光是基於CICD系統,還構建了chat ops模式,爲參與Kubernetes的社區的貢獻者提供了方便。
細看Kubernetes庫,會發現,其會針對每一個PR都作以下靜態檢查:
Kubernetes只利用了官方的幾款工具, 在檢測準確性上比較有保障。有了這些檢查點,也能倒逼研發人員關注提交代碼的質量,會迫使其在本地或者IDE上就配置好檢查,確保每次提交的PR都能經過檢查,不浪費CI資源。這也是合格工程師的基本要求。
高質量的代碼是業務質量保障的基礎。而編寫高質量的代碼是技術問題,同時也應該是企業文化問題。由於當你們都開始注重技術,注重代碼質量時,天然會朝着精益求精的路上行進,視糟糕的代碼爲仇寇。
個人一位老闆跟我說過,要作就作Number One。而在沒達到第一的時候,那就要向業界標杆看齊,好比Netflix,Google,Facebook等。當你們都很是注重本身代碼質量時,工程師纔有時間去關注解決更加系統性的問題,而不用一直在Low Level徘徊。筆者深覺得然。
Email: jinsdu@outlook.com
Blog: http://www.cnblogs.com/jinsdu/
Github: https://github.com/CarlJi