| .. _seed-0102: |
| |
| ===================================== |
| 0102: Consistent Module Documentation |
| ===================================== |
| .. seed:: |
| :number: 102 |
| :name: Consistent Module Documentation |
| :status: Accepted |
| :proposal_date: 2023-02-10 |
| :cl: 128811, 130410 |
| :authors: Chad Norvell |
| :facilitator: Kayce Basques |
| |
| --------------------- |
| Status (October 2023) |
| --------------------- |
| If you're looking for guidelines on how to author module docs, use these: |
| :ref:`docs-contrib-docs-modules` |
| |
| .. caution:: |
| |
| SEED-0102 is still considered accepted because we are still using some parts |
| of it in our current module docs guidelines. However, over the course of |
| 2023 we discovered that other parts of the SEED-0102 plan didn't achieve our |
| goals. Therefore, at this point you should only read SEED-0102 for historical |
| context on how our docs guidelines have evolved. |
| |
| ------- |
| Summary |
| ------- |
| Pigweed modules ought to have documentation that is reasonably comprehensive, |
| that has a consistent and predictable format, and that provides the reader with |
| sufficient information to judge whether using the module is the right choice for |
| them. This SEED proposes a documentation philosophy applicable to all Pigweed |
| modules and a flexible yet consistent structure to which all module docs should |
| conform. |
| |
| Definitions |
| ----------- |
| In this SEED, we define *users* as developers using Pigweed in downstream |
| projects, and *maintainers* as developers working on upstream Pigweed. The |
| primary focus of this SEED is to improve the documentation experience for users. |
| |
| ---------- |
| Motivation |
| ---------- |
| Currently, each Pigweed module is required to have, at minimum, a single |
| ``docs.rst`` file that contains the module's documentation. This gives the |
| module maintainer considerable discretion to provide as much or as little |
| documentation as they would like. However, this approach fails for Pigweed |
| maintainers by providing no guidance or structure to help them write effective |
| documentation, and certainly fails Pigweed users who struggle to find the |
| information they're looking for. So a solution needs to make it easier for |
| Pigweed maintainers to write good documentation, thereby making Pigweed much |
| more accessible to its users. |
| |
| Pigweed's design is inherently and intentionally modular. So documentation at |
| the level of the *module* is the most natural place to make impactful |
| improvements, while avoiding a fundamental restructuring of the Pigweed |
| documentation. Module docs are also what the majority of Pigweed users rely on |
| most. As a result, this SEED is focused exclusively on improving module |
| documentation. |
| |
| `Diátaxis <https://diataxis.fr/>`_ proposes a four-mode framework for technical |
| documentation, illustrated below with terminology altered to better match |
| Pigweed's needs: |
| |
| .. csv-table:: |
| :widths: 10, 20, 20 |
| |
| , "**Serve our study**", "**Serve our work**" |
| "**Practical steps**", "Tutorials (`learning-oriented <https://diataxis.fr/tutorials/>`_)", "Guides (`task-oriented <https://diataxis.fr/how-to-guides/>`_)" |
| "**Theoretical knowledge**", "Concept & design docs (`understanding-oriented <https://diataxis.fr/explanation/>`_)", "Interface reference (`information-oriented <https://diataxis.fr/reference/>`_)" |
| |
| Pigweed needs a framework that ensures modules have coverage across these four |
| quadrants. That framework should provide a structure that makes it easier for |
| maintainers to write effective documentation, and a single page that provides |
| the most basic information a user needs to understand the module. |
| |
| Alternatives |
| ------------ |
| There are risks to focusing on module docs: |
| |
| * The most useful docs are those that focus on tasks rather than system |
| features. The module-focused approach risks producing feature-focused docs |
| rather than task-focused docs, since the tasks users need to complete may not |
| fit within the boundaries of a module. |
| |
| * Likewise, focusing on module documentation reduces focus on content that |
| integrates across multiple modules. |
| |
| The justification for focusing on module documentation doesn't imply that module |
| docs are the *only* docs that matter. Higher level introductory and guidance |
| material that integrates Pigweed as a system and covers cross cutting concerns |
| is also important, and would arguably be more effective at bringing new |
| developers into the Pigweed ecosystem. However, this SEED proposes focusing on |
| module docs for two primary reasons: |
| |
| 1. Improving module docs and providing them with a consistent structure will |
| have the largest impact with the least amount of investment. |
| |
| 2. It will be easier to construct higher-level and cross-cutting documentation |
| from well-developed module docs compared to going the other direction. |
| |
| While not a primary consideration, a bonus of a module-focused approach is that |
| modules already have owners, and those owners are natural candidates to be the |
| maintainers of their modules' docs. |
| |
| -------- |
| Proposal |
| -------- |
| This change would require each module directory to match this structure:: |
| |
| module root directory/ |
| ├── docs.rst |
| ├── concepts.rst [or concepts/...] [when needed] |
| ├── design.rst [or design/...] [when needed] |
| ├── guides.rst [or guides/...] [when needed] |
| │ |
| ├── tutorials/ [aspirational] |
| │ ├── index.rst |
| │ └── ... |
| │ |
| ├── api.rst [or api/...] [if applicable] |
| ├── cli.rst [if applicable] |
| └── gui.rst [if applicable] |
| |
| Fundamental module docs |
| ----------------------- |
| These three documents are the minimum required of every Pigweed module. |
| |
| The basics: ``docs.rst`` |
| ^^^^^^^^^^^^^^^^^^^^^^^^ |
| Basic, structured information about the module, including what it does, what |
| problems it's designed solve, and information that lets a user quickly evaluate |
| if the module is useful to them. |
| |
| How it works and why: ``design.rst`` & ``concepts.rst`` (understanding-oriented) |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| Background on the design goals, assumptions, limitations, and implementation |
| details of a module, and may contrast the design of the module with alternative |
| solutions. |
| |
| This content can start in the "Design considerations" section of the index, and |
| grow into this separate document as the module matures. If that document becomes |
| too large, the single ``design.rst`` file can be replaced by a ``design`` |
| subdirectory containing more than one nested doc. |
| |
| Some modules may need documentation on fundamental concepts that are independent |
| of the module's solution. For example, a module that provides a reliable |
| transport layer may include a conceptual description of reliable transport in |
| general in a ``concepts.rst`` file or ``concepts`` subdirectory. |
| |
| How to get stuff done: ``guides.rst`` (task-oriented) |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| These are focused on specific outcomes and should be produced as soon as we see |
| a question being answered multiple times. Each module should have at least one |
| guide on integrating the module into a project, and one guide on the most common |
| use case. |
| |
| This content can start in the "Getting started" section of the index, and grow |
| into this separate document as the module matures. If that document becomes too |
| large, it can be replaced with a ``guides`` subdirectory containing more than |
| one doc. |
| |
| Interface docs (information-oriented) |
| ------------------------------------- |
| These docs describe the module's interfaces. Each of these docs may be omitted |
| if the module doesn't include an applicable interface. |
| |
| ``api.rst``: External API reference |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| Modules should have reference documentation for their user-facing APIs. Modules |
| that have APIs for multiple languages should replace the single ``api.rst`` with |
| an ``api`` subdirectory with docs for each supported language. |
| |
| How API docs should be structured, generated, and maintained is a complex topic |
| that this SEED will not determine. |
| |
| ``cli.rst`` & ``gui.rst``: Developer tools reference |
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
| A user-facing command line interface (CLI) should be documented in ``cli.rst`` |
| if the module provides one. It's ideal if this documentation closely matches the |
| output of the CLI tool's "help" command. |
| |
| If the module provides a graphical user interface (GUI) (including text mode |
| interfaces and web front-ends), its documentation should be included in |
| ``gui.rst``. |
| |
| Tutorials (learning-oriented) |
| ----------------------------- |
| We keep these as separate files in ``tutorials``. These take considerable effort |
| to develop, so they aren't *required*, but we aspire to develop them for all but |
| the most trivial modules. |
| |
| When one size does not fit all |
| ------------------------------ |
| Pigweed modules span a spectrum of complexity, from relatively simple embedded |
| libraries to sophisticated communication protocols and host-side developer |
| tooling. The structure described above should be the starting point for each |
| module's documentation and should be appropriate to the vast majority of |
| modules. But this proposal is not strictly prescriptive; modules with |
| documentation needs that are not met by this structure are free to deviate from |
| it by *adding* docs that are not mentioned here. |
| |
| Examples |
| -------- |
| A template for implementing this structure can be found ``docs/templates/docs``. |