今天在公司内部分享了一篇关于 Code Review 的杂文,也算是对最近思绪的一个整理。
注:本文可能只有部分观点是正确的。
正文:
any上面这些数据无法用来衡量一个人水平行不行、问题多不多;也不应该用来限制 PR 是否可以合并;Code Review 往往不能很精细地表现出它带来的好处,但参与者明显能感受到的是:整个系统的缺陷会减少、会更明显、更有序可控,会更利于持续迭代。
但所有的 comment 都是针对编码本身,而不是个体;每一个 comment 都是 “让代码变得更好的契机”,所以我们应敞开胸怀拥抱它。
应假设,每一条留言、回复都是对所有参与者的,而不仅仅是那个提交者,所以应对自己产生的信息负责(完整、可读、有效)。
@majunchen 这块代码写的真棒!希望它下次出现在大赏的屏幕上Code Review 是生产过程中的一个重要环节,合格的生产过程,更像是一种严谨完善的信息流走向。
所有人在合并的时候都使用 Rebase + Squash(合并提交)
比如 monorepo 下有很多个子应用,如果有一个 MR/PR 包含了 5 条 commit,每一条的 commit message 都是类似 feat: XXX page done 那么不使用 Squash,
就会导致 Master 分支的 Line 中出现的这 5 条信息,这会造成:
feat: XXX page done 那 Squash 也没啥用,因为合并后,从 Master 看依然不知道你这次提交到底是在哪个应用下做的改动。.dts” 这种事情存在。一个冰箱、洗衣机都会有说明书,说明书就是产品的一部分,一个软件也是。
CHANGELOG 和 README 就是一个软件的说明书,它们分别记录了一个软件的打开、使用方式,以及其至今为止的生命周期中经历过什么。
软件应该和冰箱洗衣机一样,不作 “下一个维护、消费代码的人一定有充足经验” 的假设。
CHANGELOG 在 GitHub 中有 Release Note 作为代替,但类似 Release Note 的记录形式并不随软件本身迁移,就像是你造的冰箱的使用说明书是电子版的,一个人必须要有 Kindle 才能看,这并不合理。
所以我认为:一个完整的软件应包含 “跟随软件本身的” CHANGELOG 和 README。
之前听大家说可以通过 VSCode 的插件精准地看到某个文件的某一行的最后修改的信息,所以 File header 并不必须,但我认为很有必要。
git 记录的信息是:
{谁} 在 {什么时候} {因为什么原因} {做了什么事} {会产生怎样的结果/副作用}{commiter} {time} {commit message & description}但 git 并不会记录:
File header 其实是 git 信息的一种互补,用于告诉别人,即便这个文件被很多人改了很多次,但你是最了解这个文件的人,下次有其他人在这里发现了问题可以第一时间找到你(或者你作为中转),而不是根据不那么精准的 git 提交记录信息(并且是依赖工具的)去挨个问。
如果说 git 是一种 “记录”,JSDoc 则是对文件本身的 “解释”。
所以 File header 和 JSDoc 都是有用的;
JSDoc 一个文件的说明书README.md 一个软件、模块的说明书CHANELOG 一个软件的的更新记录表它们都是一个软件本身的一部分,所以有很强的存在价值。
JSDoc 以前很重要的一些参数都被 TS 的类型代替了,所以 params return 之类注释的也许可以避免重复维护,但是 example、description 这些都依旧很实用。
详细可以参考: TypeScript + JSDoc = better-docs
any 类型另外,在任何的 TS 项目中可能都需要一个基本类型叫 declare type TODO = any 而不是无区别的 any 泛滥。
注意:这并不是某种社区标准,只是在实践过程中总结出的 “有用” 的一种 “技巧”。 相关讨论
绝大部分时候我们的 TODO 变成 any 后就真的一直 any 了,以至于到了后来我们已经分不清哪些 any是需要去完善的,哪些 any 是真的只能 any 的。
注释信息 TODO: 和 TS 类型别名 declare type TODO = any 的区别:
TODO:是一个可以用于标记 TODO 信息的注释标识,可以通过 IDE 搜索,或一些辅助插件统一地统计、检索整个系统中的 TODO 注释。declare type TODO = any 是一个 TS 中的类型别名, 是 “需要完善但目前没有条件完善的类型”,而原始 any 则很可能是 “本身就不需要消费/关心的类型”,这个类型别名的意义就在于区分代码系统中的哪些 any 真的就本该是 any,哪些 any 是当下偷懒/没条件需要今后补齐的 any。统计方式之别:
严谨的注释格式可以高效地对系统信息进行分级。
注释统一和分级:「怎么注释」 不如 「大家都用同一种格式来注释」 更重要。
建议格式:{全大写前缀}{半角英文冒号}{空格}{内容}
TODO: 需要 XXX @somebodyMARK: 此处可能需要优化不必要太复杂,有简单易理解的标识就足够
MARK: XXXMARK: 下次这里也这么做 @surmonNIP: XXXNIP: arr?.length 比 arr && arr.length 更简洁XXX为什么把枚举改为数字了?有何隐情?通过预置 MR 模板,可以约束提交者保证自己合进 Master 信息是规范的。
e.g.
Title:Feature: <XXX_App> <something>
Description:
1234567891011121314151617181920
### XXX 应用
**Feature**
- 增加了 XXX 模块的 XXX 业务
- ...
**Improve**
- 优化了 XXX 功能
- ...
**Bugfix**
- 修复了 XXX 的问题
- ...
**截图**
...
- [ ] 我确认已在描述中补充了截图(如果有)
- [ ] 我确认此 MR 已关联了相关的 Meego 链接
- [ ] 我确认自己的改动没有对全局产生预期外的副作用影响
附曾经参与的有参考意义的 PR 链接 。
完。
今天在公司内部分享了一篇关于 Code Review 的杂文,也算是对最近思绪的一个整理。
注:本文可能只有部分观点是正确的。
正文:
any上面这些数据无法用来衡量一个人水平行不行、问题多不多;也不应该用来限制 PR 是否可以合并;Code Review 往往不能很精细地表现出它带来的好处,但参与者明显能感受到的是:整个系统的缺陷会减少、会更明显、更有序可控,会更利于持续迭代。
但所有的 comment 都是针对编码本身,而不是个体;每一个 comment 都是 “让代码变得更好的契机”,所以我们应敞开胸怀拥抱它。
应假设,每一条留言、回复都是对所有参与者的,而不仅仅是那个提交者,所以应对自己产生的信息负责(完整、可读、有效)。
@majunchen 这块代码写的真棒!希望它下次出现在大赏的屏幕上Code Review 是生产过程中的一个重要环节,合格的生产过程,更像是一种严谨完善的信息流走向。
所有人在合并的时候都使用 Rebase + Squash(合并提交)
比如 monorepo 下有很多个子应用,如果有一个 MR/PR 包含了 5 条 commit,每一条的 commit message 都是类似 feat: XXX page done 那么不使用 Squash,
就会导致 Master 分支的 Line 中出现的这 5 条信息,这会造成:
feat: XXX page done 那 Squash 也没啥用,因为合并后,从 Master 看依然不知道你这次提交到底是在哪个应用下做的改动。.dts” 这种事情存在。一个冰箱、洗衣机都会有说明书,说明书就是产品的一部分,一个软件也是。
CHANGELOG 和 README 就是一个软件的说明书,它们分别记录了一个软件的打开、使用方式,以及其至今为止的生命周期中经历过什么。
软件应该和冰箱洗衣机一样,不作 “下一个维护、消费代码的人一定有充足经验” 的假设。
CHANGELOG 在 GitHub 中有 Release Note 作为代替,但类似 Release Note 的记录形式并不随软件本身迁移,就像是你造的冰箱的使用说明书是电子版的,一个人必须要有 Kindle 才能看,这并不合理。
所以我认为:一个完整的软件应包含 “跟随软件本身的” CHANGELOG 和 README。
之前听大家说可以通过 VSCode 的插件精准地看到某个文件的某一行的最后修改的信息,所以 File header 并不必须,但我认为很有必要。
git 记录的信息是:
{谁} 在 {什么时候} {因为什么原因} {做了什么事} {会产生怎样的结果/副作用}{commiter} {time} {commit message & description}但 git 并不会记录:
File header 其实是 git 信息的一种互补,用于告诉别人,即便这个文件被很多人改了很多次,但你是最了解这个文件的人,下次有其他人在这里发现了问题可以第一时间找到你(或者你作为中转),而不是根据不那么精准的 git 提交记录信息(并且是依赖工具的)去挨个问。
如果说 git 是一种 “记录”,JSDoc 则是对文件本身的 “解释”。
所以 File header 和 JSDoc 都是有用的;
JSDoc 一个文件的说明书README.md 一个软件、模块的说明书CHANELOG 一个软件的的更新记录表它们都是一个软件本身的一部分,所以有很强的存在价值。
JSDoc 以前很重要的一些参数都被 TS 的类型代替了,所以 params return 之类注释的也许可以避免重复维护,但是 example、description 这些都依旧很实用。
详细可以参考: TypeScript + JSDoc = better-docs
any 类型另外,在任何的 TS 项目中可能都需要一个基本类型叫 declare type TODO = any 而不是无区别的 any 泛滥。
注意:这并不是某种社区标准,只是在实践过程中总结出的 “有用” 的一种 “技巧”。 相关讨论
绝大部分时候我们的 TODO 变成 any 后就真的一直 any 了,以至于到了后来我们已经分不清哪些 any是需要去完善的,哪些 any 是真的只能 any 的。
注释信息 TODO: 和 TS 类型别名 declare type TODO = any 的区别:
TODO:是一个可以用于标记 TODO 信息的注释标识,可以通过 IDE 搜索,或一些辅助插件统一地统计、检索整个系统中的 TODO 注释。declare type TODO = any 是一个 TS 中的类型别名, 是 “需要完善但目前没有条件完善的类型”,而原始 any 则很可能是 “本身就不需要消费/关心的类型”,这个类型别名的意义就在于区分代码系统中的哪些 any 真的就本该是 any,哪些 any 是当下偷懒/没条件需要今后补齐的 any。统计方式之别:
严谨的注释格式可以高效地对系统信息进行分级。
注释统一和分级:「怎么注释」 不如 「大家都用同一种格式来注释」 更重要。
建议格式:{全大写前缀}{半角英文冒号}{空格}{内容}
TODO: 需要 XXX @somebodyMARK: 此处可能需要优化不必要太复杂,有简单易理解的标识就足够
MARK: XXXMARK: 下次这里也这么做 @surmonNIP: XXXNIP: arr?.length 比 arr && arr.length 更简洁XXX为什么把枚举改为数字了?有何隐情?通过预置 MR 模板,可以约束提交者保证自己合进 Master 信息是规范的。
e.g.
Title:Feature: <XXX_App> <something>
Description:
1234567891011121314151617181920
### XXX 应用
**Feature**
- 增加了 XXX 模块的 XXX 业务
- ...
**Improve**
- 优化了 XXX 功能
- ...
**Bugfix**
- 修复了 XXX 的问题
- ...
**截图**
...
- [ ] 我确认已在描述中补充了截图(如果有)
- [ ] 我确认此 MR 已关联了相关的 Meego 链接
- [ ] 我确认自己的改动没有对全局产生预期外的副作用影响
附曾经参与的有参考意义的 PR 链接 。
完。