上周我粉刷了一下家中的厨房,这一过程使我联想到了结对编程。
我和我的搭档之前也有过装饰房间的经验,而且出来的效果也让我们感到十分自豪。但换成了我自己来做的话,尽管我具有良好的技能与知识,但最终的效果也不那么理想。我对此产生了疑问:为什么是这样?
原因在于,如果是我一个人在工作的时候,我会不自觉地变得有些懒散和松懈——只要出来的效果“够好”并且能正常工作,那就行了。而如果我的搭档也在身边,我就会和她争先恐后地去抢着拿装饰用的遮护胶带,因为我知道我们两个人一定能把工作完成得很出色。
一起工作能够让我们对工作的质量产生更大的自豪感,我们会发现自己变得更加用心,因为我们希望自己的搭档也能够为这项工作感到自豪。它的好处还不至于此,因为我们还能从中得到更大的乐趣。
当我不小心将油漆稍稍刷出了边界的时候,我才留意到之前的那位粉刷匠(可恶的前任房客)也把油漆漆出了边界,我只是重复了一个已经存在的问题。那么我有没有停下来去思考一下能否借此机会修复之前所发生的错误呢?没有,因为我的心里有个声音始终在提醒我:“我说过我今天必须要把事情做完”,因此我就把这一目标当作了最重要的事。由于我过于专注手头上的活,而没有想过我这样做会把事情弄得更糟,至少在下次解决问题之前还需要经过很长的时间。我没有在工作的进行中选择修复一些小问题,而是让问题雪上加霜,然后把这个问题丢到我的“琐事清单”中(这个清单只会越来越长,从来也不会变短)。
此外,我还使用了错误的油漆!其实我清楚地知道一个生气勃勃与充满活力的厨房应该使用什么样的油漆,我不需要一个“高级”粉刷匠或者装潢师来告诉我这一点。我只需要有一个人能帮一下我,或者让我去帮一个某个人也行,去跑一趟商店并买回正确的油漆就可以了。但现在我只能使用手上仅有的这种死板的白色油漆了。
当我的搭档下班后来到我房间的时候,他“检阅”了一下我的工作。他并没有指出粉刷出了边界的问题。是啊,何必要提它呢?他并不打算让我重做一遍,现在再指出这一点已经太迟了。这一点只能在下一次粉刷的时候作为“前车之鉴”了,但其实正如我之前所说的一样,并不是我不知道正确的做法是什么,我只是单纯的没有那么做。他也没有注意到我使用了错误的颜料,不过我还是诚实地告诉了他,因此他也做好了明年重刷一次的心理准备。
我最终完成了厨房的粉刷,它看起来还行,但我也并不会感到特别自豪。在工作结束后再让人检阅我的结果,只会放大我所范下的一些错误,让我感到难过。这些问题都应该在当场指出,事后诸葛亮于事无补,协作的效用是无可替代的。
单纯从结论来说,让两个人一起粉刷一间房间看起来似乎是在这件任务上花费了更多的时间,但这两个人也会受到彼此之间的鼓舞,而尽力高质量地完成工作。反之,一个人完成的工作结果虽然“还过得去”,但在一年之后又不得不重新来过。之前所谓的节省下来的时间最终也都消失不见了。
幸运的是,至少我们这对粉刷匠和装潢师都住在这个房间里,而且至少还要待上1年,希望到了那时还能够记得住从这次粉刷中所学到的东西。但如果因为某些原因,我们必须要搬离此处的话,那我们只能像那个可恶的前任房客一样,将这些问题留给新房客们去解决了。
结对编程
我相信你已经看到了,以上内容完全可以对应到结对编程中去。以下是由这次粉刷过程中所看到的一些关键点:
- 在工作中找到更强的自豪感
- 更强的动力
- 更高的专注程度(我前面忘了提到我在过程中一共有多少次停下来去查看我的Facebook帐号了……!)
- 减少了累积的技术债务
- 减少了缺陷与可笑的错误
- 减少了检阅与重做的时间
- 共同学习会使记忆更牢固
这些优点合在一起就会增加你所产出的代码的质量,而且还不需要你付出更多的时间。而且这些代码的知识现在就有两个团员能够理解,而不仅是你一个人。
结对编程的意义远不只是帮助初级开发者从高级开发者这里学到知识,它的意义在于共同打造一个解决方案。
如果以上这几点是结对编程所产生的结果,那就有必要看一下一个优秀的结对需要具备哪些素质。我与我的搭档能够配合无间并不是出于偶然,而是由于我们之间的关系存在一些重要的特性,才能够达到良好的效果。
良好的关系(relationship)合作关系(partnership)所需要的六个C。:
交流(Communication)—— 良好的合作需要沟通,而不是在搭档犯错的时候袖手旁观,而在之后每次出现意见分歧的时候就旧事重提!此外,也不要一个人在那里安静地忙着粉刷,否则你的观察者会很快停止对你的关注。你应该做的是,一边工作一边保持沟通,让搭档有机会表达意见。这样你也能够受到鼓舞和激励,因此你们也能够为一些大工程共同分担责任。
自信(Confidence)——在与搭档合作时,要有自信能够解决所遇到的障碍,也要能够承担风险。此外,不要担心某些建议或许看起来很傻就不去提,如果两人中有一个人因为不安而感到拘束,这种结对就不是很高效。
Ron Jeffries在这里(浏览文件最下方)讲了一个很好的故事,那是他首次进行结对编程的经历,他从一位“傲慢的”年轻人那里学到了不少东西。你要意识到你为你的搭档所带来的价值,即使你的搭档比你更资深。先不说别的,即使是开口问一些很“傻”的问题也会带来很大的好处,它会挑战开发者所坚持的一些假设与习惯。人们不会因为你提出了一些有助于他们清空固有的己见就对你咆哮的!
妥协(Compromise)—— 为了对自信加以平衡,你必须做好妥协的准备。在你们的工作不断推进的同时,你也要保持开明,并准备接受彼此的意见与风格。即使你认为你知道最快的解决方法,也应将你的搭档的想法作为一种选择。因为对新意见的接受和促进会使你得到双倍的具有创造力的观点,而不是减半。
舒适(Comfortable)—— 请放轻松。对搭档的反馈要表现得积极、耐心和大方。重要的一点是要建立起一种良好的关系,使你们都能够没有顾虑地表达出想法。当然,这还取决于你们的空间有多大,请保证你坐姿舒适,有足够的地方放置玻璃酒水杯,能清楚地看到显示器,而且你们两人都能很方便地操作电视遥控器键盘和鼠标。
改变(Change)—— 结对编程的方式有多种,它们都强调了作出改变的重要性。
如果在结对编程中应用番茄工作法技术(Pomodoro),那就需要你们有规律地互换你们的角色,这可以始你们保持醒觉,并且更加投入。
如果使用乒乓(Ping Pong)结对编程方法,那么其中一人要编写单元测试,而另一个人要编写出通过该测试的代码。频繁地进行角色互换仍然非常重要,你依然可以使用番茄工作法来使这一过程正规化。
我的搭档不愿意接受拆开组合而换一个新搭档,但你毕竟需要保证事物的新鲜感。 我鼓励交换搭档,因为如果你每天都和同一个人进行结对,迟早你们会开始上火。好的做法是在团队之内进行轮换,每隔一日或者半日彼此交换任务,以此对团队中正在开展的工作都做到心里有数。这一点是实现知识共享和跨技能工作的最高方式,经过证实,这种方法能得到非常好的结果。
尝试一下(Give it a Chance)—— 如果你从来没有尝试过结对编程,接受这一过程或许不是非常自然。要你接受它,承诺会在一个月的时间内进行尝试,并接受这种方式并不容易。在最糟糕的情况下,你可能会对它感到厌恶,并且这个月的效率很低下。但在最好的情况下,你会接受这种方式,并且整个团队都将更为专注和得到鼓舞,团队成员们将为你们所共同努力得到的成果感到自豪。
开始尝试
我们已经表明了结对编程带来的各种好处:高标准、共同责任感以及乐趣!但是你需要为进行结对做好准备。仅仅是让两个人一起坐在显示器前面并不会让这一切自动发生,只要一点点努力,小心仔细地检查和接受它,这一切就会开发发生。
如果你和你的团队已经决定要采用结对编程,这里有些很好的资源能够帮助你们开始这一过程,举例如下:
相关推荐
我的第一次Pair(PairProgramming的简称,即结对编程。后面都是用Pair代替)是在ThoughtWorks公司面试进行的。那次,他们来自英国的项目经理Andy面试我,和我一起进行Pair。Andy问我以前是否Pair过,我说:“没有,...
**结对编程(Pair Programming)**是极限编程(XP,Extreme Programming)中的一项核心实践,旨在提高软件开发的效率和质量。在这个过程中,两位程序员坐在同一台电脑前,共同编写代码,一人为主程序员(Driver),...
标题"pair-copula.rar_pair copula程序_pair copula算法_pair-copula_paircopu"提及的核心元素是"Pair Copula",这是一个统计学概念,尤其在金融工程、风险管理和数据分析等领域广泛应用。"rar"通常表示这是一个压缩...
C++中的Pair类型是STL(Standard Template Library,标准模板库)中的一个模板类,用于存储一对值。每个Pair对象可以存储两个数据值,这两个数据值的类型可以相同也可以不同。Pair广泛应用于需要将两个相关数据组合...
1. a quick start to know what's pair programming 2. 我们为什么需要结对编程? 3. 我们应该如何进行结对编程?
结对编程结对编程实验室
结对编程(Pair Programming)是敏捷开发(Agile Development)中的一种实践方法,它是指两名开发者坐在一起,共享一台电脑,共同编写代码的过程。 结对编程的优点: 1. 提高代码质量:通过结对编程,可以减少编码...
在C语言中,没有内置的`pair`类型,但我们可以自己创建一个结构体来模拟这种类型,以便在程序中组合不同类型的值,如整型和字符串。`pair`类型通常用于表示两个相关联的数据项,这在算法和数据结构中非常常见。下面...
分钟内到达,否则将被锁在房间外 模板位于 Streaks Gmail 共享 Pathrise 帐户中 在结对编程会话之前要做的事情 找到一个问题来询问会话。 我这样做... 去leetcode并按标签过滤问题(寻找出现频率高的POPULAR问题) ...
结对编程专业
socketpair,binder
the cable, this suggests that a 4-pair system is a necessary solution. • In the case of maximum delivered power, 4-Pair PoE can deliver about 50% more power than a 2-Pair PoE system. • This ...
结对编程(Pair Programming)是敏捷开发方法论中的一种实践,源自极限编程(Extreme Programming, XP)。这种工作模式要求两名程序员共享同一台计算机,一人作为“驾驶员”编写代码,另一人作为“观察员”或“导航...
通过阅读"Pair Programming Illuminated",读者不仅可以理解结对编程的理论基础,还能掌握实施这一实践的具体步骤。对于希望提升团队效率、改善代码质量的小型IT团队来说,这是一本不可多得的参考资料。
"Could not generate DH keypair" 是一个在使用Diffie-Hellman密钥交换协议时常见的错误消息。这个错误通常出现在尝试建立安全连接,比如HTTPS、SSH或者FTP等使用公钥加密技术的应用中。Diffie-Hellman(DH)是一种...
在计算机科学领域,结对编程(Pair Programming)是一种软件开发实践,源于敏捷开发方法论,它提倡两个程序员在同一台电脑上共同工作,一人编写代码,另一人审查和提供反馈。这种协作方式旨在提高代码质量、减少错误...
本主题聚焦于一种特定的损失函数——N-pair Loss,它是在深度度量学习中广泛使用的改进版三元组损失。深度度量学习旨在学习特征表示,使得同类样本之间的距离小于不同类样本的距离,以此实现高效的分类或检索任务。 ...
介绍socketpair的一些应用,并共享到两个独立的程序中进行便捷的通信应用。 鉴于最近了解相关细节时,苦于自身人肉能力有限,没找到好的例子,为此特别在试验之后与大家分享一下相关内容 readme将有简单说明