|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
×
代码审查(Code Review)是软件开发中常用的手段,和QA测试相比,它更容易发现和架构以及时序相关等较难发现的问题,还可以帮助团队成员提高编程技能,统一编程风格等。
$ e6 f- i0 a' R: \- F$ y4 C/ r S! b9 M6 k I [# e4 h1 [
1. 代码审查要求团队有良好的文化
$ g; a3 N9 n* l: D% w0 u3 g0 n
团队需要认识到代码审查是为了提高整个团队的能力,而不是针对个体设置的检查“关卡”。$ ^( a( N$ {! K
$ i/ T. y8 k" `) B1 a “A的代码有个bug被B发现,所以A能力不行,B能力更好”,这一类的陷阱很容易被扩散从而影响团队内部的协作,因此需要避免。3 o3 ~8 S5 }" z9 L1 x9 a$ g% c0 Y
5 r7 r p# b0 t) a/ ]- G/ u4 o
另外,代码审查本身可以提高开发者的能力,让其从自身犯过的错误中学习,从他人的思路中学习。如果开发者对这个流程有抵触或者反感,这个目的就达不到。
1 n& ~- k4 c: h( y4 y, u% @8 T) H9 L4 n" J
2. 谨慎的使用审查中问题的发现率作为考评标准
: a* x/ K) J( s6 B! L
( E7 y8 b d- ^# L9 e; A3 \ " U' b* V# t( n7 ]
- ^ k) K- |; w' B& g8 I' j9 Z9 R0 l* R/ ^7 d, L: ~
$ K% d6 f" N: M) B- s/ c1 z% o
3 K5 [- G8 h& K 在代码审查中如果发现问题,对于问题的发现者来说这是好事,应该予以鼓励。但对于被发现者,我们不主张使用这个方式予以惩罚。软件开发中bug在所难免,过度苛求本身有悖常理。更糟的是,如果造成参与者怕承担责任,不愿意在审查中指出问题,代码审查就没有任何的价值和意义。
L+ t7 Q% {# d9 J5 H, R6 {: K u( u9 [4 R+ |0 f
3. 控制每次审查的代码数量
# b7 z6 |5 K" e: H+ z
3 g4 \7 Z# A# x* d3 Y( x( N 根据smartbear在思科所作的调查,每次审查200行-400行的代码效果最好。每次试图审查的代码过多,发现问题的能力就会下降,具体的比例关系如下图所示:
0 o+ A* d& i* h# r. ~8 u& e5 C6 n5 V
, f( {( S- R+ C: ]: ~ |
2 R# g- S# Q" K; D/ ^
; q ~4 X6 R$ V- n3 L " _: F4 K9 {; K" E: F) A
: { ?# {) [ m, D: f. ?5 s' B4 J 我们在实践中发现,随着开发平台和开发语言的不同,最优的代码审查量有所不同。但是限制每次审查的数量确实非常必要,因为这个过程是高强度的脑力密集型活动。时间一长,代码在审查者眼里只是字母,无任何逻辑联系,自然不会有太多的产出。
/ i( ~1 S; j0 e3 c
, ^# v- z8 n4 F* R \ 4. 带着问题去进行审查' o4 k# b/ M$ i) ^( Z
: U& O( |9 i+ r7 r9 I0 `7 t, e
我们在每次代码审查中,要求审查者利用自身的经验先思考可能会碰到的问题,然后通过审查工作验证这些问题是否已经解决。一个窍门是,从用户可见的功能出发,假设一个比较复杂的使用场景,在代码阅读中验证这个使用场景是否能够正确工作。
( v- }9 F" h% T: z& N6 ^! ?. w0 v& ~
使用这个技巧,可以让审查者有代入感,真正的沉浸入代码中,提高效率。大家都知道看武侠小说不容易瞌睡,而看专业书容易瞌睡,原因就是武侠小说更容易产生代入感。+ s4 v7 T! h! |0 C B
, D! q7 B, J6 ?" v& j 有的研究建议每次树立目标,控制单位时间内审核的代码数量。这个方法在我们的实践中显得很机械和流程化,不如上面的方法效果好。
% R+ n# ]6 ~4 h7 x0 B; W
4 s6 s+ X7 U* V2 L2 i9 m. G 5. 所有的问题和修改,必须由原作者进行确认
) q7 @2 W9 l [, @( ?- p. D, l0 L* R5 b" ]
如果在审查中发现问题,务必由原作者进行确认。
6 p% f4 d: r \: V# D; N" ? e* m5 Y) o: X* Y: h2 U% Q
这样做有两个目的:2 |) M( l$ h8 ?0 k) T3 Y" w
3 [7 } v0 n" `6 x* |6 n
(1)确认问题确实存在,保证问题被解决
1 X, [ c6 J1 Q. U: _: g% O- s- P& l
(2)让原作者了解问题和不足,帮助其成长5 s! U- F* E1 n- y
# e b' Z) E4 ~# a& D$ f* c; C 有些时候为了追求效率,有经验的审查者更倾向于直接修改代码乃至重构所有代码,但这样不利于提高团队效率,并且会增加因为重构引入新bug的几率,通常情况下我们不予鼓励。0 | p4 ~- u( j, G- b
1 h2 q; |* Q& T9 _5 a# |5 ~9 h8 ` 6.利用代码审查激活个体“能动性"1 E0 e }/ N% W$ x# R W
# t f; s: d7 n. g 即使项目进度比较紧张,无法完全的进行代码审查,至少也要进行部分代码的审查,此时随即抽取一些关键部分是个不错的办法。
5 w* n% {1 q1 H$ o; R" J! H* X- S8 Y6 Q
背后的逻辑是,软件开发是非常有创造性的工作,开发者都有强烈的自我驱动性和自我实现的要求。让开发者知道他写的任何代码都可能被其他人阅读和审察,可以促使开发者集中注意力,尤其是避免将质量糟糕,乃至有低级错误的代码提交给同伴审查。开源软件也很好的利用了这种心态来提高代码质量。
2 H( O2 A" p% S7 I/ G$ V, f% B$ P5 k8 B3 {; }% @
7.在非正式,轻松的环境下进行代码审查; w3 V8 h0 z3 i$ p: u+ B
* e) v( @% i3 K0 o1 ^4 t
如前所述,代码审查是一个脑力密集型的工作。参与者需要在比较轻松的环境下进行该工作。因此,我们认为像某些实践中建议的那样,以会议的形式进行代码审查效果并不好,不仅因为长时间的会议容易让效率低下,更因为会议上可能出现的争议和思考不利于进行如此复杂的工作。+ e8 B* T V3 n5 L/ K
3 n+ z% h1 p5 \
8.提交代码前自我审查,添加对代码的说明& V7 j! |% t# {3 |
- h' G+ \* r1 G4 G; l( U
所有团队成员在提交代码给其他成员审查前,必须先进行一次审查。这次自我修正形式的审查除了检查代码的正确性以外,还可以完成如下的工作:
. a5 M+ z- A% W( q4 u) X( }# M+ R! M2 J- X& ]/ {
(1)对代码添加注释,说明本次修改背后的原因,方便其他人进行审查。
: c; k6 ~- q: M/ I A' f( E. Q/ Z4 |1 m( A# k) H
(2)修正编码风格,尤其是一些关键数据结构和方法的命名,提高代码的可读性。/ @% Y7 B+ P( N1 R) \
9 y+ t: b/ c, s' c
(3)从全局审视设计,是否完整的考虑了所有情景。在实现之前做的设计如果存在考虑不周的情况,这个阶段可以很好的进行补救。
# m5 Q% B7 W- Y& h8 Z. @
1 Q; }1 k4 T& ^" _ 我们在实践中发现,即使只有原作者进行代码审查,仍然可以很好的提高代码质量。
' |4 C0 }/ C3 F, o; U8 L c k& y" w
9.实现中记录笔记可以很好的提高问题发现率7 k* N1 C8 ]% U8 \9 R ~. |
; \3 d5 ?( Q& V4 F: l 成员在编码的时候应做随手记录,包括在代码中用注释的方式表示,或者记录简单的个人文档,这样做有几个好处:) H- F3 F; S0 q# G
6 F7 P. M' u1 l8 h2 J
(1)避免遗漏。在编码时将考虑到的任何问题都记录下来,在审查阶段再次检查这些问题都确认解决。4 h3 ]8 C3 e# S/ u( t, W
+ T( c6 F, H( f( M y# k
(2)根据研究,每个人都习惯犯一些重复性的错误。这类问题在编码是记录下来,可以在审查的时候用作检查的依据。
( y( X7 Q$ n! P1 o" R0 z7 p
& P1 `! _/ b5 h (3)在反复记录笔记并在审查中发现类似的问题后,该类问题出现率会显著下降
- o- M! I1 a% j: a8 A7 D1 _6 T4 ?7 o' X2 v; X" \
10. 使用好的工具进行轻量级的代码审查& }+ I9 c" O. H% m& p% b& L+ @
4 u5 F6 J1 g4 }! y& Y
“工欲善其事,必先利其器”。我们使用的是bitbucket提供的代码托管服务。
# y0 M. S) S1 H/ d9 n+ g; o
) m, W, R' r1 H5 K1 q 每个团队成员独立开发功能,然后利用Pull Request的形式将代码提交给审查者。复审者可以很方便在网页上阅读代码,添加评论等,然后原作者会自动收到邮件提醒,对审阅的意见进行讨论。
2 F4 ?% p/ ?& z6 R( q' B
2 c( F* {% y u6 Q, ` 即使团队成员分布在天南海北,利用bitbucket提供的工具也能很好的进行代码审查 |
|