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. Este artigo menciona seu favorito a preços super baixos. Escolha entre entrega no mesmo dia, entrega drive-up ou retirada do pedido.

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:

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:

Estamos, a maioria, em casa. Nossas rotinas não são as mesmas. Boa parte das atividades econômicas estão paradas. Aqueles que...
Um dos princípios que mais valorizo em práticas ágeis é o feedback. De todos os tipos de feedback que já...
Last year, Mario Fusco wrote a blog post series questioning the way Java developers are implementing the Gang of Four (GoF) patterns....
This one comes from Ayende’s book about RavenDB. If you want to learn RavenDB basics, I would recommend you to...
In this post, I will share how to write an ASP.NET Core Identity Storage Provider from the Scratch using RavenDB....
Um servidor de identidades é um artefato de sofware que centraliza os dados de usuários, bem como o processo para...
Masterclass

O Poder do Metamodelo para Profissionais Técnicos Avançarem

Nesta masterclass aberta ao público, vamos explorar como o Metamodelo para a Criação, desenvolvido por Elemar Júnior, pode ser uma ferramenta poderosa para alavancar sua carreira técnica em TI.

Crie sua conta

Preencha os dados para iniciar o seu cadastro no plano anual do Clube de Estudos:

Crie sua conta

Preencha os dados para iniciar o seu cadastro no plano mensal do Clube de Estudos:

× Precisa de ajuda?