前端大型开源项目
We’re honored by the amount of positive feedback we get from folks using Flutter. As one of the largest active repositories on GitHub, we have a relatively unique challenge and we thought you might find it interesting to learn our philosophy and approach to how we’re dealing with issues at this scale, what changes we’re making to deal with the project growth, and some helpful tips for filing issues to maximize their value.
我们很高兴收到来自使用Flutter的人们的积极反馈。 作为GitHub上最大的活动存储库之一,我们面临一个相对独特的挑战,我们认为您可能会发现有趣的是了解我们的哲学和方法以了解我们如何处理这种规模的问题,正在做出哪些更改随着项目的发展,以及一些有用的技巧,可以提出问题以最大程度地发挥其价值。
Sometimes developers attempt to use the total number of public logged issues as a measure of the overall quality of the project. We think this number is poorly correlated with project health, and want to explain why, counter to expectation, a larger number of issues can be a signal of a high-quality, popular project.
有时,开发人员尝试使用公开记录的问题总数来衡量项目的整体质量。 我们认为该数字与项目运行状况的相关性很差,并想解释为什么与预期相反,大量问题可能是高质量,受欢迎的项目的信号。
Lastly, we want to use this blog post to share some concrete changes we’ve made in recent months: more active scrubbing of our backlog, accomplishing (and holding to) zero-bug-bounce for unassigned issues, and a new prioritization scheme that better aligns with how we believe our customers think about priorities.
最后,我们想使用此博客文章来分享我们最近几个月进行的一些具体更改:更积极地清理积压工作,完成(并保持)针对未分配问题的零缺陷反弹以及新的优先级排序方案更好地与我们认为客户对优先事项的想法保持一致。
Flutter如何使用GitHub (How Flutter uses GitHub)
It’s common in today’s software development world for teams to keep a backlog of issues submitted both by team members and users: this backlog is the sum total of bugs, feature requests, and technical debt facing the team. Flutter is no different: we use GitHub as our backlog. If it’s a bug, an idea for a new feature, or something in between, it’s filed as an issue in our issue database on GitHub.
在当今的软件开发世界中,团队经常会积压团队成员和用户提交的问题,这很普遍:此积压是团队所面临的bug,功能请求和技术债务的总和。 Flutter也不例外:我们使用GitHub作为待办事项。 如果是错误,新功能的想法或介于两者之间的东西,则将其作为问题提交到GitHub上的问题数据库中 。
Each of these issues starts with you, or one of Flutter’s contributors. Contributors and users file issues about Flutter or Flutter’s API documentation in the flutter/flutter issue tracker, and issues about Flutter’s website (flutter.dev) in the flutter/website issue tracker.
每个问题都从您或Flutter的贡献者之一开始。 贡献者和用户在flutter / flutter问题跟踪器中提交有关Flutter或Flutter API文档的问题 ,并在flutter / website问题跟踪器中 提交有关Flutter网站( flutter.dev )的问题 。
There are three special considerations about how we manage issues on GitHub, which contributes to a large overall number:
关于我们如何在GitHub上处理问题,有三个特殊的考虑因素,这些因素导致了很多问题:
- The issue repository is completely open. The core engineering and product teams, along with the entire Flutter community, files all feature enhancements, bugs, and potential future work into the open repository. 问题存储库已完全打开。 核心工程和产品团队,以及整个Flutter社区,都将所有功能增强,错误以及潜在的未来工作归档到开放存储库中。
- We don’t aggressively close issues, even if we don’t plan to work on them in the immediate future; we want to keep the total backlog of possible work open, so that any future contributor can work on a feature they’re interested in and see the discussion that’s already transpired. 即使我们不打算在不久的将来解决这些问题,我们也不会积极解决。 我们希望保持所有未完成工作的积压工作,以便任何未来的贡献者都可以使用他们感兴趣的功能,并查看已经进行的讨论。
We use one repository for all issues except for those involving the developer toolchain and website. Issues with Android, iOS, Windows, web, macOS, and Linux; framework and engine; API documentation and plugins, are all logged in the same flutter/flutter repository.
除涉及开发人员工具链和网站的问题外,我们对所有问题使用一个资源库。 Android,iOS,Windows,Web,macOS和Linux的问题; 框架和引擎; API文档和插件都记录在相同的Flutter / Flutter存储库中。
Flutter的分流过程 (Flutter’s triage process)
The flutter/flutter issues are triaged by a member of the team: perhaps a volunteer, or one of the folks at Nevercode who have been helping us with triage, or by a Google employee (or an employee of another company). In triage, we assign as many labels to the issue as we can.
颤动/颤动问题由团队的一个成员进行分类:也许是志愿者,或者是Nevercode中一直在帮助我们进行分类的人员中的一个,或者由Google员工(或另一家公司的员工)进行了分类。 在分类中,我们为问题分配了尽可能多的标签。
Some labels direct the issue for secondary triage. For example, the engine label directs the issue to the engine team for secondary triage. Other labels indicate additional attributes, such as whether the issue is a feature request or a possible enhancement to increase the team’s velocity (as I write this, there are over 500 issues with that label).
一些标签将问题定向为辅助分类。 例如, 引擎标签将问题定向到引擎团队进行二次分类。 其他标签指示其他属性,例如问题是功能请求还是可能的增强以提高团队速度(在我撰写本文时, 该标签有500多个问题 )。
Between primary and secondary triage, we also assign a priority label for issues filed against the code base or API documentation. Similar to other bug trackers, we use a ranked priority scheme, with priorities ranging from P0 to P6:
在主要分类和次要分类之间,我们还为根据代码库或API文档提出的问题分配了优先级标签。 与其他错误跟踪器类似,我们使用排名优先级方案,优先级范围从P0到P6:
The P0 label indicates top-priority issues such as build breaks or severe performance regressions that must be addressed immediately.
P0标签指示必须立即解决的最高优先级问题,例如构建中断或严重的性能下降。
The P1 label indicates that the issue requires timely attention, such as breakage in a major feature used by the majority of our users, or an issue blocking a strategic partner. We aim to fix or remediate P1 bugs within the current milestone.
P1标签表示该问题需要及时关注,例如,大多数用户使用的主要功能出现故障,或者该问题阻碍了战略合作伙伴。 我们旨在修复或修复当前里程碑内的P1错误。
The P2 label indicates major features or issues that affect a significant subset of our users. Like P1 issues, we aim to fix or remediate these within the current milestone.
P2标签表示影响我们大部分用户的主要功能或问题。 与P1问题一样,我们的目标是在当前里程碑内修复或修复这些问题。
The P3 label indicates an issue currently on our timeline for an upcoming release that is at the top of our work list. Many issues we are actively working on bear this label, and most should have a milestone indicating when we think they’ll land.
P3标签表示我们时间表上当前存在的问题,该问题位于我们工作清单的顶部。 我们正在积极研究的许多问题都带有这个标签,并且大多数问题都应具有一个里程碑,指示我们何时认为它们会降落。
The P4 label indicates issues that we agree are important to work on, but not at the top of the work list. This is the default level for bugs.
P4标签表示我们同意处理的重要问题,但不在工作列表的顶部。 这是错误的默认级别。
The P5 label indicates issues we think are valid but not critical. This is the default level for new feature requests.
P5标签表示我们认为有效但非关键的问题。 这是新功能请求的默认级别。
The P6 label indicates valid issues that are unlikely to ever be worked on, but kept open in the event that a contributor might want to tackle it.
P6标签表示不可能解决的有效问题,但是在有贡献者希望解决的情况下,这些问题会一直公开存在。
This schema is relatively new, replacing our three-axis system of committed milestones, `customer:` and `severe:` labels. In the process of establishing it, we auto-prioritized a large number of issues based on committed milestones and other labels.
这种模式是相对较新的,代替了我们的三轴承诺里程碑:“ customer:”和“ severe:”标签。 在建立过程中,我们根据已落实的里程碑和其他标签自动为大量问题确定了优先级。
通过错误计数来衡量质量 (Measuring quality by bug count)
Because Flutter uses GitHub as a fully open issue tracker, with both bugs and feature requests, there’s no direct correlation between issue counts and product quality. Other open source projects, such as Chromium and TensorFlow, also developed fully in the open, have large issue counts as well. If anything, the large number of issues suggests that the project is active and vibrant as users engage in the product finding both bugs and things they’d like to improve.
因为Flutter使用GitHub作为具有漏洞和功能请求的完全开放的问题跟踪器,所以问题计数与产品质量之间没有直接关联。 其他开放源代码项目(例如Chromium和TensorFlow )也完全在开放状态下开发,发行量也很大。 如果有的话,大量的问题表明,随着用户参与产品发现错误和需要改进的事情,该项目是活跃而充满活力的。
It’s difficult to make apples-to-apples comparisons, though. Some projects proactively close open issues they’re not going to address; others keep their issue database in secret, and others use different projects for different kinds of issues. As already noted, we track feature enhancements and bugs in the same repository; we also use one repository across tools, Android, iOS, first-party plugins, and so forth.
不过,很难进行苹果之间的比较。 一些项目主动解决了他们不会解决的未解决问题。 其他人将其问题数据库保密,其他人则针对不同类型的问题使用不同的项目。 如前所述,我们在同一个存储库中跟踪功能增强和错误。 我们还跨工具,Android,iOS,第一方插件等使用一个存储库。
A better metric to gauge the health of an open-source project is to look at the number of issues closed vs. the number of issues currently open. As of this writing (early July 2020), we have 7,757 issues open and 32,485 issues closed. The rate of closure has increased over the last year, although has flattened somewhat in recent months:
衡量开源项目运行状况的更好指标是查看已解决问题的数量与当前已解决问题的数量。 截至撰写本文时(2020年7月上旬),我们有7,757个期刊已发行,有32,485个期刊已关闭。 在过去的一年中,关闭率有所提高,尽管最近几个月有所下降:
The dip in December is due to the holiday season; many contributors at Google and elsewhere take a vacation in that month. Regardless, the year-over-year average is 1314 issues closed, and if you look at the six-month average, you see that it’s considerably higher, at 1604 issues closed every month.
12月的下降是由于假期。 该月,Google和其他地方的许多贡献者都休假了。 无论如何,与去年同期相比,平均有1314个问题被关闭,如果您查看六个月的平均水平,您会发现它的平均值要高得多,每个月有1604个问题。
了解我们的未解决问题 (Understanding our open issues)
To get a better understanding of the kinds of issues we face, the Flutter leads recently took a random sample of 1,200 open issues and retriaged them. In the process, we learned the following:
为了更好地了解我们面临的问题,Flutter领导最近对1200个未解决问题进行了随机抽样,并对其进行了重试。 在此过程中,我们了解了以下内容:
- 32% of the issues filed came from core contributors on the project. Many of these are future work items, such as features, ways to improve the product, or improvements to our team’s tooling and infrastructure that would increase our own developer velocity. 提交的问题中有32%来自该项目的核心贡献者。 其中许多是未来的工作项目,例如功能,改进产品的方法或对我们团队的工具和基础结构的改进,这将提高我们自己的开发人员的速度。
- The average Flutter contributor filed 7.4 bugs, while the average user of Flutter who had filed any bugs had filed 1.2 bugs. Flutter贡献者的平均提交了7.4个错误,而Flutter提交了任何错误的普通用户都提交了1.2个错误。
- Of the issues we examined, some 25% were either support requests, clearly unactionable, or otherwise no longer valid (i.e., subsequent work fixed the issue or new product directions made the concern of the issue obsolete), which we were able to close. 在我们检查的问题中,约有25%是支持请求,明显无法采取行动或已不再有效(即,后续工作解决了该问题或新产品说明使对该问题的关注已过时),我们得以解决。
We’re continuing to work with Nevercode on grooming our backlog, both with recently filed issues and older issues. They have been very helpful in several ways:
无论是最近提交的问题还是较旧的问题,我们都将继续与Nevercode一起整理积压的订单。 他们在几个方面都非常有帮助:
- They actively create reproducible code for issues, helping other engineers look for ways to fix bona fide bugs in Flutter. 他们积极地为问题创建可重现的代码,帮助其他工程师寻找方法来修复Flutter中的真实错误。
- They deduplicate bugs, closing duplicates after crosslinking them. 他们对重复数据进行重复数据删除,并在交联后关闭重复数据。
They close non-reproducible bugs, as well as requests for support (which should be directed to one of the channels listed at https://www.flutter.dev/community).
它们关闭了不可复制的错误以及支持请求(应将其定向到https://www.flutter.dev/community上列出的渠道之一)。
- They request additional information for unclear issues, closing those that are unactionable. 他们要求提供更多信息以解决不清楚的问题,并关闭无法解决的问题。
- As time permits, they help us cull our backlog of old issues, answering the same questions: Is it still an issue? Does it have a reproducible case? Is it a duplicate? 在时间允许的情况下,它们可以帮助我们消除积压的旧问题,并回答相同的问题:这仍然是问题吗? 有可复制的包装盒吗? 它是重复的吗?
Together, we’ve learned some interesting things about the issues people file: Over the last two months, fully 55% of the issues filed don’t meet our criteria — they’re either requests for support or don’t have reproducible cases.
在一起,我们已经了解到有关人员提出的问题的一些有趣的事情:在过去的两个月中,提交的问题中有55%完全不符合我们的标准-它们是请求支持或没有可复制的案例。
For older issues, the Nevercode team has found that fewer issues were invalid or duplicated, likely explained by survivorship bias (issues that survive previous triages are likely not invalid or duplicate issues). Nonetheless, in their sample, 18% of the issues were invalid (either support requests or unactionable), and another 15% were duplicates. The lion’s share — up to 50% — reflects issues that have been subsequently addressed, suggesting that we can do a better job closing old issues as we add functionality and fix bugs.
对于较旧的问题,Nevercode团队发现无效或重复的问题较少,这很可能是由于生存偏差(在以前的分类中幸存的问题可能不是无效或重复的问题)。 但是,在他们的样本中,有18%的问题无效(支持请求或无法采取行动),另有15%的问题是重复的。 最多的份额-高达50%-反映了随后已解决的问题,这表明我们在添加功能和修复错误时可以更好地解决旧问题。
发行优先级 (Issue prioritization)
As of this writing (early July 2020), here’s the breakdown of P0-P2 issues:
在撰写本文时(2020年7月上旬),这是P0-P2问题的细分:
![Image for post](https://i-blog.csdnimg.cn/blog_migrate/4e2f7e5f00ce2bc2b584b36fb5050d87.png)
This chart shows a healthy number of issues that we’re actually working on with urgency. As you’d expect from a popular open-source project, there are a lot of other pieces of feedback in our issue database: here’s the breakdown of P3-P6 issues:
此图显示了我们正在紧急处理的大量健康问题。 正如您希望从一个受欢迎的开源项目中得到的那样,我们的问题数据库中还有很多其他反馈:这是P3-P6问题的细分:
![Image for post](https://i-blog.csdnimg.cn/blog_migrate/d2d086716f21bb3f335478e53e1f8fe7.png)
The team is actively working on many of the P3 issues, as well as the higher-priority P0-P2 issues.
团队正在积极处理许多P3问题以及优先级较高的P0-P2问题。
We still have a historical backlog of triaged unprioritized issues. Of these, we believe that most will likely fall into the P5 or P6 category, because as part of Nevercode’s triage efforts, they’ve escalated those that deserve immediate attention.
我们仍然有未分类优先级问题的历史积压。 在这些代码中,我们认为大多数都可能属于P5或P6类别,因为作为Nevercode分流工作的一部分,它们已将那些值得立即关注的问题升级。
Just because an issue makes it to secondary triage does not mean that the core engineering team has bandwidth to work on it. In secondary triage, we look at several things to determine what to do with an issue, including:
仅仅因为一个问题导致了二次分类,并不意味着核心工程团队有足够的带宽来处理它。 在次级分类中,我们着眼于确定问题的几件事,包括:
- What other work have we committed to? 我们还致力于其他哪些工作?
- How severe an issue is this? 这有多严重?
- How many people does it affect? 它会影响多少人?
- Is this issue for a specific customer? 这是特定客户的问题吗?
- How does working on this issue affect our roadmap and architecture? 解决此问题如何影响我们的路线图和体系结构?
For details on how we accomplish this, you can see our previous blog post on the topic, “Issues, Bugs, and Backlogs”.
有关我们如何完成此操作的详细信息,您可以查看我们以前的博客文章,主题为“问题,错误和积压 ”。
您将如何提供帮助 (How you can help)
The Flutter issue database on GitHub isn’t just the team’s issue database, it’s the issue database for our entire community, so we all need to play a part in its health. Here are some things we can all do to help keep a check on the quality of issues in the database:
GitHub上的Flutter问题数据库不仅仅是团队的问题数据库,它还是我们整个社区的问题数据库,因此我们所有人都需要发挥其健康作用。 我们可以做一些事情来帮助检查数据库中问题的质量:
Don’t file an issue for support requests. Support requests should be raised in one of the channels we describe at https://flutter.dev/community. We actively close requests for support raised on GitHub.
不要提出支持请求的问题。 支持请求应通过我们在https://flutter.dev/community中描述的一种渠道提出。 我们正在积极关闭在GitHub上提出的支持请求。
File issues in the appropriate database: Flutter bugs, API documentation bugs, and feature requests in the flutter/flutter issue tracker, and feedback about the Flutter website or codelabs in the flutter/website issue tracker.
在适当的数据库中记录文件问题:Flutter / Flutter 问题跟踪器中的Flutter错误,API文档错误和功能请求,以及Flutter / Website问题跟踪器中有关Flutter网站或代码实验室的反馈。
- When filing an issue, search to see if one already exists for the issue you’re having. If so, upvote it and comment if appropriate. The development team uses upvotes as a measure of interest when ranking issues for future work. 提交问题时,搜索以查看您所遇到的问题是否已经存在。 如果是这样,请对其进行投票,并在适当的时候发表评论。 在对未来工作的问题进行排名时,开发团队会使用upvotes作为关注度。
- Cross-linking is good! Feel free to crosslink related issues, either when filing new issues or when upvoting an issue you’ve encountered. Like upvoting, the team uses crosslinks in their investigations, and there’s a good chance that you see a relationship that others have missed. 交联是好的! 在提交新问题或对遇到的问题进行投诉时,可以自由地交叉链接相关的问题。 就像投票一样,团队在调查中使用交叉链接,很可能您会看到其他人错过的关系。
- Make sure that your bug contains everything the team needs to reproduce it. A minimally reproducible case is crucial for the team to be able to quickly get to the root of a bug. Explaining why a feature is important makes it more likely that the team will prioritize the work quickly. 确保您的错误包含团队需要复制的所有内容。 对于团队来说,最小的可重复性案例对于快速找到错误根源至关重要。 解释功能为何如此重要的原因使团队更有可能迅速确定工作的优先级。
Consider helping the triage effort. See a bug you have time to reproduce? Try reproducing it on the latest stable and master, and let us know if it’s still a problem. See a related issue? Crosslink it. Want to write some code? Submit a PR with a unit test exhibiting the issue, or better yet, a unit test with a fix for the issue. We welcome help on managing issues, so if you’d like to help, see our contributing guide for detailed information on how you can join us in the triage process.
考虑帮助分类工作。 看到您有时间重现的错误吗? 尝试在最新的马stable和母版上重现它,并告诉我们是否仍然存在问题。 看到相关问题? 交联它。 想写一些代码吗? 提交包含问题的单元测试的PR,或者更好的是,提交带有问题修复程序的单元测试。 我们欢迎您提供有关处理问题的帮助,因此,如果您想提供帮助,请参阅我们的帮助指南,以详细了解如何加入我们的分诊流程。
Speaking for those working on Flutter, we’re in awe of the support you continue to give us in our vision to build ways to bring beautiful, performant applications to your users. Thanks so much for all that you do!
对于那些在Flutter上工作的人来说,我们对您继续提供给我们的支持感到敬畏,我们将继续为我们构想为用户提供美观,高性能的应用程序的方法。 非常感谢您所做的一切!
翻译自: https://medium.com/flutter/managing-issues-in-a-large-scale-open-source-project-b3be6eecae2b
前端大型开源项目