在我们第一次报道有关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,不过为了不再产生什么误会,这里我再明确地回答一遍你的请求:
需要明确的是,微软公司不会因你放弃Express上进行的扩展而提供补偿。如果你愿意遵守许可协议的话,我们非常愿意通过VSIP项目与你进行合作。也就是说我们愿意接受你可能提出的其他建议和意见。
- 我们不允许你将VSTS的单元测试相关组件分发至你的为Visual Studio的标准版和专业版设计的产品中。
- 我们不允许你以低于Select B(我们的标准价格模型)的价格分发Visual Studio产品。
- 我们不会为你提供免费的VSIP Premier、Open Tool和/或IDE重新分发的合作伙伴资格。
- 我们不允许你在任何情况下为Visual Studio Express提供扩展。
- 除非你接受我们的许可协议,否则我们不会允许你参加VSIP项目。
很公平的是,Jamie似乎也没有为VS Express的事情索取什么赔偿。Jamie的这封信表明了他的态度:
感谢你明确地解释了微软公司的立场。我觉得这样直率的对话非常具有建设性,且我们正在向解决问题的方向努力。这里我也希望同样能够明确地说出我的立场:在我们的第二次电话会议中,Ben Miller曾告诉我这件事情不会影响我的MVP情况或是今后的续期可能。微软公司在此时续期我的MVP身份是一个非常好的姿态,对解决这个问题极其具有建设性。于是我也很乐于将Express版本的TestDriven.NET从网站中移除,并依你所建议的那样,通过VSIP项目继续与微软公司展开深入合作。
- 所有我所使用的用来扩展Express的接口和方法都是公开的,且在MSDN网站上都能找到明确的文档。
- 我曾经对Express的授权许可进行了法律方面的研究,且迄今为止我的律师并不认为我违反了许可中的任何条目。
需要澄清的是,我并没有要求微软公司为了补偿这件事而授予我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版本的集成支持。在这次电话会议之后,我说过我需要给用户一个合理的解释,告诉他们为什么不再支持Express了。我不停地收到询问为何TestDriven.NET无法与Express一起使用的E-mail。所以这里我想请求确认一下上述你们认为我违反授权许可的陈述。
- 你说使用了智能感知功能可能违反了VS SDK许可中的反编译条款。
- 你说为了搞清楚如何使用某个API而去查看公有类型/方法的名称可能违反了VS SDK许可中的反向工程条款。
- 你说在Express的界面中添加按钮可能侵犯了微软公司的版权。
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中文站建设,请邮件至 [email protected]。