O conceito mais importante da programação

A "pirâmide" é real.

E entender a pirâmide é crucial.

Se eu reunisse minhas experiências ao longo dos anos - cada sistema que trabalhei, cada linha de código que escrevi - eu diria que a pirâmide é a base de tudo.

Ela se repete, sempre. E será sempre maior. É como uma lei básica da programação.

Em mentorias que forneci no passado, notei que uma das maiores queixas de quem está iniciando é a complexidade - jargões, terminologias, padrões - afinal, por onde começar? Ao tentar se organizar, você é rapidamente atingido pelo caos.

Novas tecnologias, novas trends, um novo framework Javascript.

É comum anúncios do tipo:

  • A melhor linguagem para aprender em 2023
  • Aprender java vale a pena?
  • Como ficar rico com Python em apenas 6 meses!

E até faz sentido - queremos resultados rápidos. Aprender a linguagem perfeita para todos os cenários - a mais requisitada do mercado, a mais performática, a mais segura.

Porém, esses cursos, artigos e vídeos geralmente relevam um ponto:

Abstração

A abstração é a essência por trás da pirâmide, e algo que intuitivamente todo mundo que desenvolve acaba entendendo, cedo ou tarde, conscientemente ou não.

E a abstração faz muita gente desistir da área antes mesmo de começar.

Quando falo em abstração, estou me referindo à utilização de uma tecnologia como base para simplificar outra.

O navegador que você usa, o seu celular, esse site - são montados em cima de uma pilha de tecnologias - cada uma com o objetivo de simplificar a outra. O problema é que isso faz com que as coisas acabem parecendo mágica. E a mágica assusta - ainda mais quando você aposta muito em cima dela.

O arquétipo da mágica, por si só, representa algo oculto - algo desconhecido. E essa capacidade de navegar o desconhecido é o que você adquire com a experiência.

E observando pessoas com mais experiência, notei que elas tinham algo semelhante a um mapa - Quando algo errado ocorre, elas facilmente conseguem identificar a causa. Foi aí que comecei a transcrever o conceito desse post.

A pirâmide é uma representação simbólica desse mapa - e ela tornará a mágica mais tangível para você.

Pular em cursos e artigos sem essa informação resultará em um gap de conhecimento - e isso trará frustração ao tentar resolver problemas no mundo real. É como tentar resolver equações sem ter aprendido a somar.

Vamos inverter a ordem.

1) Os Padrões se Repetem

Uma das primeiras linguagens que tive contato foi Javascript. A segunda PHP e a terceira SQL. Isso foi em meados de 2012, e, na época, as três representavam mundos distintos. Por mais que eu já tivesse passado por aulas de pseudocódigo, o nível de abstração era alto e eu sentia dificuldade de conectar as coisas - eu falhava em notar mais um conceito da pirâmide:

A repetição de padrões

Todas as linguagens possuem o mesmo padrão - o qual chamo aqui de core:

  • Condicionais
  • Loops
  • Variáveis

Se você focar em realmente entender os conceitos do core, já iniciará sua jornada com uma compreensão melhor - já que todas as linguagens possuirão o mesmo padrão.

Mas por que funciona assim?

Porque tudo que roda em seu dispositivo - tudo mesmo - passa pelo processador. E o processador funciona com base em impulsos elétricos - que são convertidos em "1" e "0" - "verdadeiro" e "falso". Quando há tensão suficiente, temos "1", e quando não, "0".

Tudo que roda em seu computador e celular não passa de uma abstração em cima de sinais elétricos.

E quando esses sinais são recebidos, eles passam por portas lógicas - dispositivos físicos que implementam fluxos bem parecidos ao que você irá implementar quando utilizar condicionais. Em essência, eles fazem com impulsos elétricos no nível mais baixo de abstração o que você fará com informações tangíveis na mais alta camada de abstração.

Os padrões se repetem.

A eletricidade e os dispositivos físicos são a base de tudo - a partir daí temos abstrações que repetem padrões.

Por isso, é importante ressaltar:

Foque em aprender conceitos, não sintaxe, ferramenta ou uma linguagem específica. Os conceitos se repetirão sempre, as linguagens não.

São os conceitos que geram valor - não uma linguagem ou framework.

Valor é gerado na resolução de problemas reais - e problemas reais são resolvidos por meio da aplicação prática de conceitos - os quais sempre se repetem.

A base da pirâmide sempre será a camada mais baixa de abstração.

... E o topo? Seu ponto de perspectiva.

O ponto de perspectiva é o tangível - o atual. O seu ponto de partida.

De qualquer local que você analisa ou implementa algo, imagine que uma pirâmide de abstração desça a partir dele - sempre terminando na camada mais baixa de abstração.

  • Para ver esse site, você depende do seu navegador.

  • E o seu navegador depende do seu sistema operacional.

  • E o seu sistema operacional depende do seu processador.

Ainda assim, utilizei conceitos do core do início ao fim para o implementar esse blog. O seu navegador também - pode ter certeza que existem inúmeros Loops, condicionais e variáveis envolvidos.

O core é o que mantém a pirâmide de pé - e a cada andar que você sobe da pirâmide - aumenta uma camada de abstração.

Mas então, o que une essas camadas de abstração?

2) Contratos

A única maneira da informação pela pirâmide é por algo que chamo simbolicamente de contrato.

Os contratos é que definem como e quando a informação irá navegar. Imagine que são como manuais de instrução.

Para ver esse site, você depende que do seu navegador - o qual implementa o contrato do seu sistema operacional - e o seu sistema operacional implementa o contrato do seu processador (falando de forma simplificada).

No caso da pirâmide, os contratos sempre são implementados de cima para baixo - e nunca de baixo para cima.

O seu sistema operacional não irá se adaptar para o seu navegador funcionar. Ele apenas disponibiliza um contrato.

E o seu navegador não irá adaptar sua codebase para essa página funcionar. Ele apenas disponibiliza o contrato.

... E assim por diante.

Para os mais técnicos - um contrato pode ser uma API, instruções de arquitetura, entre outros. O contrato é o que permite a comunicação entre as camadas abstratas.

Quanto mais bibliotecas, serviços e código uma aplicação depende, maior é a pirâmide - e maior é o número de contratos.

O número de contratos geralmente está ligado diretamente com a fragilidade da aplicação. Isso acontece pois caso uma camada abstrata pare de funcionar, todas as que dependem dela também pararão de funcionar.

Se o seu processador parar, o sistema operacional e navegador pararão de funcionar.

Se o seu navegador parar, esse site (no seu dispositivo) pararia de funcionar.

Se alguma dependência que o Netlify (que hospeda esse blog) consome para de funcionar, o Netlify pararia de funcionar.

Se o Netlify (que hospeda esse site) parar de funcionar, esse site (em todos os dispositivos) pararia de funcionar.

Regra básica: Se sua aplicação depende de uma camada abstrata que para de funcionar, sua aplicação para. E isso faria as aplicações que dependem da sua aplicação pararem de funcionar também.

É um efeito dominó.

Se você desenvolve há um certo tempo, com certeza - intuitivamente - já sabe disso.

Sempre tentamos desacoplar e simplificar as coisas o máximo possível, para diminuir o número de contratos. Isso é - diminuir o tamanho da pirâmide.

O problema é que esse conceito leva um certo tempo para ser compreendido - e é algo que as pessoas com mais experiência facilmente conseguem entender.

Se lembram de quando a Cloudflare caiu, levando junto deles uma grande parte da Internet?

As aplicações que caíram junto tinham a Cloudflare (uma dependência externa) como camada de abstração.

Se você já desenvolve - comece a notar que esse padrão se aplica em todas as partes.

Componentização, injeção de dependencias, micro-serviços, etc.

Tudo é para facilitar o processo de navegar na pirâmide. Tanto a nível de implementação, quanto a nível físico (de arquitetura).

Quando você vê um código ou processo engessado e cheio de dependencias, já sabe que aquilo vai dar problema - se não hoje, no futuro.

Intuitivamente, você está vendo a pirâmide. Por mais que não saiba.

Entender quais são as abstrações de uma aplicação é essencial - é isso que dá a estrutura inicial ao mapa de navegação.

3) Visualize a Pirâmide

Comece a visualizar features em aplicações que você utiliza.

A barra de busca do Instagram? Imagine como foi implementada - esqueça o aspecto técnico por enquanto.

Em uma primeira olhada, parece que é só uma caixa de pesquisa, né?

Mas vamos mais a fundo:

  • A caixa de pesquisa possui um design específico.
  • A caixa de pesquisa possui a habilidade de receber texto.
  • A caixa de pesquisa possui a habilidade de mostrar sugestões.
  • A caixa de pesquisa possui a habilidade de pesquisar em tempo real.
  • Precisamos testar se a caixa de pesquisa funciona.
  • ... E precisamos integrar essa caixa de pesquisa com o resto da aplicação.

Consegue ver a pirâmide, e como a feature pode ser quebrada?

Uma atividade de partida sempre terá atividades menores.

Partindo desse ponto de vista, tudo começará a fazer mais sentido.

O topo da pirâmide é a barra de busca, e as camadas de abstração são todos os pontos citados.

E os pontos citados também terão sub-atividades, dependendo da situação.

No caso dos testes, por exemplo, a última camada de abstração seria a configuração das ferramentas de teste. No caso do design, a configuração do sistema de estilos - e assim por diante.

E esse é o backbone do Scrum - uma das ferramentas mais utilizadas para gestão de projetos.

Vê como podemos puxar a pirâmide para praticamente qualquer área?

4) Explore e Aplique na Prática

Caso você tenha gostado da metologia, pode usar o GPT para te auxiliar a quebrar features.

Criei essa base de prompt para te auxiliar:

Como poderíamos tecnicamente visualizar a arquitetura do [TECNOLOGIA]?
Indique o número da camada de cada item e suas explicações, começando pela camada mais abstrata até a menos abstrata. Crie um desenho representativo.

Exemplo para a arquitetura do Google Chrome:

Você pode expandir cada item, quantas vezes precisar, com o seguinte prompt:

Repita o processo da pirâmide para a camada [NÚMERO DA CAMADA].

4) Recapitulando

  1. Aprenda conceitos, não uma tecnologia específica. Os conceitos sempre se repetem, as tecnologias não.
  2. As aplicações funcionam como dominós. Se uma camada de abstração falhar, as camadas acima falharão também.
  3. Quando você tiver que resolver algum problema, utiliza o método da pirâmide. Verá como tudo se conectará com mais facilidade.
  4. Utilize o Chat GPT no auxílio da quebra de tasks e no estudo de implementações.

Espero que tenha ajudado. -Rapozo