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.

Top comments (0)