微软开源 .NET 一年后……
大约一年前，微软宣布开源了 .NET 框架的大部分。当时，Scott Hanselman 使用微软 Power BI对代码库做了一个漂亮的分析。 现在一年过去了，我想要试试对以下问题做个解答：  微软开源了 .NET 框架的大部分之后，社区参与贡献了多少？  我着眼于以下三个项目做了分析，它们是 .NET 生态系统中最主要部分之一，也是 .NET 基金会内最活跃/收藏/分支的项目之一：  Roslyn .NET 编译器平台，提供了开源的 C# 和 Visual Basic 编译器，以及丰富的代码分析 API。 CoreCLR .NET Core 运行时环境和底层库（mscorlib），它包括垃圾回收、JIT 编译器
微软 .NET 开源
大约一年前，微软宣布开源了 .NET 框架的大部分。当时，Scott Hanselman 使用微软 Power BI对代码库做了一个漂亮的分析。 现在一年过去了，我想要试试对以下问题做个解答：  微软开源了 .NET 框架的大部分之后，社区参与贡献了多少？  我着眼于以下三个项目做了分析，它们是 .NET 生态系统中最主要部分之一，也是 .NET 基金会内最活跃/收藏/分支的项目之一：  Roslyn .NET 编译器平台，提供了开源的 C# 和 Visual Basic 编译器，以及丰富的代码分析 API。 CoreCLR .NET Core 运行时环境和底层库（mscorlib），它包括垃圾回收、JIT 编译器
![](/data/attachment/album/201512/11/233709aavkkvzkz5awk5kk.jpg)


大约一年前，微软宣布[开源了 .NET 框架的大部分](/article-4209-1.html)。当时，Scott Hanselman 使用微软 Power BI [对代码库做了一个漂亮的分析](http://www.hanselman.com/blog/TheNETCoreCLRIsNowOpenSourceSoIRanTheGitHubRepoThroughMicrosoftPowerBI.aspx)。 现在一年过去了，我想要试试对以下问题做个解答：



> 
> 微软开源了 .NET 框架的大部分之后，**社区**参与贡献了多少？
> 
> 
> 


我着眼于以下三个项目做了分析，它们是 .NET 生态系统中最主要部分之一，也是 .NET 基金会内 [最活跃/收藏/分支的项目](https://github.com/dotnet/)之一：


* [**Roslyn**](https://github.com/dotnet/roslyn/) – .NET 编译器平台，提供了开源的 C# 和 Visual Basic 编译器，以及丰富的代码分析 API。
* [**CoreCLR**](https://github.com/dotnet/coreclr/) – .NET Core 运行时环境和底层库（mscorlib），它包括垃圾回收、JIT 编译器、基本的 .NET 数据类型和许多底层类。
* [**CoreFX**](https://github.com/dotnet/corefx/) – .NET Core 基础库，包括 collections、文件系统、console、XML、异步以及其它方面的类。


### 数据来自哪里？


GitHub 自身已经内建了很多漂亮的图表了，你可以看看这一年来**每月提交数**的图表：


[![Commits Per Month](/data/attachment/album/201512/11/233737iowqnu2i63vw5ifu.png)](https://github.com/dotnet/roslyn/graphs/contributors)


还可以看看**每月动态**：


[![github stats - monthly pulse](/data/attachment/album/201512/11/233738sj5da7uao5og2lp7.png)](https://github.com/dotnet/roslyn/pulse/monthly)


但是要回答上面的问题，我需要更多的数据。幸运的是， GitHub 提供了[非常全面的 API](https://developer.github.com/v3/)， 再配合上出色的 [Octokit.net 库](https://github.com/octokit/octokit.net)以及 [brilliant LINQPad](https://www.linqpad.net/)，我就很容易的得到了我所需的全部数据。如果你想要自己试试这些 API ，这儿有个[示例的 LINQPad 脚本](https://gist.github.com/mattwarren/894aa5f46ca62a63764a)。


然而，仅仅知道它的每月 “<ruby> 问题 <rp>  （ </rp> <rt>  issue </rt> <rp>  ） </rp></ruby>数量” 或 “接受的PR（ <ruby> 拉取请求 <rp>  （ </rp> <rt>  Pull Request </rt> <rp>  ） </rp></ruby>）”并没有太大用处，这并不能告诉我们是谁提交了这些问题或 PR。 幸运的是， GitHub 典型的用户是有分类的，比如下图来自 [Roslyn 第 670 号问题](https://github.com/dotnet/roslyn/issues/670) ，我们可以看到是哪种类型的用户提交的备注：“<ruby> 拥有者 <rp>  （ </rp> <rt>  Owner </rt> <rp>  ） </rp></ruby>”、 “<ruby> 协作者 <rp>  （ </rp> <rt>  Collaborator </rt> <rp>  ） </rp></ruby>” 或者为空——这就是“社区”成员，比如下面的某人（我觉得）并没有在微软工作。


[![owner collaborator or community](/data/attachment/album/201512/11/233738tiztkdky54mutymk.png)](https://cloud.githubusercontent.com/assets/157298/11634101/8abd7210-9d06-11e5-82b0-570f296cf433.png)


### **结果呢？**


现在我们可以得到我们所需的数据，也就可以生成结果了。


#### **全部问题 - 按提交者分组**




| 项目 | **拥有者** | **协作者** | **社区** | **全部** |
| --- | --- | --- | --- | --- |
| Roslyn | 481 | 1867 | 1596 | 3944 |
| CoreCLR | 86 | 298 | 487 | 871 |
| CoreFX | 334 | 911 | 735 | 1980 |
|  |  |  |  |  |
| **全部** | 901 | 3076 | 2818 |  |


这里你可以看到拥有者和协作者在某些情况下占有主导地位，比如，在 Roslyn 项目中 60% 的问题是他们汇报的。但是在另外的例子中社区非常活跃，特别是在 CoreCLR 项目中社区成员汇报的问题超过了拥有者/协作者之和。造成这种情况的部分原因是项目的不同， CoreCLR 是 .NET 框架中最引人注目的部分，因为它包含了 .NET 开发者日常使用的大部分库，所以并不用对社区提交了很多改进建议和错误修复的事情感到惊奇。 另外， CoreCLR 已经出现了较长时间，社区已经使用了一段时间，也能找到它的一些不足的部分。而 Roslyn 则相对较新一些，还没有被太多的使用过，而且找到一个编译器的 bug 显然会更难。


#### 全部已接受的 PR - 按提交者分组




| 项目 | **拥有者** | **协作者** | **社区** | **全部** |
| --- | --- | --- | --- | --- |
| **Roslyn** | 465 | 2093 | 118 | 2676 |
| **CoreCLR** | 378 | 567 | 201 | 1146 |
| **CoreFX** | 516 | 1409 | 464 | 2389 |
|  |  |  |  |  |
| **全部** | 1359 | 4069 | 783 |  |


但是，如果我们来看一下已接受的 PR ，可以看到在这三个项目中社区的贡献量非常低，仅仅只有 12% 左右。不过，这并不令人吃惊，因为 PR 需要达到相当高的水准才能被接受。如果项目采用这种机制，首先你必须找到一个<ruby> <a href="https://github.com/dotnet/corefx/labels/up%20for%20grabs">  “需要解决” </a> <rp>  （ </rp> <rt>  up for grabs </rt> <rp>  ） </rp></ruby>的问题，然后如果你[要改变 API 就必须通过代码审查](http://blogs.msdn.com/b/dotnet/archive/2015/01/08/api-review-process-for-net-core.aspx)，最后你必须在代码审查中符合可比性/性能提升/正确性等。所以，实际上 12% 是个相当不错的结果，接受的 PR 解决了不少的问题，特别是考虑到大部分贡献都是社区成员在工作之余完成的。


**更新：**关于对“需要解决”的要求，参见 [David Kean](https://github.com/davkean) 的[这个评论](http://mattwarren.org/2015/12/08/open-source-net-1-year-later/#comment-7091)，以及[这条推](https://twitter.com/leppie/status/674285812146675714)来了解更多信息。“需要解决”是一个准则，旨在帮助新手，但是并不是必需的，你可以提交一个解决问题的 PR 而不打上这个标签。


最后，如果你看一下每月的数量（参见下面的两张图，点击放大），很难找到特定的趋势，或者说，社区肯定会随着时间的变化或多或少的做出贡献。不过，你也可以说，过去一年来社区一直在做贡献，而且看起来还会继续贡献下去。这不是仅仅出现在项目刚刚开源后的一次性喷发，而是一整年以来的贡献的持续水平。


#### **每月的问题数 - 按提交者分组**


[![Issues Per Month - By Submitter (Owner, Collaborator or Community)](/data/attachment/album/201512/11/233738j45uw7wzk4x3odo7.png)](https://cloud.githubusercontent.com/assets/157298/11596712/ad28f518-9aae-11e5-81d9-42bc22903d09.png)


#### **每月接受的 PR - 按提交者分组**


[![Merged Pull Requests Per Month - By Submitter (Owner, Collaborator or Community)](/data/attachment/album/201512/11/233738marnpgpzsel7zpiu.png)](https://cloud.githubusercontent.com/assets/157298/11652755/785d0d20-9d91-11e5-9802-834bb3955718.png)


### **前 20 的问题标签**


最后一件我想对我拥有的这些数据所做的事情是找到那些最流行的问题标签，这可以揭示从三个项目开源以来哪种类型的工作不断出现。


[![Top 20 Issue Labels](/data/attachment/album/201512/11/233739xzz2shrt1v8uqrh2.png)](https://cloud.githubusercontent.com/assets/157298/11633496/8505205a-9d03-11e5-89fd-33384b20306c.png)


以下是关于这些结果的一些看法：


* 列表中 **[CodeGen](https://github.com/dotnet/coreclr/labels/CodeGen)** 排名如此之高没有什么好惊奇的，[下一代的 .NET JIT 编译器 RyuJIT](http://blogs.msdn.com/b/dotnet/archive/2013/09/30/ryujit-the-next-generation-jit-compiler.aspx) 才发布了仅仅两年而已。然而如此多的问题还是让人有一点点担心，特别是考虑到它们中的一些会带来[严重的后果](https://github.com/dotnet/coreclr/issues/1296)，就如 [Stack Overflow 的开发人员](http://nickcraver.com/blog/2015/07/27/why-you-should-wait-on-dotnet-46/)发现的那样！题外话，如果你想要了解 JIT 的许多底层细节，可以看看 [@MikeDN 评论过的](https://github.com/dotnet/coreclr/issues?utf8=%E2%9C%93&q=commenter%3Amikedn+type%3Aissue)这个问题，令人难以置信的是，有些掌握了很多知识的人却自己并不从事这方面工作，甚至是微软的另外团队的！
* 这三个项目都有许多“需要解决”的问题： [Roslyn](https://github.com/dotnet/roslyn/labels/Up%20for%20Grabs)、 [CoreCLR](https://github.com/dotnet/coreclr/labels/up-for-grabs) 和 [CoreFX](https://github.com/dotnet/corefx/labels/up%20for%20grabs)，而且社区似乎也在[添加需要解决的问题](https://github.com/dotnet/corefx/labels/grabbed%20by%20community)！
* 最后，我很高兴的看到 [性能](https://github.com/dotnet/corefx/labels/performance) 和 [优化](https://github.com/dotnet/coreCLR/labels/optimization) 日益得到了重视，毕竟<ruby> <a href="http://mattwarren.org/speaking/">  性能是王道！ </a> <rp>  （ </rp> <rt>  Performance is a Feature!! </rt> <rp>  ） </rp></ruby>
