diff options
Diffstat (limited to 'seed/0102-module-docs.rst')
-rw-r--r-- | seed/0102-module-docs.rst | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/seed/0102-module-docs.rst b/seed/0102-module-docs.rst new file mode 100644 index 000000000..5ca9ab5bf --- /dev/null +++ b/seed/0102-module-docs.rst @@ -0,0 +1,203 @@ +.. _seed-0102: + +===================================== +0102: Consistent Module Documentation +===================================== + +.. card:: + :fas:`seedling` SEED-0102: :ref:`Consistent Module Documentation<seed-0102>` + + :octicon:`comment-discussion` Status: + :bdg-secondary-line:`Open for Comments` + :octicon:`chevron-right` + :bdg-secondary-line:`Last Call` + :octicon:`chevron-right` + :bdg-primary:`Accepted` + :octicon:`kebab-horizontal` + :bdg-secondary-line:`Rejected` + + :octicon:`calendar` Proposal Date: 2023-02-10 + + :octicon:`code-review` CL: `pwrev/128811 <https://pigweed-review.git.corp.google.com/c/pigweed/pigweed/+/128811>`_, `pwrev/130410 <https://pigweed-review.git.corp.google.com/c/pigweed/pigweed/+/130410>`_ + +------- +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``. |