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% |
图表



数据来源
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% |
图表



数据来源
通过更好的报告机制提升 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 项目做出贡献: