TestDriven.NET 和 Visual Studio Express 的纠纷往事

阅读数:960 2007 年 6 月 7 日

话题:.NETDevOps语言 & 开发架构

在我们第一次报道有关 Jamie Cansdale 的 TestDriven.NET 事情时,似乎给读者的感觉这又是个老套的以大欺小故事。不过当了解了完整的过程之后,人心似乎又离开了顽固的 Jamie Cansdale,并开始联合抵制 TestDriven.NET。InfoQ 就将在这里回顾一下这个不幸的事件。

故事开始于 2003 或 2004 年,Visual Studio Express 的产品经理主管 Dan Fernandez 和他的同事觉得 VS Express 应该免费提供给开发者。于是 Dan Fernandez 和几个微软的同事成功地让公司相信当前的市场状况并不那么乐观。在2004 年 4 月的一篇 Blog文章中,Dan 写道:

现在遇到的另外一个问题是,我坚信我所期望的产品策略,也正准备着为实现这个策略打一场硬仗,正如 Joe 所说的那样。不过就目前形势来看我似乎是输了,我没有能力阻止那滚滚向前的火车(实际上这火车刚刚碾过我而去),但我仍要尽力去尝试。在微软,你必须不停地战斗,因为这里并不是什么都有。很多时候我们就要为了心中的理想而战斗,不管老天是多么地不公平。这就是现在的我——8:02PM PST,在办公室里的我——没吃饭、没睡觉、桌上 400 多张幻灯片还摆在面前……愿这篇文章能在今年末的某天起到一些作用——但希望我在下周五的时候还能站得起来。

在 2005 年 11 月发布时,VS Express 如大家所愿地决定免除了头一年的使用费。若在一年后还想继续使用的话,只要大约 99 美元即可。不过在 5 个月、五百万的下载量之后,Dan 的团队终于实现了他们的心愿——微软公司决定让 VS 2005 Express 永久免费了!

不过天下没有白吃的午餐,Visual Studio Express 也自然包含了一些限制。最大的限制在于,Visual Studio Express 无法通过宏、插件或 VS 安装包进行扩展。Michael Leworthy 写道:

我们之所以禁止这类扩展,是考虑到如下两个原因:第一,我们想让所有的 Express 用户都有同样的用户体验。最初在创建教程内容(例如 Beginner Developer's Learning Center)时,我们并没有期盼这个 IDE 能够在任何时候都显示成统一的界面。为了保证让用户第一眼就能爱上它,我们必须让这个 IDE 的行为总是维持在预料中、且可被支持的范围内,因此它也只能包含一些适合于入门开发者使用的常见功能。第二,我们还需要保证 Express 系列产品不会侵占我们专业开发工具的市场份额。因此,考虑到我们在研发工作以及为社区免费提供教程内容等材料上花费的时间,这样的限制对于 Express 用户来说是完全合理且可接受的。

几乎就在同时,Mutant Design Limited 公司的 Jamie Cansdale 正在开发一款名为 TestDriven.NET(http://www.testdriven.net/overview.aspx)的商业产品。该产品支持 NUnit,、MbUnit 和微软的 Team System 等测试框架。

接下来所有的信件都是由 Jamie Cansdale 提供给 InfoQ 的。

当 Jamie 申请成为微软公司 Visual Studio 行业合作伙伴(Visual Studio Industry Partner,VSIP)时,他的产品似乎才第一次引起微软公司的注意。该产品是以 Visual Studio 第三方插件的形式提供的。

2005 年 12 月 8 日,Jason Weber 给 Jamie 写了封信,商量 Jamie 加入 VSIP 的流程、成为 VSIP MVP 的可能性并请求其将对 Express 版本的支持从 TestDriven.NET 中移除。摘录如下:

我已经和 Visual Studio 团队的项目经理 Mark Colburn 提到了你,他正在寻找合适的 Visual Studio Extensibility 方面的 MVP。经过讨论,我想你会理所应当地获此称号,这也毫无疑问比你现在的 ASP.NET MVP 有着更重的份量。请在稍后几个月中等待 Mark 的来信。

不过还有一件让人遗憾的事,就是有关你的产品对 Express 支持的问题。我看到今天你进行了一次版本更新。你已经将这个 hack 去掉了?老兄你的速度真快啊 ;-)

保重,祝你好运! - jason

为了回应 Jamie 提到的关于他违反 Express 授权协议的事情,Jason 在 12 月 9 号写了这封信。

我不是个律师,所以我也无法太过详细地解释许可协议。不过如果你曾阅读过 Express 许可协议的话,定会发现其中包含禁止对 Express 进行反向工程的条款,若是你曾阅读过 VS SDK 许可协议(这个许可协议包含了你的插件中 QueryService 所使用到的所有的原生 API)的话,也会发现与你的 hack 相关的一些禁止条款。很抱歉我无法给出更详细的说明——我只是个开发者 ;-)

中断联系两周后,Jason 再次给 Jamie 写了封信:

自从上次写信以来已经过去两周了,写这封信的目的是想问问你有没有考虑过我们前此对话中谈到的问题(特别是有关将单元测试工具引入到 VSTS 以及有关你的插件支持 Express 的问题)。希望我们能够在一月份的早些时候开一次电话会议,并在其中解答你的问题。这封信中也顺带了 Lorna 和 Ben,他们都希望参加这个会议。麻烦你能给出一个方便的时间日期。

Jamie 在 20 号回复了这封信:

我确实仔细想过上次的问题。不过对于授权许可方面我还有些疑虑。我觉得对于你所谓的“hack”,我们之间还存在着一些误会。你的信中说我在 QueryService 中调用了原生 API,而我实际上使用的是插件机制自身的扩展 API,并有意地回避了这些 VSIP 接口。

为了确认这一点,我特地和我的一位在英国的律师朋友研究了 Express 的授权协议。他认为我并没有违反任何条款——因为我并没有使用任何反向工程或反编译技术。

因此,若是让我不再支持 Express,似乎有些勉强——这样做的理由并不明确,我也无法对我的用户(包括我自己)作出合理的解释。

讨论似乎陷入了僵局,虽然谁也没有撕破脸。

1 月 6 号,Jamie 写了这封信:

很抱歉没能在昨天给你回信。我再次仔细考虑了有关 TestDriven.NET 与 Express 产品集成的问题,并仍然坚持我的产品在技术上并没有违反 Express 的授权协议。但我也不想总是抱着这颗定时炸弹睡觉,特别是我准备在春季时发布一个商业版本。

因此我觉得不再让 TestDriven.NET 支持 Express,并开始着手给我的用户一个声明。下这个决心并不容易——我曾为这个功能花费了大量的开发和测试时间,以确保在每个 Express 产品语言中都能正常使用。

我希望你能够起草一份声明,说明微软公司对待 TestDriven.NET 的立场及其集成至多个产品系列的计划,包括微软公司并不会考虑将单元测试功能提供给 Express 用户的决定。我非常希望通过让微软公司将 TestDriven.NET 集成至未来 VSTS 中并为其提供良好支持来打消众多用户的疑虑。

Regards, Jamie.

Jason 回复了这封信:

感谢你仔细的考虑并最终决定不再将 TestDriven.NET 集成至 Express 中。我很乐意和你一起向你的客户说明这一切,你也可以在说明中提到我的名字,但这并不代表微软公司。我的建议是你可以这样写……

“在与微软公司的 Jason Weber 够通过之后,我认识到为 Visual Studio Express 添加功能违反了 Visual Studio 的授权协议和版权规定。因此我决定不再让 TestDriven.NET 支持 Visual Studio Express。Jason 在将 TestDriven.NET 与其他 Visual Studio 2005 产品集成的过程中为我提供了很大的帮助,并邀请我加入 VSIP 计划。加入该计划后,我就可以每个季度飞去微软总部 Redmond,并能够与 Visual Studio 开发团队一起工作,帮助我更好地完成集成工作。”

如果你有任何疑虑,请告诉我!很高兴能够继续和你保持联系。

Thanks – Jason

此时此刻,Jason 似乎觉得问题已经妥善解决。不过几天后 Ben Miller 和 Jamie Cansdale 的一次对话却表明事情并不是那么简单。

1 月 12 号,Ben 这样写道:

回复这封邮件是为了确认一下,你不准备再支持 Express 产品。

我希望确认的是你已经收到了 Jason Weber 的 E-mail,并准备在这周末之前移除对 Express 系列产品的支持。

请尽快给我回复,以便于我们能够尽早完全解决这个问题。

Jamie 是这样回复的:

今晚我会征求更多的建议。希望能够在明天给你一个最终答复。

于是 Ben 又问:

更多怎样的建议?我以为你会直接移除掉对 Express 的支持,并将其从网站上去掉。

你是否还在考虑仍将为 Express 版本提供支持呢?

13 号,Jamie 用 Email 回答了 Jason、Ben 和 Lorna Williamson:

很抱歉,你们的建议对我来说是完全不可以接受的。正如我在前面一些 E-mail 中提到的那样,我并不认为我违反了任何 Express 的许可协议。我想要知道微软公司官方是否明确要求我不再支持 Express,且如果属实的话,是否有相关的公开声明。

此时此刻,Jason 唯一关心的事情似乎就是 Jamie 是否会移除对 Express 的支持。至于 Jamie 所关心的是否有公开的声明,TestDriven.NET 是否真地违反了授权许可,对 Jason 以及微软公司来说却并不那么重要。

是的,我们要求你移除对 Express 版本的扩展。正如我曾经提到的那样,我们认为无论是 Express 还是 Visual Studio SDK 的许可协议都不允许你创建或提供这类的扩展。

我们可以一起商讨关于公开声明的措辞,且并不需要你承认违反了授权许可以及版权协议。作为替代,我们可以这样说明:“微软公司并不认为相关协议允许这类对 Express 的扩展”。虽然你可能会不同意,不过你已经决定过不再让 TestDriven.NET 支持 Express 版本了。

请让我们知道你希望的处理过程,或者提供一些你认为合适的说明措辞。

1 月份 Jamie 发送的最后一封 Email 是这样的:

在我们上一次电话会议中,你曾经提到过我违反 Visual Studio SDK 授权许可的几种做法。你也曾说过在 Express 开发环境中添加几个按钮也许就算作对微软公司版权的侵犯。

那些你认为的侵犯了 Visual Studio SDK 授权许可的代码存在于任何版本的 TestDriven.NET 中(不过这部分代码仅仅在 Visual Studio 2005 Team Edition 中才会被调用)。因此移除对 Express 的支持并不能改善上述许可问题。即使微软公司并不追究这类对许可的违背,未来版本的 TestDriven.NET 的合法性仍旧非常令人担忧。

因此我决定删除所有对 Visual Studio SDK 相关程序集的引用,虽然很快发现这让集成的过程变得非常艰难。我正计划逐一解决由此产生的问题并看看其他插件开发者是如何处理这个问题的。我也曾阅读过很多 Blog 文章,似乎这些文章均鼓励插件开发者绕过 PLK 机制(假设这就是将 DTE 对象转型为 IServiceProvider 所要做的)。

虽然仍存在着一些版权疑虑,我还是无法理解——尽管已经仔细研究过——对应用程序怎样程度的扩展才能够算作“侵害”呢。恳请你对此作进一步的澄清。

两个月之后,双方又开始了 E-mail 往来,不过只是为了确定另一次电话会议的时间——最终定在了 3 月 30 号。虽然问题并没有完全解决,不过却似乎有了一些进展——微软给出了一个解决方案并再次授予 Jamie MVP 称号。可是就在同时,另一个令人挠头的新问题出现了。

Visual Studio 2005 引入了一个新的产品线,叫做 Visual Studio Team System(VSTS)。不过在 VSTS 中集成的却是 MSTest——微软公司自己的单元测试工具。Jamie 曾经请求过微软公司允许其分发 MSTest 中类库,以便在更加便宜的 VS 标准版和专业版中提供同样的功能。4 月 18 号,Jason 拒绝了 Jamie 的请求:

很抱歉我们不能允许你将这些 VSTS 中的组件重新分发至 Visual Studio 的标准版和专业版中。这其中既有技术上的局限(提供服务、部署、IA 等),也有商业上的限制(需要为所有 VSIP 合作伙伴提供许可,限制应用场景等)。不过至今为止我们不允许任何的合作伙伴改变我们的产品分类阵容。

另一封通信同样显示出了 Jamie 和 Jason 之间的分歧。Jamie 似乎还提出了一些额外的要求,作为其放弃对 VS Express 支持的交换条件。4 月 22 号,Jason 回复道:

Jamie:

我非常希望我们能够找到一个双方都满意的解决方案,不过事实却很难让我相信我们正逐渐达成一致。我曾经回复过这封 E-mail,不过为了不再产生什么误会,这里我再明确地回答一遍你的请求:

  1. 我们不允许你将 VSTS 的单元测试相关组件分发至你的为 Visual Studio 的标准版和专业版设计的产品中。
  2. 我们不允许你以低于 Select B(我们的标准价格模型)的价格分发 Visual Studio 产品。
  3. 我们不会为你提供免费的 VSIP Premier、Open Tool 和 / 或 IDE 重新分发的合作伙伴资格。
  4. 我们不允许你在任何情况下为 Visual Studio Express 提供扩展。
  5. 除非你接受我们的许可协议,否则我们不会允许你参加 VSIP 项目。
需要明确的是,微软公司不会因你放弃 Express 上进行的扩展而提供补偿。如果你愿意遵守许可协议的话,我们非常愿意通过 VSIP 项目与你进行合作。也就是说我们愿意接受你可能提出的其他建议和意见。

很公平的是,Jamie 似乎也没有为 VS Express 的事情索取什么赔偿。Jamie 的这封信表明了他的态度:

感谢你明确地解释了微软公司的立场。我觉得这样直率的对话非常具有建设性,且我们正在向解决问题的方向努力。这里我也希望同样能够明确地说出我的立场:
  1. 所有我所使用的用来扩展 Express 的接口和方法都是公开的,且在 MSDN 网站上都能找到明确的文档。
  2. 我曾经对 Express 的授权许可进行了法律方面的研究,且迄今为止我的律师并不认为我违反了许可中的任何条目。
在我们的第二次电话会议中,Ben Miller 曾告诉我这件事情不会影响我的 MVP 情况或是今后的续期可能。微软公司在此时续期我的 MVP 身份是一个非常好的姿态,对解决这个问题极其具有建设性。于是我也很乐于将 Express 版本的 TestDriven.NET 从网站中移除,并依你所建议的那样,通过 VSIP 项目继续与微软公司展开深入合作。

需要澄清的是,我并没有要求微软公司为了补偿这件事而授予我 VSIP MVP 称号。我只是请求你不要公开地声明这一点,免得用户会因此而离开。假设我们最终能够找到一种友好的解决方案,那么我将把如下安装文件放在网站上:http://www.mutantdesign.co.uk/downloads/TestDriven.NET-2.1.1586_Basic.zip。

Regards, Jamie.

2006 年 5 月 13 日,Jason 感谢 Jamie 移除了对 VS Express 版本的集成支持,并开始对其他与此事不相关的开发问题为 Jamie 提供帮助。

不过将近一年之后,Jamie Cansdale 再次宣称他并没有违反任何许可协议。2007 年 2 月 22 日的这封 E-mail 如下:

在我们去年的电话会议中,Ben、Lorna 和你提到了 3 条我违反的协议条款。在这样的基础上 Ben 要求我移除对 VS Express 版本的集成支持。
  1. 你说使用了智能感知功能可能违反了 VS SDK 许可中的反编译条款。
  2. 你说为了搞清楚如何使用某个 API 而去查看公有类型 / 方法的名称可能违反了 VS SDK 许可中的反向工程条款。
  3. 你说在 Express 的界面中添加按钮可能侵犯了微软公司的版权。
在这次电话会议之后,我说过我需要给用户一个合理的解释,告诉他们为什么不再支持 Express 了。我不停地收到询问为何 TestDriven.NET 无法与 Express 一起使用的 E-mail。所以这里我想请求确认一下上述你们认为我违反授权许可的陈述。

2 月 26 号,Jamie 又写了一封带有威胁意味的 E-mail,声称将要重新启用 TestDriven.NET 对 Express 的支持。

你们的迟迟不回复让我怀疑你们不能判定我确实违反了微软公司的授权许可。如果你们还是认为我违反了微软公司的授权许可,请立即给我回复。否则如此拖延下去,我将不再另行通知而重新启用 TestDriven.NET 对 Express 的支持。

就在同一天,Jason 让 Jamie 把目光放在 VS 集成的其他领域中:

Jamie,根据我们很久以前的讨论结果,我们确信你对 Visual Studio Express 产品的各种扩展均毫无疑问地违反了相关的协议条款。我们也并不认为这样的老调重弹会对问题有什么帮助。相反,我们建议你把目光和精力放在对 Visual Studio 产品进行合法扩展上,当然这些扩展要建立在 Visual Studio Industry Partner(VSIP)项目的相关许可条款之上。

4 月 17 日,Jamie 没有“食言”地重新启用了 TestDriven.NET 对 Express 的支持。Jason 也毫不示弱地威胁将会把此事诉诸于法律。

我们刚刚得到消息,你在最近重新启用了 TestDriven.NET 对 Express 的支持:http://weblogs.asp.net/nunitaddin/archive/2007/04/02/express-sku-support.aspx。

这件事情非常令我们失望。我们在去年花费了很多时间(数月)向你解释,Express 产品在设计时并没有表明任何允许第三方对其进行扩展的意图。我们也曾经向你解释过很多次,Express 产品的许可协议禁止第三方对其进行扩展并添加新的功能,或者是重新激活在该版本中被禁用的功能。你的种种扩展插件,无论是从前还是现在的版本,都毫无疑问地违反了这些产品许可条款并侵害了我们对 Express 产品的权益。你的做法也让我们的客户处在一个极其尴尬的位置,因为这样等于你也在允许他们违反这些许可条款。

当你在去年放弃 TestDriven.NET 对 Express 的支持时,我们认为你已经毫无疑问地认同了上述说法。虽然并没有直接的答复,不过根据你最近重新启用了 TestDriven.NET 对 Express 支持的做法,加上我们去年的对话(包括 2 月以前的 E-mail 往来),可以归纳出你是在有意地轻视并嘲弄我们的版权许可条款。

令我们十分疑惑的是你正在破坏着我们产品的经济学模型,而这也是你的产品所依赖的。最近的业界趋势是,几乎所有的软件厂商都为用户提供了限制功能但免费的版本,以便应对市场需求或作为入门级工具。而其他更加完善、提供更多功能的版本则通常以较高的价格提供。微软公司是正是通过 Visual Studio Express(免费产品)和 Visual Studio Standard 以及以上版本(商业产品)来实现这种区分的。你也在自己的产品中使用了类似的模型——TestDriven.NET 分为个人版、专业版和企业版。不过你让 TestDriven.NET 支持 Express 似乎正在暗中搅乱我们的所依赖的产品模型。

我们敦促你将你的精力和才华放在通过 VSIP 项目合法地扩展商业版本 Visual Studio 产品上,而不是去为 Express 版本添加功能。数以百计的其他合作伙伴都从中获得了巨大的成功,而他们却并没有将触角延伸到任何 Express 产品中。因此 TestDriven.NET 也没有理由必须要涉足 Express 产品才能取得成功。

我们非常希望能够友善地解决这个问题。请你立即移除 TestDriven.NET 对 Express 的支持。请在完成后告知与我,并保证在未来也不会再次发生此类事情。如果你在指定的期限内不能移除的话,事情将不再处于我的控制范围之内,我将不得不将此诉诸于法律。我发自内心地不希望看到事情走到那一步。

5 月 25 号,Jamie 收到了微软公司的律师函。

查看英文原文:The Story of TestDriven.NET and Visual Studio Express
译者简介:陈黎夫(Dflying Chen),毕业于上海交通大学计算机科学专业,曾在微软公司 ASP.NET Ajax 创始团队——Windows Live Hotmail 担任软件开发工程师,使用 ASP.NET Ajax 早期版本参与开发了下一代 Email 系统 Windows Live Mail,以及 Windows Live Calendar 等产品。擅长 Web 相关技术。作为 ASP.NET Ajax 在中国的传道者之一,他在个人博客中写过大量相关技术文章,引起了广泛反响,已经成为国内访问量最大的 ASP.NET Ajax 资源之一。著作 / 译作有《ASP.NET Ajax 程序设计》、《Atlas 基础教程》和《CSS 禅意花园》等。参与 InfoQ 中文站建设,请邮件至china-editorial@infoq.com