.NET 开源简史

640?wx_fmt=jpeg

现在在微软开发开源软件是很一件正常的事情——但在 2007 年,当时我刚加入微软,那时候可不是这么一回事。微软花了好几年时间才找到正确的方向,让微软这艘大船顺着开源之风向前航行。现在回头远望过去那些曾经面临的挑战,我们一笑而过。这篇文章将讲述与微软第一个开源项目有关的故事,以及它如何为我们到达今天的位置铺平了道路。

在 90 年代后期,我在一家叫作 Mustang Software 的初创公司工作,这家公司开发的软件用于跟踪公司收到的电子邮件是否得到及时回复。2000 年,这家公司被收购,而在那之前,我带着团队到奥兰多参加微软专业开发者大会,微软在大会上介绍了 ASP+(最终成为 ASP.NET Web 技术栈)和 C#。在大会期间,我和团队安装了预览版,而我立即爱上了.NET。在后续的工作中,我继续使用 ASP.NET。

2006 年,微软推出 CodePlex 源代码共享平台。最初,CodePlex 上有一个 Web 项目,代号为 Atlas 的,现在叫作 AJAX Control Toolkit。Atlas 是微软有史以来构建的第一批开源项目之一,人们对它的讨论和兴趣令人印象深刻。Brad Abrams 和 Scott Guthrie 写的有关 Atlas 的博文让我有了想加入微软的冲动。

我给 Brad 写了一封电子邮件,作为对他的博文的评论——他在一分钟内回复了邮件!第二天,我们通过电话进行了交谈,不到一周,我就通过了微软的面试。突然间,我从阳光明媚的加利福尼亚搬到了天气变化无常的华盛顿雷德蒙德。

我加入了 Brad Abrams 的团队,这个团队负责 ASP.NET 和 Silverlight 的开发。Silverlight 是将原生.NET 开发引入浏览器的早期尝试,当时刚刚发布为了第一个版本。ASP.NET MVC 还处于早期原型阶段,并且只在内部演示,尽管偶尔也被当作招聘工具,这对于 2007 年 10 月加入团队的 Phil Haack 起到了关键作用。Scott Hanselman 也是在这个时候加入微软,尽管是在另一个团队。

众所周知,ASP.NET MVC 是 ASP.NET 团队对 Ruby on Rails 的大受欢迎而做出的回应。Ruby on Rails 由 David Heinemeier Hansson 于 2004 年创建,作为 Basecamp 的一部分。到 2007 年,Ruby on Rails 被包含在最新版本的 Mac OS X 中!MVC 模式与 Rails 脚手架的组合大大减少了 Web 开发人员需要编写的管道代码数量。它让开发带有表单数据的网页变成一件很令人愉悦的事情,所以 Web 开发人员都很喜欢它。

ASP.NET MVC 也是对 ASP.NET Web Forms 备受批评而做出的回应。ASP.NET Web Forms 意在将 Windows Forms 开发人员带到 Web 上。它确实奏效了,有大量的新 Web 开发人员使用 ASP.NET Web Forms 进行开发。但经过几年的发展,ASP.NET Web Forms 也出现了很明显的问题:为了对开发人员隐藏 Web 的开发特点,他们把背后的东西弄得一团糟。

例如,在 ASP.NET Web Forms 页面上混合使用 C# 和 HTML 代码使得单元测试变得相当困难。如果没有测试用例,那么随着时间的推移,维护和修改大型网站会变得很痛苦。即使你创建了测试用例,它们也主要是 UI 功能测试——即使是在今天,这仍然是一种很脆弱的测试方法。对网页的任何更改都可能会破坏页面的相关测试。

ASP.NET MVC 的早期原型令人印象深刻,足以让 Scott Guthrie 决定在德克萨斯州奥斯汀举行的第一届 ALT.NET 大会上首次公开展示它们。ALT.NET 运动源于一班狂热的开发者,他们喜欢使用.NET,但他们认为开源工具应该占更大的比重。

在微软的历史上,曾经有一个时期患上了“Not-Invented-Here”综合症——鄙视一切不是由微软开发的软件。很多乐于使用微软工具的用户进一步强化了这种综合征。当微软宣布构建自己的对象关系映射器(ORM)Entity Framework 时,这个综合征算是病入膏肓了。其他一些 ORM 解决方案(如 nHibernate)的倡导者对于微软的重复发明轮子感到十分恼火。这些倡导者正是 ALT.NET 的开局者,2007 年 10 月,他们推出了第一个技术大会。

在 ALT.NET 大会上,Scott Guthrie 概述了 ASP.NET MVC,这是首次公开介绍 ASP.NET MVC。Scott Hanselman 演示使用 IronPython 构建 MVC 控制器,Phil Haack 使用 IronRuby 进行了类似的演示。展示的内容都只是原型代码,并不会实际发布出去。但这是一个有趣的开始,每个人都希望这是微软新时代的开端。从一开始,Scott Guthrie 就说 MVC 将是开源的。

在 ALT.NET 大会的同一周,微软还“公开”了整个.NET Framework 代码作为参考,这样在调试应用程序时就可以进入底层的.NET Framework 代码。但我们知道,它实际并没有开源,但却是向开源迈出的又一步。

MVC 和 Silverlight 也是 Web 团队首次发布的“带外”产品。每个新版本的.NET 和 Visual Studio 需要 24 至 36 个月才能上市——计划、编码和修复缺陷各自需要花上差不多一年的时间。很显然,这个发布周期对于 Web 世界来说还不够快,特别是对于 MVC 来说。毕竟,Ruby on Rails 每年都会推出一个新版本。

到了 2007 年 12 月,我们发布了 MVC 的社区技术预览版(CTP),它为当时发布的 Visual Studio 2008 和.NET 3.5 提供了基本工具(一个项目模板)。CTP 是第一个可供任何人下载和使用的 MVC 版本。

2008 年 2 月,也就是在 Mix 08 大会之前,一个叫作 MIX Preview Release 的新版 MVC 不仅增加了人们一直要求的一系列功能,而且加入了大量新工具,包括直接支持开源测试框架,如 NUnit 和 MBUnit。

在 Mix 08 大会之后,开发者可以下载、编译和调试 MVC 本身的源代码。当然,这与我们现在所期望的方式并不一样,团队在写完代码后直接将代码提交到代码库。相反,当时 MVC 的开发发生在内部,写完代码后再将代码的一部分发布在 CodePlex 上。

将部分 MVC 源代码的副本放在 CodePlex 上,并与外部进行交流,这是走向开源之路的一次早期尝试,微软内部当时对此有很多担忧。我们的目标是每隔几周推出一次更新,希望总有一天会每天更新一次……

差不多就在那个时候,我们遇到了一个有趣的问题。ASP.NET MVC 的一个关键部分是路由——能够将请求定向到控制器,而 ASP.NET Dynamic Data 的开发人员也在使用路由——我们各自都构建了自己的实现。事实证明,“Not-Invented-Here”综合症甚至扩展到个体团队!后来我们花了一些时间将路由的独特部分从代码库中抽取出来,变成一个路由引擎,作为 System.Web 的一部分。

在这个过程中,我们还开发了路由调试器。它最初作为一个私有工具,用于调试新的共享路由模型,最后才将它共享给外部。

代码版本的命名也是一个有趣的问题。ASP.NET MVC 的初始版本叫作社区技术预览(Community Technology Preview)。之后,我们将它们改为预览版本(Preview Release),有一些有编号,有一些没有。但即使是预览版在起初也不会经常发布,我们无法达到每隔几周就将新代码更新到 CodePlex 的目标,所以我们进行了源刷新(Source Refresh)。这有点令人感到困惑,但我们也一直在学习——最终,预览版的发布达到了足够快的速度,并停止使用替代名称。

2008 年 9 月,MVC 第 5 个预览版发布——这很棒,但更重要的是 jQuery。Jon Resig 早在 2006 年就开始将 jQuery 库作为一个紧凑而强大的开源工具,让 JavaScript 开发变得不那么痛苦,而 CodePlex 的很多用户建议 MVC 应该使用 jQuery。集成 jQuery 对微软来说是一个了不起的挑战——使用开源软件是一回事,而开发开源软件是另一回,但是将开源库作为产品的一部分?这实在是太疯狂了!

但使用 jQuery 确实是有意义的。无论如何,jQuery 提供的大部分功能都有助于完善 MVC 的功能。为什么要重新创建轮子呢?我们开发的很多不同的 Web 产品都可以利用 jQuery,以至于 Scott Guthrie 在他的博客上宣布,Visual Studio 的下一个版本将加入对 jQuery 的支持,而这在 2010 年成为了现实。

这个时候,微软 Azure 的早期版本发布了,我们尝试将 MVC 与 Azure 结合在一起使用,将其作为 11 月要发布的 MVC 测试版的示例,并在洛杉矶举行的微软专业开发者大会上进行了演示。

2009 年 3 月,微软在 Mix 09 大会上发布了 MVC 的第一个 RTM 版本。我们将代码发布在 CodePlex 上,基于 MS-PL 开源许可。许可协议的内容很短,与今天的 MIT 许可(这是微软目前使用的主要许可)类似。开源计划署(OSI)批准了 MS-PL 许可,但它在某些圈子中仍然存在争议——微软为什么要推出自己的许可?背后有什么目的?当然,MS-PL 许可背后并没有藏着任何不可告人的秘密,但从长远来看,一直使用这个许可并没有太大意义——使用 MIT 或者 Apache 许可就足够了。但在微软内部,有些法律部门的同事乐此不疲,他们不明白一家企业拥有独立的许可会有哪些不利影响。

法律团队担心将 jQuery 添加到 Visual Studio 2010 中存在许可风险——如果 jQuery 中包含 GPL 许可的代码,这会影响 Visual Studio 其余部分的许可吗?当时,法律同事担心 GPL 公共版权具有“传染性”,将 GPL 许可软件与具有传统版权(如.NET)的软件合并将会侵犯版权。

在今天看来,这种担忧似乎有点被夸大了,但法律同事们确实处理过一些情况,比如与代码有关的诉讼,这些代码被意外地包含在微软 Word 中,导致不得不在世界各地下架 Word 产品。

微软制定了一系列程序来解决与 jQuery 有关的法律问题,还构建工具用于测试 jQuery 源代码的谱系——这个工具搜索整个 jQuery 代码,检查其中所有涉及的许可。我们发现有一个贡献者添加了一些 GPL 许可代码——jQuery 维护者们甚至都不知道!jQuery 是基于 MIT 许可的,被用于商业用途,在其中添加 GPL 许可代码是没有意义的。

就在 Visual Studio 2010 发布之前,我接到了法律部门的一位律师的电话——他们认为,微软软件包提供的任何代码(包括 jQuery)都应该基于 MS-PL 许可。后来,我参加了一次电话大会,我强烈主张我们不应该改变第三方开源库的许可。MIT 和 MS-PL 非常相似,但这并不是重点——只是改变一个开源项目的许可实在是太鲁莽了。这样并不会带来任何有意义的好处,却严重损害了我们作为开源支持者的声誉。

最终,法律团队也开始拥抱这个开源之旅。当 Studio 2010 发布时,其中包含的 jQuery 仍然保留了原始的 MIT 许可。Visual Studio 2010 还包含了 ASP.NET MVC V2、Silverlight 4 和其他一系列出色的工具。

这一版本成为微软开源项目的榜样。当 ASP.NET 团队开始计划一个跨平台的新版本时,我们很自然地公开与社区一起合作。最终,这项工作发展成为.NET Core 和.NET Foundation 的基础,以支持.NET 平台的开源协作。

回首过去所走过的开源之路以及学到的经验教训,如果不是之前付出的那些努力,我们或许不会达到今天这样的状态。

英文原文:https://medium.com/microsoft-open-source-stories/starting-the-net-open-source-revolution-e0268b02ac8a

原文地址:https://www.infoq.cn/article/qjPthH_mUfwwmqN04uK0

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P2617 Dynamic Rankings(整体二分)

P2617 Dynamic Rankings 题意: 待修改的区间最值问题 题解: 整体二分天然带有修改性 整体二分做不带修改的区间最值—>看这里 现在待修改,我们可以将第l位修改为x,因为我们是用树状数组来维护的,所以把这个过程拆分成将第l个…

[LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相(树的重心+贪心)

[LOJ 6042]「雅礼集训 2017 Day7」跳蚤王国的宰相 description solution 一个到所有节点距离和最小的节点 ⇔\Leftrightarrow⇔ 树的重心(满足最重的儿子最轻,每个儿子siz≤n2\le\frac{n}{2}≤2n​) 显然原树的重心答案为0 对于点iii&am…

由优劣语言之争引起的思考

由优劣语言之争引起的思考#欲使其灭亡,必使其疯狂昨天上午由阿里云中间件公众号和架构师小秘圈公众号发布的一篇文章《天天敲代码会使人变聪明么》在.net开发者中掀起了一阵巨浪,文章中提到的语言的先进与落后之争让基于.net开发者们义愤填膺&#xff0c…

[LOJ #521]「LibreOJ β Round #3」绯色 IOI(抵达)(结论)

#521. 「LibreOJ β Round #3」绯色 IOI(抵达) description solution 因为点的庇护所不能为自身,题目背景在树上,有结论一定是两个相邻点互为庇护所 所以树一定要能两两完美匹配才有解 判断完有解后就是构造解了,…

微软是如何使用 C# 重写 C# 编译器并将其开源的

Roslyn 是 C# 和 Visual Basic.NET 开源编译器的代号。这篇文章将介绍它是如何从微软过去的十年至暗时刻走出来,成为开源跨平台的 C# 和 VB 公共语言引擎。我于 2005 年加入微软,也就是在.NET 2.0 发布之前,当时微软内部已经开始在讨论 Rosly…

P3332 [ZJOI2013]K大数查询(整体二分做法)

P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 【模板】可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改区间查询 但是不知道为什么我调了一阵子也不对…

[APIO2020]交换城市(交互+kruskal重构树)

[APIO2020]交换城市 description solution 如果u,vu,vu,v存在于一条链上(只有两个点度数为111其余点度数为222)则无解,否则必有解 如图,不管是哪个点度数>2>2>2,都可以有解 以蓝色为例,第二个…

如何在ASP.NET Core程序启动时运行异步任务(1)

原文:Running async tasks on app startup in ASP.NET Core (Part 1)作者:Andrew Lock译者:Lamond Lu背景当我们做项目的时候,有时候希望自己的ASP.NET Core应用在启动前执行一些初始化逻辑。例如,你希望验证配置是否合…

扫描线讲解

参考文章: 线段树扫描线(有关扫描线的理解) 线段树扫描线(基本原理) 扫描线 第二个文章里面的图很生动: 我总结一下就是:将所给图形的横坐标全部记录,纵坐标记录为扫描线 然后对与…

梁迪:我为MVP骄傲,《微软最有价值专家奖励计划介绍》附专题视频

题记:有些事情,比 MVP 更加不朽,浩气长空,日月星汉,我们为 MVP 和那些心目中的“MVP”感到骄傲。微软 MVP 是一种追求,不必要去强求,但 MVP 必定是俱乐部发展的根基础。火车跑得快全凭车头带&am…

P3295 [SCOI2016]萌萌哒(DP+倍增)

P3295 [SCOI2016]萌萌哒 description solution 强制部分区间相同,很容易就想到了并查集,直接暴力并查集合并是O(n2)O(n^2)O(n2)的 只需要考虑那一个数据结构将其转化成O(nlog⁡n)O(n\log n)O(nlogn)的 树之类的就不考虑了,一段一段的区间…

【恭贺新春】2019年春节放假

2019年放假通知致全体微友: 2019年2月5日(正月初一)至2月8日(正月初四)春节放假,共4天,小编停止更新公众号信息。敬请相互转告。值此新春佳节到来之际,“dotNet跨平台”给大家拜个…

C - Insertion Sort Gym - 101955C

C - Insertion Sort Gym - 101955C 题意: t组数据,每组数据给你n,k,q,让你求存在多少合法的1~n排列 合法要求: 对排列的前k项进行排序,使得整个序列中最长的递增子序列长度为n-1 题解&#x…

华为云.NET Core支持情况调查

各大公有云都提供了开发者开发的SDK,今天我们来看看华为云对.NET Core的支持情况怎么样? .NET SDK地址 https://developer.huaweicloud.com/sdk#.NET华为云的.NET SDK相比其他语言少的可伶,而且这几个SDK还不支持.NET Core。SDK的支持实在太差…

[2021-07-19 内测NOIP] 操作(状压DP),异或(字典树),等级(线段树),矩阵(DP)

[2021-07-19 内测] NOIP操作descriptionsolutioncode异或descriptionsolutioncode等级descriptionsolutioncode矩阵descriptionsolutioncode操作 description 有n堆石子,每堆石子都有一定的数量,第i堆石子的数量用Ai表示。 任意两堆石子均可合并&…

.NET和Java之争

这几天连续有多篇文章诋毁.NET,这类文章我十几年前就看得多了,只不过十几年前是C和C之争,C和Java之争。我从来不理这类文章,因为这类口水战并没有什么实际意义。然而接连收到多位粉丝私聊说,主席,你应该写点…

线性代数一之矩阵转向量随机化求解——神奇的矩阵(BZOJ)+向量内积

向量随机化神奇的矩阵descriptionsolutioncode[NOI2013]向量内积descriptionsolutioncode矩阵既可以看成是一张数位表,也可以看成是若干个行向量或者若干个列向量的向量表神奇的矩阵 description solution 暴力做A∗BA*BA∗B会达到n3n^3n3的复杂度,难…

潘淳:国士无双《微软技术俱乐部(苏州)成立大会暨微软技术交流会介绍》附专题视频...

题记:凡我赶不上的,我就在未来等他,随时等待捕捉那个趋势的的到来。2019年立一个FLAG,加入一个成长性组织,一个能让我学习使我成长的平台。2019年你和我都将亲历这个组织的到来,一个属于苏州程序员自己的大…

ASP.NET Core中借助CSRedis实现安全高效的分布式锁

引言最近回头看了看开发的.NET Core 2.1项目的复盘总结,其中在多处用到Redis实现的分布式锁,虽然在OnResultExecuting方法中做了防止死锁的处理,但在某些场景下还是会发生死锁的问题,下面我只展示部分代码:问题&#x…

L Machining Disc Rotors

L Machining Disc Rotors 题意: 圆心为(0,0)半径为R的圆,现在被被n个互不相交的圆切割(圆心和半径会给出),保证这n个彼此之间不会交叉,保证n个圆中不会有某个包含整个大圆的情况。问切割后大圆剩余部分的直径(即两点…