`
qepwqnp
  • 浏览: 114838 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

敏捷质疑: 结对编程, 代码集体所有权

阅读更多

 

Q: 结对编程、责任共享,完全是胡说,代码找不到作者,开发人员哪里会有责任心!

A: 这个疑问基于一个假设: 开发人员的责任心来自于问责制度, 开发人员只有在恐惧的驱使下才会细心去编码.

我不知道你的职位是什么, 你或许是某个大中型企业的中高层领导, 或许手下有不少的人, 但你不会得到手下的尊敬, 他们只有"畏".

或许在对死亡之类的恐惧面前, 人类会爆发出强大的力量, 对于医疗系统, 军事系统, 心存敬畏之心是对的. 但日常生活中, 人们在荣誉而不是恐惧的驱使下, 更能发挥自己的潜能

Pair都希望通过展示自己的知识得到彼此的尊敬, 都希望代码轮转到其他同行手中时得到对代码质量的赞赏.

是的, 即使代码不署名, 团队依然清楚谁的代码写的好, 因为结对和轮换, 因为版本控制系统.

但是, 你, 管理者, 不需要知道哪块代码是谁写的, 不需要知道引起重大损失的Bug是哪个开发者引入的. 所有的事情都是整个团队一起完成的.

事实上, 你真正想知道的, 是整体上谁优秀, 谁需要提高, 或者谁真的不适合. 有其它比代码署名更好更有效, 而且不会把整个团队笼罩在恐惧的阴影下的方法.

 

Q: 那是什么方法?

A: 这涉及到整个考评体系的转变. 举个例子, 团队应该作为一个整体被考评, 客户的反馈, 带来的利润, 造成的损失, 都应该只到团队这一级, 荣辱与共.

团队内部每个成员的考评, 应该由团队自己完成, 成员之间经历了轮换结对, 谁优秀, 谁需要提高, 谁不适合, 都会有共识, 伪装不了.

 

Q: 你是说同行互评? 别扯了, 我只要弄好人际关系, 随你怎么评. 况且尤其是中国人, 抹不开面子, 怎么好意思当面说人家坏话.

A: 这是另外一个观念的转变, 必须借助于团队文化达成共识: 同行互评, 是帮助你发现自己的不足, 帮助你提高, 不是指责或贬低你. 如果你真的不合适, 同行互评会更快的让你认识到这一点, 从而努力提高或尽快选择其它的道路.

至于面子问题, 依然需要团队文化, 在秉承"沟通, 反馈, 勇气", 心态开放的团队里, 当面反馈反而更易接受.

另一方面, 大家都心智成熟, 如果一个人令周围的人都不爽, 难道真的因为面子的问题忍受下去?

 

Q: 怎么结对编程, 责任共享扯出这么大的动静来? 还要颠覆公司的考核体系?

A: 是的, 结对编程是 XP 实践中最具争议的一个. 反对它的开发者不在少数, 但更大的阻力来自老板的本能反对.

我们不幸生活在口号的时代. 或许领导们习惯了喊口号, 而从不考虑让口号"落地", 从不关注口号的实施. "合作"是不是能把耳朵磨出老茧的口号? 有什么具体行动? 结对编程就是最具体的一种合作啊.

老板们对它的质疑更多的是效率上. 其实就像TDD增加了整体代码量但不是工作量一样, 结对编程并非像直觉的那样降低了效率, 而是失之东隅, 收之桑榆, 甚至鱼与熊掌兼得.

几个俗套但不亲身体验就无法体会的论断:

  1. 不是总希望员工像驴一样干活不要偷懒吗? 为什么不让员工互相监督? 有人坐在旁边盯着你的屏幕, 你能上网,打游戏,和女朋友聊天? 天亮就干活,一直到天黑

  2. 不是总担心员工跳槽带来损失吗? 为什么不趁他还在的时候就让团队把他所有的知识都吸收干净?

  3. 不是总担心有人写烂代码吗? 不是一直觉得code review流于形式效果不理想吗? 还有比结对/轮换结对更彻底的code review形式吗?

  4. 不是总想取长补短, 优势互补吗? 不是总想达到"臭皮匠顶诸葛亮"的效果吗?

  5. 不是总担心新员工成长太慢吗?

  6. 不是总希望团队气氛融洽, 互帮互助, 没人跳楼吗?

 

Q: 我干嘛要把辛辛苦苦很多年积累的经验白白告诉别人? 我喜欢不可替代的感觉.

A: 是的, 本质上这是一个心理学和政治学的问题, 我也无法说服你. 但有几点, 还是要说一下.

  1. 独自解决一个别人无法解决的难题, 可以得到公司的承认; 把知识传授给团队, 至少也会得到团队的认可

  2. 解决已知问题的经验, 可以传授. 但当未知问题出现时, 多年的沉淀依然不可代替. 即使新手知道解决问题的一般原则, 真正熟练运用也需要岁月的历练.

  3. 如果你真的拥有智慧, 不必担心别人剽窃你的只言片语, 它们剽窃不了你的思想

如果你只是担心功劳会被别人抢走, 好吧, 我心理学和搞政治两方面都很差, 也没什么办法. 或许你可以坚持你不喜欢结对, 团队也不应该强求你结对.

 

Q: 有些老手不喜欢结对, 觉得新人不劳而获对他们不利, 不情愿, 怎么办?

A: 人们总是在心甘情愿的去做一件事的时候效率最高, 结对编程也应该遵循这个原则. 但并不意味着不做任何努力就放弃结对的纪律.

有些人可能凭直觉不喜欢结对, 但不曾真的尝试过. 你要想办法让团队的人真正花点时间试过, 再来下结论, 或许想法就会有所改变.

但实践初期, 有一个敏捷教练是有必要的. 结对涉及到人与人之间的合作, 性格的碰撞. 人的问题是最难缠的问题, 稍有不顺心, 就会夸大结对的负面效果, 比如彼此之间的争执, 互不相让等, 又或者总是由强势的人来主导, 平和的人总是被迫承担不喜欢的决定, 及它带来的后果.

敏捷教练可以发现这些问题的苗头, 并协助团队建立良好的纪律和习惯.

 

Q: 你刚才提到结对就是持续 Code Review, 可如果是两个新手结对, 代码质量还是得不到保证. 听说不鼓励新手结对, 是否真的?

A: 没什么真不真, 取决于你的资源情况. 两个经验丰富而又各有所长的人合作解决问题自然是最高效的. 现实生活中的最佳拍档不胜枚举, 甚至小说中人们也表达了对这种合作形式的强烈向往: 陆小凤与花满楼司空摘星, 楚留香与胡铁花姬冰雁, 四大名捕等.

然而确实团队中不是每个人都是楚留香. 事实上, 有经验的人能占到一半, 从而保证每对开发者都有一位经验丰富的人, 已经很不错了.

新人结对, 却也有另外一种效果, 以探索的方式成长, 虽然对团队短期的整体效率可能是个短板, 但对个人的成长, 会留下一些印象深刻的教训, 在未来的职业生涯中发挥作用.

有一些互相支撑的实践来提高新人结对的效率, 比如团队专用的开发空间, 实际上大家都坐在一间屋子里, 经验丰富的人听到新人Pair之间的讨论明显偏离正确的解决方案的时候, 随时可以加入讨论.

 

Q: 那互不相让怎么办?

A: 几种实践:

  1. 卷入更多的人讨论, 时间窗;

  2. 先选择其中一个人的意见做做看看;

  3. 不要选择夹生饭, 即妥协出来的方案通常集中了两种方案的缺点.

其实结对编程对开发者的冲击最大. 把你的工作重点从与机器打交道变成了与人打交道. 把你从虚拟的机器世界拉回到现实世界. 把程序员重新变回成"人", 练习人与人之间的交流.

工作上的争论, 对事不要对人.

 

Q: 强势的人主导怎么办?

A: 这个问题很快能够被整个团队发现. 团队需要和强势的人沟通, 提醒, 碰到问题不应该一味维护自己的方案. 但通常本性难改, 这时其他成员在发生此类问题的时候如果坚信自己的方案有可取之处, 要坚持不要放弃, 可以扩大讨论范围, 卷入更多的人讨论.

项目经理和初期的敏捷教练需要特别关注此类问题, 因为它有可能把结对变成假结对, 只是表面看是两个人.

 

Q: 难道一定要结对? 个人编码时代一样产生了无数优秀的软件, 而且更能体现作者的思想和个性.

A: "一定"这类词只应出现在几个基本定理中, 其它场合通常是错的, 而且总会给措辞追咬者提供把柄, 有时甚至你只是说某个东西好推荐使用, 他也能理解成你说的是"一定"要用某个东西

至少两个极端情形下, 结对并不强制:

  1. 复杂, 初期需要静心思考的问题, 可以分头行动, 各自有了理解或解决方案或时间窗到了再来讨论. 言语在思考的过程中也会帮忙, 但我们都知道对有些问题, 言语只会打扰思路.

  2. 一堆琐碎毫无技术含量的工作, 不得不手工完成, 只是考验耐心, 自然不妨分头行动, 效率肯定比结对要高

 

Q: 几对开发者同时讨论各自的问题, 太吵了!

A: 小点声.

 

Q: 又说Pair之间要交流, 要讨论以便周围的人听到后可以及时发现偏差以节省时间. 到底要小声还是要大声?

A: 安静的讨论

 

Q: 如果代码集体所有, 那某个模块出错,此时已经有超过5对开发者编辑过此模块代码,那么谁来改?

A: 团队来改. 如果要在某个模块上增加新功能, 此时已经有超过5对开发者编辑过此模块代码, 那么谁来添加?

 

Q: 我想修改某段代码, 想找原作者了解一下思路, 可根本不知道是谁.

A: svn praise/blame. 然而更应该发生的是:

  1. TDD, 一旦改错单元测试用例会给你反馈.

  2. 轮换结对编程, 可能很多人都清楚那段代码.

  3. 简单设计, 代码不应该太复杂

 

 

分享到:
评论

相关推荐

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

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

    Lab 1:结对编程实验报告.pdf

    在结对编程中,这可能涉及到两人一组,共同完成代码编写,互相审查对方的代码,以及定期交换角色以促进技能共享和理解。 2. 待求解问题描述与数学模型: 实验通常围绕一个特定的问题或挑战展开,例如设计一个算法...

    敏捷建模:极限编程和统一过程的有效实践———— 好东西!

    《敏捷建模:极限编程和统一过程的有效实践》是一本深入探讨敏捷开发方法的书籍,主要聚焦于极限编程(XP)和统一过程(RUP)这两种广泛应用的敏捷框架。在这个快速变化的IT行业中,敏捷方法论已经成为软件开发的...

    在复杂的项目开发中使用结对编程

    1. **提高代码质量**:结对编程通过实时的代码审查,能够及时发现并修正错误,从而显著提升代码质量和可维护性。 2. **增强团队协作**:结对编程促进了团队成员之间的交流和协作,有助于建立更加紧密的合作关系,...

    XP实践结对编程demo

    **结对编程(Pair Programming)**是极限编程(XP,Extreme Programming)中的一项核心实践,旨在提高软件开发的效率和质量。在这个过程中,两位程序员坐在同一台电脑前,共同编写代码,一人为主程序员(Driver),...

    论文研究-结对编程开发人员之间若干关系问题的探讨 .pdf

    结对编程强调的是两个人的协作,与传统方式相比,它允许通过团队合作来提升代码质量、促进问题解决速度,并降低因团队成员变动带来的风险。此外,结对编程还能提高团队成员之间的沟通和合作能力。 结对编程是极限...

    Addison Wesley - 结对编程启示录(手册)

    《结对编程启示录》是Addison Wesley出版的一本关于结对编程的实用手册,旨在帮助读者快速理解和掌握这种编程方法,以提升代码质量和开发效率。结对编程(Pair Programming)是极限编程(XP,Extreme Programming)...

    PairProgramming:结对编程实验室

    结对编程结对编程实验室

    结对编程技术与策略pdf

    2. **重构旧代码**:对于需要重构的现有代码,结对编程有助于理解原有代码的逻辑结构,并进行优化改进。 3. **调试与修复**:在遇到难以定位的bug时,结对编程可以帮助更快地发现并解决问题。 #### 七、结对轮转...

    交换编程-结对编程的延伸实践

    ### 交换编程—结对编程的延伸实践 #### 一、引言 交换编程作为一种新型的软件开发模式,是对结对编程的一种延伸和发展。本文旨在深入探讨交换编程的基本概念、实施背景及其在软件开发中的应用价值,并通过实例来...

    结对编程启示录

    结对编程,作为一种创新的软件开发实践,源自敏捷开发的理念,旨在提高代码质量和团队协作效率。"结对编程启示录"这本书深入浅出地探讨了这一主题,为小团队提供了宝贵的资源,帮助他们在有限的人力条件下产出高质量...

    捷建模-极限编程和统一过程的有效实践

    8. **集体所有权**:所有代码对团队成员开放,鼓励任何人修改任何代码。 9. **编码标准**:制定并遵循一致的编码规范,提高代码可读性。 10. **现场客户**:客户参与开发过程,提供实时反馈,确保软件符合需求。 另...

    敏捷方法 敏捷方法 敏捷方法

    敏捷方法在Ruby On Rails项目中的应用 一、敏捷方法概述 敏捷方法是一种基于迭代和增量式的开发方法论,强调团队...在BOSCO系统的开发过程中,敏捷方法和结对编程发挥了重要作用,帮助我们成功地开发了BOSCO系统。

    assignment-11:结对编程练习

    在IT行业中,结对编程是一种常见的软件开发实践,它强调两个程序员共同工作在同一台计算机上,一起编写和审查代码。这种协作方式可以提高代码质量、减少错误,并促进团队成员之间的知识共享。在这个“assignment-11:...

    敏捷开发和极限编程

    集体代码所有权,鼓励团队成员对所有代码负责;编码标准,保持代码一致性;隐喻,提供系统整体视角;可持续的速度,保持稳定的工作节奏,避免过度劳累;以及重构,持续改进代码质量。 敏捷开发和极限编程都注重人的...

    leetcode高频面试题-pair-programming:结对编程

    leetcode高频面试题内部结对编程资源 下面是我可以召集的进行结对编程会议的过程的记录。 :) 结对编程会话前的电子邮件 模板化电子邮件在结对编程会话发生的当天发送(周二/周四@下午 1 点,周日@上午 10 点) 模板...

    一种分布式网络环境下虚拟结对编程的设计方案.pdf

    实时语音通话模块允许结对双方进行实时的语音交流,而协同编程模块则涉及到代码的实时编写与编辑。在这样的系统中,两位开发者可以远程配对工作,共享屏幕,实时地看到对方的编码过程,并进行交流和协作。 此外,本...

    自组织团队与松结对编程 陈勇 2011-09-18

    松结对编程是一种灵活的结对编程方式,它结合了传统结对编程的优点(如代码质量的提升、知识的快速传播等),同时也允许一定的灵活性,以适应不同的项目需求和个人偏好。 **优势:** 1. **提高代码质量**:两个人...

Global site tag (gtag.js) - Google Analytics