Complexidade é Custo

Desenvolver software profissionalmente, em um ambiente onde a finalidade é lucro, implica em ampliar ganhos e/ou reduzir custos.

O resultado esperado é sempre “Ganhar mais” ou “Gastar menos”, de preferência “Ganhar mais gastando menos”! Terá melhores resultados quem conseguir entender bem essa relação:

PRODUTIVIDADE = DESEMPENHO / EMPENHO

Quanto maior a complexidade, maior o empenho. Logo, maior o impacto negativo sobre a produtividade.

Sobre Complexidade

No desenvolvimento de um sistema enfrentamos diferentes complexidades. Podemos classicá-las como:

  • Essencial – Aquela que não pode ser evitada.
  • Acidental – Aquela que “escolhemos” adicionar ao projeto.

Outra classifcação relevante para complexidade seria:

  • Domínio – Inerente ao problema de negócio que estamos tentando resolver
  • Solução Técnica – Com relação as técnicas e tecnologias (frameworks, ambientes operacionais, etc) que optamos por adotar
  • Legado – Soluções que precisamos continuar suportando, alheio a nossa vontade.

Embora não seja uma regra de ouro, podemos estabelecer duas relações entre as classificações que acabamos de propor:

  • Complexidade Essencial = Domínio
  • Complexidade Acidental = Solução Técnica + Legado

Em suma, geralmente, a única complexidade que geralmente não pode ser evitada, de forma alguma, é a complexidade do domínio. As demais, somente serão toleradas se forem indispensáveis para atender as demandas do domínio (pensando em disponibilidade e assertividade [entre outros atributos não funcionais acordados com o negócio])

A complexidade do domínio também é a única que o “negócio” entende.

Complexidade é Custo

Agora, proponho uma nova leitura. Vamos trocar a palavra complexidade, que usamos acima, por custo.

Logo, temos:

No desenvolvimento de um sistema enfrentamos diferentes complexidades custos. Podemos classicá-los como:

  • Essencial – Aquele que não pode ser evitado.
  • Acidental – Aquele que “escolhemos” adicionar ao projeto.

Outra classifcação para complexidade custos relevante seria:

  • Domínio – Inerente ao problema de negócio que estamos tentando resolver
  • Solução Técnica – Com relação as técnicas e tecnologias (frameworks, ambientes operacionais, etc) que optamos por adotar
  • Legado – Soluções que precisamos continuar suportando, alheio a nossa vontade.

Embora não seja uma regra de ouro, podemos estabelecer duas relações entre as classificações que acabamos de propor:

  • Complexidade Custo Essencial = Domínio
  • Complexidade Custo Acidental = Solução Técnica + Legado

Em suma, geralmente, a única complexidade o único custo que geralmente não pode ser evitado, de forma alguma, é a complexidade o custo do domínio. Os demais, somente serão tolerados se forem indispensáveis para atender as demandas do domínio (pensando em disponibilidade e assertividade [entre outros atributos não funcionais acordados com o negócio])

A complexidade O custo do domínio também é o único que o “negócio” entende.

Implicações da relação Complexidade e Custo

A única complexidade (ou custo) que o negócio entende e que, naturalmente, está disposto a pagar é a relacionada ao domínio. Não há muita sensibilização pela infraestrutura de nuvem, nem pela estratégia de persistência, nem sobre as estratégias de teste, nem com a integração com o banco de dados legado. Para o negócio, todas essas são questões acidentais – são custos que escolhemos e que deveriam ser evitados.

Voltemos a relação com a qual iniciei este post:

PRODUTIVIDADE = DESEMPENHO / EMPENHO

Terá maiores chances de êxito quem entender que as Complexidades/Custos Acidentais implicam em aumento do empenho e são um obstáculo à produtividade.

Como justificar complexidade/custo acidental

O custo total de um sistema pode ser descrito como:

CUSTO TOTAL = CUSTO PARA DESENVOLVER + CUSTO PARA MANTER

Como desenvolvedores profissionais, buscando a produtividade, devemos tomar decisões visando reduzir o custo total empenhado.

Geralmente, há um trade-off entre o custo para desenvolver e para manter. Ou seja, quando optamos por uma estratégia que irá reduzir o custo de manutenção, aumentamos o custo de desenvolvimento. Quando optamos por uma estratégia que irá reduzir o custo de desenvolvimento, geralmente optamos por aumentar o custo de manutenção.

De forma empírica, geralmente é mais inteligente optar por reduzir o custo de manutenção para minimizar o custo total. Mas a resposta definitiva depende de cada caso.

Quando optarmos por adicionar complexidade a um projeto, precisamos verificar se haverá redução no custo para desenvolver ou para manter. Caso não haja nenhum ganho, será difícil justificar essa opção.

De qualquer forma, é sempre melhor reconhecer que estamos falando de custos e é dessa forma que devemos debater com (e sensibilizar) o negócio.

Por exemplo:

  • Testes reduzem o custo total significativamente, pois reduzem o custo de manutenção (embora podendo aumentar um pouco o custo de desenvolvimento)
  • Adotar o framework XPTO facilita a adoção de novas features, reduzindo o custo da manutenção
  • Um banco de dados NoSQL diminui as dificuldades para persistência de dados novos mais adaptados a novos cenários de negócio (manutenção mais baixa)

Concluindo

Desenvolvimento profissional é, em boa dose, a arte de escolher complexidades (custos) com eficiência. Todo custo para atender o domínio é bem atendido pelo negócio (e geralmente aceito). Todos os outros custos devem ser justificados com base no impacto para o custo total.

Lembre-se, recurso/funcionalidade/benefício não percebido pelo negócio, no final do dia, é só custo. Por definição, custos devem ser cortados.

Capa: Alice Pasqual

Compartilhe este insight:

5 respostas

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Elemar Júnior

Sou fundador e CEO da EximiaCo e atuo como tech trusted advisor ajudando diversas empresas a gerar mais resultados através da tecnologia.

Mais insights para o seu negócio

Veja mais alguns estudos e reflexões que podem gerar alguns insights para o seu negócio:

Nesses últimos tempos, com a pandemia, inaugurei novos hábitos e aposentei outros. Estou trabalhando muito mais, mas também, agora que...
Você ainda acredita em estimativas? Nós, não. Embora aceitemos que ter uma boa ideia de esforço e prazo sejam diferenciais...
Em minha experiência, a inovação acontece a partir de um dos seguintes gatilhos: A área de negócios identifica uma demanda...
Uma das vantagens de estudar diversas linguagens, frameworks, técnicas e prática é encontrar inspiração inusitada para nosso código. Nesse post...
Muitas vezes, em nossos sistemas, temos tarefas que demandam processamento de  longa duração ou possuem alta complexidade computacional. Na medida...
In this post, I would like to explain a basic but confusing concept of CUDA programming: Thread Hierarchies. It will...
× Precisa de ajuda?