DEV Community

Cover image for Introdução ao Cognitive Driven Development (CDD): Controlando a Complexidade do Código de Forma Sistemática
Uiratan Cavalcante
Uiratan Cavalcante

Posted on

Introdução ao Cognitive Driven Development (CDD): Controlando a Complexidade do Código de Forma Sistemática

Introdução

No mundo do desenvolvimento de software, um dos maiores desafios que enfrentamos é garantir que o código que escrevemos hoje seja compreensível e sustentável no futuro. Afinal, enquanto as pessoas podem mudar de equipe ou empresa, o código permanece — e é ele que carrega o valor do software. Mas como podemos garantir que nosso código seja fácil de manter e evoluir, especialmente quando a complexidade tende a crescer naturalmente ao longo do tempo?

Foi pensando nessa questão que surgiu o Cognitive Driven Development (CDD), uma teoria de design de código que propõe uma abordagem sistemática para limitar o crescimento da complexidade do código. O CDD é inspirado na Teoria da Carga Cognitiva, da psicologia cognitiva, que estuda como o cérebro humano processa e armazena informações.

Teoria da Carga Cognitiva

A Teoria da Carga Cognitiva sugere que nossa memória de trabalho tem uma capacidade limitada para processar informações em um determinado período de tempo. Quando somos expostos a informações complexas ou desconhecidas, nossa capacidade de processamento é rapidamente sobrecarregada, o que dificulta o aprendizado e a compreensão.

No contexto do desenvolvimento de software, isso se traduz em um problema comum: quando a complexidade do código aumenta descontroladamente, os desenvolvedores que precisam entender e manter esse código enfrentam dificuldades. E é aí que o CDD entra em cena.

Como o CDD Funciona?

O CDD propõe uma maneira prática de medir e controlar a complexidade do código. A ideia central é definir pontos de complexidade intrínseca (ICPs) para elementos do código que aumentam a complexidade, como estruturas condicionais (if, else, switch), loops, blocos try-catch, acoplamento com classes específicas do projeto e outras construções que criam caminhos de execução no código.

Cada vez que um desses elementos aparece no código, ele adiciona um ponto à contagem de complexidade. A equipe define um limite máximo de ICPs para cada arquivo ou método, e quando esse limite é excedido, é sinal de que o código precisa ser refatorado para reduzir a complexidade.

Benefícios do CDD

  • Consenso na Equipe: O CDD ajuda a equipe a chegar a um consenso sobre o que é considerado complexo e como medir essa complexidade. Isso reduz discussões subjetivas sobre a "dificuldade" do código.
  • Controle da Complexidade: Ao definir limites claros para a complexidade, o CDD permite que a equipe controle o crescimento desenfreado da complexidade do código, facilitando a manutenção e a evolução do software.
  • Integração com Outras Práticas: O CDD não substitui outras práticas de design de código, como SOLID, Domain-Driven Design (DDD) ou arquitetura em camadas. Pelo contrário, ele complementa essas práticas, oferecendo uma métrica adicional para avaliar a qualidade do código.
  • Adaptabilidade: A equipe pode ajustar os ICPs e os limites de complexidade conforme necessário, tornando o CDD uma ferramenta flexível que se adapta ao contexto do projeto.

Exemplo Prático

Imagine um arquivo de código com mais de 1000 linhas, cheio de estruturas ifaninhadas e blocos try-catch. Sem uma métrica clara, pode ser difícil determinar se esse código é realmente complexo ou se apenas parece complexo para algumas pessoas. Com o CDD, a equipe pode definir que cada if conta como 1 ICP, cada try-catch como 1 ICP, e assim por diante. Ao somar esses pontos, é possível ter uma visão objetiva da complexidade do código.

Por exemplo, se a equipe define que o limite de ICPs para um método é 10, e um método específico tem 13 ICPs, isso indica que o código está mais complexo do que o desejado e precisa ser refatorado.

Como Implementar o CDD

Implementar o CDD é simples e pode ser feito em poucos passos:
Defina os ICPs: Reúna a equipe e defina quais elementos do código devem ser considerados como pontos de complexidade (ex.: if, else, loops, try-catch, etc.).

  • Estabeleça limites: Defina um limite máximo de ICPs para métodos, classes ou arquivos. Esse limite deve ser ajustado conforme a maturidade da equipe e a complexidade do projeto.
  • Meça e Refatore: Comece a medir a complexidade do código existente e refatore os trechos que excederem o limite estabelecido.
  • Revisite e Ajuste: Periodicamente, revise os ICPs e os limites de complexidade para garantir que eles continuem alinhados com as necessidades da equipe e do projeto.

Conclusão
O Cognitive Driven Development (CDD) é uma abordagem para controlar a complexidade do código de forma sistemática. Ao combinar insights da psicologia cognitiva com práticas de desenvolvimento de software, o CDD oferece uma maneira tangível de garantir que o código seja fácil de entender e manter, mesmo em projetos de longo prazo.

Se você está buscando uma maneira de melhorar a qualidade do código na sua equipe, o CDD pode ser a ferramenta que faltava. Experimente implementar essa prática no seu dia a dia e veja como ela pode transformar a forma como você e sua equipe lidam com a complexidade do código.

Bibliografia
Leonardo Ferreira Barbosa, Victor Hugo Pinto, Alberto Luiz Oliveira Tavares de Souza, and Gustavo Pinto. 2022. To What Extent Cognitive-Driven Development Improves Code Readability? In Proceedings of the 16th ACM / IEEE International Symposium on Empirical Software Engineering and Measurement (ESEM '22). Association for Computing Machinery, New York, NY, USA, 238–248. https://doi.org/10.1145/3544902.3546241

Image of Datadog

Create and maintain end-to-end frontend tests

Learn best practices on creating frontend tests, testing on-premise apps, integrating tests into your CI/CD pipeline, and using Datadog’s testing tunnel.

Download The Guide

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay