不加班的秘密
如果面試官問你:如何提高代碼質量???下面這些優化方法,可以提高代碼質量,大廠都是這樣做的,供你參考:
做代碼重構,盡量減少耦合性,盡量保證函數功能唯一性,保證函數精簡,推薦看一下這篇文章:?經典永不過時!重溫設計模式
做代碼review,讓團隊幫忙發現問題。
做代碼靜態檢查, 看一下是否存在已知代碼風險,推薦 pclint,cppcheck,coverity等;
做代碼單元測試,檢查程序bug, C++ 推薦用Google-Test,保證覆蓋率達到95%以上。
做代碼內存泄漏檢查,檢查內存泄漏隱患,防止系統崩潰,C/C++推薦用valgrind;
做代碼自動化測試,讓每一次修改都有基本質量的保證;
做代碼長穩測試(長期穩定性壓測), 找出代碼隱藏bug;
下面會詳細解釋一下,其中比較重要的環節。
代碼review
代碼審查(英語:Code review)是指對計算機原始碼系統化地審查,常用軟件同行評審的方式進行,其目的是在找出及修正在軟件開發初期未發現的錯誤,提升軟件質量及開發者的技術。?代碼審查常以不同的形式進行,例如結對編程、非正式的看過整個代碼,或是正式的軟件檢查。
代碼review主要有以下目的:
發現錯誤:人都會不可避免的出現一些紕漏,而這些紕漏在另一個人眼中也許顯而易見。
健壯性檢查:代碼是否健壯,是否有潛在安全、性能風險。代碼是否可以回滾。
質量保證:在一般情況下,新提交的代碼一定需要寫測試,測試不只可以保證你的提交符合預期,還可以在后人改你的代碼時有一層保障。同時,MR 階段也有機器人自動檢查當前分支的測試覆蓋率是否低于主分支,當低于主分支時會標紅警示,但不會禁止 merge。
統一風格:對于整個團隊來說,代碼風格的統一很重要。風格統一除了人 Review,我們也引入了靜態代碼檢查,不符合團隊風格的代碼,是無法通過 CI 的。
完善注釋:包括 commit message、代碼中復雜實現是否有解釋性的注釋、緊急 hack 是否明確標注等。
互相學習
一些流行的代碼review工具:
Crucible:Atlassian 內部代碼審查工具;
Gerrit:Google 開源的 git 代碼審查工具;
GitHub:程序員應該很熟悉了,上面的 "Pull Request" 在代碼審查這里很好用;
LGTM:可用于 GitHub 和 Bitbucket 的 PR 代碼安全漏洞和代碼質量審查輔助工具;
Phabricator:Facebook 開源的 git/mercurial/svn 代碼審查工具;
PullRequest:GitHub pull requests 代碼審查輔助工具;
Pull Reminders:GitHub 上有 PR 需要你審核,該插件自動通過 Slack 提醒你;
Reviewable:基于 GitHub pull requests 的代碼審查輔助工具;
Sider:GitHub 自動代碼審查輔助工具;
Upsource:JetBrain 內部部署的 git/mercurial/perforce/svn 代碼審查工具。
代碼靜態檢查
靜態代碼檢測是指無需運行被測代碼,通過詞法分析、語法分析、控制流、數據流分析等技術對程序代碼進行掃描,找出代碼隱藏的錯誤和缺陷,如參數不匹配,有歧義的嵌套語句,錯誤的遞歸,非法計算,可能出現的空指針引用等等。統計證明,在整個軟件開發生命周期中,30%至70%的代碼邏輯設計和編碼缺陷是可以通過靜態代碼分析來發現和修復的, ?所以靜態代碼分析工具能夠幫助開發人員快速、有效的定位代碼缺陷并及時糾正這些問題,從而極大地提高軟件可靠性并節省開發成本。
靜態代碼分析工具的優勢:
1、自動執行靜態代碼分析,快速定位代碼隱藏錯誤和缺陷。
2、幫助代碼設計人員更專注于分析和解決代碼設計缺陷。
3、減少在代碼人工檢查上花費的時間,提高軟件可靠性并節省開發成本。
一些主流的靜態代碼檢測工具,免費的cppcheck,clang static analyzer,商用的coverity,pclint等,各個工具對比:
推薦 pclint,cppcheck,coverity等;
安全檢查
代碼檢查里面一般還包含一些安全檢查規則,檢查代碼是否存在安全漏洞,防止系統被入侵和攻擊。
單元測試
單元測試(英語:Unit Testing)又稱為模塊測試,是針對程序模塊(軟件設計的最小單位)來進行正確性檢驗的測試工作。程序單元是應用的最小可測試部件。在過程化編程中,一個單元就是單個程序、函數、過程等;對于面向對象編程,最小單元就是方法,包括基類(超類)、抽象類、或者派生類(子類)中的方法。
單元測試的意義
1.提高代碼質量:編寫測試用例會迫使開發人員仔細思考代碼的設計和必須完成的工作,進而會改善代碼質量。
2.簡化調試過程:開發人員可以測試單個模塊的功能,不依賴外部工程和數據源。
3.保證重構正確:單元測試可以有效地測試某個程序模塊的行為,是未來重構代碼的信心保證。
4.盡早發現問題:單元測試由功能對應的開發者完成,測試考慮的范圍更加全面,可以盡早發現大部分問題。
單元測試框架
C推薦用cmocka,google開源,功能豐富,C語言首選;
https://cmocka.org/?https://api.cmocka.org
C++ 推薦用 Google-Test,專業,強大,C++首選;
https://google.github.io/googletest/
python推薦pytest,pytest入門、擴展性最強;
go推薦goconvey;
java推薦JUnit or testNG;
代碼覆蓋率
代碼覆蓋率是一種通過計算測試過程中被執行的源代碼占全部源代碼的比例,進而間接度量軟件質量的方法,為了提高單元測試作用,單元測試需要保證代碼覆蓋率,一般是95%以上,盡量覆蓋所有分支,由于單元測試可以mock其他依賴,所以被測代碼的各種分支處理,理論上都是可以被覆蓋到的。
一般需要借助工具來進行覆蓋率檢查,如C/C++,python,go和Java等,都有相應的代碼覆蓋率測試工具:
Gcov是一個可用于C/C++的代碼覆蓋工具
Coverage是一個可用于Python的代碼覆蓋工具
JavaCodeCoverage是一個可用于Java的代碼覆蓋工具??????
golang test cover是一個可用于Go的代碼覆蓋工具
...
內存泄漏檢查
內存泄漏(英語:Memory leak)是在計算機科學中,由于疏忽或錯誤造成程序未能釋放已經不再使用的內存。內存泄漏并非指內存在物理上的消失,而是應用程序分配某段內存后,由于設計錯誤,導致在釋放該段內存之前就失去了對該段內存的控制,從而造成了內存的浪費。
C/C++
使用C/C++這類沒有垃圾回收機制的語言時,你很多時間都花在處理如何正確釋放內存上。如果程序運行時間足夠長,如后臺進程運行在服務器上,只要服務器不宕機就一直運行,一個小小的失誤也會對程序造成重大的影響,如造成某些關鍵服務失敗. 除了認真review代碼外,最靠譜還是結合valgrind工具掃描一下。
JAVA
Java的一個重要優點就是通過垃圾收集器(Garbage Collection,GC)自動管理內存的回收,程序員不需要通過調用函數來釋放內存。因此,很多程序員認為Java不存在內存泄漏問題,或者認為即使有內存泄漏也不是程序的責任,而是GC或JVM的問題。其實,這種想法是不正確的,因為Java也存在內存泄露,但它的表現與C++不同。
我們通常使用一些工具來檢查Java程序的內存泄漏問題。市場上已有幾種專業檢查Java內存泄漏的工具,它們的基本工作原理大同小異,都是通過監測Java程序運行時,所有對象的申請、釋放等動作,將內存管理的所有信息進行統計、分析、可視化。開發人員將根據這些信息判斷程序是否有內存泄漏問題。這些工具包括Optimizeit Profiler,JProbe Profiler,JinSight , Rational 公司的Purify等,檢查的主要原理就是暴露出所有堆中的對象,讓程序員尋找那些無用但仍被引用的對象。
GO
pprof,Memory Profiling:內存分析,檢查go語言代碼內存泄漏,在應用程序進行堆分配時記錄堆棧跟蹤,用于監視當前和歷史內存使用情況,以及檢查內存泄漏。
自動化測試
自動化測試就是將人工測試自動化,把測試能力復用起來,減少人為失誤(漏測),一般流程:
評審review新增測試用例
編寫自動化測試用例
搭建自動化測試環境
測試自動化測試用例
維護自動化測試用例
自動化測試前期投入比較大,是一種長期戰略,大廠正在推行的方向,當前測試人員要求不會像以前一樣,單純只負責測試,而是開始如下發展:
自動化環境搭建和維護
負責編寫自動化測試框架(開發)
編寫自動化測試用例
對外提供自動化測試接入接口
提供自動化測試統計和報告
自動化測試解放測試人員雙手,把軟件測試抽象成一種可以復用的能力,排除人為因素,長期來看,減少測試人力投入,降低了成本(理想是這樣),提高了軟件測試效率,保證軟件質量。
長穩測試
長穩測試主要目的檢查軟件長期運行的穩定性,這個對于后臺服務器和ToB業務來說都非常重要,質量就是生命線,每一次故障,都可能導致公司嚴重的損失,尤其是用戶量很大情況下,所以大廠都特別重視。
穩定性測試
穩定性測試是用來驗證產品在一定的負載下是否能夠長時間的穩定運行,其主要目的是驗證能力,并在能力的驗證過程中找到系統不穩定的因素并進行分析解決。
可靠性測試
可靠性測試就是采用特定的方法激活系統中的各種故障(FAULT),通過觀察失效(FAILURE)的發生情況來對系統容錯能力(故障定位、故障恢復、故障報告等)進行評估并利用該評估結果來推動產品持續減少失效的一種測試活動。
極限壓測
極限壓測,主要是采用極限規格情況下來轟炸系統,得出系統可承受值安全閾值,比如QPS,PPS,最大帶寬,CPU消耗,內存占用,處理耗時等指標,方便建立準確監控系統和擴縮容管理。
常見壓測工具:
最后
一般大廠都有效能團隊和質量團隊(QA),會有相應開發人員專門負責建設CI/CD 框架,會把上面的那些任務融入到流水線,自動化起來,用流水線方式讓每一次修改(每個版本)都有質量保障。
參考和擴展閱讀
https://www.zhihu.com/question/41089988
http://www.51testing.com/html/19/n-3709719.html
https://cmocka.org/?https://api.cmocka.org/
https://www.huaweicloud.com/articles/12602783.html
https://mp.weixin.qq.com/s/mtt68FfSaKZT4kCWYjMmyQ
https://testing.googleblog.com/2020/08/code-coverage-best-practices.html
http://en.wikipedia.org/wiki/Code_coverage
https://testerhome.com/topics/5757
https://segmentfault.com/a/1190000020211494
- END -
看完一鍵三連在看,轉發,點贊
是對文章最大的贊賞,極客重生感謝你
推薦閱讀
一文搞懂JAVA與GO垃圾回收
深入理解BPF、eBPF、XDP 和 Bpfilter
后端技術趨勢指南|如何選擇自己的技術方向
經典永不過時!重溫設計模式
總結
- 上一篇: 各路英雄齐聚BAT
- 下一篇: 如何阅读《深入理解计算机系统》?(文末送