怎么进行CodeReview

news/2024/7/8 3:20:07 标签: Code, Code Review, 代码规范

怎么进行Code review?

需求

  • 功能是什么?
  • 功能之外的需求
    • 可用性/易用性、
    • 可测试、
    • 目标性能、
    • 安全性、
    • 扩展性、
    • 可用性等
    • 监控、打点

设计

1. 方案设计是否合理

  1. 表定义:是否需要分库/分表?根据业务预期增长情况考虑、2~3年
  2. 缓存:Redis、本地缓存、
  3. Redis数据结构设计是否合理:zset、hash、string、set等
- 大key问题?
- 热key问题?
  1. 数据结构/模型定义
  2. 相关分层结构?
- 同样的代码逻辑是否集中在同一个服务/模块中,而不是零散在多个微服务、定时任务等多个地方?
- 读写DB、修改缓存是否集中的同一个服务和模块中
  1. 是否需要消息队列/异步等?

2. idl设计

  1. 接口设计是否合理,接口参数是否合理,
      1. 命名规范容易理解、
      1. 必要的注释、
      1. 是否容易使用,不容易误用、
      1. 是否方便测试
  2. 效率与性能:
  3. 是否具有可扩展?
  4. 怎么做到可扩展,一个建议是面向抽象/接口编程,而不是面向具体编程?比如我们设计接口的时候,不要固定具体类型、参数、字段;依赖外部组件的时候,依赖抽象接口,而不是依赖具体对象;
    比如下面的例子:
GetDenounceRecordsByInfoAndCtimeResponse GetDenounceRecordsByInfoAndCtime(
1
:GetDenounceRecordsByInfoAndCtimeRequest req)

struct GetDenounceRecordsByInfoAndCtimeRequest{
    1: DenounceType denounce_type,
    2: string info,
    3: i64 ctime,

    255: optional base.Base Base,
}

在我看来,上面的接口定义,就很死,不可扩展,如果后面想基于另外一个参数查询这个,就不好做了。需要定义另外一个函数。

上面这个如果是我会定义成这样:

GetDenounceRecordsResponse GetDenounceRecords(1:GetDenounceRecordsRequest req)

然后在request里面定义一些optional的条件字段,比如Info、Ctime、User、Mtime等。

性能和稳定性

  • 支持的qps是多少?
  • 响应速度:在qps达到一定量级时候,pct99响应时长是多少?
  • 索引
  • 缓存是否会存在大key问题?
  • 缓存是否会存在热key问题?

安全性

所有ugc内容,都需要检查输入数据是否安全。

  • 是否有sql注入
  • 是否有xss注入?
    • https://owasp.org/www-community/xss-filter-evasion-cheatsheet
  • csrf
  • 是否需要过词表、模型、审查?

编码

  • uber的go编码规范:
    • 中文: https://www.cnblogs.com/legendtkl/p/uber-go-style-guide.html
    • 英文: https://github.com/uber-go/guide/blob/master/style.md
  • 是否存在内存/goroutine泄漏?锁竞争?
  • sql语句是否合规?是否使用上索引?
  • 空指针?提示语不合法?
  • 代码是否具有可测试性?
  • 是否有魔数常量?
  • 代码是否适合修改、变更?控制开关等
  • 日志格式、等级是否规范等?

监控打点

  • 是否有监控、打点?
  • 数据统计&报表、

参考文献

  • Code Review Checklist: https://blog.csdn.net/lyjy1216102/article/details/89046655
  • https://github.com/uber-go/guide/blob/master/style.md

http://www.niftyadmin.cn/n/739350.html

相关文章

教你学用CURL命令 --- 命令行浏览器

转载自 http://bbs.et8.net/bbs/showthread.php?t568472 CURL? 嗯,说来话长了~~~~ 这东西现在已经是苹果机上内置的命令行工具之一了,可见其魅力之一斑 1) 二话不说,先从这里开始吧! curl http://www.yahoo.com 回车之后&am…

全局对象和函数内静态对象调用构造析构函数差异

全局对象和函数内静态对象调用构造析构函数差异 转自http://blog.csdn.net/mznewfacer/article/details/6897952 全局对象的构造函数将在main函数之前运行。析构在main函数之后运行。 函数内部的static对象的构造函数将在第一次调用该函数时调用,main函数结束之后执…

如何设置vs2005的环境变量

http://blog.163.com/ctct7833126/blog/static/1616246902012785567313/ 这篇文章主要写给那些以前没有用过VS2005的新手,同时也是自己学习经验的积累,高手就不用看了以免浪费您宝贵的时间。 在VS的工程中常常要设置头文件的包含路径,当然你可…

ubuntu14.04使用--字体

很多时候比如Flash插件或者其他界面中会出现小方格的空,表示无法显示字符,特别是在非英文字符,例如中,日,韩的字符。1、下载解压字体首先需要下载相应语种的字体。网上有很多的字体包,例如win7和winxp都有完…

ubuntu14.04-flash插件安装

我用的浏览器是chromiun浏览器,感觉这个浏览器比火狐浏览器好用的多。第一步、下载Adobe Flash Player并解压 tar xvfinstall_flash_player_11_linux.i386.tar.gz . 第二步、输入以下指令:sudo cp libflashplayer.so/usr/lib/chromium-browser/plugins/…

Ubuntu14.04--系统中解压rar和zip文件的方法

在Ubuntu系统中解压rar和zip文件的方法 大家在以前的windows系统中会存有很多rar和zip格式的压缩文件,Ubuntu系统默认情况下对这些文件的支持不是很好,如果直接用"归档管理器"打开会提示错误,因此今天跟大家分享一下如何在Ubuntu中…

Linux在C语言下的时区设置与修改(一)

清理当前使用底层OS适配库代码,代码中涉及到了utc时间和本地时间转换。 发现代码中时区设置有问题。 每次设置时区时都会调用tzset函数,然后直接使用被初始化后的全局变量timezone去和utc时间相加减得到本地时间。 但是问题来了,这样做真的…

Linux在C语言下的时区设置与修改(二)

前面说到是去同步时区的接口, 从同步的角度来讲,如何获取被设置后的时区,还有一个接口即gettimeofday, 这个接口不仅可以获取时区,posix标准似乎还很好心的在第二个参数中放置了可以用来获取时区和夏冬令时的tz参数&…