将代码集体所有权进行到底!

敏捷开发
• 阅读 168

极限编程中有一个实践是代码集体所有权(Collective Ownership)。这个实践从字面意思理解起来很简单,就是大家共同拥有代码,都有权限浏览、修改代码。这个实践从表面看是一个技术问题,只不过是源代码管理系统的权限如何设置的问题。但从本质上来讲,这是一个团队乃至整个公司的团队协作和勇气的问题。今天借这篇文章和大家仔细展开聊聊。

开始讨论之前先来问个问题:是不是将源代码管理系统(如Git或者Subversion)的权限都放开,就是实施了代码集体所有权呢?

请大家认真思考一下这个问题。我想有很多公司是这样设置的,但这只是技术上的一个设置而已,是不是真正实施了集体所有权,我们还要看团队实际的行为

正如我在前面的文章里谈到的,很多团队的分工是按照模块划分的,一个人负责一个模块,并且团队之间的界限也比较明显。我负责我的模块,你负责你的模块,井水不犯河水。

虽然大家都是工作在一个代码库下面,代码也会做集成打包,但我认为真正意义上的代码集体所有权应该从分工上打破这种方式,每个人都可以参与到每个模块的开发中,每个人都有能力修改任一模块的代码以完成新功能的开发或者Bug的修复。所以说只是将权限分配给大家,这种表面的做法是远远不够的。

将大家之间的无形界限打破,做到你中有我,我中有你,才是真正意义上的代码集体所有权

下面是禅道项目的实际例子,大家可以看看历史的提交记录。 将代码集体所有权进行到底!

谈到这儿,估计有朋友就会问,这样做会有很多问题啊。比如某个开发人员对某个模块不熟悉,让他来开发,会影响项目进度;再比如,团队几个人的编码风格不统一,容易打架。这类问题如何解决呢?极限编程也有解决方案,比如推行编码规范、结对编程和代码评审,都可以很好地促进代码集体所有权。请大家参考我之前写过的《极限编程里最容易被忽略的实践》和《无结对,不编程》这两篇文章。

接下来聊聊开篇提到的勇气的问题。是否真正实施集体所有权,从根本上来讲是团队勇气的体现。站在团队管理者角度来看,是否有勇气接受因为打破模块之间原有分工带来的不确定性,诸如代码不熟悉而带来的工期延长、Bug增加?站在团队成员角度来讲,是否有勇气去改动其他同事维护的代码,是否有勇气对过往代码里不合理的地方进行重构?

所以极限编程的核心价值会讲到勇气。价值观的东西比较虚幻,大家都找不到抓手,怎么做就是有勇气了呢?

实施代码集体所有权就是勇气的体现

短期看确实会因为打破之前的分工模式会带来一些混乱,甚至是一些故障乃至事故。但对整个团队乃至公司来讲,要有这样的勇气来经历这样一个过程。当真正经历这个过程中之后,会有很多意想不到的收获。代码集体所有权会让团队真正地成长为一个互相信任、深度协作的团队;也可以进一步地促进技术和业务经验在团队里的推广,避免单点的问题;还能减少重复造轮子的问题,提高代码的复用率。

就拿禅道自身来讲,代码从2009年开始到今天,已经迭代了13年多。这期间有大量同事参与到了代码的开发。大家感兴趣的话可以看看我们的代码,不看提交记录的话,你会感觉禅道的代码就像是一个人写的。对团队情况不熟悉的话,基本上分辨不出代码是谁写的。这就是我们团队践行代码集体所有权的结晶,对我们的好处就是团队的任意一人可以参与禅道的任一模块,这样在排兵布阵时就可以很灵活。

有的公司出于保密需求,可能没有办法做到这种程度的开放和协作,但也可以通过项目内部的权限控制、内部开源、开放SDK、开放参考手册等方式,促进团队之间的分享和协作,带来的优势也是显而易见的。

有勇气,就将代码集体所有权进行到底吧!

点赞
收藏
评论区
推荐文章
blueju blueju
2年前
阿里低代码引擎 | LowCodeEngine - 多页面管理功能(提供完善 github 代码示例)
前言自阿里低代码引擎lowcodeengine发布后,经常能看到钉钉社区、githubissue、掘金等博客有多页面管理的需求。我们在基于阿里低代码引擎lowcodeengine二开低代码平台的时候也遇到了这个问题,并付诸了实践。其实阿里低代码引擎lowcodeengine本身是支持该功能,提供了openDocument、documents、
Wesley13 Wesley13
2年前
GitHub Actions入门
一、一些概念持续集成(Continuousintegration)频繁地向一个共享仓库提交少量代码变更的软件开发实践。使用GitHubActions,可以创建自定义的CI工作流,以自动构建并测试你的代码。从你的仓库中,你可以查看代码变更的状态和工作流中每个操作的详细日志。CI通过提供代码变更的及时反馈来更快地检
Stella981 Stella981
2年前
JOptionPane修改图标
1.在Linux平台下.JOptionPane会显示Java默认的图标,在window平台不显示图标,如何替换这个图标了?2JOptionPane.setIcon(Icon)修改的是内容区域的icon,而不是左上角的Icon.所以需要通过修改Jdialog/Frame的图标来达到修改默认图标的问题.3.代码:if(JOptio
Stella981 Stella981
2年前
Knative 实践:从源代码到服务的自动化部署
通过之前的文章,相信大家已经熟悉了Serving、Eventing以及Tekton。那么在实际使用中,我们往往会遇到一些复杂的场景,这时候就需要各个组件之间进行协作处理。例如我们提交源代码之后是否直接可以部署服务到K8s中?这个场景对于用户来说很有吸引力。那么现在就让我们来看一下,在Knative中如何实现从代码到服务?(https:
Stella981 Stella981
2年前
Linux应急响应(一):SSH暴力破解
0x00前言SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议,主要用于给远程登录会话数据进行加密,保证数据传输的安全。SSH口令长度太短或者复杂度不够,如仅包含数字,或仅包含字母等,容易被攻击者破解,一旦被攻击者获取,可用来直接登录系统,控制服务器所有权限。0x01应急场景某天,网站
Stella981 Stella981
2年前
Hibernate纯sql查询结果和该sql在数据库直接查询结果不一致
问题:今天在做一个查询的时候发现一个问题,我先在数据库实现了我需要的sql,然后我在代码中代码:selectdistinctd.id,d.name,COALESCE(c.count_num,0),COALESCE(c.count_fix,0),COALESCE(c
Stella981 Stella981
2年前
DevOps世界中的软件开发
!(https://oscimg.oschina.net/oscnet/f40e68cbfe8148deb00f040b4e917a0a.jpg)在整个软件开发过程中,开发人员通常需要花费大量时间来修复错误和漏洞,以便一切按计划进行交付。但是,通过DevOps实践,可以更轻松地管理和保护这些问题。这是由于以下事实:使用DevOps实践的软
Stella981 Stella981
2年前
RocketMQ一个新的消费组初次启动时从何处开始消费呢?
1、抛出问题一个新的消费组订阅一个已存在的Topic主题时,消费组是从该Topic的哪条消息开始消费呢?首先翻阅DefaultMQPushConsumer的API时,setConsumeFromWhere(ConsumeFromWhereconsumeFromWhere)API映入眼帘,从字面意思来看是设置消费者从哪里开始消费,正是解
Python进阶者 Python进阶者
7个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
敏捷开发 敏捷开发
3个月前
无结对,不编程
极限编程里面有一个比较有争议实践就是结对编程。很多团队的管理者在谈到结对编程的时候,第一反应是浪费时间:本来一个人可以干的事情要安排两个人干,不是浪费时间吗?那结对编程到底会不会浪费时间呢?结合我们禅道团队自身十几年的结对编程实践,跟大家做一下分享。首先来
敏捷开发
敏捷开发
Lv1
女 · 产品经理
公众号:敏捷开发 网址:www.minjiekaifa.com
文章
40
粉丝
0
获赞
0