阅读更多

11顶
0踩

研发管理

转载新闻 源代码管理的 10 条戒律

2012-03-06 15:37 by 副主编 MnouW 评论(14) 有13877人浏览
源代码管理是开发工作中很重要的一部分,甚至可以说是很多开发者的生命。但是我们往往在这方面犯错。

我在这里列出了十条建议,可以说是戒律。虽然我会用 Subversion 和 .NET 来做示例,但这些戒律和你用的编程语言还有源码管理工具无关。

1. 彻底抛弃 VSS!

VSS 已死,就让它离去吧。它曾经很有用,但是现在其他 VCS(Version Control System)已经远远超越了它。微软也决定从明年开始不再支持 VSS了

老实说,在1995年,VSS是一个伟大的工具,但是它的光环早已被它的晚辈——Subversion、Git 和 Mercurial 夺去。

2. 没有进入版本库,它就不存在

你应该每天把这条念一遍 ——“工作进展的唯一标准就是代码进了版本库”。在代码进入版本库之前,它相当于不存在。

我承认你的代码藏在你机器的某个角落,但是对于其他人来讲,这有何意义?他们不能拿到你的最新版本,他们不能和你的版本合并,你也不能部署你的代码,一旦你的硬盘坏了,一切将烟消云散。

如果你坚持执行这一条的话,你会发现其他的好习惯会随之而来。你会自觉的把任务分成小块并经常提交代码。你会更加频繁的更新、集成代码。最重要的是,经常提交代码说明了你正在做东西。

3. 尽早提交,尽快提交,经常提交

紧接上面一点,防止“幽灵代码”(只在你本地机器上能看到的代码)的唯一的方式就是把代码尽快的提交到版本库。这么做还有以下好处:

  • 每次提交都会生成一个新的版本,给你回滚的机会。假如你把代码搞乱了,你是希望回滚到一小时前还是一个星期前?
  • 间隔的时间越长,代码合并越困难。合并代码从来不是一件好玩的事情。当你好几天都不提交代码,你会突然发现,你已经累计了50个冲突要解决,你大概会疯掉。
当你坚持经常提交代码的习惯以后,你会发现你的工作、代码提交会呈现出一定的规律。这个规律可以用来指导你的开发工作。当你发现你的团队好几天都没有代码提交的时候,你就会意识到 “something is wrong”。

4. 在提交前检查你的更改

提交代码到版本库看起来太简单了。反正在项目的根目录下有东西更改了,提交吧!这样会导致你提交了一堆垃圾。很多人看到下面的对话框的时候,往往是选择所有,然后搞定!于是你的代码库就被污染了,例如debug文件夹之类的。



还有一些情况是人们提交代码前不检查自己到底更改了什么。例如一个项目配置文件,你会记得你改了什么吗?也许这次修改就不应该提交呢?如下图所示,这个Web.config文件为什么被修改了?你可以通过SVN工具对比来查看更改。对于一些可能被更改但是不需要进入版本库的文件,例如 Thumbs.db,你可以用 SVN 的“ignore”功能来排除它。




5. 认真填写“commit messages”

填写 commit message(提交注释)是有一点枯燥,但是请不要写“更新了一段代码”这种提交注释,你会把别人逼疯的。

“commit message”的目的是解释你提交的代码中到底修改了什么。你也许不记得你一年前为什么提交一段代码,但是 SVN 的注释会让你想起来。



所以,请不要写以下这些注释:

  • 修复了一个bug
  • 有一个拼写错误
  • 更新1024
  • 这什么都不是
  • 提交了
你还有见过比这个更烂的注释吗?另外,任何一个人的注释应该是不一样的,而且从逻辑上来讲永远不可能一样,因为你每次提交代码的基础一定是不一样的,所以你做的事情不可能一样。

6. 你必须自己提交代码,而不是让别人代劳

这个听起来有些奇怪。但这种事情确实存在,而且我还遇到过不止一次。有一些团队为了保证代码库的干净,让一个人专门负责审核和提交代码。这并不是一个好习惯。

首先,源代码管理并不是为了保持代码的纯净,起码在开发过程中不是这样。它的目的是让团队更频繁的集成各自的工作,当有问题的时候可以回退。在这个过程中,并不需要每一步都很完美。只有在版本发布的时候,我们才需要,或者尝试去达到“干净的代码”。

还有,从开发者的角度来看,这么做等于没有源代码管理。因为它意味着没有代码集成,没有回退,没有blame log,什么都没有。你只是坐在那里写代码,然后在你也无法确定的时间把代码交给你的老板。

7. 数据库的版本控制是必须的

这是有很多人想做,但是觉得很困难而做不到的一点。这里的问题是,很多应用没有数据库根本无法运行。所以如果你不把数据库加入版本控制的话,你的应用是不完整的。

大部分的版本控制系统只针对文件系统工作,例如 HTML、CSS、图片、配置文件等任何保存在文件系统中的东西。但是对于数据库中的数据却无能为力。



不过现在也有一些数据库版本控制工具,例如 Red Gate 出品的 SQL Source Control。关于这个工具我曾经写过很详细的文章 Rocking your SQL Sourc Control world with Red Gate,我在这里就不赘述了。总之,数据库的版本控制也很容易了!

8. 编译出来的文件不应该加入版本控制

简单的说,就是任何自动生成的东西都不应该放在版本库里面。以 .NET 为例,所有“bin”、“obj”文件夹下面的东西(.dll、.pdb等等)都不应该加入版本库。

为什么?因为如果这么做了,你团队的其他人会恨死你的。每次他们更新代码都会用你的编译输出来替代他们的编译输出,会导致他们本地的很多东西不能用。另外一个原因是,你完全没有必要把这些编译输出放在版本控制里面,它们只是在浪费服务器的硬盘和带宽。

9. 别人不在乎你的个人配置

很多时候,人们没有意识到他们正在提交自己的个人配置到版本库。开发工具往往会生成一些配置文件,记录你的文件路径、字体设置、快捷键设置等等,这些东西只对你有用。以 .NET 项目为例。



10. 依赖项也需要添加到版本库

虽然这是最后一条,但也是很重要的。如果你的代码需要依赖第三方的类库或者文件,你需要把这些文件也添加到版本库。你不能认为程序在你的机器可以跑,就在别人的机器上也能跑。你团队的其他成员也许没有这些依赖的文件,他们更新了你的代码以后,会导致项目无法编译或者程序无法运行。

我今天还遇到一个这样的问题。我拉下了很久以前的一个项目,然后出现下面的编译错误。



这个项目也是我开发的,以前的工作环境总是有 NUnit 的,但是现在没有了,所以出现了这些错误。

总结

这十条的每一条都很简单,老实说都是很基础的东西:及时、尽早的提交代码,充分了解你提交的东西,并确认它们确实需要被提交到代码库,解释你的提交,自己提交自己的代码,不要忘记数据库版本控制,不要忘记依赖项。但请你忘记 VSS。

英文原文:The 10 commandments of good source control management
  • 大小: 57.4 KB
  • 大小: 49 KB
  • 大小: 147.7 KB
  • 大小: 21.8 KB
  • 大小: 25.4 KB
  • 大小: 18.2 KB
  • 大小: 37.3 KB
11
0
评论 共 14 条 请登录后发表评论
14 楼 allenny 2012-03-17 23:53
不错,鼓励一下!不过很多新手对此太不重视了!!他们眼里只有自己那几段可怜的程序。
13 楼 liugang_ok 2012-03-13 10:01
上面说了要完全严格执行起来还是不容易的,比如所有提交均要写注释,如果没有强制约束的话,鲜有人完全用心去做,对于尽快及时提交、认真检查提交内容等值得学习、改进。
12 楼 transist 2012-03-08 10:16
很基础的东西
11 楼 tomfish88 2012-03-07 17:59
改点提交一点,但注释不喜欢写,经常是ddddddddddddddddd,aaaaaaaaaaaaaa搞定
10 楼 ronnin 2012-03-07 17:58
不赞成“尽早提交,尽快提交,经常提交”

这不能太过份。在IDE下,一天提交2-3次,甚至1次很好。因为IDE的本地历史也可以依赖的。并且提交的版本应该是完整的,对应开发任务的(特性,甚至是功能)。
9 楼 deadeye 2012-03-07 12:37
第10条不太赞同
现在有依赖管理,maven,ivy什么的
放进版本库也是浪费空间和带宽吧
8 楼 dieslrae 2012-03-07 11:00
一直都用cvs.....只会用cvs......
7 楼 oaklet 2012-03-07 10:10
vss,cc难用了些
通常都已经用上了svn,git等,
当然hg也是不错的,不然谷歌也不会专门搞个google code
6 楼 xcrn75416 2012-03-07 09:54
大项目的话从VSS到其他版本控制系统做迁移还是蛮难的
5 楼 coolhorse168 2012-03-07 09:24
尽早提交,尽快提交,经常提交
4 楼 cnhans 2012-03-07 09:19
在用git。。。
3 楼 hay 2012-03-07 08:58
我也是这样严格要求自己,基本上每一条都是,我也要求跟我做项目的也尽量如此!总结的挺好的。
2 楼 geminiyellow 2012-03-07 08:01
VSS就是单线程比较蛋疼。其他都还好。
1 楼 飞天奔月 2012-03-06 23:48
VSS 很久以前用的了

现在 cvs  svn

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 网页 游戏 数据包截取工具

    轻松截取数据包 不用注册安装 所有数据包有效 还可以截取指定ip的数据包

  • C/C++ 原生套接字抓取FTP数据包

    网络通信在今天的信息时代中扮演着至关重要的角色,而对网络数据包进行捕获与分析则是网络管理、网络安全等领域中不可或缺的一项技术。本文将深入介绍基于原始套接字的网络数据包捕获与分析工具,通过实时监控网络流量,实现抓取流量包内的FTP通信数据,并深入了解数据传输的细节,捕捉潜在的网络问题以及进行安全性分析。

  • 看完即会,抓取微信小程序数据包教程

    最近有很多小伙伴问到能不能抓取到微信小程序数据呢?答案当然是肯定的,通过Fiddler或者Charles这些主流的抓包工具都可以抓得到,在IOS平台抓取微信小程序和https请求都是一样的设置,接下来给大家通过Fiddler演示如何设置在IOS平台端抓取小程序数据包(Charles也是类似)。一般电脑和移动端设备连接到同一个WiFi热点(路由器),就可以保证是在同一局域网中,这里我们可以通过手机设置->无线局域网->选择对应热点,查看设备IP地址:在电脑端通过ping命令去检测下电脑是否能够连接IOS设备:

  • 使用Fiddler抓取网易MUMU模拟器数据包

    Fiddler的官方网站可以下载到最新版本:https://www.telerik.com/fiddler 安装完毕Fiddler后,可以看见它已经在自动获取封包了,但是模拟器的封包是获取不到的,我们需要打开模拟器的Wifi设置,可是网易Mumu的系统设置里并没有Wifi的选项,我们只能通过代码进入,这里写了一个直接跳转进入WIFI设置的APP,安装后打开直接进入,代码很简单,如下 start...

  • winpcap开发包使用中的问题总结

    winpcap开发包在使用中还是会有一些容易被忽略的问题的,由于这些问题可能让您在开发中产生一些莫名奇妙的结果。     首先,我们从winpcap的环境配置中可能出现的错误开始。     winpcap开发环境需要是windows操作系统,而且必须安装winpcap驱动才可以调试您的程序。 如果您的程序调试出现类式如下问题:can't find wpcap.dll................

  • Charles+Proxifer实现PC端抓包

    Charles+Proxifer工具对windows PC客户端进行抓包

  • HOOK Send函数截取游戏数据包

    前两天写了一个HOOK微软的加密函数然后打Log的Detours的例子,还是不够直观,这次举个简单的例子,其实完全可以应用在不加密的游戏游戏数据分析上,当然当前不加密明文传输的少之又少,此处只为学习方法。 首先在VC下建立一个DLL工程,不需要使用MFC DLL,因为不需要那个框架里面的东西。 然后新增一个源文件,写入相关代码 #include #include #in

  • 使用 Socket 抓取数据

    要在客户端操作 Socket ,可使用 fsockopen、socket_create、stream_socket_client 等函数实现。如果是PHP 5,建议使用 stream_socket。   fsockopen 实现长连接。Client 方与 Server 方先建立通信连接,连接建立后不断开,然后再进行报文发送和接收。   使用 Socket 获取数据的实现,GET 方法。 ...

  • 外挂制作介绍篇

    网络游戏的封包技术是大多数编程爱好者都比较关注的关注的问题之一,在这一篇里就让我们一起研究一下这一个问题吧。 别看这是封包这一问题,但是涉及的技术范围很广范,实现的方式也很多(比如说APIHOOK,VXD,Winsock2都可以实现),在这里我们不可能每种技术和方法都涉及,所以我在这里以Winsock2技术作详细讲解,就算作抛砖引玉。 由于大多数读者对封包类编程不是很了解,我在这里就简单介绍一下相

  • 一个很好用的模板(截取网络数据包)

    template class Analizer { private: const char* m_pccPacket; int m_Size; static const int M_MIN_SIZE = minsize; public: void Bind(const char* pccPacket, int size) { m_pccP

  • 推荐一款可以提取游戏资源的辅助工具:RPGViewer

    是一款可以提取游戏资源的修改辅助工具,体积小巧,操作简单,用户只需要选择好游戏的路径,就可以从游戏主程序里将设置和属性直接提取出来,并进行编辑和修改,让玩家可以有更好的游戏体验感。

  • 使用nslookup进行DNS查询及tcpdump/wireshark抓取DNS数据包

    我们通常使用nslookup工具来测试DNS解析,获取DNS报文的详细数据,这也是我们想要使用协议分析工具nslookup来分析DNS流量进行分析。您可以使用它来执行 DNS 查询并接收:域名或 IP 地址,或任何其他特定的 DNS 记录。默认查询主机地址,想要测试其他类型的资源记录,先使用 set type命令设置要查询的DNS记录类型,然后输入域名,可得到相应类型的域名测试结果。这是一个简单的DNS解析过程,序号为56的数据包显示的是DNS查询报文,序号为57是数据包是DNS应答报文。

  • 利用libpcap抓取数据包

    概述libpcap是一个网络数据包捕获函数库,tcpdump就是以libpcap为基础的。主要作用:捕获各种数据包,例如:网络流量统计过滤网络数据包,例如:过滤掉本地上的...

  • 计算机网络——数据包抓取与分析

    数据包抓取与分析 目录 一、实验目的 二、实验内容 三、实验环境 四、实验步骤与过程 一、实验目的 学习安装、使用协议分析软件,掌握基本的数据报捕获、过滤和协议的分析技巧,能对抓取数据包进行分析。 二、实验内容 协议分析软件的安装和使用、学会抓取数据包的方法并对对抓取数据包进行分析。 三、实验环境 使用Windows操作系统;Internet连接 抓包软件Wireshark。 四、实验步骤与过程 WireShark的使用 选择接口过滤器 安装Wiresh

  • winpcap编程函数介绍

    1. int pcap_findalldevs(pcap_if_t **, char *) 说明:用来获得网卡的列表 参数: 指向pcap_if_t**类型的列表的指针的指针; char型指针,当打开列表错误时返回错误信息 返回值: 为int型,当显示列表失败时返回-1 pcap_if_t 是pcap_if 重命名而来:typedef struct pcap_if pcap_if_t;

  • 抓包工具

    抓包简介:网络服务之间的通信,都是基于数据包实现的 网络服务:网络游戏 访问视频网站 网络购物 各种手机APP 网络服务的双方 : 客户端:client 服务端:server 网络通信过程: (1)客户端向服务器端发请求 (2)服务器端向客户端发响应 抓包工具有哪些:sniffer wireshark tcpdump:Linux中自带 fiddler :测试工作中常用 fiddler简介:他本质上就是一个基于http协议的抓包调试工具,主要用于抓取电脑和...

  • 如何抓包微信小程序修改数据

    修改完成,当然,弄懂原理的话,操作起来就很简单,其他的抓包发包工具一样可以进行。从上图中可以看到我们的分数是13,接下来是修改分数,在这条请教点击右键,选择数据重放->重放并编辑,修改分数后点击运行到完成。进入游戏中,点击右上角的三个点点,第一行的一堆菜单中,滑到右侧,找到在电脑上打开,点击,此时小游戏就能在电脑端自动打开了。如果通过手机接入电脑作为代理抓包,其实相对要复杂得多,但是有的游戏转发出来,在电脑端打开,就不能正常进行。,进行任意一局游戏,这里以DNF爱的守护者为例。

  • 使用wireshark进行网络报文抓取与分析

    Wireshark介绍 Wireshark(前称Ethereal)是一个免费的网络报文分析软件。网络报文分析软件的功能是抓取网络报文,并逐层显示报文中各字段取值。网络报文分析软件有个形象的名字“嗅探工具”,像一只猎狗,忠实地守候在接口旁,抓获进出该进口的报文,分析其中携带的信息,判断是否有异常,是网络故障原因分析的一个有力工具。 网络报文分析软件曾经非常昂贵,Ethereal/wireshark ...

Global site tag (gtag.js) - Google Analytics