O custo oculto da complexidade

Dec 24 2022
Por que eu deveria ler isso? Para entender melhor o custo real e mortal da complexidade. Percebendo nossa percepção tendenciosa de simplicidade e complexidade.

Por que eu deveria ler isso?

Para entender melhor o custo real e mortal da complexidade. Percebendo nossa percepção tendenciosa de simplicidade e complexidade. E também modelando a complexidade para descobrir algumas de suas características. Principalmente sua natureza exponencial.

regras de simplicidade

Simplicidade, na minha opinião, é o princípio mais importante do desenvolvimento de software. Aqui eu falei. É simples assim :)

Você acha o mesmo? Deixe-me dizer-lhe porque eu acredito nisso.

Dois lados da mesma moeda

A simplicidade é desvalorizada

Muitas vezes deixamos de ver a beleza oculta da simplicidade. Como se o considerássemos um dado adquirido. É muito fácil perder a engenhosidade que ele apresenta. Isso ocorre porque uma solução simples é óbvia para explicar e entender, mas muitas vezes não para descobrir. É difícil se orgulhar de algo que, uma vez explicado, parece trivial. Mesmo que isso exigisse um esforço monumental para ser descoberto. Afinal, as pessoas costumam julgar os resultados, não a maneira de obtê-los. Mas, para entender melhor o valor da simplicidade, precisamos olhar para ela de outra maneira. Olá, complexidade.

O primeiro lado da moeda. A beleza oculta da simplicidade. (Eu criei esta imagem usando o modelo de Inteligência Artificial de Difusão Estável. Usando o prompt: “uma única moeda de ouro com uma flor”.)

O verdadeiro custo da complexidade

Eu defendo que a complexidade é uma doença. Uma doença mortal. Foi adicionado em pequenas doses por cada decisão que tomamos. Lenta mas seguramente, eles têm um impacto cumulativo no corpo que invadem. A velocidade da mudança diminui como se pesos invisíveis estivessem sendo adicionados às pernas de um corredor. Eventualmente, pode até atingir a estagnação completa. Nos piores casos, uma intervenção dolorosa (como uma reescrita) é o único caminho a seguir.

O outro lado da moeda. Custo da complexidade. (Eu criei esta imagem usando o modelo de Inteligência Artificial de Difusão Estável. Usando o prompt: “uma única moeda de ouro com o ceifador”.)

Complexidade é admirada

Por que esse cenário é tão comum? Para responder a essa pergunta, precisamos entender que somos inclinados à complexidade. Isso ocorre porque somos ensinados a apreciar a complexidade. Tome a Grande Pirâmide de Gizé como um exemplo extremo. É considerado o último membro permanente das Sete Maravilhas do Mundo Antigo. Um edifício notável e impressionante. Mas sendo franco, é apenas um túmulo. O faraó simplesmente precisava de um lugar para ser enterrado. Digamos que esta era a sua intenção desde o edifício (ignorando a motivação religiosa ou política). Então, uma simples sepultura teria bastado. Algo parecido com o que os chefes de estado recebem hoje em dia. No entanto, admiramos o edifício e sua complexidade. Não vemos isso como um desperdício de recursos que poderiam ter sido investidos em outro lugar.

E aí vem a grande ironia:

Admiramos a complexidade e evitamos a simplicidade, enquanto devemos admirar a simplicidade e evitar a complexidade.

Se os robôs estivessem construindo as pirâmides. (Eu criei esta imagem usando o modelo de Inteligência Artificial de Difusão Estável. Usando o prompt: “robôs construindo uma pirâmide egípcia”.)

Complexidade de modelagem

Você pode estimar o impacto da complexidade? O que isso faz ao seu sistema ou organização? Talvez pareça muito abstrato até mesmo para abordar esse tópico. Vamos ver se podemos analisar juntos o custo oculto da complexidade e como combatê-lo.

Precisamos construir para nós mesmos um modelo mental que dê forma a esse inimigo indescritível. Isso servirá como pedra angular em nossa abordagem em relação à complexidade.

cadeias de complexidade

Qualquer cadeia é construída conectando elos. Vamos pegar, por exemplo, um sistema aleatório de uma empresa de software e tentar descrevê-lo com cadeias. Os links seriam componentes do sistema (por exemplo, microsserviços). Uma cadeia seria composta de componentes do sistema que são acoplados em qualquer relacionamento significativo (por exemplo, microsserviços que se comunicam entre si). O sistema então pode ser representado como uma coleção de cadeias. É isso, chega de definições.

Vejamos um exemplo concreto. Digamos que temos dois microsserviços que se comunicam entre si. Ambos são elos da nossa cadeia. Além disso, eles são executados em um provedor de nuvem. O provedor de nuvem é outro link. E, finalmente, os serviços são implantados usando uma única infra de CI/CD. Ainda, outro link. Descrevemos agora uma cadeia de quatro elos. Até agora tudo bem.

Uma corrente de 4 elos

A complexidade o atingirá com força quando os links começarem a ter mais de um único estado. Por exemplo, vamos supor que um dos microsserviços esteja sendo migrado para uma nova versão principal (por exemplo, com alterações importantes na API). Durante o processo de migração, esse link terá dois estados simultaneamente. Como se nossa corrente se bifurcasse em duas “ correntes fantasmas ”. Além disso, se oferecermos suporte a uma arquitetura multinuvem e tivermos 2 fornecedores de nuvem diferentes, outro link terá mais de um estado. Mas agora nossa corrente original foi transformada em 4 correntes fantasmas. Ao mesmo tempo, a equipe infra iniciou o teste A/B da infraestrutura CI/CD. O 4 dobra para 8. Isso cresce exponencialmente.

Uma corrente se bifurca em 8 correntes fantasmas.

Um caso extremo que leva à falha do sistema agora pode ser acionado em apenas uma das cadeias fantasmas. Por exemplo, um bug acionado por uma chamada de API para o microsserviço recém-migrado. Mas apenas se fosse implantado usando a nova infra na primeira nuvem. O palco está montado. E adivinhe, acontece por volta das 2 da manhã, acordando o engenheiro de plantão. Levando a mais uma autópsia .

Quanto mais correntes você tiver e mais longas elas se tornarem, o risco de uma explosão exponencial de correntes fantasmas aumenta.

Vamos notar alguns comportamentos interessantes que surgem dessa modelagem:

  1. Impacto de complexidade - Adicionar a mesma quantidade de complexidade a um sistema complexo produz um impacto maior do que em um sistema simples. Isso se deve ao fator exponencial da complexidade.
  2. O paradoxo da complexidade - Um esforço para reduzir a complexidade, no longo prazo, provavelmente aumentará a complexidade no curto prazo. Isso ocorre porque fazer alterações que envolvem migrações adiciona mais estados aos links das cadeias existentes (visíveis no exemplo acima). Isso pode gerar um sentimento entre as pessoas de que nossos esforços para reduzir a complexidade estão falhando, quando na verdade não estão.

Neste post, abordei um tipo de complexidade. No entanto, a complexidade pode vir em muitas formas e formas diferentes. Listando alguns:

  1. Complexidade do sistema - Como descrevemos acima. A complexidade dos componentes do sistema e suas interações.
  2. Complexidade do produto - De produtos a serviços. Dividindo-o em recursos, UX, fluxos e suas interações.
  3. Complexidade organizacional - Da estrutura da organização aos seus processos e governança.
  4. Complexidade do código - Não apenas as definições clássicas de tempo e memória da ciência da computação. Mas também outros aspectos, como código limpo.

Qual é o próximo?

Em meu próximo post, discutiremos algumas características adicionais de complexidade:

Saltando pela toca do coelho da complexidade

Conclusão

Resumo

A complexidade costuma ser admirada pelas pessoas. No entanto, muitas vezes não percebemos que também tem um lado mortal. Geralmente deixamos de ver seu custo até que seja tarde demais, principalmente porque é um conceito abstrato e elusivo. A complexidade da modelagem e sua natureza exponencial nos permitem estar cientes dos perigos à frente. Enfatizando a importância crucial da simplicidade.

Pensamentos finais

Uma observação sobre o modelo mental das cadeias de complexidade: um modelo melhor provavelmente será um gráfico (o clássico da ciência da computação). Onde cada componente do sistema é um nó/vértice. Uma borda entre os nós marca que esses componentes do sistema estão conectados em alguma relação. Então nossas cadeias do exemplo anterior serão cliques em um grafo. Mas isso é muito complexo. Minha ideia principal neste post é pregar a simplicidade, não construir um modelo preciso para a complexidade. É verdade tanto para sistemas quanto para posts de blog. Esperançosamente, um modelo impreciso, mas simples, ajudará a reforçar a mensagem. A complexidade tem uma natureza exponencial. Esteja ciente do perigo que representa.

Agradecimentos

Muito obrigado a Pol Miro Omella , Yanai Ron , Nimrod Shai e Roy Green por suas análises e comentários perspicazes.