尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

技术规格书撰写指南(以 Joplin 开源项目为例)

技术规格书撰写指南(以 Joplin 开源项目为例) 技术规格书撰写指南以 Joplin 开源项目为例【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplin导读本文面向 Joplin 的开发者、贡献者与 GSoCGoogle Summer of Code参与者系统讲解如何为 Joplin 项目撰写一份高质量的技术规格书Technical Spec。文章完整继承 readme/dev/technical_spec.md 的核心模板——Overview、Problem description、SolutionUX 与技术方案、Testing plan并结合仓库中真实落地的规格文档如 sync.md、e2ee/index.md与测试基础设施源码说明每一步该如何写、写到什么深度帮助你在动手写代码之前先想清楚问题也让评审者与导师能快速评估你的方案。什么是技术规格书Joplin 开发文档 technical_spec.md 开篇引用了 StackOverflow 博客文章的定义A technical specification document outlines how youre going to address a technical problem by designing and building a solution for it. 技术规格书阐述的是你将如何针对一个技术问题通过设计和构建解决方案来应对它。这份文档本身源自 StackOverflow 的《A practical guide to writing technical specs》一文但 Joplin 项目认为原模板过于冗长因此在仓库中提供了一份精简、面向本项目实际需求的定制模板也就是 readme/dev/technical_spec.md 全文所呈现的内容。凡是想为 Joplin 提出功能改动或修复的贡献者都被鼓励先按此模板写出规格书再进入编码阶段。值得注意的是Joplin 文档体系中规格有清晰的落点readme/dev/spec/目录下存放着已经完成的各类技术规格文档例如 sync.md同步机制、e2ee/index.md端到端加密、editor_commands.md编辑器命令、search_sorting.md搜索引擎排序等。这些文档正是按本文介绍的模板精神写就的成品范例后面会反复引用它们作为参考。为什么写技术规格书很重要对工程师的好处By writing a technical spec, engineers are forced to examine a problem before going straight into code, where they may overlook some aspect of the solution. 通过撰写技术规格书工程师被迫在直接进入编码之前先审视问题否则可能会忽视解决方案的某个方面。这份先思考、后编码的纪律在 Joplin 的贡献流程中被制度化根据 readme/dev/index.md 的Contribution scope一节项目只接受解决一个具体、已被认可的问题的 Pull Request且要求遵循识别问题 → 讨论并被维护者接受 → 问题被打上标签 → PR 针对已认可的方案的流程。换句话说规格书正是讨论并被接受这一环节的载体没有清晰的规格PR 往往会被直接关闭。对项目的好处Investing in a technical spec ultimately results in a superior product. Since the team is aligned and in agreement on what needs to be done through the spec, big projects can progress faster. 在技术规格书上的投入最终会带来更优质的产品。因为团队通过规格书对齐并达成共识大型项目可以进展得更快。Joplin 是一个横跨桌面Electron React、移动端React Native、CLIterminal-kit与服务端Node.js PostgreSQL的多端项目各应用共享同一套后端逻辑数据库、同步、设置、模型。在这样的代码库中一次改动往往牵动多个应用规格书带来的团队对齐价值尤为突出——这一点在 readme/dev/spec/architecture.md 的架构描述中可以得到印证任何对后端packages/lib的改动都需要保证在桌面、移动、CLI 各端仍然可用而规格书正是确保这种跨端共识的工具。技术规格书模板Joplin 定制版以下是 technical_spec.md 提供的完整模板共四个小节。下文将对每个小节进行逐项展开并配合 Joplin 仓库中的真实文档、源码与测试作为示范。1. Overview总览要求从用户视角出发永远如此用户面临的具体问题是什么尽可能提供上下文并附上相关论坛帖或 GitHub issue 的链接。然后概述你打算如何解决该问题。此阶段不要进入技术细节不写代码、不写文件名。写作要点与仓库示例以 readme/dev/spec/sync.md 为例它一开篇就用一段朴素语言描述了用户场景Joplin 应用是离线优先的offline first——数据保存在本地设备上。为了让用户所有设备上的数据一致我们使用同步流程。简而言之每台设备把笔记、笔记本、标签等上传到服务器同时下载自己缺失或最近变更的数据。这就是典型的 Overview 写法先说清楚用户在多个设备间保持数据一致的问题再给出同步流程这一解决思路全程没有涉及具体类名与代码。在 Joplin 的实践中附上论坛/Issue 链接尤其重要因为项目的功能请求必须在论坛讨论并被接受后才会进入 GitHub tracker见 readme/dev/index.md 的 Feature requests 一节。因此你的 Overview 中引用的链接应该优先指向已经被社区讨论过的论坛主题。2. Problem description问题描述要求提供需要解决问题的更多细节可以给出用户故事user stories或引用论坛帖中的原话。这一节的目标还包括解释为什么这个问题值得解决。写作要点这一节是 Overview 的深化。Overview 是电梯陈述Problem description 则是完整案情。你要把问题的表象、影响范围、受影响用户群讲透并说明不解决它会带来什么代价。例如在 readme/dev/spec/sync.md 的Vocabulary术语表部分它先把客户端Clients同步目标Sync targets条目Items三个核心概念定义清楚——这本身就是问题描述的基础如果没有统一的术语评审者与实现者之间的讨论会陷入混乱。术语澄清、范围界定、用户故事都是让问题值得解决变得有说服力的材料。3. Solution解决方案3.1 User experience用户体验要求再次强调永远从用户视角出发用户界面看起来会是什么样用户要执行哪些操作来使用这个功能尽可能详细新增的 UI 元素按钮、列表等会放在哪里按钮或工具提示tooltip如何命名如果要增加键盘快捷键用户应该按下哪些按键为什么这些细节如此重要文档原话指出——All these details are very important because they give a clear picture of what you are going to do, and it helps reviewers assess the implementation. 这些细节非常重要因为它们能清晰描绘你将要做什么并帮助评审者评估实现方案。Its also an easy way for everybody, even non-technical people, to get involved and help you refine your spec. 这也是让所有人——甚至非技术人员——都能参与进来、帮助你完善规格书的便捷途径。如果可能请附上一份 UI 线框图UI mockup。仓库范例readme/dev/spec/editor_commands.md 对桌面与移动端编辑器命令的用户操作层面做了细致区分移动端有编辑器命令与笔记屏幕命令两类运行于不同的上下文桌面端则由各编辑器类型注册自己的命令处理器。即便是一篇偏底层的规格它依然先交代清楚命令由谁触发、在什么上下文运行这正是 UX 思考在技术规格中的体现。3.2 Technical solution技术方案要求从技术层面概括说明你将如何解决这个问题。描述你的改动会带来的影响与风险。例如如果只是添加一个改变文本格式的按钮很可能影响较低如果是修改同步算法则影响很高——因为存在数据丢失的可能。说明你需要修改哪些服务或应用部件以及如何修改。本小节可以提及代码和文件名但尽量不要写太深的技术细节——这些细节往往很快就过时不像规格书的其余部分那样持久。仓库范例与源码佐证Joplin 的规格文档在技术方案上有着清晰的分层叙述传统。以 readme/dev/spec/sync.md 的 Code architecture 一节为例它精确地指出同步涉及的文件层级packages/lib/Synchronizer.ts负责同步主流程下载、上传、应用删除并通过接收SyncTarget对象处理目标特有操作E2EE 开启时还负责加解密条目packages/lib/SyncTarget*.ts各同步目标的入口暴露名称、描述、支持选项等元数据主要职责是初始化FileApi实例packages/lib/file-api-driver-*.ts文件 API实现通用的创建、更新、删除、列出等文件操作packages/lib/*Api.ts底层 API 封装如 JoplinServerApi.ts 用于连接 Joplin Serverpackages/lib/BaseModel.ts与BaseItem数据库对象的模型抽象与同步工具类sync_items数据库表保存sync_time、sync_disabled、sync_target等同步状态属性。这就是技术方案小节的理想形态在文件与模块的粒度上说明改动范围与调用关系而不是粘贴大段实现代码。文档自己也提醒过细的实现细节会迅速过时保留在模块/接口层面的描述才具有长期价值。另一份典范是 readme/dev/spec/e2ee/index.md它在Encryption workflow中说明条目仅在同步序列化时BaseItem.serializeForSync被加密解密由后台的 DecryptionWorker 完成——一句话就划清了加解密在同步链路中的位置以及它给用户带来的行为加密条目对用户基本只读、可删除。这就是影响与风险的具象化表述。4. Testing plan测试计划要求你计划如何测试你的改动尽可能提供单元测试unit tests。如果是GSoC 项目单元测试是强制要求——没有单元测试的 PR 不会被接受。关于如何编写单元测试参见 readme/dev/index.md 的Automated Tests一节。仓库中的测试基础设施深化佐证Joplin 使用Jest作为测试框架。根据 readme/dev/index.md测试的组织与运行方式如下在仓库根目录运行yarn test可执行全部单元测试也可以进入某个包目录如packages/lib后运行yarn test只测该包运行单个测试文件yarn test markdownUtils匹配文件名运行文件中的单个用例yarn test markdownUtils --filtershould handle conflict新增测试文件的约定在源码同目录下创建以.test.ts结尾的文件例如为example.ts创建example.test.ts文件已存在则直接追加用例。仓库中可以看到大量范例如 packages/lib/markdownUtils.test.ts、packages/lib/Synchronizer 配套的同步测试 等需要数据库与同步器支持的测试可以使用joplin/lib/testing/test-utils包提供的工具参考 packages/lib/models/Note.test.ts只测纯函数的简单用例则无需这些额外装配测试 React Hooks 时使用testing-library/react-hooks参考 useLayoutItemSizes.test.ts。如果确实无法写单元测试怎么办文档给出的建议非常务实绝大多数情况下其实是可以写测试的——把代码重构一下将某些功能抽成无依赖的纯函数就能轻松为它添加单元测试。如果单元测试仍不足够请提供一份手动测试计划manual testing plan要求包括如何验证你的功能正常工作至少包含 5 个测试用例并考虑各种可能的输入边界——如果是列表0 个元素、1 个、10 个、100000 个分别如何工作如果是文本输入空字符串、超长字符串如何处理。不要只写一个最佳路径的用例。如何验证相关应用部件未被破坏例如你改了笔记加载逻辑就要检查工具栏仍正常工作、切换笔记仍然正常、笔记列表标题仍然同步更新等。评审者应当能够用你的改动运行应用然后按照上述步骤逐一验证。同步测试的专项说明对于像同步这类高风险模块readme/dev/spec/sync.md 的 Testing 一节提供了更具体的测试方法——默认情况下测试单元使用内存同步目标in-memory sync target速度快且足以验证大部分行为如果需要针对文件系统、Nextcloud、Joplin Server 等特定同步目标测试可以修改 packages/lib/testing/test-utils.ts 中的setSyncTargetName()并可能需要维护~/joplin-credentials/*下的凭据文件。这为规格书中的 Testing plan 提供了项目认可的测试方式参考。在 GSoC 语境下的规格书这份模板在 Joplin 的 GSoC 项目中扮演着关键角色。从 readme/dev/gsoc/gsoc2024/index.md 可以看到候选人被要求必须先在论坛提出想法、获得讨论提案应明确问题、目标、实现方案、时间线与个人介绍技术规格书质量直接关系到 PR 能否被接受文档明确指出如果一个 issue需要一个非常清晰的技术规格而 PR 里还要讨论它应该如何工作、应该做什么就说明该功能没有共识PR 很可能被关闭单元测试在 GSoC 期间是强制要求且写作单元测试和代码文档不能拖到最后几周应贯穿编码全程——这与 technical_spec.md 中 Testing plan 小节的立场完全一致。因此把本文介绍的模板用扎实等于同时满足了给维护者的规格文档与GSoC 提案的 Implementation 部分两份交付物的质量要求。写在最后模板使用的原则综合 technical_spec.md 全文可以提炼出三条贯穿始终的原则永远从用户视角出发——Overview 与 UX 小节都反复强调这一点它是评审者理解方案的最短路径也是非技术参与者介入讨论的入口在合适的小节放合适深度的细节——Overview 不提技术Problem description 讲清价值UX 小节写全交互细节Technical solution 停在模块与文件层面、着重讲影响与风险避免会迅速过时的实现级细节测试计划是规格的正式组成部分——尤其是 GSoC 场景下单元测试是硬性门槛写规格时就把测试策略规划进去而不是等代码完成后再补。当你准备为 Joplin 提交新功能或修复时可以参考 readme/dev/spec/ 目录下的既有规格文档同步、E2EE、编辑器命令、搜索排序、无障碍焦点管理等作为范文再对照本文介绍的模板逐节填写即可产出一份让维护者、导师与同行评审都能快速理解并给出反馈的高质量技术规格书。【免费下载链接】joplinJoplin - the privacy-focused note taking app with sync capabilities for Windows, macOS, Linux, Android and iOS.项目地址: https://gitcode.com/GitHub_Trending/jo/joplin创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表