我为什么要搭建新的词典 app?

明明 AppStore 里已经有 300 多个词典 app 了!!!我为什么还要搭建新的词典 app?

为什么要搭建词典 app?故事的开头都一样:我遇到了点小问题。前段时间我阅读了《沙丘》,我想在这本书的同名电影上映前把书读完。但我的母语不是英语,我常用的大多数英语单词都只跟工作或生活有关,所以理解这本书所传达的意境对我来说有点难。于是,我就想使用人类的伟大创造之一:词典。

作为信息时代的忠诚拥护者,我首先去 AppleStore 寻找词典,结果发现没有一个 词典 app 能满足我的需求。

我敢发誓,我的期望值并不高,我只有以下几条核心原则:

  • 提供离线支持 我们生活在一个充满诱惑的时代,如果我们用手机搜索单词,只要手机有网,我们就很容易在搜索单词时经不住诱惑,无缝切换到社交媒体 app。

  • 查询快速 如果我们在专心阅读时遇到陌生词汇,不得不暂停阅读去词典里搜索生词,这时候我们往往希望搜索能瞬间完成,无须等待词典 app 慢慢加载,从而快速回到阅读中。

  • 能存储知识 每次使用词典 app 搜索生词都是一次增加词汇量的机会,但如果词典 app 没有存储生词功能或没法查阅搜索历史,那么增加词汇量的宝贵机会就被浪费了。

  • 零噪音 市面上的很多词典 app 都有各种各样的干扰因素,例如,额外的点击、不需要的功能、矩形广告或过多的排版风格。

  • 无锁定 这一原则源自于“本地优先软件运动,用户拥有数据所有权,可以输出并控制自己创建的内容。

  • 优秀的数据集 我曾与我的一些语言学朋友讨论过什么词典能称之为好词典这个问题,大家都认为,不是所有词典都是好词典。每个词典在编辑初期都有特定的目标,而现代词典往往偏重功能性,只给出词汇的少量含义,还有一些词典的语言更具诗意和趣味性,适合作家和母语人士使用。

考虑了以上所有因素,于是我开始创建我心目中的完美词典 app。

任务启动

经过了初步畅想,我迫不及待地想要快点搭建这个 app。真正开始搭建后,我发现问题比我想象中要棘手……但我相信我可以克服这些问题。

数据

我开始为创建词典寻找可靠的数据,但事实证明这也不简单。我测试过的大多数免费词典都将 hello 定义为“见 Halloo”(捂脸)。阅读了一些文章后,我登陆了 freeDictionary API,该词典用维基词典作为词源。

因为我需要离线数据,所以还不能接入我的 react-native 应用,但这是第一步。接下来,我创建了一个脚本,下载了 30 万个常用英语单词的定义,并把它们添加到 SQLite 数据库中。为避免因请求太多被拒绝,我让电脑连续运行了 30 个小时把所有定义下载下来。下图是这个脚本所做的“苦工”:

测试速度

现在我有了附有英文单词和定义的 db.sql。

2

起初,我有点担心 react-native 查询 21 MB SQLite 数据库的速度,后来发现完全不用担心——遵循“本地优先”的最大优点是依赖设备的速度。这是我的第一个 demo,也是我搭建过程中收获的第一份快乐:一个简单的文本输入搜索词典。

光标定位

接下来是第二个挑战,也是我个人认为 UI 中最激动人心的部分:使用光标在单词之间定位。你可以写词或用光标定位单词来获得实时结果,另外,使用文本输入可以在已经填充的注释中通过键盘控制并移动光标

听起来很神奇,但确实成功了 :slight_smile:

设计和布局

是时候设计和优化 app 的外观了。外观没有进行特别的设计,只是在细节上下了功夫:

  • 选择适合阅读和写作的排版方式。

  • 为浅色和深色模式各挑选一个色彩方案。

  • 创建设置和列表页。

  • 一定要算出键盘的高度,保证输入和结果这两个区域始终可见。

数据集

前面都进展得相当顺利,但当我开始寻求多语言支持时,我发现 Wiktionary 只能支持英语,其他语种的数据集不完整。

在我开始寻找替代方案时,我意识到创建一个好的词典 app 的主要挑战不在于技术或设计,而在于维护和销售词典的公司的授权模式。截至目前,我了解的所有词典的定价和授权模式都是基于 API 的,它们根据调用收费,禁止用户缓存结果。如果有授权离线数据集的选项,价格就会非常高。例如,牛津大学只允许在企业模式下使用离线数据集,价格为 3000 英镑起步

创建和维护一本词典是一项极为艰巨的工作,理应获得充分的认可。Webster 花费了多年时间,借助大量贷款,才让他编撰的词典得以出版。我当然能理解这样伟大的工作必须收费,我质疑的是那些不重视用户体验的模式(比如没有缓存),因为词典数据对人类学习和人工智能模型非常重要。难道高质量的数据集不应该免费并支持用户快速访问吗?不应该按照非政府组织或非盈利模式运营?

1.0 版

尽管我还没有把数据集的授权模式完全搞清楚,但我自制了这个我想要的 app。它是开源的,期待大家的贡献。

这是一款个人软件,可以保存大家在书中读到的、在旅行中看到的、在课堂上学到的、或在街上听到的单词。它可以作为即时知识,始终与你同在,因为它可以与 iCloud 和 Google Drive 同步。

更多精彩内容,敬请期待!

和其他产品一样,在获得一些测试用户(我的女朋友)的反馈以及我自己的使用之后,我已经有了很多优化想法。

闪卡

如果在应用内有闪卡模式就好了,可以帮助用户复习和记忆生词,这样用户就不需要将生词导出练习。

可扩展系统

能把注释和单词定义的屏幕分开的框架很强大,这方面谷歌地图做的非常好。那么,为什么不扩大可能性,让用户可以在一个词的不同结果之间选择?比如:翻译、用户的定义、上下文的使用。

感谢大家陪我回顾整个过程,并耐心读完这篇文章。如果你喜欢并想支持这个 app,请移步 Github,成为这个 app 的赞助人。我很开心这个 app 让我继续进步,我会继续对其进行优化升级,让它越来越好。

原文作者:Zeh Fernandes
原文链接:Why I built a dictionary app even with more than +300 apps available at AppStore?

推荐阅读
相关专栏
开发者实践
182 文章
本专栏仅用于分享音视频相关的技术文章,与其他开发者和声网 研发团队交流、分享行业前沿技术、资讯。发帖前,请参考「社区发帖指南」,方便您更好的展示所发表的文章和内容。