NVDA 二十年:从数据看开发历程与社区成长

原文:20 Years of NVDA Development: A Data-Driven Retrospective

庆祝 NVDA 20 周年!

太好了!免费开源的 Windows 屏幕阅读器 NVDA 已持续开发 20 年。下文将结合数据,回顾 NVDA 的开发历程,以及与它一同成长的庞大社区。

除此之外,NVDA 托管在 GitHub 上也已有 10 年。GitHub 是 NVDA 的开发平台,用户可在这里报告 issue、贡献新功能并参与开发讨论。在 GitHub 上的这些年里,NVDA 已经从一个小型开源屏幕阅读器,成长为由志愿者、贡献者和 NV Access 共同支持的全球社区项目。

这份报告基于过去 15 年积累的跟踪数据,回顾 NVDA 项目的演变:我们如何管理缺陷报告(issue)、如何提出新的代码变更(Pull Request),以及安全流程如何逐步成熟。更重要的是,它呈现了支撑 NVDA 成长的人员与机制,并说明社区参与、流程改进和 NV Access 的人员投入如何让 NVDA 开发保持及时响应、稳定和安全。

通常,一个 NVDA issue 提交后,会进入 triage(审查并确认)流程。接着,社区成员或 NV Access 会创建一个用于解决该 issue 的 Pull Request。这个 Pull Request 会由 NV Access 和社区共同审核。审核通过后,相关 issue 会关闭,代码也会合并,并在 NVDA 的下一个版本中发布。

总体来看,社区和 NV Access 提交的代码变更数量都在逐年稳定增长。这让我们基本能够跟上 issue 的处理节奏:2016 年以前创建的 issue 关闭率达到 95%,2016 年至 2023 年创建的 issue 关闭率也达到了 80%。几年前,NVDA 未关闭 issue 的数量曾一度超过 2500 个,现在大约为 2100 个。issue triage、Pull Request 审核和安全流程的改进,已经带来了可以衡量的成效。

NVDA 贡献者社区由数百名志愿者组成,其中包括翻译者、开发者、测试者、问题调查者和问题报告者。社区成员贡献了一半代码改动,报告了数千个 issue,并帮助调查这些 issue。到 2025 年,NVDA 已经有多个支持开发的社区组织:由受信任的社区成员组成、为 NV Access 提供建议的顾问组,专注于安全研究的安全顾问组,我们的 GitHub 社区,以及各种社区邮件列表。

关键事实

  • 约 2100 个未关闭 issue,约 12,000 个已关闭 issue,关闭率为 85%。
  • 46% 的未关闭 issue 已被接受并可开始处理。
  • 每年新增 700 个以上 issue。
  • 每年约有 700 次代码贡献,并且仍在稳步增长。
  • 所有代码贡献中有 50% 来自社区。
  • 所有提交的代码贡献中,有 87% 被接受并纳入 NVDA。
  • 2025 年有 30 多位活跃社区代码贡献者。
  • 2025 年有 73 位活跃翻译者。
  • 2025 年翻译了 140 万词。
  • 自 2022 年以来发布了 20 条安全公告。

我们如何管理和解决已报告的问题

我们通过 issue 跟踪 NVDA 的缺陷报告、功能请求和其他工作。

2009 年,NVDA 项目首次在一个名为 Trac 的 issue 跟踪服务上接收 issue 报告。

2015 年,NVDA 迁移到 GitHub,issue 记录也一并迁移到了 GitHub。

2022 年,NV Access 正式开始对所有新 issue 进行 triage。这个过程会逐一查看最近创建的 issue,并且:

  • 确保报告有效;
  • 确保报告中包含足够的信息,开发者可以据此着手处理;
  • 补充推进 issue 处理所需的信息;
  • 为 issue 分配优先级。

2025 年,NVDA 采用了 GitHub 的 issue 表单功能,让新手也能更轻松地报告问题。

如果一个 issue 确认有效,并且社区或 NV Access 已经可以开始处理,就会加上 triaged 标签。如果还需要补充信息,则会加上 needs-triage 标签。对 issue 进行 triage 有助于推动它得到解决,也向社区表明该 issue 已经可以开始处理。当 issue 被修复,或者已经不再有效时,就会被关闭。

NVDA 项目每年新增 issue 数稳定在 700 到 1000 个之间。NVDA 每年新增 issue 数在 2021 年降至历史低点,当年新增 700 个 issue;2015 年达到历史高点,当年新增 1200 个 issue。自 2021 年的低点以来,issue 创建数量一直在缓慢增加。在 2021 年之前,每年新增 issue 的数量变化并不稳定。

一个 issue 越早创建,就越有可能已经被关闭。迁移到 GitHub 之前创建的 issue,也就是早于 2016 年的 issue,有 95% 已经关闭。triage 似乎也能提高关闭率,因为过去 6 年中最高的关闭率(80%)和最高的审查率(95%)都出现在 2023 年。

issue 数据

请注意,由于从 Trac 迁移到 GitHub,2007 至 2010 年的 issue 被归为一组统计。

数据表

创建年份 未审查 已审查 需要更多信息 未关闭总数 已关闭总数 关闭率 审查率
2007-2010 21 4 0 25 1057 97.69% 16.00%
2011 17 3 0 20 690 97.18% 15.00%
2012 31 4 0 35 846 96.03% 11.43%
2013 49 14 0 63 762 92.36% 22.22%
2014 74 5 2 81 866 91.45% 6.17%
2015 60 3 0 63 1111 94.63% 4.76%
2016 106 10 0 116 747 86.56% 8.62%
2017 121 14 0 135 791 85.42% 10.37%
2018 142 21 2 165 800 82.90% 12.73%
2019 147 24 1 172 831 82.85% 13.95%
2020 171 28 1 200 709 78.00% 14.00%
2021 119 35 3 157 546 77.67% 22.29%
2022 13 128 28 169 561 76.85% 75.74%
2023 0 156 8 164 660 80.10% 95.12%
2024 0 230 21 251 526 67.70% 91.63%
2025 0 326 33 359 517 59.02% 90.81%
合计 1071 1005 99 2175 12020 84.68% 46.21%

图表

按年份统计的 issue 图表 1

按年份统计的 issue 图表 2

按年份统计的 issue 图表 3

数据来源

NVDA 社区如何贡献代码

Pull Request(PR)是指已提交、等待审核的代码变更。要修改 NVDA,例如添加功能或修复缺陷,NV Access 和社区成员通常会先创建一个 Pull Request。之后,这个 Pull Request 会由 NV Access 审核,通常社区也会参与审核,然后才会被纳入 NVDA。

NVDA 的确是由社区共同开发的!自 2015 年以来,NVDA 约 50% 的变更来自社区成员。随着社区和 NV Access 的成长,Pull Request 数量逐年增加。每年 PR 总数大约增加 50 个,2025 年达到 700 多次贡献。

2015 年迁移到 GitHub 后,NVDA 开始通过 Pull Request 接受社区代码贡献。2016 年,NV Access 聘用了第一位全职软件开发者;2021 年,NV Access 又聘用了一位开发者。2023 年,NV Access 的全职开发者人数曾短暂减少一人,并在 2024 年重新招聘。

2019 年,社区 Pull Request 数量达到历史高点,共 334 个。此后,NV Access 开始跟踪每周有多少个未关闭 PR。这是因为当时有大量社区贡献在等待 NV Access 的反馈或支持。其中许多 Pull Request 都与 NVDA 所用底层编程语言的一次重大升级有关,也就是将 NVDA 从 Python 2 迁移到 Python 3。2020 年,未关闭 Pull Request 曾超过 90 个;到 2025 年,同一时间未关闭的 PR 曾降至历史低点,只有 7 个,最高也只有 34 个。这意味着现在一个 PR 创建后,会很快得到关注,从开始开发到纳入 NVDA 的周期也大幅缩短了。

2020 至 2021 年,为了消化积压的社区贡献,NV Access 只接受社区提交的缺陷修复 PR,并暂停接受社区提交的新功能。积压减少并重新接受社区提交的新功能后,社区 PR 又逐年上升,到 2025 年达到 321 个。

有时,PR 会在未合并进 NVDA 的情况下被关闭。原因可能是实现方式无法正常工作、已有新的 PR 替代它,或者相关工作被放弃。总体而言,87% 的 PR 被接受并合并。这意味着通常只要某项工作已经开始,它就很有可能完成并成为 NVDA 的一部分。这个比例也随着时间推移而提升,现在每年约为 90%。

Pull Request 数据

数据表

创建年份 同一时间进行中的最大 PR 数 已合并的 NV Access 贡献 已合并的社区贡献 已合并总数 未合并即关闭 已关闭总数 社区贡献占比 合并率
2015 0 2 2 18 20 100.00% 10.00%
2016 73 55 128 53 181 42.97% 70.72%
2017 125 99 224 39 263 44.20% 85.17%
2018 83 143 226 38 264 63.27% 85.61%
2019 112 334 446 91 537 74.89% 83.05%
2020 90+ 130 216 346 68 414 62.43% 83.57%
2021 63 248 178 426 67 493 41.78% 86.41%
2022 65 291 164 455 52 507 36.04% 89.74%
2023 51 282 281 563 46 609 49.91% 92.45%
2024 49 352 298 650 76 726 45.85% 89.53%
2025 34 443 321 764 87 851 42.02% 89.78%
合计 90+ 2110 2091 4201 628 4786 49.77% 87.78%

图表

按年份统计的 Pull Request 图表 1

按年份统计的 Pull Request 图表 2

按年份统计的 Pull Request 图表 3

数据来源

通过更好的报告机制提升 NVDA 的安全性

2022 年,NV Access 制定了正式的安全问题处理政策,并启用了 GitHub 的 Security Advisories(安全公告)功能。这让研究人员和开发者能更方便地以负责任披露的方式报告漏洞。自 2022 年以来,共记录了 20 条已发布安全公告。平均来看,安全问题报告后,NV Access 会在 3 个月内将修复发布到 NVDA 稳定版。超过一半的安全问题在不到 1 个月内得到修复,平均响应时间主要被少数较复杂的问题拉高。

安全公告时间线:

  • 2022 年:发布了 14 条安全公告。
  • 2023 年:未发布安全公告。
  • 2024 年:发布了 3 条安全公告。
  • 2025 年:发布了 3 条安全公告。

严重程度:

  • 严重:3 条(15%)
  • 高:7 条(35%)
  • 中:6 条(30%)
  • 低:4 条(20%)

更多安全公告实际意味着什么?更多报告并不意味着 NVDA 的安全性正在下降。相反,它意味着:

  • 社区正在更加密切地关注安全问题;
  • 我们的负责任披露政策正在发挥作用;
  • NVDA 的安全性正在逐年改进。

安全公告数据

  • 从报告到修复发布的平均天数:91 天
  • 从报告到修复发布的中位数天数:25.5 天
创建年份 已发布 严重
2022 14 3 4 6 1
2023 0 0 0 0 0
2024 3 0 3 0 0
2025 3 0 0 0 3
合计 20 3 7 6 4

按严重程度分组的安全问题图表

数据来源:安全公告

让全世界都能使用 NVDA

NVDA 目前已有 67 种语言的活跃翻译。来自世界各地的志愿翻译者参与翻译 NVDA 界面、用户指南和更新日志。

2024 年底,NVDA 的翻译工作从旧有自研系统迁移到 Crowdin。

2025 年,73 位活跃翻译者将 140 万词翻译成 67 种语言。平均下来,每位翻译者每年翻译 19,000 词。

未来仍需推进的工作

这份报告表明,改进工作方式可以对整个 NVDA 开发流程产生积极影响。我们计划继续打磨这一流程:从报告 issue、triage,到通过 Pull Request 修复 issue。通过对较旧的 issue 进行 triage,我们可以让提出已有十多年的需求也继续向前推进。我们也希望继续培训和鼓励新的贡献者,帮助社区成长。为此,我们可以改进开发者文档、开发者工具,并提供直接指导。随着 PR 积压减少,我们可以继续及时处理新的社区代码贡献。

欢迎阅读我们的贡献者指南,了解如何参与 NVDA 项目。你可以通过多种方式为 NVDA 项目做出贡献:

标签: none

添加新评论