Composite C1 是如何通过开源方式找到成功之路的

阅读数:1046 2014 年 8 月 27 日

话题:开源Azure架构

在当前的环境下,开发商用产品变得越来越困难了,尤其是在那些竞争非常激烈的领域中,例如内容管理系统。Composite C1也发觉到它们的市场在不断萎缩,在这种情况下,它们终于找到了一条生存之道,即将它们的核心产品开源,并在云端进行托管。

在与 Marcus Wendt 进行的一次访谈中,我们了解了 Composite C1 整个 15 年的历史,并看到它是怎样从一个商用软件的新手成为一个拥有大量客户的开发平台的。

InfoQ:让我们首先从 Composite C1的历史开始说起吧,这个项目的成因是什么呢?

Marcus对我们来说,Composite C1 是一次大规模尝试?????的顶点。我们从 1999 年开始就致力于开发 web 内容管理系统,当时我们还是一家闭源的商业软件公司,使用的也是当时正当红的微软技术,例如 ASP、VB、C++、COM 和 SQL Server。CMS 是我们的主打产品,也是优势所在,当时我们作为一家 CMS 提供商在斯堪的纳维亚(北欧)地区获得了成功。但随着时代的前进,我们的产品开始显得落伍了,即使我们花费了很大力气将部分系统升级到.NET 平台上,也没有改变这一局面。

这一情况提醒我们必须完全舍弃陈旧的代码,从头打造一套全新的 CMS 系统。这项工作从 2007 年一早开始,随后在 2008 年 4 月,我们终于发布了 Composite C1 的 1.0 版本。从开发者的角度来看,这是一段非常令人振奋的时期,因为像 LINQ 和 Workflow Foundation 等新技术开始出现在.NET Framework 中,而且更先进的浏览器也在不断进化。

1.0 版本在很多方面还是具有一定实验性质的。我们创建了一个基于 LINQ 的数据访问层,它使用了表达式树转换,它使我们能够按照抽象的数据接口访问 SQL Server 以及内存中的数据(XML 文件)。作为类型安全数据系统的一部分,CodeDom 使我们能够动态编译 CLR 运行时类,这样我们就能够用户界面上生成能够与.NET 完美交互的数据类型了。我们也用到了 Workflow Foundation,这在当时还是门很新的技术。我们也编写了一个在线管理界面,使用 JavaScript 将服务端生成的一种类似 XUL 的抽象标签(类似于 <ui:tabbox /> 和 <ui:splitpanel />)转换为 HTML。我们使用了微软的模式与实践(Patterns & Practices)小组推出的 Enterprise Library 套件编写了一系列应用构件块,以确保这套 CMS 具有高度的可插用性(pluggable)。

在那之后,我们花费了一些时间让 Composite C1 符合工业标准。之后的 18 个月,我们致力于提升系统的性能与稳定性,并完善一些基本特性。我们特意选择了一些合作伙伴与客户到丹麦来共同参与这一流程。

到了 2009 年 9 月,距 1.0 版本的发布已经过去了 18 个月,在此期间我们也发布了多个版本的补丁包。我们此时的系统已经经过充分的测试并且已经相当稳定。它具有一套优秀的特性集合,并且拥有良好的技术架构与基础设施,能够让我们不断完善这套 CMS。使用这套 CMS 进行内容编辑的体验非常好,.NET 和 web 开发者也能够利用它打造一套经过高度定制的解决方案。

InfoQ:Composite C1是一套商用产品,你们为什么会决定将它开源呢?

Marcus作为一家商业公司,我们在创建 Composite C1 时所面临的挑战主要是在本地市场上几乎没有任何影响力。随着 WordPress 和 Joomla 这些系统的出现,人们对于 CMS 市场的期望渐渐从传统的商用软件模式转变为开源软件或免费软件的模式。由于受众面的狭小、市场区域的限制以及所面临的近乎疯狂的竞争,我们开始重新审视我们的市场策略。

我们讨论了各种可能适用于我们的商业模式,例如价格竞争、打造“杀手级特性”、建立免费软件模式或是开源模式。我们拥有一套非常优秀的软件,它使用了.NET 环境下最新与最优秀的特性,拥有一套非常健康的代码库,因此我们对于开源及共享它感觉十分自豪。如果我们把目光放远一些,我们就能看到全球市场上迫切需要一款高质量的开源.NET CMS 系统,而当时的选择非常少。我们非常希望能够将 Composite C1 推向全球,让它站到聚光灯之下,围绕这款产品打造出一片社区,帮助它逐步壮大,同时也激发出.NET 开发者的热情。综上所述,开源是一种很好的选择。

接下来的几个月我们慎重地考虑了我们的想法,毕竟我们对于开源了解甚少,要学习的东西很多。我们发布了最新版本的代码之后,就开发了繁重的代码重构工作:重新组织类和命名空间、添加更多的文档、并且进一步改善了入门指南,让开发者在下载软件后只需简单的操作就可以搭建起整个网站。

2010 年 9 月,我们在 CodePlex 上发布了完整的源代码,基于 Mozilla Public License 1.1 授权。

从那时起,许多事情都显得不一样了。这套产品不再是一个本地的、封闭的产品,它得到了数千次下载,在一百多的国家里得到应用,我们的论坛变得异常活跃,志愿者们提交了各种补充。有各种各样的网站开始使用我们的 CMS 系统进行搭建,包括小型的个人婚礼展示网站,到财富 500 强的网站应有尽有。人们的反响热烈,通常都是正面的、有创造性的并且非常友好,我们在 CodePlex 上的网站得到了大量的 5 星评价和正面的反馈,这一切都非常美妙,它极大的鼓舞了我们这些核心团队成员们的斗志和好胜心:)

InfoQ:Azure对于 Composite C1来说似乎是个非常重要的平台。为什么你们选择了这个平台,而不是诸如 Amazon等其它公司推出的云平台呢?

Marcus我们可以选择自行托管的方式或是托管在 Windows Azure 平台上,我们从很早开始就关注 Windows Azure 平台,因为在技术上同我们十分契合。在.NET 环境下,Windows Azure 所提供的工具、服务和 API 超越了我们所见过的其它任何平台。由于.NET 是这个平台下的一等公民,整个云基础设施使用起来感觉就是一种非常自然的扩展,我们也相信这个平台能够保持良好的发展。

从商业的角度上看,Windows Azure 也是一个非常有趣的平台,由于多数用户使用的是 Composite C1 的免费服务,我们探索了各种方式,以寻求为用户提供有价值的服务,并从中盈利,以继续我们的软件开发。为高质量的托管花费一些费用是能够接受的,而 Windows Azure 也为我们提供了价廉物美的各种托管选择。因为将 Composite C1 作为服务提供给用户,而且用户只需几分钟时间就可以通过该服务搭建起一个可运行的网站,这也使得我们的用户量进一步提升了。

InfoQ:Composite C1是否支持 Mono呢?

Marcus很遗憾,目前还不支持,因为我们的产品所依赖的一些.NET 特性目前还没有移植到 Mono 上,我们目前也没有足够的精力来帮助 Mono 实现这部分功能缺失。

InfoQ:你能具体说一下这部分的细节吗?

Marcus我们上一次尝试解决 Mono 上的最大问题距今已经有一段时间了,但一个至今也无法逾越的障碍就是 Workflow Foundation,我们使用了一些.NET 3.5 中新加入的特性,而这部分内容至今还未加入到 Mono 中。

随着.NET 4 的推出,微软推出了全新的 WF,使用了新的命名空间,我猜测微软大概是对 WF 进行了完全重写。之后的.NET 4.5 版本就将早期版本的 WF 功能全部认定为过期功能了。

这一新版本的推出或许能够促进我们的产品对 Mono 的支持吧。

InfoQ:Composite C1的团队规模有多大?这些团队成员都是内部员工吗,还是说你也会从社区中获取一些志愿者提交的代码呢?

Marcus目前的核心开发团队一共包括了三名成员,Dmitry Dzygin、Taras Nakonechnyi 和我。除此之外,Poul Kjeldager Sørensen 负责在 Windows Azure 平台上的工作,而 Vitaly Vysotskyi 则确保我们发布的产品具有完善的文档和测试。Inna Boitsun 也有很天分,他帮助我们维护上手指南模板以及特性包(package)。我们的 CEO Oskar Lauritzen 当然是关注于销售的部分,最后是我们的万事通 Pavlo Kuzminskyi,他专注于客户支持以及运行整个公司的其它一些部分。荣誉也同样属于 Jesper Moth 和 Martin Ingvar Jensen,他们在产品开发的前 4 年前是核心团队中必不可缺的人物。

虽然主体的工作是由内部人员实现的,但我们同样欢迎并且鼓励社区成员为我们提交代码,同时我们也非常重视公众提交的各种缺陷追踪。我们目前只剩下 12 个还没解决的 bug,同时我们也尽力为用户加入他们最想加入的新特性。

当我们刚开始将代码开源的时候,还没有使用 ASP.NET 中的母版页功能打造页面模板,也没有使用 Razor 引擎进行内容展现,这些部分的缺失是由一位名叫 Pauli Østerø的社区成员替我们填补的,他将这些功能加入到了额外的包中。他的贡献引起了社区中许多人的关注,我们最终决定将这部分内容加入到我们的核心代码中。类似这样的社区贡献对我们的产品继续发展是非常有帮助的。

我们也陆续收到了许多小型的补丁文件,以补充核心部分的功能,例如对用户界面语言的翻译文件,包括德语、汉语和俄语等等。此外也有许多优秀的特性包(插件),比如某个特性可以允许 Entity Framework 与 Composite C1 的数据访问系统进行无缝的集成。

总的来说,我们花了不少时间来验证这些提交代码的质量,尤其是对核心功能部分的补丁经常需要进行一些适配工作。我们已经按照这种方法运作了很长时间,因为我们需要保证代码的可靠性和可维护性,而且比起为用户提供大量重复的特性和选项,我们宁可让用户在使用 Composite C1 时不要遇到任何错误。

关于受访者

Marcus Wendt是 Composite C1 项目的负责人,该项目是一个开源的、运行于.NET web 技术栈之上的 web CMS 产品。他最关注的方面是为终端用户和开发者提供良好的用户体验。你可以通过他的网站twitter了解到他的更多信息。

查看英文原文:How Composite C1 Found Success by Becoming Open Source