NVDA 内幕故事1:概述与总体目标
译注:《内幕故事》系列文章为英文译文。后文中的“我”指 Joseph Lee
首先,感谢 Brian V 允许我做一些我过去几年梦寐以求的事情:带大家了解 NVDA 屏幕阅读器的内部结构。
在过去的几年里,我希望我能花一些时间告诉你屏幕阅读器的内部是如何工作的,并为屏幕阅读器的研究添加急需的知识体系。
当你在论坛存档中搜索“内部(internals)”和“开发(development)”等术语时,你会看到我和其他人撰写的一系列关于屏幕阅读器内部的文章。举几例:
还有一些主题讨论了 NVDA 之外的东西,但仍然涉及了 NVDA 的某些部分,例如:
我将在之后的文章中介绍 NVDA 的历史,这次关注与读屏软件无关,但有助于解释多年以来(开发过程中)做出选择的话题。
写系列文章的原因
写《NVDA 内幕》系列的原因是为了解释屏幕阅读器的工作原理,特别是 NVDA 在幕后的工作原理。
本系列的一部分源于这样一个事实,即尽管 NVDA 是一个开源的屏幕阅读器,但在源代码级别没有得到很好的记录。这也许是那些希望贡献代码使屏幕阅读器变得更好、更有价值的人遇到困难的最大原因之一。“更好”是因为竞争的概念,需要支持不同的应用场景;“更有价值”是因为人们认为更多的功能意味着更多的价值和能力。(我现在可以告诉你这是错误的,你会注意到我可以而且有时会变得哲学)。
正如 Brian V 和其他人所观察到的那样,包括在关于可访问拖放的线程中,屏幕阅读器充满了关于访问不可访问部分的变通方法的补丁的补丁,我不是在开玩笑。至少这是屏幕阅读器开发的现实,我希望这个系列能让你对这个现实有所了解。首先通过高层次地讨论内部结构,然后带你踏上这样那样的功能是如何真正实现的。我不能对 NVDA 源代码进行逐行评论,因为这里不是一个开发讨论区,但我会尽我所能,至少以一种我希望用户能够欣赏的方式说明正在发生的事情。
发布《NVDA 内幕》的第二个原因是:这可以视作一个放松和恢复的过程,对我和整个 NVDA 社区来说都是如此。
我直到参加研究生课程时,才意识到我是如此专注于 NVDA 的开发,以至于让我感到倦怠。今年,当我宣布为期一个月的休息时,这一点就很明显了。因为我需要一些时间来治愈和重新组织我的想法。
NVDA 源代码中缺乏文档,确实增加了我的压力。但更糟糕的是,我意识到用户对他们最喜欢的屏幕阅读器在幕后的工作方式知之甚少,虽然这是可以理解的。
更紧迫的是,我是一名研究生,正站在一个十字路口。我知道我对 NVDA 社区的参与即将结束。我觉得这是一个难得的机会,可以在我继续前进之前,将我对 NVDA 和屏幕阅读的了解传递给下一组社区成员。
由于写作似乎是摆脱压力和治愈的方法之一,我觉得写关于 NVDA 内部的文章将帮助我治愈,并为社区揭开 NVDA 屏幕阅读器的一些面纱,以便人们可以更好地了解正在发生的事情,并提出更好的功能建议。
写《NVDA 内幕》系列的第三个原因是:教你技术交流的艺术和科学。
我个人很高兴我们有像 Quinn 这样的人,他们是技术交流的化身:使用多媒体演示、讲故事和其他创新的方式来讨论技术概念,包括以许多人都能理解的方式讨论屏幕阅读技术。
技术交流或一般的技术写作是一个包含了艺术性和科学性的过程。艺术性,因为作者需要看看观众是谁,并想出以友好的方式解释困难概念的方法。科学性,因为人们必须在研究和理解(包括观众的反馈)中表现出严谨性,否则解释就会分崩离析。我希望其他人可以在实践技术交流的艺术和科学的同时,贡献他们的帖子,以丰富社区。
写《NVDA 内幕》系列的第四个原因是:给未来的研究者留下一些思考。
在源代码级别研究辅助技术并了解其内部结构是许多人的梦想。直到最近,人们才开始意识到软件源代码的研究价值。但是,由于理解源代码需要时间(特别是对于不熟悉源代码设计的主要受众来说),对于辅助技术源代码来说更是如此。
我想这是一个绝佳的时机,让我这个研究者活动起来,并为未来的研究人员留下一些参考。我认为一两个关于 NVDA 内部的故事可能会为研究人员提供一些提示,让他们知道下一步该去哪里。
小结与预告
最后,我将《NVDA 内幕故事》系列献给无数在我作为 NVDA 社区成员的旅程中帮助过我的人。特别感谢 NV Access 的人们,他们在平等获取技术的旅程中一直是我的导师和同事。我希望即将到来的《内幕故事》系列可以作为展示我过去十年所学知识的一种方式。
由于《NVDA 内幕故事》将从用户的角度讨论 NVDA 屏幕阅读器的内部结构,因此我将尽最大努力减少使用行话、术语(当然如果有必要的话,我会定义这些术语)。即文章以讲故事为主,我也希望读者对计算机有一定的了解。
对于熟悉可访问性概念和相关技术(如可访问性标准和 API)、熟悉编程以及愿意更深入地研究技术方面的人来说,这是一个特别的奖励。
我的主要受众是 NVDA 用户,他们已经使用屏幕阅读器一段时间(至少一年),并且对功能的工作原理感到好奇,无论是在高级级别(它对你来说如何显示)还是略低级别(非常接近源代码级别),但还没有达到对屏幕阅读器本身进行编码开发的程度。
有时,我会向你展示对功能内部工作至关重要的源代码部分,并在之后进行解释。由于 NVDA 在不断开发中,我所说的内容与实际添加到源代码中的内容可能会有所不同。最后,这不是一个开发讨论组,所以解释代码的级别不是逐行评论,而是更倾向于讲述一两个关于事物是如何诞生的故事(例如,请参阅我关于如何加载浏览模式的解释)。
《内幕故事》系列中的第一个故事将介绍屏幕阅读器组件的高级概述。这是对 8 月份发布的帖子的回应,当时我们讨论了数学表达式发音,据观察,它最终归结为语音合成器,而不是屏幕阅读器本身。我希望即将发表的帖子能够一劳永逸地澄清屏幕阅读器不是文本转语音引擎,反之亦然。与往常一样,如果你有希望我在整个内幕故事系列中涵盖的内容,请直接与我联系。
谢谢
Cheers,
Joseph
评论与回复
- 问:是否有计划以博客或维基(Wiki)的形式记录这些故事?
答:也许以后会有 - 问:是否有设计、架构文档,我们可以把这些故事填充在文档框架中。
答:NVDA 的源码中有一个技术设计概述文档。以前在项目的维基中,最近的版本移动到了源代码中,放在nvda/projectDocs/design
文件夹中。下一个内部实现故事主要基于该文档,因为我会引用一些源代码来讨论 NVDA 组件。
译注
译自 Joseph Lee - The Inside Story of NVDA: introduction and overall goals and mindset (2022-09-18)
- 2023-12-11:调整摘要内容;增加“译文”标签
很精彩的译作,希望这个系列可以持续更新下去。这对于中文社区用户更深入了解 NVDA 背后的原理和历史有很大帮助。