Programar deveria ser fácil

Em julho deste ano, os físicos do LHC anunciaram a descoberta de uma nova partícula consistente com o bóson de Higgs. Eu não entendo nada de nada sobre física de partículas, mas gosto de acompanhar as descobertas da área para tentar absorver um pouco do entendimento que esses super-humanos têm da natureza. Quando soube do anúncio, não pude deixar de pensar que são essas pessoas que estão fazendo o trabalho duro de verdade.

Eu, aqui programando regras arbitrárias e tentando formar um universo artificial consistente? Nem tanto. Comparado com o trabalho desses caras, o meu é muito fácil. Mesmo porque na maioria das vezes minhas regras não se encaixam tão bem assim e passam longe de ser consistentes.

Até se trabalhássemos sempre para fazer programas totalmente consistentes e sem defeitos, nosso trabalho como programadores deveria ser mais fácil do que é. Mas porque tanta gente acha que programar é difícil?

Vamos voltar à Física por um instante. O objetivo de um físico é descrever as regras da natureza da forma mais simples possível. Há um conjunto de regras que já existe e funciona muito bem e eles tentam fazer a engenharia reversa do universo inteiro. Eles não possuem nenhuma documentação, diagrama, esquema ou planta fundamental além do que aquilo que os físicos anteriores descobriram. Para deixar a coisa mais complicada ainda, nem nessas descobertas anteriores eles podem confiar cegamente. A física newtoniana, por exemplo, não funciona nem nas escalas quânticas nem nas velocidades próximas à da luz. E eles tiveram que descobrir isso quebrando a cara.

O problema essencial é que há um conjunto de regras pré-estabelecidas que se quer conhecer.

Contraste isso com o Desenvolvimento de Software. Quando programamos, estamos definindo regras a partir do nada e temos controle total do funcionamento do “universo”. Sim, nós também precisamos subir nos ombros de gigantes e usar bibliotecas, frameworks e linguagens de programação que não fomos nós que inventamos. Mas as regras destas ferramentas que usamos também foram escritas do zero, tudo montado a partir de uma álgebra fundamental de bits. O que nós tentamos fazer é justamente o inverso do que os físicos fazem. Enquanto eles partem de um conjunto de comportamentos observáveis para extrair as regras de funcionamento, nós escrevemos as regras de modo a gerar o comportamento.

Programadores definem como um universo em particular deve funcionar partindo de regras já conhecidas. Físicos definem regras de modo a explicar um universo conhecido.

É como se os físicos estivessem tentando decifrar o código-fonte de um programa sem ter acesso nem aos binários. Se fazer decompilação não é coisa simples, imagina ter que fazer isso só com o resultado de testes!

Tendo isto em mente, fica mais difícil ter alguma compaixão pelos programadores. Enquanto os físicos precisam enfrentar uma complexidade inerente ao objeto de estudo deles, toda a complexidade que enfrentamos ao programar é culpa exclusivamente nossa como classe. Obviamente às vezes também precisamos modelar objetos e processos do mundo real inerentemente complexos, mas essa é uma conversa para outra hora (e minha impressão é que muitas vezes tornamos o pedaço de mundo real que estamos tentando modelar mais complexo do que ele realmente é). O que importa é que fomos nós que criamos este monstro complexo ao não dar a devida atenção ao design. Enfileirar bits de modo que um computador consiga seguir as instruções é até fácil. Fazer isto elegantemente é que é difícil. E por negligenciar essa parte difícil não temos a facilidade que deveríamos ter.