Documentação de Software & PlantUML
Documentação como Código
Documentação como Código (ou Documentation‑as‑Code) é uma abordagem que trata a documentação de um projeto da mesma forma que se trata o código‑fonte. Em vez de criar documentos estáticos em ferramentas separadas (como editores de texto ou wikis), a documentação é escrita em arquivos versionados, normalmente em formatos legíveis por humanos e processáveis por máquinas (Markdown, AsciiDoc, etc.) e armazenada no mesmo repositório que o código.
Principais características
Característica | Como funciona na prática |
---|---|
Versionamento | Cada mudança na documentação gera um commit, permitindo rastrear quem alterou o quê e quando, assim como acontece com o código. |
Revisões de PR | Alterações na documentação passam por revisões de código (PRs/MRs). Isso garante qualidade, consistência e permite que desenvolvedores revisem o conteúdo antes de mesclar. |
Integração CI/CD | Pipelines automatizados podem validar a sintaxe, gerar builds de documentação (HTML, PDF) e até publicar em sites de hospedagem (GitHub Pages, GitLab Pages, Read the Docs). |
Automação | Scripts podem extrair informações diretamente do código (ex.: docstrings, comentários, OpenAPI specs) e inseri‑las na documentação, reduzindo duplicação e erros. |
Colaboração | Qualquer pessoa com acesso ao repositório pode contribuir, usar as mesmas ferramentas de desenvolvimento (IDE, linters, formatadores) e seguir as mesmas convenções de estilo. |
Benefícios
- Consistência – A documentação evolui junto com o código; mudanças de API ou comportamento são refletidas imediatamente.
- Qualidade – Revisões de código aplicam padrões de escrita, ortografia e clareza, assim como revisões de implementação.
- Transparência – Histórico completo das alterações facilita auditorias e entendimento de decisões passadas.
- Escalabilidade – Automatizações (geração de diagramas, tabelas a partir de dados reais) mantêm a documentação atualizada sem esforço manual.
- Unificação de processos – Equipes não precisam gerenciar duas pilhas de ferramentas diferentes (um para código, outro para docs).
Ferramentas populares
- Hugo & Docsy1 - Geração estárica de sites que viabiliza documentação UML, OpenAPI e outros artefatos.
- MkDocs (com tema Material) – Converte Markdown em sites estáticos; integra bem com GitHub Actions.
- Sphinx – Usa reStructuredText (ou MyST Markdown) e suporta extensões para gerar documentação de APIs Python, C++, etc.
- Docusaurus – Framework React para sites de documentação; aceita MDX (Markdown + JSX).
- Read the Docs – Serviço que hospeda builds automáticos de Sphinx/MkDocs a partir de repositórios.
- GitBook, Docsify, Hugo – Outras opções para geração estática de sites.
Hugo & Docsy
“Docsy é um tema Hugo pré-configurado que fornece os principais recursos e comportamentos necessários para criar um site de documentação técnica.”
Acesse o link a seguir para observar um demonstração mais completa de Documentação como Código: https://adrianovieira.gitlab.io/plantuml-demo/
Fluxo típico de trabalho
- Escrita – O autor cria/edita arquivos .md (ou .rst) no repositório.
- Lint/Format – Um linter (ex.: markdownlint, vale) verifica estilo e ortografia.
- Pull Request – A mudança é submetida a revisão; revisores verificam clareza e correção.
- CI Build – O pipeline roda testes de build (ex.: mkdocs build). Se falhar, o PR não pode ser mesclado.
- Deploy – Após merge, o pipeline publica a nova versão da documentação (GitHub Pages, Netlify, etc.).
Quando adotar?
- Projetos com evolução rápida ou APIs públicas que exigem documentação sincronizada.
- Times que já utilizam CI/CD e desejam centralizar todo o fluxo de entrega.
- Organizações que valorizam transparência e auditabilidade das mudanças.
Em resumo, documentação como código traz a disciplina de engenharia de software para a criação e manutenção de documentos, garantindo que eles permaneçam precisos, revisáveis e facilmente distribuídos à medida que o projeto cresce.
Artefatos de Software
Um artefato é um dos muitos tipos de subprodutos tangíveis produzidos durante o desenvolvimento de software.
Alguns artefatos (por exemplo: casos de uso, diagramas de classes, requisitos e documentos de design) ajudam a descrever a função, a arquitetura e o design do software. Outros artefatos estão relacionados ao próprio processo de desenvolvimento — como planos de projeto, casos de negócios, avaliações de risco, e diagramas de software.
E é aqui que entra o PlantUML…
PlantUML
“PlantUML é usado para desenhar diagramas UML, usando uma descrição de texto simples e legível. Tenha cuidado, pois isso não impede que você desenhe diagramas inconsistentes (como ter duas classes herdando uma da outra, por exemplo). Portanto, é mais uma ferramenta de desenho do que de modelagem.” - PlantUML.org
Diagramas
C4 Model
O C4 Model é uma técnica de notação gráfica enxuta para modelar a arquitetura de sistemas de software. Ele é baseado em uma decomposição estrutural (uma estrutura de árvore hierárquica) de um sistema em contêineres e componentes e depende de técnicas de modelagem existentes, como Unified Modeling Language (UML) ou diagramas de entidade-relacionamento (ERDs) para a decomposição mais detalhada dos blocos de construção arquitetônicos.
Código fonte
@startuml
skinparam dpi 300
!include <C4/C4_Container>
AddElementTag("v1.0", $borderColor="#d73027")
AddElementTag("v1.1", $fontColor="#d73027")
AddElementTag("backup", $fontColor="orange")
AddRelTag("backup", $textColor="orange", $lineColor="orange", $lineStyle = DashedLine())
Person(user, "Customer", "People that need products")
Person(admin, "Administrator", "People that administrates the products via the new v1.1 components", $tags="v1.1")
Container(spa, "SPA", "angular", "The main interface that the customer interacts with via v1.0", $tags="v1.0")
Container(spaAdmin, "Admin SPA", "angular", "The administrator interface that the customer interacts with via new v1.1", $tags="v1.1")
Container(api, "API", "java", "Handles all business logic (incl. new v1.1 extensions)", $tags="v1.0+v1.1")
ContainerDb(db, "Database", "Microsoft SQL", "Holds product, order and invoice information")
Container(archive, "Archive", "Audit logging", "Stores 5 years", $tags="backup")
Rel(user, spa, "Uses", "https")
Rel(spa, api, "Uses", "https")
Rel_R(api, db, "Reads/Writes")
Rel(admin, spaAdmin, "Uses", "https")
Rel(spaAdmin, api, "Uses", "https")
Rel_L(api, archive, "Writes", "messages", $tags="backup")
SHOW_LEGEND()
@enduml
Diagrama
Referências
-
Hugo & Docsy https://www.docsy.dev/ ↩︎