Assim como desenhar, programar é traduzir o mundo em outra linguagem.
Bons programadores, como bons artistas, não enxergam melhor, mas sabem organizar, escolher e representar melhor.
Índice
1. Introdução
No início dos meus estudos em programação, sempre caminhei em paralelo com o estudo de desenho. Durante essa jornada, não pude deixar de traçar paralelos entre as duas áreas. O estudo do desenho sempre me pareceu ter um caminho claro: focar nos chamados fundamentos e praticar. Já na programação, sempre busquei identificar esses fundamentos, mas a definição nunca foi tão evidente.
Neste texto, pretendo explorar o que considero serem os fundamentos da programação.
2. Fundamentos
O que me encanta na ideia de fundamentos é que eles são tópicos inesgotáveis. Você pode estudá-los por toda a vida, e ainda assim haverá sempre mais a aprender. É como anatomia no desenho: você pode aprofundar infinitamente, desde o estudo dos ossos até a simplificação de formas para criar estilos exagerados ou minimalistas. Mas, para que o resultado seja intencional e convincente, precisa estar bem fundamentado.
Da mesma forma, um bom desenho ou um bom programa depende da aplicação equilibrada de vários fundamentos ao mesmo tempo. Dominar apenas um não garante um bom resultado final. Os fundamentos não são uma lista que se esgota, mas pontos de prática constante — como um boxeador que treina o mesmo soco todos os dias até que se torne instintivo.
3. Fundamentos da arte
Como este é um artigo focado em programação, muitos podem não ter tido contato com os fundamentos da arte. Então farei uma breve explicação para seguirmos:
- Linhas: o elemento mais básico para definir contorno, forma e dar sensação de movimento.
- Formas: blocos de construção de qualquer objeto, representados por figuras geométricas básicas como círculos, quadrados e triângulos. Simplificar a realidade em formas ajuda a construir o desenho de maneira mais precisa.
- Perspectiva: permite criar a ilusão de profundidade e tridimensionalidade em uma superfície plana.
- Anatomia: essencial para desenhar pessoas e animais de maneira realista e proporcional. É o estudo da estrutura corporal, músculos e ossos.
- Composição: refere-se à organização visual dos elementos dentro do espaço. Envolve a disposição, o equilíbrio e a distribuição de objetos, cores e linhas para criar uma obra harmoniosa.
4. Fundamentos da programação
4.1. Lógica computacional
Capacidade de entender uma necessidade e transformá-la em um programa. Observe como um desenhista enxerga formas simples (círculos, quadrados) em uma figura complexa.
O programador deve ter a habilidade de enxergar processos complexos e representa-los de forma simplificada.
Exemplo: imagine um programador conversando com um cliente sobre um novo projeto. O cliente descreve um fluxo de contratação totalmente manual, que envolve diversos setores, diferentes níveis de permissão, etapas de aprovação, envio de e-mails e muitos outros detalhes.
O papel do programador é extrair, simplificar e organizar esses fluxos, transformando a descrição em um modelo compreensível. Só assim será possível apresentar ao cliente quais funcionalidades serão desenvolvidas e como elas vão funcionar.
4.2. Estruturas de dados e algoritmos
São formas de organizar e processar informações. Assim como um artista usa a composição para distribuir elementos em uma cena, o programador utiliza estruturas para dar ordem e eficiência aos dados.
Observe essas 2 artes
Na primeira arte, não há técnicas de composição evidentes; já na segunda, o olhar do observador é conduzido intencionalmente pelos elementos, seguindo o caminho que o artista planejou.
Da mesma forma, um programador deve saber escolher as estruturas de dados e algoritmos adequados para guiar o fluxo das informações. Usar um array para armazenar uma lista telefônica pode até funcionar, mas não será a decisão mais eficiente — nesse caso, uma estrutura de mapa permitiria buscas muito mais rápidas e organizadas.
// Lista telefônica usando Vec
let lista_telefonica = vec![
("Peter", "1111-1111"),
("Carlos", "2222-2222"),
("Jordan", "3333-3333"),
];
// Procurar telefone do Jordan em um Vec (O(n))
let mut telefone = None;
for (nome, numero) in &lista_telefonica {
if *nome == "Jordan" {
telefone = Some(*numero);
break;
}
}
println!("Telefone do Jordan (Vec): {:?}", telefone.unwrap());
// Lista telefônica usando HashMap
let mut lista_telefonica_map = HashMap::new();
lista_telefonica_map.insert("Peter", "1111-1111");
lista_telefonica_map.insert("Carlos", "2222-2222");
lista_telefonica_map.insert("Jordan", "3333-3333");
// Procurar telefone do Jordan em HashMap (O(1))
if let Some(numero) = lista_telefonica_map.get("Jordan") {
println!("Telefone do Jordan (HashMap): {}", numero);
}
Dominar essas estruturas — e os algoritmos que as acompanham — é essencial para compor sistemas complexos. Cada estrutura tem pontos fortes e fracos, e saber quando aplicar cada uma delas é o que diferencia soluções simples de ótimas composições.
4.3. Ferramental (Tooling)
Assim como um artista que utiliza uma mesa digitalizadora consegue desenhar mais rápido, com maior precisão e explorar possibilidades criativas que seriam muito mais trabalhosas no papel, o programador também pode acelerar e ampliar sua capacidade ao dominar suas ferramentas.
O uso de LLMs para gerar código ou documentação, scripts de automação para eliminar tarefas repetitivas, Docker para garantir ambientes consistentes e até sistemas como o Nix para reproduzir setups complexos traz não apenas mais velocidade, mas também conforto e segurança no dia a dia de desenvolvimento.
Aprender e dominar essas ferramentas é tão importante quanto aprender uma linguagem de programação: são elas que permitem transformar esforço bruto em eficiência, garantindo que o desenvolvedor trabalhe com mais fluidez e tenha liberdade para explorar soluções mais sofisticadas.
4.4. Debugging e engenharia reversa
Um bom desenvolvedor deve ser capaz de “executar mentalmente” o código, acompanhando cada fluxo de decisão (if
, switch
) e cada loop (for
, while
) como se estivesse rodando o programa na cabeça.
fn calcular_frete(valor: f64, destino: &str) -> f64 {
if valor <= 0.0 {
return 0.0;
}
// Frete grátis para pedidos acima de 500
if valor > 500.0 {
return 0.0;
}
// Destino prioritário tem taxa fixa
if destino == "capital" {
return 20.0;
}
// Valor padrão
50.0
}
Você não deve precisar perder tempo executando esse código com todas as suas possibilidades para debugar, enquanto escreve já deve ser capaz de executar as possibilidades de entrada e saída para a função.
O verdadeiro desafio surge quando algo dá errado: muitas vezes o erro aparece apenas como uma mensagem no console ou um comportamento inesperado na tela do cliente, enquanto a causa real está escondida em camadas mais profundas.
Depurar significa seguir esse rastro, passo a passo, de cima para baixo, até chegar à raiz do problema. É como um artista que olha para um desenho “estranho” e percebe que a falha não está na pintura final, mas em uma proporção incorreta do esboço inicial. Ter essa habilidade de engenharia reversa, de reconstruir o caminho do erro até sua origem, é o que transforma um desenvolvedor comum em um solucionador de problemas eficiente.
4.5. Abstração
Abstração é o ato de simplificar: olhar para um problema complexo e destacar apenas os pontos essenciais.
Um pintor não precisa desenhar cada fio de cabelo, apenas sugerir volume e textura.
Note que o artista não precisou pintar cada detalhe da cena, alguns elementos da pintura são somente pinceladas; ele concentrou-se no ponto de interesse e deixou de lado elementos desnecessários. Ainda assim conseguimos identificar claramente uma criatura em um pasto de animais com montanhas ao fundo.
Em programação, as abstrações existem para organizar o caos. Ao criar uma função como sendEmail, o que realmente importa é a intenção: “enviar um e-mail”. Se será por API, SMTP ou outro provedor é apenas um detalhe de implementação, que deve ser abstraído para poder mudar sem impactar o restante do sistema. Esse isolamento torna o código mais limpo, reutilizável e fácil de manter.
Conclusão
Estudar fundamentos não significa que você dominará tudo, mas sim que terá a base sólida para evoluir. Conhecer os fundamentos permite aplicá-los de forma consciente, adaptá-los e até quebrar regras quando necessário, da mesma forma que um artista usa formas circulares para transmitir suavidade, mas pode inverter a lógica para transmitir algo inesperado.
O essencial é entender que fundamentos não se esgotam: quanto mais você pratica, mais naturais se tornam, e mais liberdade você ganha para criar, inovar e resolver problemas de maneira original.
Top comments (0)