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