DEV Community

Cover image for Overengeneering
Ortiz de Arcanjo António David
Ortiz de Arcanjo António David

Posted on

Overengeneering

Sinónimos

  • Excesso de engenharia;
  • Sobreengenharia;
  • Sobredesenvolvimento;
  • Engenharia Exagerada;
  • Complexidade Desnecessária;
  • Engenharia em Demasia.

Definições

Overengeneering é o uso excessivo de recursos ou complexidade em um projeto ou sistema, geralmente resultando em um produto ou serviço que é mais caro, difícil de usar ou manter do que o necessário.
Overengeneering na construção de um software refere-se à prática de aplicar mais complexidade, recursos e tecnologias do que o necessário para atender aos requisitos reais do projeto.
Overengeneering é o desenvolvimento excessivo ou desnecessário de um software, caracterizado pelo uso de tecnologias, recursos e abstrações que ultrapassam os requisitos e escopo reais do projeto.

Desvendando Overengeneering: Uma análise detalhada

Para analisar o conceito de overengeneering é indispensável explorar minuciosamente vários cenários comuns, nomeadamente:

  • Engenharia de Software;
  • Arquitectura;
  • Design de código;
  • Base de dados;
  • Software em uso.

1. Engenharia de Software

Planejamento

  • Problema: Planejamento excessivamente detalhado e complexo.
  • Impacto: Atrasos no início do desenvolvimento, dificuldade em se adaptar a mudanças.

Modelagem

  • Problema: Modelagem excessivamente detalhada e complexa. -
  • Impacto: Dificuldade na compreensão, resistência a mudanças nos processos.

Documentação de Requisitos

  • Problema: Documentação detalhada demais, incluindo requisitos pouco relevantes.
  • Impacto: Dificuldade na manutenção da documentação, confusão para a equipe de desenvolvimento.

Falta de MVP (Minimum Viable Product)

  • Problema: Falta de foco na entrega de um produto mínimo viável.
  • Impacto: Atraso na entrega, aumento nos custos.

2. Arquitectura

Excesso de Camadas

  • Problema: Introdução de camadas desnecessárias na arquitetura.
  • Impacto: Complexidade adicional, dificuldade na manutenção e entendimento do sistema.

Dependências Externas

  • Problema: Integração excessiva com bibliotecas e serviços externos.
  • Impacto: Maior probabilidade de falhas, aumento da complexidade de configuração.

Não Revisão Contínua da Arquitetura

  • Problema: Falta de revisões regulares da arquitetura durante o desenvolvimento.
  • Impacto: Dificuldade em identificar e corrigir problemas arquiteturais precocemente.

3. Design de Código

Abstração

  • Problema: Uso excessivo de abstrações complexas e desnecessárias.
  • Impacto: Dificuldade de compreensão, aumento da curva de aprendizado para novos desenvolvedores.

Design Patterns

  • Problema: Aplicação incorreta ou desnecessária de padrões de design.
  • Impacto: Complexidade adicional, dificuldade na manutenção e entendimento do código.

Separação de Responsabilidades

  • Problema: Separação exagerada de responsabilidades, resultando em muitas pequenas classes.
  • Impacto: Dificuldade na navegação do código, aumento da complexidade.

4. Base de Dados

Modelagem (lógica e conceitual)

  • Problema: Modelagem excessivamente complexa e detalhada.
  • Impacto: Dificuldade na manutenção, lentidão em consultas.

Excesso de Tabelas

  • Problema: Criação de tabelas desnecessárias.
  • Impacto: Aumento no uso de recursos, dificuldade de manutenção.

Excesso de Índices

  • Problema: Criação de índices em excesso e/ou desnecessários.
  • Impacto: Desempenho comprometido, aumento no espaço de armazenamento.

Excesso de Triggers

  • Problema: Utilizar triggers em excesso.
  • Impacto: Aumento da carga de processamento, potencialmente resultando em lentidão e instabilidade.

Excesso de Stored Procedures

  • Problema: Desenvolver procedimentos armazenados em excesso.
  • Impacto: Aumento na complexidade do banco de dados, dificultando a manutenção e compreensão do sistema.

Queries Complexas

  • Problema: Escrever consultas SQL mais complicadas do que o necessário.
  • Impacto: Degradação do desempenho do banco de dados, dificuldade na depuração e manutenção do código.

5. Software em uso

Excesso de Alerts e Modals

  • Problema: Sobrecarregar o usuário com pop-ups excessivos, prejudicando a experiência.
  • Impacto: Interrupção constante na fluidez da interação, levando à possível frustração do usuário.

Excesso de Passos

  • Problema: Demandar um número excessivo de etapas para concluir uma operação simples.
  • Impacto: Aumento da complexidade operacional, podendo resultar em lentidão e confusão para o usuário.

Excesso de Configurações

  • Problema: Disponibilizar um número excessivo de opções de configuração.
  • Impacto: Potencial confusão do usuário, tornando a customização mais difícil e aumentando a probabilidade de configurações inadequadas.

Soluções para os cenários

1. Engenharia de Software

  • Foco na agilidade e adaptação a mudanças;
  • Manter a documentação alinhada com as necessidades do projeto.

2. Arquitetura

  • Adotar uma arquitetura simples que atenda aos requisitos;
  • Avaliar a necessidade de cada dependência externa.

3. Design de Código

  • Priorizar simplicidade e clareza;
  • Utilizar abstrações e padrões apenas quando justificado.

4. Base de Dados

  • Modelagem simplificada conforme os requisitos;
  • Evitar a criação de objetos de banco de dados desnecessários;
  • Otimizar consultas e índices conforme necessário.

5. Software

  • Limitar o uso de pop-ups e modais;
  • Simplificar fluxos de trabalho, reduzindo o número de passos;
  • Fornecer configurações essenciais e relevantes para o usuário.

Causas da Overengineering

  • Falta de compreensão dos requisitos: Desconhecimento ou interpretação inadequada dos requisitos pode levar a soluções excessivamente complexas e desnecessárias;
  • Ambição excessiva: Alguns desenvolvedores, impulsionados por uma ambição desmedida, buscam criar um software perfeito, mesmo quando essa perfeição não é crucial para o projeto;
  • Inexperiência da equipa: Os desenvolvedores inexperientes podem não ter o conhecimento ou a experiência necessários para identificar o overengineering;
  • Desejo que igualar as Big Techs: A aspiração de equiparar-se às grandes empresas de tecnologia pode resultar na implementação de todas as tecnologias utilizadas por elas, sem considerar a fase específica de desenvolvimento em que a empresa se encontra. Esse desejo desenfreado de imitar pode levar a escolhas tecnológicas inadequadas para o momento presente da organização.

Consequências da Overengeneering

  • Elevação dos custos de desenvolvimento: Implica na necessidade de mais recursos computacionais, tempo, envolvimento de pessoal e utilização de ferramentas adicionais;
  • Aumento nos custos de manutenção: A complexidade excessiva, caracterizada por camadas supérfluas, dependências intricadas e uma variedade excessiva de ferramentas, pode tornar o software difícil de manter;
  • Diminuição da flexibilidade: Dificulta a adaptação do software às mudanças reais nas necessidades do negócio, comprometendo a agilidade e a resposta eficiente a evoluções no cenário operacional;
  • Decréscimo no desempenho: Pode resultar em uma experiência de usuário insatisfatória devido a sobrecargas e ineficiências, afetando negativamente a performance do sistema.

Como evitar Overengeneering?

  • Compreensão precisa dos requisitos do software;
  • Implementar apenas os recursos estritamente necessários;
  • Ter expertise e conhecimento suficientes para identificar potenciais práticas de overengineering durante o processo de desenvolvimento.

Conclusão

Em conclusão, o overengineering representa um desafio significativo no desenvolvimento de software e na arquitetura de sistemas. Quando as soluções são projetadas com uma complexidade além do necessário, isso não apenas aumenta a dificuldade na manutenção e compreensão, mas também pode resultar em impactos negativos no desempenho, consumo de recursos e na experiência do usuário.

É crucial que os profissionais da área reconheçam os sinais de overengineering em diversas camadas, desde o design de código até a arquitetura e implementação de software em uso.

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

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs

👋 Kindness is contagious

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

Okay