ITPub博客

首页 > 数据库 > 数据库开发技术 > 不加班的秘密

不加班的秘密

原创 数据库开发技术 作者:极客重生 时间:2021-08-08 12:09:14 0 删除 编辑




如果面试官问你:如何提高代码质量?  下面这些优化方法,可以提高代码质量,大厂都是这样做的,供你参考:


  • 做代码重构,尽量减少耦合性,尽量保证函数功能唯一性,保证函数精简,推荐看一下这篇文章: 经典永不过时!重温设计模式

  • 做代码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

后端技术趋势指南|如何选择自己的技术方向

经典永不过时!重温设计模式

原文作者:极客重生;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2021-01-23

  • 博文量
    165
  • 访问量
    67593