Overengeneering
Tags: softwaredevelopment, softwareengineering, programming
Published: 2023-11-17 14:16:47

# 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.