为什么项目开放源代码之后就变成死项目 很少或几乎不再更新
经常遇到一些好的.NET项目开放源代码之后,便很少更新。即使是大名鼎鼎的CodeProject中的文章中的代码项目,遇到问题时,留言或是主动给作者发邮件,都像石沉大海一样,得不到回复或解决,只好自力更生。
Codeplex中的项目,更新的速度就更慢了。从First release算起,三个月之外,就很少有更新了。我指的项目不是指官方的一些项目,驻留在这里。比如SQL Server的Sample Database驻留在这里,更新速度当然频繁,有官方的背景,各方面的更新工作肯定不会马虎。
1 项目已经成熟,满足作者设定的需求范围,不再需要更新
这种情况比较多。项目的开发人员,在设定目标后,会花费很多时间来完成它,业余时间都会充分利用上。我自己也经常这样,一旦认为添加某个Feature对项目非常重要时,会把业余时间都利用上,加班加点的把它完成。
举例说明,一个数据库工具,一开始作者设定只需要连接到SQL Server进行数据操作即可。这样的需求设计,你很难要求作者去为你添加Oracle,MySQL的支持。一个代码生成工具,起初的目标是支持SQL Server, Access, Oracle,MySQL四种类型的数据库,但是后来作者发现,大部分的时候,只需要满足一个常见的数据库类型即可,要能支持其它类型的数据库,测试和编码的工作量要多很多。写出来的功能,就应该充分测试,要么就没有,要么就测试充分以满足各种情况和场景。我的一个代码生成器曾经也有这样的思考,只要求支持SQL Server,但是后来一直想加入对Access,Oracle的支持,一直没有动力,最后不了了之。项目中遇不到的使用场景,很难有动力去虚拟一个环境,做出连自己都不需要的功能。
2 遇到技术瓶颈 现在项目停止开发或转向新的架构和需求
每个开源项目是为解决特定领域的问题,如果满足第一条,可以满足该领域的需求,便不再需要精进。另一方面,遇到不可解决的技术瓶颈,也会导致项目无法继续深入下去,现在已经做的最好了,再深入下去会无从下手。
前段时间,我想找一个项目中代码重复的检测工具,判断一下,我的项目中有哪些代码是通过拷贝的方法做出来的,而不是进行代码重用。代码重复给项目的维护带来麻烦,所幸运的时,在CodePlex上面找到一个开源工具,Clone Detective, 只支持VS2008,之后就没有更新。2010年4月微软发布Visual Studio 2010,至今已有三年,也没有更新过这个小工具。VS2012内置了代码重复的检查工具,但是依照目前的情况来看,.NET 4.5的普及程度不高,拒绝对XP和Windows Server 2003的支持,要花钱买正版的企业,一般都不会为此买单。Resharper 有一个插件工具,也可以检测代码重复,但是只支持5.1版的Resharper。以我的理解,这两个工具,可能是因为面对新的API变化,技术阻碍,而停止更新。能做出这样工具的开发人员,技术瓶颈是需要适应新的开发工具接口,但无力去维护更新。
3 作者或公司转向新的研究领域,原有的代码不再维护更新
这种情况曾经发生在Borland公司身上。Borland公司曾经是世界一流的开发工具供应商。曾经的一个时代,世界上的绝大多数的控件,是用Delphi开发的。后来是.NET的崛起,Delphi控件供应商逐渐减少,或是无法赢利的时候,直接把控件抛给开源社区,开源社区因为没有赢利的驱动,又不以把握市场需求为目的,凭借个人兴趣爱好,难以成体系的发展。到现在,世界上流行的控件或组件包,几乎都是.NET开发的。Infragistics NetAdvantage系列,Dev Express系列,ComponetOne系列,Synfusction系列,Krypton系列,全是为了.NET市场而生的商业组件包。
Java世界也发生过这种现象,顺应市场的发展,开源只是为了放下过去,更好的拥抱未来。
留下一堆的组件包在开源世界,几乎无人问津。
4 失去促进开源项目发展的动力,有心无力
这一点应该是符合中国国情的一点。设计一个流行的开源项目,可以增加自己的知名度,为自己镀金。但功成名就之后,这个敲门砖便不再有作用,失去继续维护的动力。再者,IT这一行逐渐走向平民化,薪水和待遇不再远远高于其它行业,有时候甚至低于金融,会计这些行业。
俗话说饱饭思淫欲,在没有吃饱饭的情况下,积极的促进开源事业的发展,有点背道而迟。如果有基金扶持,项目肯定会做的很好,很有特色。但是这一项待遇只属于各大院校。把研究出来的东西,再锁进抽屉里面,如果想看论文,需要再次付款,谁会再次去为此付款。作为纳税人,我们已经为他们的科研工作提供支持,用税收给他们研究动力,我想看一下他们研究的成果却不行,这可是花我的钱研究出来的东西。
公司则永远不可能为开源而开源,公司要赢利才能生存,每个月的水电费,租金,人员开支都需要钱。公司开放项目的源代码也是为了赢利。曾经看到一个公司把ERP项目都开源了,后来发现原来是赚个吆喝,真正的核心组件没有开源。
5 项目被公司看中,进行定制 开源停止更新 闭源发展的更好
如果一个开源项目被公司看中,公司聘请到这个项目的开发人员,探讨这个项目的发展,或转向新的商业领域。这是开源项目中,我以为最好的一种结局。典型的例子是.NET Reflector,大名鼎鼎的.NET反编译工具,在.NET开发领域几乎无人不知,无人不晓。后来被Red Gate收购了,版本更新更快了,功能也更强大。
曾经有朋友问,是不是增加了更霸道的功能才收费。我的回答是Yes。
旧的版本的.NET Reflector,反编译后有几个问题没有处理好:
1 属性 比如代码中一个Name的属性, 代码如下所示
public string Name { set;get;}
反编译后的结果是是get_Name,set_Name,要手动修改才能编译成功。
事件也是一样,旧版本反编译后的源码生成了Delegate.Add和Delegate.Remove两个方法的调用版本,也需要调整。
新版本解决了这个问题,
2 对于一些常见的编程模式,新版本的.NET Reflector 可以正确识别,并为你重写代码。
这个例子,最简单的当属于foreach和using。试一下,新版本的.NET Reflector可以为你生成这两个句式的代码。而旧版本中,这是没有的。这里的using我是指using(Stream stream=File.OpenRead(“file.txt”))
这种情况也有另一种发展方向,开源项目被公司看中,但是公司不向作者购买,而是直接用它的开源版本,在上面直接修改,做出一个自己需要的版本,或是进行增强。在各种盗版软件泛滥的情况下,开源协议相当于一纸空文。公司的目的是以最小的开支,创造最大的利润,可以理解这种情况。