- 浏览: 327687 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (262)
- Java (20)
- 设计模式 (16)
- Oracle (13)
- Struts (1)
- 问题解决 (9)
- ibatis (2)
- Maven (5)
- Git (2)
- 实现原理 (6)
- 敏捷开发 (22)
- Spring (4)
- 算法 (8)
- MySQL (2)
- Java工具箱 (17)
- jQuery (1)
- 英语学习 (8)
- 杂谈 (15)
- 多线程 (15)
- Java解惑 (7)
- Linux (1)
- 重构36计 (6)
- 网络 (4)
- PHP (1)
- Socket (6)
- 面试 (1)
- JVM (14)
- 历史与故事 (5)
- 报表 (4)
- CMS (3)
- Windows (1)
- nginx (5)
- 架构设计 (7)
- RubyOnRails (2)
- Hadoop (8)
- Go (7)
- JS (1)
- Web (1)
- 项目实例 (5)
- ubuntu (4)
最新评论
-
jacking124:
按照你这个配置以后提示这个异常?Exception occur ...
Go语言学习:开发环境搭建及Hello World -
焦志广:
有请看http://jiaozhiguang-126-com. ...
Hadoop白皮书(1):分布式文件系统HDFS简介 -
w156445045:
Hadoop 有没windows环境下的配置呢,
谢谢。非常感 ...
Hadoop白皮书(1):分布式文件系统HDFS简介 -
xiangxm:
学习了。
Java 解惑知多少六 -
焦志广:
xhh_lite 写道怎么少了一个类?恩?不少啊,少那个类啊; ...
易学设计模式四 命令模式(Commond)
松结对和紧结对不一样,两个人不是总坐在一起随时发现问题解决问题,而是很短时间地坐在一起。其中在后检查点发生的主要事情有两个:一是看结果是否符合需求(做什么),而是看代码是否存在问题(怎么做),后者就是代码检查。
代码检查(也称代码审查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
代码检查(也称代码审查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
发表评论
-
测试驱动开发
2012-11-11 14:21 0测试驱动开发的一般流 ... -
Kent Beck : 领导的敏捷潮
2012-10-15 10:29 962Beck全家似乎都弥漫着技术的味道。生长在硅谷, 有着一个对无 ... -
什么是敏捷(下)(无住,不住于空,破空执,非法,非非法)
2012-10-09 14:23 926破除法执之后,很容易 ... -
什么是敏捷(上)(无住,不住于法,破法执)
2012-10-09 14:20 1024所谓无住,包括两个含义:不住于法,不住于空。前者比较好理解, ... -
敏捷开发与本能反应
2012-10-09 14:12 765经常听到有人提到敏捷开发与“本能反应”非常近似,比如凡事都需 ... -
敏捷的未来会怎样?
2012-10-09 13:49 373正法,像法,末法 任 ... -
敏捷开发之大型团队切分
2012-10-09 11:00 1070大型团队的切分 如果 ... -
敏捷开发加班吗?
2012-10-08 17:43 1697问题 敏捷开发加班吗? 楼下有人问到“敏捷和加班有什么关系 ... -
敏捷适合什么类型项目?
2012-10-08 16:44 1441问题 原来问题是这么写的:“一家企业既要过CMMI,又要过I ... -
敏捷开发智慧之:定不定流程和模板?
2012-10-08 15:45 920缘起 (立项时) 甲:“你们的设计文档打算怎么写?” 乙 ... -
敏捷开发智慧之写不写文档?
2012-10-08 15:17 717缘起 “我们产品已经做完了,客户说要补上需求文档,可我们只有 ... -
敏捷开发松结对编程之七问题集锦
2012-10-05 19:06 863人员与结构 在团队中使用层级结构,是否阻碍了个体与外界的沟通 ... -
敏捷开发松结对编程之四日常管理
2012-10-05 18:16 774团队中常见的一种情况 ... -
敏捷开发松结对编程之三共同估算
2012-10-05 14:58 813估算是经久不衰的管理 ... -
敏捷开发松结对编程之二计划设计
2012-10-03 22:30 746新人其实很少偷懒,因 ... -
敏捷开发松结对编程之一人员结构
2012-10-03 12:11 823传说中的结对编程,大致结构是两个人共用一台电脑,一个开发,一 ... -
敏捷开发心法之共振
2012-10-03 11:42 702共振 共振是以无我、 ... -
敏捷开发心法之无住
2012-10-03 11:33 841无住 在般若敏捷系列 ... -
敏捷开发心法之无我
2012-10-02 21:54 669做敏捷开发时间长了, ... -
敏捷开发松结对编程之六大型团队
2012-09-28 16:49 783松结对编程是小型团队 ...
相关推荐
结对编程(Pair Programming)是敏捷开发(Agile Development)中的一种实践方法,它是指两名开发者坐在一起,共享一台电脑,共同编写代码的过程。 结对编程的优点: 1. 提高代码质量:通过结对编程,可以减少编码...
极限编程是一种敏捷开发方法,它强调面对面的沟通,通过结对编程和 40 小时工作制来提高开发效率和代码的规范度。在本项目中,我们采用极限编程的方法,通过结对编程来提高代码的规范度和正确率,加大了开发效率。...
此外,结对编程还可以减少代码检查的时间和代码的学习成本,提高软件质量和开发效率。 在Java Web开发课程实践教学中,结对编程可以应用于项目驱动教学法。学生可以以“团队合作”的方式完成项目任务,并通过结对...
松结对编程和代码审查是敏捷开发中常见的实践,旨在提高代码质量和团队成员之间的知识共享。结对编程可以让两个开发者一起编写代码,一人打字,另一人审查,这种做法不仅可以减少错误,还能促进技能传授。代码审查则...
- **结对编程**:两个程序员共享同一台计算机,互相学习和检查代码。 - **测试驱动开发(TDD)**:编写测试用例先行,再编写满足测试的代码。 - **重构**:改进代码结构,保持代码的简洁性和可维护性。 【工具】 在...
XP包括一系列具体的实践,如持续集成、结对编程、重构、简单设计等。 #### 四、敏捷开发的优势 1. **提高产品质量**:通过持续的反馈和频繁的软件发布,可以更快地发现并修复问题。 2. **增强团队协作**:强调团队...
敏捷开发实践包括日常站会、计划会、结对编程、Code Review、Refactoring等。日常站会用于讨论团队成员的工作进度和问题。计划会用于讨论项目计划和任务分配。结对编程用于两个开发者共同完成一个任务。Code Review...
它强调通过严格的编程规范、测试驱动开发(TDD)、结对编程、持续集成等技术来提高软件质量。XP的核心实践包括:计划游戏、小发布、结对编程、持续集成、单元测试、重构、简单设计、YAGNI(你不会需要它)和ISP...
结对编程是敏捷开发中的一种实践,其中两位开发者共享同一台电脑工作,一个编码,另一个检查。这种做法可以提升代码质量,促进知识共享,并且可以提高工作效率。 6. 测试自动化(Test Automation) 测试自动化是指...
5. **结对编程**:两个程序员共享一个工作站,共同编写代码,可以提高代码质量,增强知识共享。 6. **看板系统**:可视化的工作流程管理工具,帮助团队跟踪任务状态,促进透明度和协作。 7. **回顾会议**:每次...
- **结对编程**:两个开发者共同在一个工作站上编写代码。 - **持续集成**:频繁地集成代码,并确保每次集成都能通过自动化的构建和测试。 - **重构**:定期重写代码以提高可维护性和可读性。 #### 四、Kanban 在...
其中,结对编程让两个程序员共享一个工作台,一起编写和审查代码,增强了代码质量和团队协作。持续集成则要求开发人员频繁地将代码合并到主分支,减少集成问题。简单设计强调在满足需求的同时保持设计简洁,避免过度...
在计算机科学领域,结对编程(Pair Programming)是一种软件开发实践,源于敏捷开发方法论,它提倡两个程序员在同一台电脑上共同工作,一人编写代码,另一人审查和提供反馈。这种协作方式旨在提高代码质量、减少错误...
- **XP(极限编程)**:注重编程实践,如结对编程、持续集成、测试驱动开发等,以提高代码质量。 3. **设计原则**: - **单一职责原则**:每个类或模块应只有一个职责,避免功能耦合。 - **开放封闭原则**:类或...
3. **结对编程**:两个开发者共享一个工作区,一人编码,另一人审查。这有助于即时代码审查,提升代码质量并促进知识共享。 4. **持续集成**:开发人员频繁地将代码合并到主分支,以尽早发现和解决问题。 5. **...
- 结对编程。 #### 三、敏捷测试简介 ##### 3.1 敏捷测试的概念 敏捷测试是指在敏捷开发模式中的测试活动。它包括单元测试(通常由程序员完成)和验收测试(通常由测试人员完成)。 ##### 3.2 敏捷测试的实质 ...
其中,极限编程(XP)作为敏捷开发的代表,进一步细化了敏捷原则,如短迭代周期、持续集成、单元测试和结对编程等,以提高开发效率和软件质量。 2. **极限编程(XP)** XP是敏捷开发的实践之一,它倡导通过一系列...
5. **结对编程**:两名开发者共享一个工作区,互相审查对方的代码,增强代码质量和团队协作。在C#中,这是一种提升代码质量、降低错误的有效方式。 6. **集体代码所有权**:所有团队成员都可以修改任何代码,鼓励...