说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

源代码管理十诫

HTML文档下载 WORD文档下载 PDF文档下载
源代码管理软件是我们工作的必备工具,是许多开发团队的血液。那为什么我们都会对它有所误解呢?为什么都很难理解版本控制系统的核心价值和基本原理呢?

若是还有可以毫无偏见地涉及各个编程语言,比源代码管理软件更必要的工具,我倒是很想见识一下。源代码管理软件是我们工作的必备工具,是许多开发团队的血液。那为什么我们都会对它有所误解呢?为什么都很难理解版本控制系统的核心价值和基本原理呢?

我总结出10条惯例——如果你愿意也可以用“戒律”——意味着必须服从它而且从一开始很难去理解。它们与所有类型编程语言的版本控制软件都有关联。在这里我选取了Subversion和.NET的几个例子,不过它们也广泛地适用于其他的一些技术。

第一诫:如果你现在还在使用VSS-请立刻停手

它已经死了。当然不完全对,它也存活了许多年,被全新的更实用的源代码管理工具超越之后还在苟延残喘地活着。准确地说当微软几个月后不再为其提供支持时(还是会坚持一段时间的),它才是真的死了。

平心而论,VSS还是一个不错的工具。在1995年,它的光芒被像Subversion这样类似于Git和Mercurial的分布式软件给遮盖住了。微软表示要取代它已经好多年了。

原因是因为不支持如今的标准所导致的一系列缺陷使它一直不被看好。众所周知它是微软的悲剧系统,但不知何故它能坚持这么久,尽管它有那么多小故障,缺陷,并且不包含必需的功能(相对于今天的标准)。 


第二诫如果代码没放在源代码管理软件里,等于它不存在

每天重复读这句话——“使用源代码管理软件是唯一的有效措施”。除非你在工作时使用项目的源代码管理库来控制代码版本——否则代码等于没有存在过。

显然你曾发觉在你的本地机器上运行良好的代码在其他人那里运行的效果并不理想。是不是?他们不能获取你的最新版本,他们没法去归并代码文件,你没有正确地部署它(参考you're deploying it wrong)而且如果你的SSD硬盘坏了的话你将永远地失去你的劳动成果。

只要你保持这个心态——代码只有提交后才是真的安全,才是其他良好编程习惯的保障。你可以把你的任务划分成许多很小的单元以便你逐一提交。你需要频繁地这么做。你就不必担心你的硬件会不会出棘手问题。

不过更重要的意义是(至少对于你的团队领导来说),通过源代码管理软件可以看到你做了什么。使用图表并列出项目清单是个好方法,不过怎么知道他们实际上在做些什么?而使用源代码管理软件进行工作就能看得一清二楚了。

第三诫要早提交,常提交,并且不要觉得麻烦

关于前面那点,避免“幻影代码”(就是只能在你的机器上看到的代码)的唯一方法是经常提交你的任务并且不要觉得麻烦。它可以解决你的问题,不过这样做也会对你的工作产生其他的影响:

1.每个提交的修订都会为你提供一个还原点。如果你完全把代码搞砸了(没骗你,我们都这么做过),你是希望恢复到一个小时前的工作还是一周前的工作?

2.归并文件时会出现的危险会随着时间不断增加。归并文件一直很麻烦。如果你不是每天都保持提交代码,某一天你会突然发现你和其他人的更改内容会有50多个冲突。你不会为此感到高兴的。

3.它促使你把任务分离成分散的单元。通常人们都是快完成的时候才提交的,因为他们想把代码做成一个完整的逻辑单元模块。不过庞大的任务不可避免地要分离出较小的分散功能,而频繁地提交它们会使你更了解它们,你可以一个个地构建并提交。

如果你做到这些,你的提交历史不可避免地开始类似于一种半规律的样式,里面每个工作日都是在提交任务。当然不总是这样,也有停下来重构或测试,或者其他合理的活动也会中断标准的开发周期。

然而,当我在看一个独立的——尤其是完整的项目时,每当发现我们在一个标准的开发周期里,有一天或几天什么都没有做,我便会非常担忧。我之所以担忧是因为这意味着什么地方出问题了。一般不是有人正在想方设法要把问题搞定的话,就是因为卡在某个问题上而导致项目完全没有进度。无论到底是什么情况,源代码管理软件都会告诉你出现问题了。

第四诫提交前要检查你更改了什么

往源代码管理软件里提交代码的步骤其实非常简单。(你恐怕会困惑上一条为什么说的那么麻烦。)一般只要发现文件内容有变更时都会不顾后果地把文件传上去。像这样——“我的项目根目录下有文件内容变更了,我要快点提交上去!”

如此会发生一件(或两件)事情:首先,程序员会没有意识地把目录下的垃圾代码文件也上传上去。一些人看到类似下面的窗口时,就会点击“选择全部”然后提交——这样源仓库里就会被本不应该存在的未调试的文件和其他垃圾文件给弄乱。 


或者是,程序员实际上并没有检查他们更改过什么就把文件上传了。当你在工作中处理配置文件或项目定义文件时很容易就不经意把那些不想提交的文件给上传了,而且那些文件很可能就被别的程序员用到了。你真的会记住你在配置文件里的所有更改吗?


解决方法很简单:你必须在提交前立刻检查你改过什么地方。做起来其实比听起来还要容易。使用许多系统已经提供的“忽略”特性可以大幅度地减轻“不经意上传文件”的危险。你可以忽略Thumbs.db文件因为你压根不想上传它。你在每次修订后可能还有其他文件不想上传——那么就忽略掉它们吧!

至于文件里的更改,你通常可以使用某个流行的文本比较工具来观察差异。为什么我又要上传一次Web.config文件呢? 


噢,我想起来了,我想把尝试密码失败的最大次数从5次减少到3次。啊,我差点没注意把一个虚拟的登录页面给上传上去了。这种在提交前做检查的练习可以让你更容易理解下一节的内容。

第五诫写提交信息时一定要认真

这是一个古老的谚语(出处不详),大意是说“写每一条提交信息时就好象等下会读到它的人是一个斧头杀人狂,而且他还知道你住在哪里”。如果我是那个杀人狂并在研究你的代码想追踪bug的话,看到的提交信息全部都是“代码更新了”,小心,我会来砍你的!

我的解决办法就是解释清楚为什么要提交新的代码。每次你对代码进行更改都是有原因的。可能什么地方会崩溃。可能客户不喜欢现在的主题颜色。可能你仅仅要调整一下构建配置。无论是什么,这都是有原因的而且你要把原因用文字保留下来。

为什么?这样做的原因有很多,而且在不同环境下各不相同。举个例子,使用“归属”特性或其他类似的功能显示出谁改了代码那些地方。如果我不记得18个月之前我对项目的Web.config文件改过什么地方或者我为什么要改动应用程序的设置,是因为我没有在当时留下一个适当的提交信息,而现在会非常简单: 


这是一个可以随时观察代码更改的软件的一种。无论我像下面那样想了解一个文件的完整更改历史,还是只想知道团队昨天做了什么,留下一个描述性的相关记录意味着只要不经意一瞥就能知道是什么情况了。 


最后强调一下,当调试遇到错误时提交信息的重要性是无法估计的。举个例子,在你的集成环境里的最后更新的地方可以找到出错的原因。我的例子是非常显而易见的,不过把信息表示出来可以把很多棘手的问题变得极好解决。 


把这条牢记于心,这里列出一些提交信息的反面教材:

1.可恶
2.能跑了
3.解决了一些混帐问题
4.解决了
5.改进了一点bug
6.上传了
7.排字错误
8.修订1024

好的,我从Stack Overflow网站的哪些是你写过的最差劲的提交信息(译者注:帖子已经被删除了,原因难道是出现了脏话?)帖子里选取了以上内容,不过它们和我以前看过的提交信息并不相同。它们没有告诉你有关代码更改的任何有效信息;它们都是垃圾信息。

关于提交信息最后要注意的是;同一个程序员之后提交信息绝不能和前面的完全相同。原因很好理解:你向源代码管理软件提交文件是因为对于上一个版本的代码有东西改变了。你现在的代码和之前的已经不一样了,如果你的提交信息是完整准确的,理论上就不能和前面的相同。如果是相同的(可能有时真的会这样),日志就会难以阅读,因为没有办法区分两条提交有什么区别。

是谁动了我的CPU! 欧朋CEO:GPU加速是手机浏览器的新趋势 TOP30专访:Splashtop研发中心总经理Alex Xu 2012Q3国内App开发者半数以上入不敷出 细微之处见真章 为什么要在try-catch-finally里加大括号 独立开发者:面对攻击就要“脸皮厚+更自豪” IBM纳米光子芯片对付大数据 单个通道25Gbps AWS数据仓库服务Redshift是最好的选择吗? 又赚了一笔:微软向两公司收取Android专利费 深度解析:Android4.2系统“应用验证服务” 欧洲移动游戏大会:五大行业趋势 大揭秘:Windows Phone 8 键盘输入的8个设计精髓 朝鲜:探寻最神秘的移动互联网王国 如何让IE 10玩转响应式网站 Windows Server 2012:令CIO激动的三个新特性 高德和新浪微博战略合作 打通账号互调数据 乐观锁和悲观锁 你更钟情于哪一个? Apple索30%分成 iOS版微软SkyDrive更新搁浅 [简讯] Linux 3.7发布 开源图形卡驱动程序 高效敏捷的十大经验法则 佛瑞斯特资讯公司预测2013年云计算的十个变化 百会中小企业CRM年会成功举办 发布CRM选型指南 诺基亚创新体验中心NEIC训练团正式开班 新威胁:IE新漏洞允许网站跟踪鼠标 少编码多思考:代码越多 问题越多 [简讯] JDK 7u10发布 修复安全漏洞 搜狗茹立云:为何搜狗语音助手比Siri更精准? BlackBerry 10最终版SDK Gold发布 谷歌地图正式登陆App Store 为开发者推出SDK 你的云数据的三个最大威胁 公开叫板:Google不打算推出Win8版Gmail和Drive 在WORD里在哪里找到类似信封和类似电话的特殊符号? 一个十分简单的问题! 请教文件上传问题 关于sqlserver时间格式问题 公司准备上一套外贸管理系统,谁能帮我推荐一下!!! 基础问题 全文检索不能检索中文问题 谁有标准C函数库? 高分求救:关于crystal 连接oracle,不能运行 A调用B,怎样能够获得A所在的线程? frReport出错,解决即给分。 谁有标准C函数库? WIN2000和WINXP关于网上邻居的问题 如何将判断一个graphi字段里是否有内容,如果有,就删除!! 请问深圳市区内哪里较全面的计算机类的书店? javac不能编译Servlet,请问在Tomcat 下还有别的方法吗? 很有意义的问题!! [[[[[[[[[推举几个SEX站点.给欧研究研究.]]]]]]]] 怎么实现!? 字段长度int(2) 这个2到底是什么意思? 那里有Microsoft DirectX SDK FOR DELPHI的下载 学生管理系统登录问题(ADO数据库的问题) *.dat文件用什么软件打开!! 哪有jsp写的论坛源程序 大家给个思路了!!! 如何传递两个参数!在线等! 小弟在开发一个软件时踫到了许多问题,想请各位大侠帮助!! 请问:如何从VARIANT类型的数组中取数据? TOMCAT+SQLSERVER连接池配置问题~高分请教 这个问题让我有点晕!——安装与部署项目! 空调有坏了!!!! 安装论坛过程中遇到的问题!!!!!! 关于使用TC35Modem发送短信的问题,用超级终端可以,用N多个程序连接端口都不行。 "native code outside the VM"是什么错误呀 win2000 VPN方式的网络的实现。 datagrid控件的数据绑定问题. 请高手教我如何搭redflag linux下JAVA开发环境,急,另给分 如何删除一个字符串的前10个字符? 资料档案库是用来干嘛的? 用EJB做后台的参数传递。高分请教! 在ASP中对数据库操作是否可以用事务提交啊? TOMCAT+SQLSERVER连接池配置问题~~高分请教~ 请教!!!如何在IntraWeb控制IE? 如何远程对局域网内的某一台计算机(假设其计算机名为comm1)实施关机操作? 为什么连不上CVS服务器? 如何用ASP读取XML中节点的属性值? 如何使用jspsmartupload 一个简单问题请进来look一下 我所知道的论坛常用语,自己以为算得上的可以往上加啊! 如何自画窗体或者PANEL,让小图象在上面排列,然后再根据顺序,一次改变小图象呢? asp.net 《笑声》,400字以上,今天就要!复制的也可以,但一定要写的好,今天就要 某数除以28 余数是26 除以16 余数是4 求符合条件的最小的数 池塘里的笑声作文400字 数学题ERTY=4x³-24x²+36x咋解?具体过程是什么? “鹅的只数是鸭的7分之3”是把()的只数看作单位“1”平均分成()份,()的只数有这样()份 从地球辐射的分段特性说明为什么对于卫星影像解译必须了解地物的反射波谱特性 从地球辐射的分段特性说明为什么对于卫星影像解译必须了解地物反射波谱特性 上帝的创造,用英文怎么说?the creation of god 似乎有问题。因为听起来像是谁造了上帝似的。楼下诸君以为如何?有没能给出翻译理由的? 求函数的解析式 怎么求函数解析式 创建很好的联系英语怎么说 中国最透明的安全软件:百度杀毒隐私保肯德基“半价桶”遭遇争论 小薯条代替宁海查获一万多罐假红牛 包装味道都和外国驻韩外交官5年犯法48起 外交豁农业部:农垦有望率先实现农业现代化朴槿惠为韩职棒总决赛开球 穿日本运动美媒揭白宫工作准则:不让总统为坏消息叙利亚总统警告:外国停止支持反对派才杨澜提问郎朗\"工作有何意义\"惹争金华餐饮业遭遇寒流 高档酒店与农家乐奥巴马医改网站安全漏洞细节曝光 内测【吃货小技能get√】自制芝士爆浆猪男女老少不穿衣服的印第安部落生活P2P监管细则出台将近 逾七成平台或两人会分手,身后必有狗! 搞破鞋是从什么才是微商?如何实现微商赚钱?刚在奶茶MM贴吧里面看到一个小号爆出神秘哈尼族婚礼习俗:用糯米饭和香蕉做畅享PK!《征途》三国版新区4月10星际战甲Evolution引擎 引领初二男生爱吃炸鸡排 乳房发育如少女小儿发烧不宜尽快退烧 科学退烧有方法
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘