Hello World
Spiga

无处不在的DRY原则

2010-07-22 17:00 by 老赵, 8633 visits

DRY(Don't Repeat Yourself)原则,一般是指在写代码的时候尽量避免重复的实现。违反DRY原则导致的坏处很容易理解,例如维护困难,修改时一旦遗漏就会产生不易察觉的问题。不过其实这个原则并非写代码的时候独有,其实在各处都有类似的情况。当然,现在还是不谈“生活”,而是简单谈谈我在工作中发生的一些事情。

您认识这只小乌龟吗?相信大部分Windows下的程序员一定认识,这是个著名的SVN的客户端工具TortoiseSVN,与Windows下的资源管理器集成,提供了各种可视化的操作,深受广大人民群众喜爱。更重要的是,这个功能可谓十分强大的工具是免费的。

那么,您用过VisualSVN吗?VisualSVN是另一个和SVN相关的工具,它的主要功能是与Visual Studio集成,可以让开发人员在Visual Studio里进行SVN控制。VisualSVN是收费工具,不过对Microsoft MVP提供免费的个人版——说到这点,其实不少收费工具对MVP有此类政策,如著名的单元测试工具TypeMock Isolator对MVP提供免费的License。MVP同学们可以多多挖掘这类福利,毕竟MVP在世界范围内还是十分有价值的荣誉。此外,VisualSVN还提供了VisualSVN Server(标准版免费),方便人们搭建和管理SVN服务器,不过这是题外话了。

值得一提的是,VisualSVN是基于TortoiseSVN的工具,它与SVN的交互完全利用TortoiseSVN的功能,包括各式对话框。这么看来,VisualSVN的主要工作都是由一个免费工具全权完成,于是我就纳闷了,那么VisualSVN的这么点“附加”功能,就值得收取50美金的费用?当然收费与否,收费多少是软件开发者的自由,不过为什么会有那么多人去购买VisualSVN呢?在Visual Studio里操作SVN,和在资源管理器里操作SVN又有什么大不了的优势呢?VisualSVN值那么多钱吗?

由于我近几年来一直遵守“软件无盗版”的原则,于是对于收费工具不是很上心,即便如VisualSVN这种可以免费使用的软件,我也倾向于使用其免费的替代品。总之,我没有使用VisualSVN,当然使用SVN时几乎还都是借助于TortoiseSVN的。于是,这样便造成了一些问题。例如,我时不时会遗漏一些新建的文件,没有将它们提交至SVN中。于是,另一台机器获取代码之后很显然就无法编译通过了。为什么会造成这种情况?因为我往往在Visual Studio里添加了一个文件,它会出现在解决方案树中,然后继续编辑修改测试,然后就用TortoiseSVN提交了。但是,我还没有把新文件添加到SVN索引里面去!于是我本地看上去完全正常,而SVN Repository里面的数据却是不完整的。

这就是TortoiseSVN的局限性所在。TortoiseSVN只关心硬盘上的文件,而不会关注这些文件在逻辑上有什么关联。在上面的例子中,问题就是“新文件”与“项目文件”其实应该是同步的(如csproj里面的文件也应该在SVN中出现),但这样的重复就需要由我们手动维护了。于是,我们为项目添加一个文件时就要做两件事情:

  1. 在Visual Studio添加文件
  2. 在TortoiseSVN里添加(选择)文件

在文件的改名或删除时也会出现类似的情况。其实我已经很小心了,但是这样的事情还是难以完全避免。一个文件添加(改名或删除)两次,这不也是违反了DRY原则吗?于是我才意识到VisualSVN的重要性,我认为它最关键的一点便是帮我们在Visual Studio与SVN索引之间进行同步,例如在解决方案树中添加文件会自动出现在SVN索引中(即下图的红点,这表明该文件“已经加入索引”但“尚未提交”):

在平时开发过程中和DRY相关的地方有很多,例如之前有同事说要将压缩后的JS和CSS文件一并提交到SVN中,我说这样会同步死的,于是最后在某个发布过程中添加了一个步骤对这些资源进行自动压缩。还有,一些程序集可能会用于多个应用程序,于是它们的配置文件也会随之出现在各处,给维护造成困难。最后还是使用了一些最简的做法:只在一处维护配置数据,然后再构建过程中复制到各个地方去。这一切都是不能松懈的。

当然,现在我主要使用的是基于命令行的git(虽然有TortoiseGIT),在每次提交前都会git status看看情况,这样遗漏文件的情况反而不多见了。虽然命令行的git可能不如TortoiseSVN这种GUI工具来的方便,但它可以较方便地暴露出潜在错误,这也是一种颇为可观的优势。

PS:如果您身处上海,熟悉git,有自信能表现出它的优点并愿意这么去做,请联系我(推特帐号:@jeffz_cn)。

Creative Commons License

本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名赵劼(包含链接),具体操作方式可参考此处。如您有任何疑问或者授权方面的协商,请给我留言

Add your comment

102 条回复

  1. zzfff
    113.141.29.*
    链接

    zzfff 2010-07-22 17:24:37

    说到“Don't Repeat Yourself”,我立即想到是:为什么这个世界这么五彩斑斓?!熟悉了.NET,面对Java,虽然学起来比较容易,但终究要(不少)成本;熟悉了WCF,面对Axis2,一样需要学习成本............................这些才是大大的Repeat Yourself啊!

    既生X,何生Y,等价于,既生Y,何生X。

    另:既然主题是Visual Studio + “source safe”,为什么不提Visual Studio Team Foundation Server呢?要m$,一定要比m$还m$

  2. xiao_p
    218.24.162.*
    链接

    xiao_p 2010-07-22 17:34:30

    同样被svn新建文件的问题困扰着,每次commit的时候总是忘记新建的文件。。。

    老赵,这个可以不可以弄个powershell脚本自动侦测下,新创建的却没有提交的文件并自动提交???

  3. Wuvist
    220.255.7.*
    链接

    Wuvist 2010-07-22 18:32:25

    这就是TortoiseSVN的局限性所在

    不能理解,使用TortoiseSVN提交时,它是会提示有新文件的。

    “新文件”与“项目文件”其实应该是同步的

    这也未必,比方说我可能只是要在本地建立一个测试小文件,给我自己用而已;同步与否,是需要确认的。

    一个文件添加(改名或删除)两次,这不也是违反了DRY原则吗

    我不觉得这是违反。本地改名是你本地的决定,但这个改名是并非永远都要提交。

    个人在本地环境下做的变动,并非永远都需要提交,并且指望别人也接收。

    否则,按照你的说法,一切都要同步,一切都不DRY;那么你应该使用的是dropbox之类的硬盘文件同步管理软件,而不是SVN。

  4. deerchao
    113.81.82.*
    链接

    deerchao 2010-07-22 18:35:25

    AnkhSVN 也是免费开源的,未必比 VisualSVN差.

  5. forcey
    110.251.94.*
    链接

    forcey 2010-07-22 18:50:02

    @deerchao

    差的太多了…… 山寨工具 vs 专业工具的感觉

  6. 老赵
    admin
    链接

    老赵 2010-07-22 18:54:32

    @zzfff

    听不懂你的意思。

    TFS我不用的,对我来说性价比太低,还是让企业们去用吧。

  7. 老赵
    admin
    链接

    老赵 2010-07-22 19:01:00

    @Wuvist

    不能理解,使用TortoiseSVN提交时,它是会提示有新文件的。

    新文件太多了,比如build时出来的一大堆,所以我一般不显示不在SVN索引下的文件。

    我不觉得这是违反。本地改名是你本地的决定,但这个改名是并非永远都要提交。个人在本地环境下做的变动,并非永远都需要提交,并且指望别人也接收。否则,按照你的说法,一切都要同步,一切都不DRY;那么你应该使用的是dropbox之类的硬盘文件同步管理软件,而不是SVN。

    我强烈感觉到你的回复是在抬杠,就是属于那种虽然看上去理论上没错,但是明显忽视了我文章里的隐含条件:在需要与SVN同步的情况下。我当然知道“个人在本地环境下做的变动并非永远都要提交”,这就不属于我的讨论范围了。

  8. zzfff
    113.141.29.*
    链接

    zzfff 2010-07-22 19:01:05

    @老赵

    Visual Studio对于公司,一样要花钱。Visual Studio对于个人如果不花钱,TFS也不花钱。

    关于DRY,是我的表达能力太弱,还是你的理解能力太差,或者both?

  9. 老赵
    admin
    链接

    老赵 2010-07-22 19:03:55

    @zzfff: Visual Studio对于公司,一样要花钱。Visual Studio对于个人如果不花钱,TFS也不花钱。

    可惜Visual Studio和TFS是分开的,公司愿意买Visual Studio不一定愿意买TFS。同理,我会要求公司买Visual Studio,但是不强求买TFS,因为性价比太低。

    如果你觉得TFS好用的话,不妨介绍一下该怎么用。我看过一点介绍,也尝试过TFS 2005,感觉不好。

    // 饭醉去了,晚上回来看,呵呵。

  10. zzfff
    113.141.29.*
    链接

    zzfff 2010-07-22 19:09:52

    @老赵

    TFS我也不会,我会的其实很少。我的感受是:M$的特点以及优势是“全平台整合”。

  11. RedNax
    124.74.47.*
    链接

    RedNax 2010-07-22 19:12:41

    无论用什么版本管理都要加ignore pattern的吧?加了之后tortoise就会把build时出来的那些文件ignore掉了啊……看起来也挺清爽的。 另外我个人比较喜欢hg,git在windows下总要在msys或者cygwin环境下才能跑,总觉得不方便。

  12. Wuvist
    220.255.7.*
    链接

    Wuvist 2010-07-22 19:21:28

    @老赵

    新文件太多了,比如build时出来的一大堆

    你不知道可以设置SVN Ignore么?这个非常值得BS啊~~~

    明显忽视了我文章里的隐含条件:在需要与SVN同步的情况下。

    实际上,我企图跟你说明的就是这个隐含条件是工具本身是无法判断的,必须由程序员本人才可以判断。

    你在讨论的仅仅是特定情况下的特定DRY应用;适用场景非常小,非但提不上“无处不在”,实际上也没啥意义。

  13. 链接

    zhangronghua 2010-07-22 20:13:25

    哈, 我们公司就是只买了Visual Studio ,没买TFS,然后我们也是只用TortoiseSVN,没有购买visualsvn。 不过我们在review机制,所有提交的代码都需要peer review,所以基本上不会漏提。 就算万一漏了, 一般持续集成的脚本就会坏掉了,一会就有同事提醒了。

  14. 躺着读书
    58.61.12.*
    链接

    躺着读书 2010-07-22 21:19:45

    新文件太多了,比如build时出来的一大堆,所以我一般不显示不在SVN索引下的文件。

    可以设置忽略列表啊……

  15. mikeshi
    114.91.76.*
    链接

    mikeshi 2010-07-22 21:20:01

    这就是人们不愿意用微软的东西的原因吧,你看看Eclipse,Netbeans,谁不是内嵌SVN啊, 当然还有git什么的,而且都是免费的,你说对公司的吸引力多大啊,呵呵

  16. zzfff
    113.141.29.*
    链接

    zzfff 2010-07-22 21:53:29

    这个哥们的那四篇文章很有趣:http://www.cnblogs.com/haoxiaobo/archive/2010/06/01/1748966.html

    当公司大到一定程度,软件的花费不起决定性作用。若是小公司想跟M$混,要么用盗版,要么参加BizSpark,WebSpark计划,或者根本别碰商业软件。

  17. 老赵
    admin
    链接

    老赵 2010-07-22 22:21:22

    @Wuvist

    你不知道可以设置SVN Ignore么?这个非常值得BS啊~~~

    好吧,我知道有SVN Ignore这个东西,不过倒真没去用,为什么不用我也想不起来了……估计是好像忽略文件夹容易,但是忽略零碎文件还是要一个个设置,麻烦,所以我还是不显示Unrevisioned Files的。

    实际上,我企图跟你说明的就是这个隐含条件是工具本身是无法判断的,必须由程序员本人才可以判断。你在讨论的仅仅是特定情况下的特定DRY应用;适用场景非常小,非但提不上“无处不在”,实际上也没啥意义。

    首先我没听懂你这里到底是指什么意思,其次我也不觉得我这里哪里有问题。照我的理解,正是需要由程序员本人判断,这不就是造成Repeat Yourself的原因吗?就算是设了Ignore List,它还是要在最后“钩上去”,还是Repeat Yourself了。而且我还举了其他例子,如配置文件和压缩JS和CSS文件,在我看来DRY完全就是“无处不在”。

    最后我想弱弱地问一句,我哪里的罪过您吗?好像我文章里也没写什么特别的东西,为什么您冲上来就咣咣猛砍,不给力啊老湿。

  18. 老赵
    admin
    链接

    老赵 2010-07-22 22:23:09

    @zzfff: 当公司大到一定程度,软件的花费不起决定性作用。若是小公司想跟M$混,要么用盗版,要么参加BizSpark,WebSpark计划,或者根本别碰商业软件。

    其实小公司有小公司的过法,除了BizSpark,WebSpark外,也不妨可以使用Express版本的工具,Windows Server的话用Web版也完全没有问题,相当便宜。微软贵的其实是其他一些,比如SQL Server,因此我鼓励把存储放在*nix上面。

    商业软件没有那么可怕,有选择性的碰碰有益无害。近两年很多时候,我在做技术选型时会发现一些商业产品完全不贵。如果自己做的话,光投入的时间成本(就只算工资)也不止这个数,且质量还没保证。

  19. 老赵
    admin
    链接

    老赵 2010-07-22 22:24:55

    @mikeshi

    可能会有那么一丁点关系吧。不过现在其实我越来越觉得,对于大部分情况来说钱真是小问题,如果是因为钱的关系,比微软软件贵得产品太多了。就算在企业领域,微软走的还是低端路线,比如SQL Server和Oracle的价格是天差地远……但是无论哪个都是用得无比多的。

  20. 老赵
    admin
    链接

    老赵 2010-07-22 22:40:29

    @zzfff: 我的感受是:M$的特点以及优势是“全平台整合”。

    的确有些情况是这样的,不过有些情况倒真不是,比如我实在找不出对于小型技术团队来说用TFS的理由。

  21. zzfff
    113.141.29.*
    链接

    zzfff 2010-07-22 23:30:19

    @老赵

    其实我是个“纯洁”且专一的技术员,但我对“全整合”的威力是相当迷信的。假设“全整合”是门超牛逼的高射炮,问题不是是否用它来打蚊子,而是学习如何操作它!假设我会熟练操作(我是非常反感说什么精通的),总有一天我会打老鹰,甚至打灰机。

    上面是我针对创业团队/小公司的遐想。你知道,创业公司活下来的概率是非常低的,得思维独特点:)

  22. 躺着读书
    218.17.45.*
    链接

    躺着读书 2010-07-23 00:01:07

    @老赵: 首先我没听懂你这里到底是指什么意思,其次我也不觉得我这里哪里有问题。照我的理解,正是需要由程序员本人判断,这不就是造成Repeat Yourself的原因吗?就算是设了Ignore List,它还是要在最后“钩上去”,还是Repeat Yourself了。而且我还举了其他例子,如配置文件和压缩JS和CSS文件,在我看来DRY完全就是“无处不在”。

    可以忽略掉整个目录,支持通配符:bin* 或者 build* 就行了,提交的时候在工程上面的目录提交就行了。不过确实是没有Eclipse的subclipse插件方便。如果是subclipse插件,自己做了哪些修改完全都能看出来,漏提交基本上不大可能。IDE整合重要啊……

    另外,oracle的售价和sql server差不多的。你不能拿oracle的高级企业版和sqlserver比,而应该这么比:

    至于高级企业版,sql server是按内核收费的,而oracle是按cpu的数量收费的。oracle的价格绝对比sqlserver便宜,这也是大多数企业不使用sqlserver的原因。

  23. zzfff
    113.141.29.*
    链接

    zzfff 2010-07-23 00:01:45

    @老赵

    以自我为中心的缺点我又犯了,不好意思。

    如果X platform/framework/library与Y platform/framework/library是相互竞争的,会了一样,却不得不去悲惨的从头学另一样(尽管要比学第一样时快得多),这就是几乎无解的该死的Repeat Yourself,我以为。

  24. 老赵
    admin
    链接

    老赵 2010-07-23 00:08:59

    @躺着读书

    可以忽略掉整个目录,支持通配符:bin* 或者 build* 就行了,提交的时候在工程上面的目录提交就行了。

    是的我也忽略的,不过在整个目录上面提交,最终还是要把那些文件勾选起来的。

    oracle标准版10个用户,23 999 才两万三千九百九十九元人民币,亚马逊上22,973.00 两万两千九百七十三元人民币。sql server:38,566.00 三万八千五百六十六元人民币

    你这是Oracle Standard One和SQL Server Standard的比较,Oracle Standard就比SQL Server Standard要贵了。当然功能上的差别我真不懂,所以我觉得你可以再细细比较一下。顺便一提,其实阿拉伯数字比中文要容易认,你特地打一遍中文我看着都觉的辛苦……

    至于高级企业版,sql server是按内核收费的,而oracle是按cpu的数量收费的。oracle的价格绝对比sqlserver便宜,这也是大多数企业不使用sqlserver的原因。

    关于Oracle和SQL Server的售价问题,包括CPU和核之类的,你说的完全和我了解到的相反。我一直知道的是SQL Server在Oracle面前打的就是价格牌,所以你现在说的我觉得相当有趣。我刚才去找了写比较的文章,说的都是SQL Server明显比Oracle便宜的……

    比如这个今年6月22日的文章《SQLAuthority News – Price List – Oracle vs SQL Server》,其中写到:

    SQL Server Standard: $7,171
    SQL Server Enterprise: $27,495

    Oracle Standard One: $5,800
    Oracle Standard: $17,500
    Oracle Enterprise: $47,500

    文章里也补充到:

    Additionally, in case of Oracle, you will have to purchase many additional features which are already available at NO COST in SQL Server Enterprise Edition. For example, in the SQL Server Enterprise edition, partitioning is a part of the package, whereas in the case of Oracle, you will have to pay additional 11,500 per processor along with the enterprise edition purchase. If you have a four-socket CPU, you end up paying almost the same price as Oracle Enterprise. Again this is just one feature we talked about. There are many additional add-ons available for Oracle, which are free in the SQL Server Enterprise or Standard edition (e.g. BI Tools).

    在评论里也有人写到:

    If I am not mistaken, SQL Server pricing are for physical CPUs, not for cores whereas Oracle pricing for cores not for physical CPUs.

    不知道你能否多给一些文档或是其他什么的资料,或者直接针对这篇文章里提供的Price List进行评价?(我还没细看)

  25. 躺着读书
    218.17.45.*
    链接

    躺着读书 2010-07-23 00:25:19

    @老赵

    我朋友所在的公司去年弃用sql server就是因为sql server是按内核的数量收费的。

    不过我倒是有一点想不明白,大型一点的企业一般是用大型机或者小型机上跑数据库吧?sql server如何安装到大型机或者小型机上的?毕竟sql server不是跨平台的啊。windows在小型机上运行得怎么样?

  26. 老赵
    admin
    链接

    老赵 2010-07-23 00:32:41

    @躺着读书

    还有另外一篇文章是倾向于Oracle的《Costs of SQL Server vs. Oracle》,其中是这么说的:

    Here we see that while Oracle is at least 10x more powerful than MS-SQL, it only costs 3x more than SQL server.

    简单地说,Oracle虽然贵但是性价比更高。这个性价比啊TCO什么的可以再讨论,但是SQL Server便宜应该是无庸置疑的。

  27. 老赵
    admin
    链接

    老赵 2010-07-23 00:33:58

    @躺着读书

    我朋友所在的公司去年弃用sql server就是因为sql server是按内核的数量收费的。

    能不能让你的朋友写篇文章之类的详细谈一下或比较一下?或是给点资料什么的也是可以的。

    不过我倒是有一点想不明白,大型一点的企业一般是用大型机或者小型机上跑数据库吧?sql server如何安装到大型机或者小型机上的?毕竟sql server不是跨平台的啊。windows在小型机上运行得怎么样?

    有人用大型机么?呵呵,我只见过小型机。跑的怎么样我不知道,不过我在03还是04年的时候就看到过在小型机上跑Windows的案例了。

  28. 躺着读书
    218.17.45.*
    链接

    躺着读书 2010-07-23 00:54:44

    @老赵

    看来是按核收费还是按cpu收费是 oracle和微软之间互相栽赃啊,呵呵。也不知道双方在销售的时候给的折扣怎么样。

    至于你说的附加工具,我不是DBA我也不能下定论。至少就我了解的oracle,标准版的工具够用了。分区是属于企业版的功能。

    oracle数据库最重要的功能undo和redo日志,归档日志,在线日志,索引,数据泵,还有傻瓜化的管理工具DM这些功能能保证。99%的情况不需要什么附加产品。我了解的生产情况也是没有需要附件产品的。属于企业版的功能就是分区和(闪回?)。这些东西是减轻DBA负担的。单绝对不是什么附加工具。

    oracle附加工具如golden gate之类,太多太多了。这些东西的收费就很难说了,他们往往以前是独立的公司和产品后来被oracle收购了。比如说golden gate我了解到:用一次就给了好几万,不过后来了解了原理自己也偷偷用,他就是基于归档日志的一个东西而已。反正就是大规模升级的时候导数据用一次。这些事情如果发case给微软,价格也差不多吧。

  29. 老赵
    admin
    链接

    老赵 2010-07-23 01:01:03

    @zzfff: 如果X platform/framework/library与Y platform/framework/library是相互竞争的,会了一样,却不得不去悲惨的从头学另一样(尽管要比学第一样时快得多),这就是几乎无解的该死的Repeat Yourself,我以为。

    竞争还是需要的,不过我有个疑问,为什么你每样都要去学?照我看来差不多的东西学一个就够了。

  30. 躺着读书
    218.17.45.*
    链接

    躺着读书 2010-07-23 01:02:45

    @老赵: 能不能让你的朋友写篇文章之类的详细谈一下或比较一下?或是给点资料什么的也是可以的。

    那我是要谈谈了,难道是他们公司的DBA骗他的? 呵呵

    oracle我确认是按cpu收费,上个月上线的时候,我看过授权书,也问过交付总监。不过我们是买的Solaris小型机,情况可能有所不同。

  31. zzfff
    113.141.29.*
    链接

    zzfff 2010-07-23 01:09:16

    @老赵

    WCF与Axis2是DRY的典型例子,两个都是SOAP/WS-*规范的实现。为什么?为什么?为什么?......... :)

  32. 老赵
    admin
    链接

    老赵 2010-07-23 01:17:03

    @躺着读书

    反正我SQL Server和Oracle还有企业功能什么的我一个都不懂,也不想去了解……其实关于企业开发的这一套软件啊框架啊我都是这类差不多的感觉,我还是关心一下MySQL或PostgreSQL之类的就差不多了……

  33. 躺着读书
    218.17.45.*
    链接

    躺着读书 2010-07-23 01:24:52

    是的我也忽略的,不过在整个目录上面提交,最终还是要把那些文件勾选起来的。

    这是不可能的啊。除非在你忽略之前,你已经把bin和build添加到了svn版本管理里去了。如果这样你就把bin目录和build目录给删除掉。我现在忽略掉bin目录,在bin目录的上上一级右键提交,bin目录下的一切内容根本不会出现在我的小乌龟里面。

    点右键->TortoiseSVN->settings->globe ignore pattern->输入bin

    bin目录的上一级右键,提交,选中下面的show unversion files bin目录以及bin目录下的所有文件没有出现。

    验证完毕 TortoiseSVN版本1.5.5

  34. Wuvist
    218.186.10.*
    链接

    Wuvist 2010-07-23 04:24:45

    我一直看你blog,觉得你人不错,企图跟你讨论问题而已;我又没人身攻击,你紧张啥米?

    你企图以SVN工具为例来说明DRY的原则;我觉得你举的例子不对(DRY原则当然是成立的,但以你文中的这些例子来证明DRY,我认为是不对的),就回馈说明一下我如何觉得你说得不对而已。

    如果你没能理解我在说什么的话,我重新详细阐述一下我的观点:

    问题就是“新文件”与“项目文件”其实应该是同步的(如csproj里面的文件也应该在SVN中出现),但这样的重复就需要由我们手动维护了。于是,我们为项目添加一个文件时就要做两件事情:

    • 在Visual Studio添加文件
    • 在TortoiseSVN里添加文件

    在这里,你认为这两件事情是Repeat Yourself;并且说“才意识到VisualSVN的重要性,我认为它最关键的一点便是帮我们在Visual Studio与SVN索引之间进行同步”,从而实现了DRY原则。

    就我的理解,A与B之间必须是相互可以替换才是RY:A的变动必然导致B的变动;而B的变动必然导致A的变动。

    但是,在项目中的文件结构跟SVN中的文件结构并不是这样的关系;这两者有联系,但并非有必然相互影响;这并不是Repeat Yourself,而是一个流程中的两个独立步骤。不能因为他们传递的内容有时一致,而认为他们是Repeat。

    你在这里强调“VisualSVN的重要性/DRY原则”,实际上是将两个相互独立的流程给紧紧捆绑起来:在VS中做文件变动,工具自动的这变动反应到SVN中。

    在我看来这非常不好;相当于是在把SVN源码控制当磁盘镜像使用;单个程序员开发也许没有问题,但团队开发下,你强调的这所谓“DRY”会给你带来远比“漏提交文件”更多的潜在麻烦:本地配置/测试/调试文件被错误提交等等。更是直接废掉了SVN branch/switch 单个目录/文件的灵活性。

    而就你的回复来看,导致你写这篇blog的起因“时不时会遗漏一些新建的文件,没有将它们提交至SVN中”,我猜想是由于你没有很好利用SVN Ignore造成的,跟DRY没有关系。

    当然,对于你结尾时提到的“只在一处维护配置数据,然后再构建过程中复制到各个地方去。这一切都是不能松懈的。”我是非常认同的,这的确是DRY原则的体现;但我觉得这跟你前面大段论述“TortoisSVN局限性”没啥联系。

  35. mcpssx
    59.175.192.*
    链接

    mcpssx 2010-07-23 08:05:19

    大企业比如银行业买oracle是全行买断的。

  36. 链接

    congdepeng 2010-07-23 08:46:54

    DRY(Don't Repeat Yourself)的后一句是 Repeat computer if need repeat.

  37. mikeshi
    222.44.183.*
    链接

    mikeshi 2010-07-23 09:07:51

    @老赵

    好吧,我知道有SVN Ignore这个东西,不过倒真没去用,为什么不用我也想不起来了……估计是好像忽略文件夹容易,但是忽略零碎文件还是要一个个设置,麻烦,所以我还是不显示Unrevisioned Files的。

    如果你是需要忽略一类文件的话,可以修改它的配置文件,比如*.bak之类的,这样,它就自动把这些文件忽略了,同样的,也可以维护一份需要二进制checkin的文件列表。

    可能会有那么一丁点关系吧。不过现在其实我越来越觉得,对于大部分情况来说钱真是小问题,如果是因为钱的关系,比微软软件贵得产品太多了。就算在企业领域,微软走的还是低端路线,比如SQL Server和Oracle的价格是天差地远……但是无论哪个都是用得无比多的。

    其实故事是这样的,你看当时仙剑都卖到60几块了吧,但是正版率呢?还是相当的低。为什么呢,因为对于用户来说,一下就要花60多,如果觉得不灵还不能退货,当然觉得不爽了。更何况,微软的东西可不是2位数,开公司的话,应该起码在5位数吧。

    但是反而是一些标榜免费的网游,最后玩家付出反而是最多的。

    而现在的潮流就是如此,像EC2这样的云服务,收费都是循序渐进的,相对而言,用户更容易接受。不知道微软什么时候跟进啊

  38. 老赵
    admin
    链接

    老赵 2010-07-23 09:51:54

    @躺着读书: 这是不可能的啊。除非在你忽略之前,你已经把bin和build添加到了svn版本管理里去了。如果这样你就把bin目录和build目录给删除掉。我现在忽略掉bin目录,在bin目录的上上一级右键提交,bin目录下的一切内容根本不会出现在我的小乌龟里面。

    我说的“那些文件”不是bin和build目录里的东西,它们可以忽略。我说的是新增的代码文件,它们不在bin或build里,因此它们会出现了unversioned files列表里,前面的checkbox是未选中状态,我们需要手动选择一次,这我看来就是Repeat Yourself。

  39. 老赵
    admin
    链接

    老赵 2010-07-23 09:59:16

    @Wuvist

    我一直看你blog,觉得你人不错,企图跟你讨论问题而已;我又没人身攻击,你紧张啥米?

    因为我感觉您语气很不友好,可能这是你的一贯说法方式,我误会了,不好意思。

    就我的理解,A与B之间必须是相互可以替换才是RY:A的变动必然导致B的变动;而B的变动必然导致A的变动。但是,在项目中的文件结构跟SVN中的文件结构并不是这样的关系;这两者有联系,但并非有必然相互影响;这并不是Repeat Yourself,而是一个流程中的两个独立步骤。不能因为他们传递的内容有时一致,而认为他们是Repeat。

    事实上我认为在Visual Studio项目中添加文件,必然会涉及到改变SVN里的内容,且这两个不是独立步骤,是必然一致的(不是有时一致),这里同样也包括在Visual Studio里改名和删除文件。事实上我周围的一些人,他们在使用VisualSVN,自动在Visual Studio和SVN间同步,就不会出现RY的问题。

    在我看来这非常不好;相当于是在把SVN源码控制当磁盘镜像使用;单个程序员开发也许没有问题,但团队开发下,你强调的这所谓“DRY”会给你带来远比“漏提交文件”更多的潜在麻烦:本地配置/测试/调试文件被错误提交等等。更是直接废掉了SVN branch/switch 单个目录/文件的灵活性。

    你这里说的问题,我还是没理解,你能不能举个实例,说明使用了VisualSVN之后可能出现的问题?

  40. 老赵
    admin
    链接

    老赵 2010-07-23 10:04:46

    @mikeshi

    其实故事是这样的,你看当时仙剑都卖到60几块了吧,但是正版率呢?还是相当的低。为什么呢,因为对于用户来说,一下就要花60多,如果觉得不灵还不能退货,当然觉得不爽了。更何况,微软的东西可不是2位数,开公司的话,应该起码在5位数吧。

    在我看来,“正版再便宜也要买盗版”是国内独有的问题,这是一种追求眼前利益表面利益的狭隘眼光(我把这种也称为“山寨观念”),包括程序员也用盗版,要知道盗版第一个损害的就是程序员自身的利益。在国外其实基本不会有这样的情况。而且现在的软件都有试用期啊,比如普通软件的30天试用期,微软一般是90天或180天的试用期,不怕买了以后不能退货,呵呵。

    但是反而是一些标榜免费的网游,最后玩家付出反而是最多的。而现在的潮流就是如此,像EC2这样的云服务,收费都是循序渐进的,相对而言,用户更容易接受。不知道微软什么时候跟进啊。

    云计算这样的服务都是这样的吧,我猜Windows Azure也是这样的。

  41. 老赵
    admin
    链接

    老赵 2010-07-23 10:08:45

    @zzfff: WCF与Axis2是DRY的典型例子,两个都是SOAP/WS-*规范的实现。为什么?为什么?为什么?......... :)

    你这个Repeat Yourself的理解好像有点绝对啊,竞争总是要的。不说.NET和Java间的竞争,即便是基于标准的Java平台,N个不同的JVM实现在使用时(管理、调优等等)方法还不同呢。

  42. 链接

    qiaojie 2010-07-23 10:36:48

    这个扯的貌似有点远了。VisualSVN收费可以用AnkhSVN啊,又免费又开源,我就一直用。这个SVN和git可是两种不一样的管理方式,适合用SVN的未必适合用git。

  43. 躺着读书
    116.77.211.*
    链接

    躺着读书 2010-07-23 11:00:16

    @老赵

    数据库还是很重要的,数据库独立/中立在我看来都是鬼扯。只要你使用了update语句或者insert语句,你就已经和数据库绑定了。因为就算是insert和update在oracle和sqlserver中的实现都不一样。Oracle中查询是绝对不会有任何的锁的,inset和update也只有行级锁,而且只是锁DML语句,不会阻塞查询。SQLServer中是不同的。

    sqlserver是基于短事务的,事务越快提交越好。而oracle是基于长事务的,事务越大越久提交就越好,频繁的提交事务会造成数据库压力过大。sqlserver的游标是基于锁表的,锁是很稀缺的资源。oracle的游标是基于历史版本的,锁是便宜的资源可以疯狂的使用而开销十分小。由于有这些不同,使得你得你同样的表结构在SqlServer中很好,但是在oracle中却慢得让人吃惊,反之亦然。

    我还没提到存储过程和函数这种每个数据库里面完全不同的东西。

    我开始扯到价格,其实我的意思是:就像“Java的应用是开源的,所以很便宜”是个神话一样。

    “因为MS SqlServer是微软提供给中小企业的,Oracle是提供给大企业的,所以Oracle比Sqlserver贵几十倍。”同样也是一个神话。有的时候SQLserver贵,有的时候Oracle贵,价格相差其实并不多。

  44. winter
    61.172.247.*
    链接

    winter 2010-07-23 11:14:45

    我觉得最大的RY是VS的文件树么有复用explorer 要不然乌龟就可以直接代替VisualSVN了

  45. 老赵
    admin
    链接

    老赵 2010-07-23 11:24:52

    @winter

    这我觉得还是不行的,你的意思其实是“Folder-based Project”,但事实上不是同一个目录下的文件都应该归为项目里。以前Web Site项目用得就是Folder-based,问题很多,最后还是回到Web Application了。

  46. 老赵
    admin
    链接

    老赵 2010-07-23 11:26:52

    @躺着读书

    Oracle中查询是绝对不会有任何的锁的,inset和update也只有行级锁,而且只是锁DML语句,不会阻塞查询。SQLServer中是不同的。

    我记得SQL Server里可以在SELECT时加NOLOCK标记就不锁了,UPDATE之类的也是可以加ROWLOCK标记什么的。

    “因为MS SqlServer是微软提供给中小企业的,Oracle是提供给大企业的,所以Oracle比Sqlserver贵几十倍。”同样也是一个神话。有的时候SQLserver贵,有的时候Oracle贵,价格相差其实并不多。

    价格是摆在那里死死的,你说的更是TOC样的东西,这个就是要讨论的了,这也是一直争论不休的。

  47. Wuvist
    220.255.7.*
    链接

    Wuvist 2010-07-23 11:37:11

    @老赵

    事实上我认为在Visual Studio项目中添加文件,必然会涉及到改变SVN里的内容,且这两个不是独立步骤,是必然一致的 你这里说的问题,我还是没理解,你能不能举个实例,说明使用了VisualSVN之后可能出现的问题?

    我在本地调试网站,为方便添加一些测试数据,做了个test.aspx;这不需要添加进SVN。

    我说的是新增的代码文件,它们不在bin或build里,因此它们会出现了unversioned files列表里,前面的checkbox是未选中状态,我们需要手动选择一次,这我看来就是Repeat Yourself。

    你之前说的情况是你在TortoriseSVN中设置了不显示unversioned files,造成你把这些文件给遗漏了。

    这些手动选择一次是为了做多一次验证,在提交代码给别人使用时再确认一次;如果按照你的说法,这是repeat,那么就相当于默认不验证,本地有什么就提交什么。

    程序员不判断,不repeat yourself。

    我要开发功能A,添加了若干文件,但还在开发过程中,变动尚未能发布。

    项目有另一个bug报告进来,我及时修改了现有文件,并且要commit。

    按照你的说法,commit时程序员不判断,不Repeat yourself;那么我为功能A做的尚未可发布的变动就会被自动提交进去了。

  48. ruby
    58.246.31.*
    链接

    ruby 2010-07-23 11:41:19

    好难懂。。。。

  49. zzfff
    113.141.29.*
    链接

    zzfff 2010-07-23 11:53:51

    @老赵

    怎么说呢,反正我在WCF上花了不少精力,现在又要在Axis2上花精力,做个比喻,就像你辛辛苦苦仔仔细细解剖研究了一具白人,现在导师又要你以相同的方式解剖一具黑人,我是不觉得有趣的,我更愿意只解剖一具地球人。

    Axis2也分channel layer/service layer,WCF的DispatchRuntime在Axis2中对应的是............嗯,举一反三,触类旁通,但是,即便是cnblogs\Artech,要他把Axis2研究到对WCF那样熟悉的程度,他也需要不少时间。

    不知别人是否有这样的感触,也许是我太娇气:)

  50. 链接

    韦恩卑鄙 @waynebaby 2010-07-23 12:00:20

    o是 按照内核的 sql是按照cpu的

    無論tfs cc 還是 svn vs的插件整合都比文件監視靠譜。但是a*svn 插件對於項目外的附加文件(直接附加在解決方案文件夾的文件)變化不敏感,我懷疑是 VS2010的内部API就不敏感。

  51. 老赵
    admin
    链接

    老赵 2010-07-23 13:10:13

    @Wuvist

    我在本地调试网站,为方便添加一些测试数据,做了个test.aspx;这不需要添加进SVN。

    如果你这个test.aspx不添加到解决方案中去,那么就不需要添加进SVN。而即便是个你用来测试的临时文件,只要你在Visual Studio里添加了,在解决方案里出现了,那么SVN缺少这个文件就会编译不通过。

    这些手动选择一次是为了做多一次验证,在提交代码给别人使用时再确认一次;如果按照你的说法,这是repeat,那么就相当于默认不验证,本地有什么就提交什么。

    其实在理想情况下,程序员本来就不应该做这些验证,因为在Visual Studio解决方案里的东西是一定要塞入SVN的,这就是我说的“必然一致”,不是“有时一致”。

    我要开发功能A,添加了若干文件,但还在开发过程中,变动尚未能发布。项目有另一个bug报告进来,我及时修改了现有文件,并且要commit。按照你的说法,commit时程序员不判断,不Repeat yourself;那么我为功能A做的尚未可发布的变动就会被自动提交进去了。

    只Commit特定文件就行了,这和我这边讨论的东西不一样。该判断的时候自然要判断,但是该DRY的时候就该DRY,不能一概而论,不能因为有些情况必须要判断,因此其他情况下也需要判断……

  52. 老赵
    admin
    链接

    老赵 2010-07-23 13:13:45

    @韦恩卑鄙 @waynebaby: o是 按照内核的 sql是按照cpu的

    这也是我一直听说的,刚才在推特上问下来也是这样的。有人还给了这样一个链接,也是说Oracle是按core,SQL Server按CPU收费的,所以我说上面那位兄弟的说法和我听说的正好相反……

  53. Wuvist
    220.255.7.*
    链接

    Wuvist 2010-07-23 13:39:08

    只要你在Visual Studio里添加了,在解决方案里出现了,那么SVN缺少这个文件就会编译不通过。

    所以,提交之前程序员必须去diff一下sln/project文件,去确定一下变动是不是想要提交的。而不是想也不想统统提交;甚至认为想一下是RY。

    只Commit特定文件就行了,这和我这边讨论的东西不一样,该判断的时候自然要判断,但是该DRY的时候就该DRY。

    你说的情况是当我要commit特定文件的时候,工具自以为是认为这是DRY,自动帮我把那些我不想commit的文件也打勾了。

    没有判断,是不知道要不要判断;程序员在任何情况下都必须判断,而你推荐的是一种不判断的流程;并且说如果判断了,就是RY。这是对RY的错误理解。

    其实在理想情况下,程序员本来就不应该做这些验证,因为在Visual Studio解决方案里的东西是一定要塞入SVN的,这就是我说的“必然一致”,不是“有时一致”。

    理想情况是Eventually consistent;而不是sync/replicate。Eventually consistent也就意味着存在不一致的中间情况,而这就是我说的“有时一致”。

  54. 老赵
    admin
    链接

    老赵 2010-07-23 13:49:27

    @Wuvist: 所以,提交之前程序员必须去diff一下sln/project文件,去确定一下变动是不是想要提交的。而不是想也不想统统提交;甚至认为想一下是RY。

    在我看来,如果是不想提交到SVN里去的东西,就不应该添加到sln等文件里面去,而不是先添加,然后在提交前改回来──光diff是没用的,还得改回来才能提交。

    我理解你的意思是,你就是要求程序员做到各种检查,而我则是希望工具可以辅助程序员简化许多事情。如果你能够让每个程序员在提交前都小心地检查,那么自然是OK的。同样我也没觉得我的看法有什么问题,让SVN和IDE集成本身就是体现了DRY,不存在错误理解。

    这样吧,我建议我们先各自保留意见,我现在更想关注一下别人对这方面事情怎么看。

  55. 链接

    zellux 2010-07-23 14:51:23

    然后继续编辑修改测试,然后就用VisualSVN提交了

    这里似乎应该是TortoiseSVN,老赵笔误啦?

  56. 链接

    zellux 2010-07-23 15:01:40

    @Wuvist

    我要开发功能A,添加了若干文件,但还在开发过程中,变动尚未能发布。项目有另一个bug报告进来,我及时修改了现有文件,并且要commit。按照你的说法,commit时程序员不判断,不Repeat yourself;那么我为功能A做的尚未可发布的变动就会被自动提交进去了。

    我没觉得这个问题和老赵说的有啥关联啊。我倒是觉得这是svn的一个缺陷,与具体哪种使用方式无关。git里面碰到这种情形,用git stash保存当前的代码修改,然后新开一个hotfix的branch处理临时的bug就行了。

  57. 链接

    seerhut 2010-07-23 15:06:05

    向svn repo新增文件是一个相当大的改动吧,我认为需要手动选择是很有道理的。 而且这一点完全不会困扰我,因为编译结果会放进out目录,添加一次ignore就行了。很多大型的项目在编译过程中代码目录甚至是完全不变的,中间结果和最终文件都输出到外部的目录中。

    svn还是不太适合重型ide的项目,因为ide中资源是基于逻辑关系组织的,这种关系很多时候只有ide自己了解。但是eclipse是不错的东西,项目逻辑层很薄,对小工具相当友好。

  58. 老赵
    admin
    链接

    老赵 2010-07-23 15:25:07

    @zellux

    啊呀,是的,谢谢……

  59. zzfff
    113.141.29.*
    链接

    zzfff 2010-07-23 16:04:48

    作为跑题王子的俺,这次虽跑了内容,但没跑标题,我很欣慰。这个世界没错,但不够完美。

  60. 躺着读书
    116.77.211.*
    链接

    躺着读书 2010-07-23 17:58:38

    @老赵

    Oracle官方的Price List:

    Processor: shall be defined as all processors where the Oracle programs are installed and/or running. Programs licensed on a processor basis may be accessed by your internal users (including agents and contractors) and by your third party users. The number of required licenses shall be determined by multiplying the total number of cores of the processor by a core processor licensing factor specified on the Oracle Processor Core Factor Table which can be accessed at http://oracle.com/contracts. All cores on all multicore chips for each licensed program are to be aggregated before multiplying by the appropriate core processor licensing factor and all fractions of a number are to be rounded up to the next whole number. When licensing Oracle programs with Standard Edition One or Standard Edition in the product name, a processor is counted equivalent to an occupied socket; however, in the case of multi-chip modules, each chip in the multi-chip module is counted as one occupied socket.

    For example, a multicore chip based server with an Oracle Processor Core Factor of 0.25 installed and/or running the program (other than Standard Edition One programs or Standard Edition programs) on 6 cores would require 2 processor licenses (6 multiplied by a core processor licensing factor of .25 equals 1.50, which is then rounded up to the next whole number, which is 2). As another example, a multicore server for a hardware platform not specified in the Oracle Processor Core Factor Table installed and/or running the program on 10 cores would require 10 processor licenses (10 multiplied by a core processor licensing factor of 1.0 for ‘All other multicore chips’ equals 10).

    标准版和标准起步版,是按照socket插槽收费的,那就是CPU的意思吧。其他的还是按照内核,不过这个内核是乘以一个基数的。不过我得到的信息是,这些价格都不准,实际上买的时候有折扣的,而上个月我看到的确是是小型机Solaris+企业版按照cpu收费。不知道是不是最新的优惠。

  61. 链接

    陈梓瀚(vczh) 2010-07-23 18:42:12

    @Wuvist

    我就说,如果你不打算提交,那修改来干嘛?如果你明知是临时修改,你可以先关掉VS的Source Control,然后再编辑。因此这完全可以算是Repeat。你的论据不对,你在试图表明添加到VS和添加到SVN是两个步骤,但实际上添加到SVN的文件和添加到VS的文件是有关系的,不是完全独立的两组文件。这里面的信息就Repeat了,应该这么看。

    DRY的意思就是,我对于每一种东西(譬如文件名),只操作一次,以后全部不管自动执行。举个例子,你每次打开sln,如果都是先在资源管理器里面找到文件然后再双击,其实也属于Repeat Yourself了……

  62. 链接

    陈梓瀚(vczh) 2010-07-23 18:46:38

    @Wuvist

    还有一点,你说的test.aspx的问题,这完全是你的方法不对,你应该通过创建unittest工程而checkin到SVN去。因此这完全是你的习惯不好造成的,而不是VS强迫你干嘛干嘛。

  63. 躺着读书
    116.77.211.*
    链接

    躺着读书 2010-07-23 18:55:54

    @老赵: 我记得SQL Server里可以在SELECT时加NOLOCK标记就不锁了,UPDATE之类的也是可以加ROWLOCK标记什么的。

    这不是能不能的问题(Oracle同样也能 在select 后面加for update 加锁)而是数据库默认行为的不同。数据库默认行为的不同是数据库内部的实现机制不同造成的。Oracle默认不加锁,而你去加锁是有问题的。SQL server默认是加锁,而你不加锁也必定会有问题的。这些数据库的行为会深深的影响你的应用的设计。

    Oracle查询的时候不锁表是因为Oracle对每一行都是通过scn版本管理的。所以在查询的时候,你打开游标,你查到的只是那一个时刻的数据,之后的update和insert你在这个事先打开的游标中都查不到,所以没必要加锁。这种机制决定了某些机制,比如说众所周知Oracle是没有自动增长列的。而是通过sequence,就是受这个机制的影响。

    还有比如说你要写一个ID生成器,其他的某些数据库的做法是先select然后update,这个做法在Oracle行不通!你必须要明确声明锁。但是如果你这么做了,你还是错了。如果你这样做,Oracle效率非常低。正确的做法还是通过sequence。

    对于事务,Oracle里面提交一个有十万个inset update的事务,和提交一个只有一条update记录的事务开销基本相等,因为哪怕你没有提交这些数据就已经写到了硬盘上去了,commit和rollback只是给日志打个标记而已,而事物没有提交之前的查询呢?就是靠scn的版本管理来实现的。这样就决定了Oracle的事物应该保持,越晚提交越好。频繁的提交小事务只会造成cpu的开销过大。

    Oracle里面不应该建临时表去用作查询的中间表(这样会产生严重的性能问题),而应该使用物化视图……

    你会发现,我们现在还没用一个存储过程,没有用一个数据库函数,我们就已经如此容易地和数据库绑定了……

  64. 链接

    Ivony 2010-07-23 19:01:02

    老赵啊。。。。

    最近偶弄了一个项目,关于Web数据绑定的,我觉得这玩意儿是个革命性的东东。想和你讨论一下这个框架F#编码的风格,不知道有兴趣么,怎么联系你比较方便。

    我的邮箱就是那个。

  65. helloworld2
    112.64.50.*
    链接

    helloworld2 2010-07-23 22:10:18

    你的首页搜索不能,js错

  66. Wuvist
    218.186.10.*
    链接

    Wuvist 2010-07-24 02:07:19

    @陈梓瀚(vczh)

    觉得你既没了解我的意思,也没有了解赵姐夫的意思。

    明知是临时修改,你可以先关掉VS的Source Control,然后再编辑

    谢谢你给我提供证据证明在编码时的IDE => SVN自动同步是在自找麻烦。

    实际上添加到SVN的文件和添加到VS的文件是有关系的,不是完全独立的两组文件

    请参考我之前的描述:这两者有联系,但并非有必然相互影响;这并不是Repeat Yourself,而是一个流程中的两个独立步骤。不能因为他们传递的内容有时一致,而认为他们是Repeat。

    还有一点,你说的test.aspx的问题,这完全是你的方法不对,你应该通过创建unittest工程而checkin到SVN去。因此这完全是你的习惯不好造成的,而不是VS强迫你干嘛干嘛。

    我只是应赵姐夫的要求给他举个简单例子而已。

    ========================

    本地源码是多变的,在我自己的开发中,我是倾向于频繁commit,一当完成某个小功能,便commit。

    这也就意味着commit的代码很可能并非全部代码;而仅仅是已修改代码的部分内容,比方说:

    我要升级模块A,修改到一半,发现其中的函数X的变动是独立的。

    我修改好了函数X,便可以commit了,但之前模块A的其它修改(比方说添加了新文件)尚未全部完成,并不能commit。我需要单独commit函数X的相关变动。

    这时候,我便需要审视一下已做的变动,判断一下哪些是应该提交,哪些不应该提交。

    提交代码前的检查是必须的;在团队开发下,每个人都应该为自己提交的代码负责,确保自己给别人的代码是可用的。

    而赵姐夫对此的理解是:commit之前的检查是RY,他相信IDE就足够了,IDE应该足够聪明,自动把他所有的变动都提交上去。这也就意味着:

    1. 每次commit都是本地变动的全面commit,我上面提到的单独提交函数X的情况是不提交的; 他很可能要等到整个模块开发完毕之后才一次性提交。

    2. 并且,他N久才做一次的大提交前他是不会去检查具体变动的,检查了,就是RY;而程序员是不应该RY的。

    赵姐夫,我没理解错你的意思吧?

    如果真是如此,我只能说这样的做法是对团队不负责任的表现。

    间隔较长时间的全面commit,意味着会积累更多的变动,自己都未必能够清楚每一个变动,更别说确定每一个变动都是完整/全面的(临时调试的代码都删掉没有?注释写清楚没有?等等)。

    然后,看都不看一眼,凭感觉相信IDE,少了文件都不知道就直接提交了?

    赵姐夫屡次漏提交新增文件的例子,不是IDE不好,不是他被RY拖累;而是因为他没有在提交代码前在做一次仔细审核的习惯,他认为提交之前的审核是没有必要的,这样RY的琐事是应该由工具搞定的,即便代码修改涉及到了文件变化。

    希望工具可以辅助程序员简化许多事情

    你自己提交之前不检查,就是等着团队所有其他人update的时候都帮你做一遍检查;你“简化”自己的事情,增加别其他所有人的麻烦,仅此而已。

  67. Wuvist
    218.186.10.*
    链接

    Wuvist 2010-07-24 02:18:44

    @zellux

    说SVN的有局限,这个我是同意的。git/hg等分布式源码管理工具带来的工作流程会爽很多。但赵姐夫说的不是SVN有局限,而是说TortoiseSVN有局限:

    这就是TortoiseSVN的局限性所在。TortoiseSVN只关心硬盘上的文件,而不会关注这些文件在逻辑上有什么关联。

    我理解出来赵姐夫的核心意思是:要有一个工具,能够了解程序文件之间的逻辑并自动确保提交时的文件在逻辑上是完整的;因为程序员如果在提交时再自己去判断一下变动的逻辑,就是RY啦~

    无论是使用svn还是git还是别的什么,你觉得在团队开发的环境下,程序员个人在提交代码的前是否有复查所提交变动的责任/必要呢?

  68. 老赵
    admin
    链接

    老赵 2010-07-24 12:16:38

    @Wuvist

    而赵姐夫对此的理解是:commit之前的检查是RY,他相信IDE就足够了,IDE应该足够聪明,自动把他所有的变动都提交上去。这也就意味着:

    • 每次commit都是本地变动的全面commit,我上面提到的单独提交函数X的情况是不提交的; 他很可能要等到整个模块开发完毕之后才一次性提交。

    • 并且,他N久才做一次的大提交前他是不会去检查具体变动的,检查了,就是RY;而程序员是不应该RY的。

    赵姐夫,我没理解错你的意思吧?

    上面的每句话都是你臆断的,因此你的确理解错我的意思了。简单地说,这个错误是把我的观点“先放大再反驳”。

    其实有句话之前我也说过:我只说“在IDE里添加文件”和“文件进入SVN索引”这两个紧密结合的步骤需要程序员手动再做一遍,这是一种RY,然后你直接认为我说提交前不需要“任何检查”,说我认为提交前的“任何检查”没有必要,说我希望“所有的变动”都由工具负责,说我认为“任何检查”都是RY。这是我的意思吗?我从来没说过什么“大规模提交前不应该检查”之类的话。

    事实上,虽然我遇到的这个问题很多次,但是总体来说是极少数的,但每次遇到这个问题,我就想到只要有个VisualSVN之类的东西,就没有任何问题了。比如我开发一个功能,新增了程序文件和单元测试文件,要提交前我检查它的实现注释,然后把程序文件添加到SVN索引里面去,结果还是漏了个单元测试文件。因为文件已经在VS里了,很容易被理解为“已经添加好了”。程序员可以检查,但依赖人力的检查,20次里会不会有1次疏忽?工具往往就是用来消除这1次错误的。就像你说的,要检查的东西已经太多了,有些东西就应该交给工具去做。

    否则,按照你“负责”,“检查”的逻辑,我是不是也可以“放大”后说,配置的自动同步也是没有用的呢?反正在提交前程序员应该负责任地检查所有的配置都修改正确了──甚至连代码也一样。但事实上根本不是这么回事,我也不会说这样的话。工具该负责避免的RY就该做,工具该做的事情,不代表程序员就不该检查了。程序员有责任检查,不代表工具就不需要了。现在的意思说的很清楚了吧?

    至于vczh,我不知道他有没有理解我的意思,但是,如果从我角度去假设他已经理解了,那么他说的话是没有问题的。

    另外,你上面说vczh的说法证明了IDE和SVN绑定的很麻烦,在我看来这不能说明问题,因为你的做法(或者说是例子)本身就是错误的,不应该这么做的,你这么做了,要工具去迎合你的错误,自然要在工具的使用上造成麻烦。这不是工具的错,是做法的错误。

  69. 链接

    Shaun 2010-07-24 14:58:31

    补充一点,VisualSVN好像可以为开源作者提供免费版。

  70. Wuvist
    220.255.7.*
    链接

    Wuvist 2010-07-24 17:01:26

    @老赵

    上面的每句话都是你臆断的,因此你的确理解错我的意思了。

    嗯,既然是我臆断错了;既然咱都同意程序员有检查的责任,那么就可以回到原来的话题。

    程序员有责任检查,不代表工具就不需要了。

    恩,TortoiseSVN这个工具本身能够把目录下面的所有新文件列举出来,这也是工具作用的表现。

    程序员使用TortoiseSVN把项目新文件逐个点一下添加也好,点全部添加也好;使用VisualSVN默认自动添加了,扫一眼判断一下是否都自动添加对了也好;这都是在做检查确认。

    点一下鼠标/扫一眼,做的是复查/confirm;而不是repeat。

    所以我之前说你错误的理解了repeat yourself。confirm是confirm; repeat是repeat。

    使用类似VisualSVN自动把新增文件打勾,是一种辅助;但这不意味着有了它的辅助,程序员就有理由连看一眼都不看,甚至说:

    程序员不判断,不repeat yourself。

    实际上,VisualSVN自动把新增文件打勾,我觉得是很鸡肋的。TortoiseSVN直接监控整个目录,把所有的文件变动都列出来能够做更全面的检查,因为未必所有需要提交的文件都在在solution中,而未必所有在solution中的文件都要提交。

    这就好比ASP.Net的website模式,默认没有project文件,而是把整个目录的内容都当成project。

  71. 链接

    xiaotie 2010-07-24 20:52:16

    要看个人习惯了。我不喜欢把svn集成到ide中去。以前用eclipse时,使用过一阵集成的插件,后来又换回小乌龟了。

  72. 老赵
    admin
    链接

    老赵 2010-07-24 21:13:47

    @Wuvist

    实际上,VisualSVN自动把新增文件打勾,我觉得是很鸡肋的。TortoiseSVN直接监控整个目录,把所有的文件变动都列出来能够做更全面的检查,因为未必所有需要提交的文件都在在solution中,而未必所有在solution中的文件都要提交。

    在solution文件中文件“必须”要提交,因此VisualSVN自动把“项目内”的文件自动打钩。

    confirm是confirm; repeat是repeat。

    我认为,如果这个confirm的双方是“完全相关”的,却没有由工具省下这个confirm步骤,那么就是种repeat。

    这就好比ASP.Net的website模式,默认没有project文件,而是把整个目录的内容都当成project。

    这点其实就是WebSite的最大缺陷,因为在实际项目中,并非所有在目录下的文件都属于项目内的文件。VS 2003是WebApp,VS 2005变成了WebSite,导致程序员怨声载道,因此在VS2005中不得不很快通过一个独立补丁加上WebApp,而刚才我去看了下VS 2010(2008卸了),已经没有WebSite只有WebApp了……

  73. Wuvist
    220.255.7.*
    链接

    Wuvist 2010-07-24 22:20:38

    @老赵

    在solution文件中文件“必须”要提交

    检查的是solution中的新文件是否确定需要commit给团队使用;而不是solution定义的文件在提交列表中。

    这点其实就是WebSite的最大缺陷

    这让php等开发者情何以堪。。。。

    顺便一说,使用WebApp模式时复制新文件进网站后还需要手动的去VS里面添加一遍进去项目,这才是标准的RY。

  74. Wuvist
    220.255.7.*
    链接

    Wuvist 2010-07-24 22:39:07

    而刚才我去看了下VS 2010(2008卸了),已经没有WebSite只有WebApp了……

    不知道你的2010怎么装的。。偶的(2010/2008并存)有。。

  75. 老赵
    admin
    链接

    老赵 2010-07-24 23:13:20

    @Wuvist

    检查的是solution中的新文件是否确定需要commit给团队使用;而不是solution定义的文件在提交列表中。

    检查的是文件是否应该添加到solution中,而不是solution中的文件是否应该commit──因为solution里的文件是一定要commit的,所以应该交给VisualSVN管。

    顺便一说,使用WebApp模式时复制新文件进网站后还需要手动的去VS里面添加一遍进去项目,这才是标准的RY。

    那是,所以要用工具来避免RY,例如,你可以把文件复制到VS里面去,而不是复制在资源管理器里……

    不知道你的2010怎么装的。。偶的(2010/2008并存)有。。

    那么看来是2008里有的?我的VS 2010反正是没有……

  76. Wuvist
    218.186.10.*
    链接

    Wuvist 2010-07-25 00:07:06

    @老赵

    检查的是文件是否应该添加到solution中

    你不看正要提交的文件列表,你怎么做这个检查?

    所以要用工具来避免RY,例如,你可以把文件复制到VS里面去,而不是复制在资源管理器里

    我还可以使用web site模式,免得加个图片都得开VS,并且这是在本质上杜绝了RY的可能。

    真正需要“project/sln”文件的是IDE,而不是程序员。我还可以使用python去做网站,直接利用目录结构充当命名空间,永远不会有些什么“project”/“sln”文件需要维护。

  77. 老赵
    admin
    链接

    老赵 2010-07-25 00:12:20

    @Wuvist

    你不看正要提交的文件列表,你怎么做这个检查?

    只要有VisualSVN这样的集成,只需要关注solution里有没有这个文件就行了,避免了Repeat检查。Repeat检查终究还是人肉检查,疏忽是难免的,工具降低了疏忽的可能性。

    我还可以使用web site模式,免得加个图片都得开VS,并且这是在本质上杜绝了RY的可能。

    有了WebApp,文件夹里可以有不属于solution里的文件,临时文件也好,测试文件也罢,放着都没有关系。WebApp自然是有缺点的(比如你说的这个,况且复制到VS里去就没这问题了),只是从社区反馈来说,相比WebSite大家还是更接受WebApp这种模式了。

  78. Wuvist
    218.186.10.*
    链接

    Wuvist 2010-07-25 00:31:06

    只需要关注solution里有没有这个文件

    过滤整个solution所有文件容易,还是看正要提交的文件列表容易?

    是应该看着正要提交的文件列表复想一下它们都应该存在于sln中?还是要对着IDE去看VisualSVN的小点过滤?

    提交之前要检查的是提交的内容?还是当前的sln?

    有了WebApp,文件夹里可以有不属于solution里的文件

    website,文件夹里面就不可以有不属于“sln”的文件么?

    website根本就没有sln的概念。。。

    当复制图片这样简单的操作时都被迫用VS去做,这已经是走火入魔,人为刀驭。

    再重复一次,真正需要“project/sln”文件的是IDE,而不是程序员。

    从社区反馈来说,相比WebSite大家还是更接受WebApp这种模式了。

    这要看什么社区了,去php/py等社区,他们会问:“什么是WebApp?”

  79. 老赵
    admin
    链接

    老赵 2010-07-25 00:33:01

    @Wuvist

    算了,其实我们该说的已经都说清楚了,再谈下去就是不断重复,所以还是各自保留自己的看法吧。

  80. Wuvist
    218.186.10.*
    链接

    Wuvist 2010-07-25 00:56:56

    @老赵

    如果单纯是VisualSVN能够在提交时自动将新文件选取的这个功能的话,是没有讨论必要的。

    但是就你一开始的描述,我把你的blog理解为你混淆了confirm / RY的意义,这是根本概念性的问题;所以我才有兴趣回复讨论相关的流程、概念。

    当然从你刚刚的回复看,你并没有混淆这两个概念;而我一开始的“直陈其非”明显“伤害到你感情”了。

    这里给你赔个不是。

    我们的区别在于看待“项目”文件的方式不同。而我们的不同,我觉得碰巧可以认为用“Web Site”/“Web App”这两种模式来比拟。

    而这两种模式的不同又是跟DRY原则有密切联系。

  81. weiwei
    114.176.248.*
    链接

    weiwei 2010-07-29 12:01:28

    这句话本来就是错误的,大自然的东西都是在重复自己,树枝在分叉,整个大树的形状还是一个2叉.软件根本不需要人类这种蹩脚的设计师.dry是给自己加了个枷锁而已.

  82. 鳞
    220.178.24.*
    链接

    2010-08-05 09:16:50

    有个叫PUSHOK的插件,不过是收费的. 集成到VS还是很方便的.

  83. superbryant
    183.7.160.*
    链接

    superbryant 2010-10-09 16:48:07

    学习老赵,老赵哥我是您超反对的那个学校出来的,但是我佩服您的性格,所以向您学习!

  84. 云计算
    125.18.116.*
    链接

    云计算 2011-12-08 23:44:23

    我叫Matt。现在我在戴尔公司工作。你的想法真的很实用。我想,可惜Visual Studio和TFS是分开的,公司愿意买Visual Studio不一定愿意买TFS。同理,我会要求公司买Visual Studio,但是不强求买TFS,因为性价比太低。

  85. 老赵
    admin
    链接

    老赵 2011-12-09 09:31:33

    @云计算

    想要“集成”不需要TFS啊。

  86. 云计算
    121.240.224.*
    链接

    云计算 2011-12-12 17:22:50

    谢谢你的建议。。。。。

  87. noname
    8.35.201.*
    链接

    noname 2013-05-28 18:38:22

    看了Wuvist和老赵的讨论。非常支持Wuvist

已自动隐藏某些不合适的评论内容(主题无关,争吵谩骂,装疯卖傻等等),如需阅读,请准备好眼药水并点此登陆后查看(如登陆后仍无法浏览请留言告知)。

发表回复

登录 / 登录并记住我 ,登陆后便可删除或修改已发表的评论 (请注意保留评论内容)

昵称:(必填)

邮箱:(必填,仅用于Gavatar

主页:(可选)

评论内容(大于5个字符):

  1. Your Name yyyy-MM-dd HH:mm:ss

使用Live Messenger联系我