`

敏捷开发松结对编程之五代码检查

阅读更多
松结对和紧结对不一样,两个人不是总坐在一起随时发现问题解决问题,而是很短时间地坐在一起。其中在后检查点发生的主要事情有两个:一是看结果是否符合需求(做什么),而是看代码是否存在问题(怎么做),后者就是代码检查。

代码检查(也称代码审查Code Inspection)是一种由来已久但是很神秘的东西,最初引入是在一些生命攸关、重大财产相关的软件开发中,典型的就是SSOS(美国航天飞机的软件),其每段代码都交由6个人审阅,方可入库。成果就是在1989年之前(之后笔者没有数据),SSOS在太空中失效次数只有一次。笔者亲身参与的代码审查活动包括某数字电视CA系统的代码审查(25个程序员只有1个测试,已用于CCTV)、某电信计费系统的代码审查(一周发现2400个缺陷)、某电信运维系统的审查(2天发现200个重要缺陷,其中1个已困扰团队5年)、某航空无损检测系统的代码审查(交付后一年内客户只发生一次失效)。

代码检查的基本原理就是相信人脑(而非人眼)是判断代码好坏的最好工具,比如如果代码中有一行:if (i == 1001) return die()的错误或非法代码,几乎无法经由测试包括自动测试发现,但肉眼却一目了然。

笔者曾编写过一个“复杂而彻底”的代码检查培训教材,但后来发现过于复杂而且还不彻底,所以作罢。下面将要介绍的是一种业余但却有效的代码审查方法。

-----------------------------------------------------------------------

程序员的质量观

有人曾把程序员分为四级:编写可用软件(大致是大学在校生的状态),编写可靠软件(大致是好一些的职业程序员的状态),编写精美软件(在简单性/可维护性/可复用性上有所突破),编写思想深邃软件(设计模式、MVC、JQuery及早期OLE、RPC等创始者所做的事情)。

但在现实中,却往往发现很多程序员停留在第一层次:“你测吧,测出缺陷来我改”“这个不用改也能运行”“这么编就是难读点而已”,师徒间的代码检查,就是把程序员从第一级别向上提高的过程。

第一段提到的25个程序员+1个测试人员的团队是01年我们所在的团队,当时保持了良好的质量风气。尤其由于大家知道没有测试人员擦屁股,留下缺陷相当于给自己找麻烦,所以大家不得不习惯自己动手防患于未然。这个产品后来发展势头很好,07年曾占据市场60%(之后不详)。

怎样检查

“高手本来自己就要开发很多代码,还要替新手检查代码,多花费时间啊……”这是一个常见问题,答案是:“每天,在后检查点,花费不超过15分钟时间,能看出什么来就说什么,时间到了就停。”

一般而言,大致每天高手能编写100多行有效代码(按分号计数),新手会多一些但也不超过200(他们编写代码比较费),也就是10个屏幕以内。有经验的人一定知道:高手看新手的软件,5秒钟就能发现问题。

常存在的一种情况是高手“看不懂”新手的代码,当然不是因为技术太精妙了,而是写得太乱了。但在松结对编程里边不存在,由于师傅徒弟天天在一起,这200行代码可谓一目十行,如果以往一直每天检查代码,那么里边存在的问题应该不会很多。

检查什么

这个是重点,整体包括:

1. 结构问题

代码最大的问题,不是一两个地方有技术缺陷,也不是业务逻辑错误,而是整个软件编写的不好。前两者都可以通过测试或使用来发现和更正,但后者就不同了。如果回想一下自己见过的各种烂摊子,是不是有同感?具体哪里有问题怎么改说不上来,就是整个软件看上去混乱无章,无从下手。

具体结构问题包括:重复拷贝代码(不封装函数,不用Template/泛型……),函数过长(超过一屏幕就叫过长),错误封装(不恰当的public/不用Interface/不内聚/强耦合/在类中封装了无关方法……),内容错误(多个无关类置于一个文件/不恰当的命名……)等等。

改正结构问题,是从编写可靠软件向编写精美软件迈进的重要方法。

(笔者博客中已经写了几个“编码简单性”的文章可供参考)

2. 业务逻辑问题

就是软件是否与需求的要求符合的问题。师傅和徒弟经常对业务需求的理解有差异,借此机会同步一下,必要时引入PO(产品经理/策划人员……)。

有人会说业务逻辑问题不是一测试就知道了吗?可是测试一般发生在很久以后,有些逻辑测试还需要一定的触发条件,而且测试只会发现失效(failure, 与预期不符)而不能发现缺陷(defect, 具体哪里出了错),等积累长了,谁也找不到原因了。

3. 编程素养问题

很多问题属于那种“这样也行那样也行”的状态,比如命名/初始值/缩进/断行……但是高手的做法总是比新手好一些。

比如bool result = true; 这句话就有问题,刚初始化就先宣布成功,必有隐患。这是一个真实案例,而下面也的确有一个分支错误地返回了这个true(实际案例是个HRESULT)。而发现这个问题,不是测试而是代码检查。实际上测试几乎发现不了这些问题,比如上面那段代码会在某文件打不开的时候错误地返回这个true,而在测试中几乎不会故事破坏那个文件来测试其结果。

实际使用时,不用拉太长的清单,师傅能想到的看到的告诉徒弟就行。

徒弟不需要学到天上去,只要能学到师傅那么好就可以了。之前在做CMMI咨询的时候我弄过一些检查表,推广均以失败而告终。那些表都是为了顶级安全性的软件考虑的,在普通项目里边使用是个灾难。

几个问题

1. 师傅天天检查,会不会很累?

检查不全是为了发现缺陷,而是为了提高成长。如果总是发现重复问题,此徒不可教。好学的徒弟有半年时间就能接近师傅了,考虑到师傅一般比徒弟多工作2年,我们因此让一个人加速1.5年。

2. 不会饿死师傅吗?

会,也不会。如果师傅止步不前,即使他不教别人,也迟早被人超越;师傅也是需要学习的。事实是会教徒弟的师傅才会学习,而会学习的师傅才会教徒弟。

3. 师傅跟谁学?

师徒制度是最底层团队制度(1个师傅+1~3个徒弟左右),其上还有更大的结构和更高的高手。我们之前曾把人员层次设为需指导的(徒弟)/可免于指导的(也是徒弟)/可提供指导的(师傅)/可培训的(团队最高级别的高手),最后一级需要定期与大家分享内容。

师傅作为高级技术人员,还享有机会外出培训/采购图书等待遇。

师傅自学也很重要,经验更是不可取代的。前事不忘后事之师,要把自己的经历和别人的经历都当作经验来看待。

4. 师傅努力编好自己的软件不久已经有很大贡献了,为何要帮助徒弟?

软件整体是一个串联系统,一个环节出了问题整个软件崩溃(Web软件好一些)。因此软件质量取决于最差的部分,而不是最好的部分。

代码审查的确会占用时间导致最好的部分变差,但却使最差的地方变得好得多,整体质量因此而得以提高。

------------------------------------------------------------

从工作层面讲,代码检查使得代码的质量尤其是结构质量,整体上保持在师傅可能达到的水平,从而保证了项目的成功。

从学习层面讲,代码检查使得徒弟可以不断/渐进地学习,从而花费远远低于师傅的时间成本达到更高层次。

心态是其中的关键。徒弟不能因此而觉得有一个后盾了可以放任存在问题等师傅发现,要珍惜师傅的时间,也要利用师傅的时间每次都学不同的内容;师傅也不能觉得徒弟学会了对自己是个威胁,威胁时刻都在,不来自于自己的徒弟,也会来自于别人的徒弟,唯有自我提高。

至此所有实践层面的内容基本上都写完了,下一篇将提到一些“139团队”的问题,所谓“139团队”就是一个使用松结对编程工作方式的大型团队。


ref:http://blog.csdn.net/cheny_com/article/details/6594507
分享到:
评论

相关推荐

    结对编程——敏捷开发.pdf

    结对编程(Pair Programming)是敏捷开发(Agile Development)中的一种实践方法,它是指两名开发者坐在一起,共享一台电脑,共同编写代码的过程。 结对编程的优点: 1. 提高代码质量:通过结对编程,可以减少编码...

    系统分析师-敏捷开发方法

    极限编程是一种敏捷开发方法,它强调面对面的沟通,通过结对编程和 40 小时工作制来提高开发效率和代码的规范度。在本项目中,我们采用极限编程的方法,通过结对编程来提高代码的规范度和正确率,加大了开发效率。...

    结对编程在Java Web开发课程实践教学中的应用.pdf

    此外,结对编程还可以减少代码检查的时间和代码的学习成本,提高软件质量和开发效率。 在Java Web开发课程实践教学中,结对编程可以应用于项目驱动教学法。学生可以以“团队合作”的方式完成项目任务,并通过结对...

    火星人敏捷开发手册 2012-12-25

    松结对编程和代码审查是敏捷开发中常见的实践,旨在提高代码质量和团队成员之间的知识共享。结对编程可以让两个开发者一起编写代码,一人打字,另一人审查,这种做法不仅可以减少错误,还能促进技能传授。代码审查则...

    深度讲解:Agile and Tooling敏捷开发与工具

    - **结对编程**:两个程序员共享同一台计算机,互相学习和检查代码。 - **测试驱动开发(TDD)**:编写测试用例先行,再编写满足测试的代码。 - **重构**:改进代码结构,保持代码的简洁性和可维护性。 【工具】 在...

    程序敏捷开发

    XP包括一系列具体的实践,如持续集成、结对编程、重构、简单设计等。 #### 四、敏捷开发的优势 1. **提高产品质量**:通过持续的反馈和频繁的软件发布,可以更快地发现并修复问题。 2. **增强团队协作**:强调团队...

    软件研发管理解决方案(敏捷开发).pptx

    敏捷开发实践包括日常站会、计划会、结对编程、Code Review、Refactoring等。日常站会用于讨论团队成员的工作进度和问题。计划会用于讨论项目计划和任务分配。结对编程用于两个开发者共同完成一个任务。Code Review...

    敏捷软件开发:原则、模式与实践

    它强调通过严格的编程规范、测试驱动开发(TDD)、结对编程、持续集成等技术来提高软件质量。XP的核心实践包括:计划游戏、小发布、结对编程、持续集成、单元测试、重构、简单设计、YAGNI(你不会需要它)和ISP...

    《敏捷教练之路》演讲PPT

    结对编程是敏捷开发中的一种实践,其中两位开发者共享同一台电脑工作,一个编码,另一个检查。这种做法可以提升代码质量,促进知识共享,并且可以提高工作效率。 6. 测试自动化(Test Automation) 测试自动化是指...

    敏捷开发--首席构架师

    5. **结对编程**:两个程序员共享一个工作站,共同编写代码,可以提高代码质量,增强知识共享。 6. **看板系统**:可视化的工作流程管理工具,帮助团队跟踪任务状态,促进透明度和协作。 7. **回顾会议**:每次...

    3 第三章 敏捷软件开发.pdf

    - **结对编程**:两个开发者共同在一个工作站上编写代码。 - **持续集成**:频繁地集成代码,并确保每次集成都能通过自动化的构建和测试。 - **重构**:定期重写代码以提高可维护性和可读性。 #### 四、Kanban 在...

    硝烟中的敏捷和xp 及 驱动测试设计

    其中,结对编程让两个程序员共享一个工作台,一起编写和审查代码,增强了代码质量和团队协作。持续集成则要求开发人员频繁地将代码合并到主分支,减少集成问题。简单设计强调在满足需求的同时保持设计简洁,避免过度...

    PairProgramming:CS 125 结对编程

    在计算机科学领域,结对编程(Pair Programming)是一种软件开发实践,源于敏捷开发方法论,它提倡两个程序员在同一台电脑上共同工作,一人编写代码,另一人审查和提供反馈。这种协作方式旨在提高代码质量、减少错误...

    结对_csdn

    在软件开发领域,“结对编程”(Pair Programming)是一种被广泛采纳的敏捷开发实践。它要求两名开发人员共同使用一台电脑完成编码工作。通常情况下,一名程序员担任“驾驶员”角色,直接在键盘上编写代码;另一名...

    敏捷软件开发:原则、模式与设计

    - **XP(极限编程)**:注重编程实践,如结对编程、持续集成、测试驱动开发等,以提高代码质量。 3. **设计原则**: - **单一职责原则**:每个类或模块应只有一个职责,避免功能耦合。 - **开放封闭原则**:类或...

    硝烟中的Scrum和XP高清敏捷开发介绍

    3. **结对编程**:两个开发者共享一个工作区,一人编码,另一人审查。这有助于即时代码审查,提升代码质量并促进知识共享。 4. **持续集成**:开发人员频繁地将代码合并到主分支,以尽早发现和解决问题。 5. **...

    敏捷测试理论与实践敏捷测试理论与实践

    - 结对编程。 #### 三、敏捷测试简介 ##### 3.1 敏捷测试的概念 敏捷测试是指在敏捷开发模式中的测试活动。它包括单元测试(通常由程序员完成)和验收测试(通常由测试人员完成)。 ##### 3.2 敏捷测试的实质 ...

    软件开发最前沿技术介绍

    其中,极限编程(XP)作为敏捷开发的代表,进一步细化了敏捷原则,如短迭代周期、持续集成、单元测试和结对编程等,以提高开发效率和软件质量。 2. **极限编程(XP)** XP是敏捷开发的实践之一,它倡导通过一系列...

Global site tag (gtag.js) - Google Analytics