Nos anos 80, a maneira mais fácil de começar uma luta de nerds era proclamar que a sua linguagem de programação preferida era a melhor. C, Pascal, Lisp, Fortran? Os programadores passaram horas a explicar exactamente porque é que a sua forma particular de criar uma cláusula if-then-else era superior à sua forma.
Era então. Hoje, as batalhas envolvendo sintaxe e estrutura acabaram em grande parte porque o mundo convergiu em alguns padrões simples. As diferenças entre os ponto-e-vírgulas, parênteses encaracolados, e o que não está em C, Java, e JavaScript são menores. Ainda existem debates interessantes sobre dactilografia e fechamentos, mas a maioria é discutível porque a automatização está a fechar a lacuna. Se não gostar de especificar um tipo de dados, há uma boa hipótese de o computador ser capaz de inferir exactamente o que quis dizer. Se o seu chefe quer JavaScript mas você gosta de Java, um cross-compiler converterá todo o seu Java estaticamente digitado em JavaScript minificado, pronto a correr num browser. Porquê lutar quando a tecnologia tem as nossas costas?
Hoje em dia, a acção interessante está nas estruturas. Quando me sentei com outros docentes da Universidade Johns Hopkins para planear um novo curso, as estruturas dominaram a conversa. Será Angular melhor do que Ember? Será Node.js tudo isso?
Concebemos um curso de inquérito que iria explorar a arquitectura dos pacotes de software mais importantes que são a base da Internet. Este foi o centro da acção, digno de um curso de inquérito que exploraria a arquitectura dos pacotes de software mais importantes que cingem a Internet de hoje.
Neste sentido, as estruturas são as novas linguagens de programação. São onde se encontram as mais recentes ideias, filosofias e aspectos práticos da codificação dos tempos modernos. Algumas chamam a atenção, mas muitas estão a tornar-se os novos blocos de construção fundamentais da programação. Aqui estão sete facetas que alimentam a tendência das estruturas — e fazem das estruturas o novo foco preferido dos nerds.
A maior parte da codificação é encadear APIs
Há um tempo em que escrever software significava empregar todo o seu conhecimento da linguagem de programação para espremer ao máximo o código. Fazia sentido dominar a complexidade dos apontadores, funções, e alcance — a qualidade do código dependia de fazer a coisa certa. Hoje em dia, a automatização trata de grande parte disto. Se deixar declarações inúteis no código, não se preocupe. O compilador retira o código morto. Se deixar apontadores pendurados, o colector do lixo irá provavelmente descobrir.
Plus, a prática da codificação é agora diferente. A maioria do código é agora uma longa linha de chamadas API. Há uma reformatação ocasional dos dados entre chamadas API, mas mesmo esses trabalhos são normalmente tratados por outras APIs. Poucos sortudos conseguem escrever código inteligente, de bit-banging, de malabarismo para as entranhas das nossas máquinas, mas a maioria de nós trabalha com as camadas superiores. Simplesmente executamos tubos entre as APIs.
Por isso, é mais importante compreender como uma API se comporta e o que pode fazer. Que estruturas de dados é que ela aceita? Como é que os algoritmos se comportam quando o conjunto de dados se torna maior? Perguntas como estas são mais centrais para a programação actual do que as que se referem à sintaxe ou linguagem. De facto, existem agora várias ferramentas que tornam simples chamar rotina a uma linguagem de outra. É relativamente simples ligar as bibliotecas C ao código Java, por exemplo. Compreender as APIs é o que importa.
Os ombros dos gigantes valem a pena ficar em
Imagine que se tornou um discípulo de Erlang ou de outra nova linguagem. Decide que oferece a melhor plataforma para escrever uma aplicação estável e sem bugs. Este é um sentimento agradável, mas pode levar anos a reescrever todo o código disponível para Java ou PHP na sua última linguagem de escolha. Claro, o seu código poderia revelar-se dramaticamente melhor, mas isso vale o tempo extra?
Frameworks deixe-nos aproveitar o trabalho árduo daqueles que vieram antes de nós. Podemos não gostar da arquitectura que escolheram e podemos discutir sobre os detalhes de implementação, mas é mais eficiente abafar as nossas queixas e encontrar uma forma de viver com as diferenças. É muito mais fácil herdar todo o bom e o mau da base de códigos através de um enquadramento. Tomar a rota machista escrevendo tudo você mesmo na sua nova língua favorita em vez de uma das suas estruturas mais populares não lhe permitirá desfrutar da nata da sua nova escolha tão rapidamente como simplesmente adiar aos criadores da estrutura e às suas APIs.
Conhecer a arquitectura é o que importa, não a sintaxe
Quando a maior parte da codificação é encadear chamadas API, não há muita vantagem em aprender as idiossincrasias da língua. Claro, poderia tornar-se um especialista em como Java inicializa campos estáticos nos objectos, mas seria muito melhor descobrir como aproveitar o poder de Lucene ou JavaDB ou alguma outra pilha de código. Poderia passar meses a analisar as rotinas de optimização dos compiladores do Objective-C, mas aprender as entradas e saídas da mais recente biblioteca principal da Apple irá realmente fazer o seu código gritar. Vai aprender muito mais os detalhes picuinhas da estrutura do que a sintaxe da linguagem em que a estrutura se baseia.
A maior parte do nosso código passa a maior parte do seu tempo nos circuitos internos das bibliotecas. Obter os detalhes da linguagem correcta pode ajudar, mas saber o que se passa nas bibliotecas pode compensar dramaticamente.
Algoritmos dominam
Aprender uma linguagem de programação pode ajudá-lo a fazer malabarismos com os dados guardados nas variáveis, mas isso só o leva até agora. O verdadeiro obstáculo é conseguir corrigir os algoritmos, e estes são geralmente definidos e implementados pelas estruturas.
Muitos programadores entendem que é perigoso e desperdiçador gastar tempo a reimplementar algoritmos padrão e estruturas de dados. Claro, pode ser capaz de o afinar um pouco às suas necessidades, mas arrisca-se a cometer erros subtis. As estruturas têm sido amplamente testadas ao longo dos anos. Elas representam o nosso investimento colectivo numa infra-estrutura de software. Não há muitos exemplos de quando faz sentido “sair da rede”, pôr de lado o trabalho árduo dos outros, e construir uma cabina algorítmica com as suas próprias duas mãos.
A abordagem correcta é estudar as estruturas e aprender a usá-las da melhor forma possível. Se escolher a estrutura de dados errada, poderá transformar um trabalho linear num que leve um tempo que seja uma função quadrática do tamanho da entrada. Isso é um grande incómodo quando se torna viral.