社交编码|结对编程
极限编程之社交编码
观看本视频后,你将能够:
描述社交编码原则,并认识到结对编程如何创造出更好的代码以及培养更优秀的程序员。
什么是社交编码?
我喜欢把它称为 “内部开源”。
社交编码是开源社区多年来一直在做的事情。
新的变化在于将这些概念引入企业,并以社区的形式在内部项目中进行编码。
过去,开发人员在私有代码库中工作,只有团队成员才能进行代码贡献。
一切都由访问控制列表和严格的 “需要知道” 原则控制。
这样做的问题在于,没人知道你正在进行相关工作,所以代码复用根本不可能,因为没人知道这些代码的存在。
因此,企业不断地重复造轮子,因为没人知道轮子已经被造出来了。
在社交编码模式下,代码库是公开的,并且鼓励每个人复刻代码并进行贡献。
这是一种截然不同的思维方式。
开发团队往往会认为 “这是我的代码,其他人不许碰”,但为了公司的利益,他们需要摒弃这种想法。
你可能会认为这样会陷入混乱,但实际上,它运行得相当好,因为代码库所有者会进行管控。
代码库的所有者仍然完全掌控着代码贡献。
社交编码解决了什么问题?
假设你看到一个组件,它能满足你80% 的需求,但缺少一些功能。
你要如何添加这些缺失的功能呢?
现在你需要做出一个决定:
你是向代码库所有者提出新功能的请求,但要冒着请求被排在优先级列表末尾的风险?
或者更糟糕的是,他们的资金被削减,你的请求会首先被砍掉。
还是说,为了不依赖其他团队,你要把代码全部重写一遍,只为了得到那20% 你需要的功能?
很遗憾地说,许多团队选择了后者,为了获得所需的功能而重新造轮子。
这对任何一家公司来说都是巨大的资源浪费,但这种情况却一直在发生。
采用社交编码原则是如何解决这个问题的呢?
你和代码库所有者讨论新功能,并且你们达成一致,由你为他们开发这个功能。
这使你能够利用他们已完成的所有工作,并添加你需要的功能。
你在GitHub上创建一个问题,并将其分配给自己,这样每个人都知道你正在处理这个问题。
然后你复刻代码库,创建一个分支,并进行你的修改。
当你完成所有工作并准备好贡献代码时,你发起一个拉取请求,表明你已准备好接受审核,代码库所有者可以决定是否将你的代码合并回主项目。
代码库所有者拥有完全的控制权。
因为是他们进行合并,所以他们可以要求你做出修改。
如果你的测试覆盖范围不够,他们可以要求你编写更多的测试用例。
他们会像对待团队的其他成员一样对待你和你的贡献。
这是一个双赢的局面。
你得以利用另一个团队的代码以及所有你需要的功能,而另一个团队则免费获得了一个新功能。
公司也节省了资金,因为代码得到了复用,而不是重写,皆大欢喜。
这就是开源的运作方式,也是公司对待内部代码应有的方式。
结对编程是社交编码的一个方面,它源自极限编程。
它是指两名程序员共用一台工作站(两人共用一个屏幕、一个键盘和一个鼠标)。
坐在键盘前操作的程序员通常被称为 “驾驶员”。
另一位程序员同样积极参与编程任务,但更侧重于整体方向,被称为 “领航员”。
当 “驾驶员” 在打字时,“领航员” 会检查其工作,或者查找一些资料,又或者思考接下来要做什么。
大约20分钟后,他们交换角色。
这样他们两人都能扮演这两个角色。
在工作中,我一有机会就会进行结对编程。
我喜欢社交编码的这个方面。
我个人的一个弱点是,我会为给新变量或函数取什么名字而苦恼。
我想把它取到完美,让代码尽可能易读。
有其他人一起交流想法,能帮助我更快地做出这些决定。
你可能会认为结对编程是用两倍的资源来完成同样数量的工作,但事实并非如此。
结对编程有很多好处。
第一个好处是代码质量更高。
“大声编程” 这种方式能让人对代码有更清晰的理解。
过去,当我独自编写代码,然后向别人解释这段代码时,我会在大声讲解的过程中发现一个错误。
我在脑海中检查代码时没有发现这个错误,但在大声说出来的时候却发现了。
向别人解释代码会迫使你把代码写得更清晰。
这意味着可以更早地发现缺陷。
这是一件好事,因为它能降低后续的维护成本。
在开发过程中,缺陷发现得越晚,修复成本就越高。
结对编程还能促进技能传授,培养更优秀的程序员。
我喜欢让初级程序员和高级程序员结对。
我经常这么做,这样他们就能从对方解决问题的方法中学到东西。
他们会学到对方使用的技巧和窍门。
这能培养出更优秀的程序员。
而且每一行代码都有两双眼睛在检查。
你不会希望代码只有一个人能看懂。
不然那个人去度假了,就没人知道如何修复他的代码了。
结对编程能让人对代码有更好的理解。
更多的人能够充分理解代码,从而进行修复和改进。
在本视频中,你学到了:
社交编码是通过公共代码库以社区协作的方式进行的,所有团队成员都被鼓励进行贡献。
结对编程能够提高代码质量,因为它能更早地发现缺陷、降低成本,并且让更多人理解代码库。