Programação

Aprendendo uma nova linguagem

Aprender uma nova linguagem de programação não é tarefa trivial. O domínio de uma linguagem como Java, Scala ou Perl exige processos de aprendizado muito semelhantes aos da aquisição de uma nova linguagem humana.

Primeiramente, pode-se perceber que para programar computadores o domínio da lingua inglesa é essencial, o que já configura o primeiro obstáculo para nós falantes do português. Primeiro devemos aprender um segundo sistema simbólico e idiomático humano, para só depois aprendermos a programar os computadores usando os símbolos aprendidos. Portanto, a programação é uma tarefa duplamente complicada para aqueles que tem o inglês como segundo idioma.

Após compreender o significado das diversas palavras-chave da linguagem de programação que desejamos aprender, o segundo passo é tentar descobrir a gramática formal da linguagem. Como essas palavras são combinadas para formar frases que possuem significado(e realizam tarefas úteis)? Essa sintaxe é normalmente especificada no sistema BNF, criado pelo pai da primeira linguagem de programação estruturada(John Backus, criador da linguagem Fortran).

O terceiro passo é adquirir vocabulário, e esse é um processo que se estende até o fim de nossas vidas como programadores.

É fácil conhecer por completo a sintaxe de uma linguagem, mas a aquisição de vocabulário e o refinamento da escrita é um processo permanente, sem fim. A analogia entre linguagens de programação e aquelas humanas mais uma vez se aplica: há muitos especialistas que conhecem por completo a gramática do português, mas há apenas um José Saramago. Conhecer a gramática não significa que serão produzidos bons textos, significa apenas que os textos provavelmente estarão grafados corretamente.

Na programação de computadores a analogia com esse exemplo é direta: muitos especialistas conhecem toda a gramática de certas linguagens, mas nem todos criarão programas úteis e bem escritos. É nesse momento que esbarramos na fronteira entre a sintaxe e a semântica. Uma sintaxe perfeita é exigência básica para escrever programas, já a criação semântica é uma arte.

Por isso os livros de Donald Knuth não se chamam “A Ciência de Programar Computadores”, mas “A Arte de Programar Computadores”. Apesar de haver um rigoroso formalismo matemático por trás de toda linguagem de programação, a criação de programas que se tornarão úteis, que servirão aos usuários finais, é uma arte. E esta arte, infelizmente, não pode ser totalmente ensinada. Alguns conceitos são fáceis de serem transmitidos, outros não.

Enfim, como aprender uma linguagem? Existe uma receita?
Como podemos perceber, existe uma parte da arte da programação de computadores que é possível de se ensinar. A sintaxe da linguagem, idiomas mais comúns, boa formatação do código e boas práticas são relativamente simples de se ensinar a um iniciante. Já a criação de bons programas depende de sua capacidade de usar todo esse ferramental.

A parte mecânica do aprendizado de uma linguagem de programação tem um roteiro que sofre poucas variações. É mais ou menos algo assim:

  1. Aprender a sintaxe da linguagem.
  2. Aprender a usar as ferramentas de compilação e/ou interpretação dos programas.
  3. Ler bastante código nessa linguagem para adquirir familiaridade com os idiomas, estruturas de dados e algoritmos mais usados.
  4. Memorizar as bibliotecas padrão da linguagem.
  5. Aprender boas práticas na organização, montagem e combinação de componentes(padrões) para montar sistemas com o mínimo de falhas.
  6. Praticar.

Os passos desse roteiro são apenas fruto do senso comum.

Não se pode sequer testar uma linguagem sem conhecer sua sintaxe. E tampouco é preciso conhecer toda a sintaxe da maioria das linguagens para começar a produzir programas – um subconjunto mínimo nos torna capazes de escrever programas úteis, e o domínio da sintaxe completa pode ser adquirido com a prática. Aprender a sintaxe de uma linguagem pode levar de semanas a meses, mas é uma tarefa que pode ser completada em um espaço finito de tempo.

Aprender a usar os interpretadores/compiladores pode se tornar uma tarefa quase que permanente(principalmente com as mudanças a cada nova versão), mas também é possível de se completar em tempo hábil. Novamente aprendemos como usar recursos básicos para criar programas, porém o domínio completo dos compiladores e interpretadores pode levar meses, até anos. Um compilador como o gcc, por exemplo, possui uma infinidade de recursos, poucos dos quais usamos no dia a dia.

A partir do terceiro passo, o processo de aprendizado torna-se permanente e não existe uma só pessoa que possa “completar” esse processo.

Por exemplo, ninguém domina toda a biblioteca sequer das linguagens mais antigas e mais estudadas. Principalmente nos dias atuais, quando devemos trabalhar com vários sistemas simultâneamente: um banco de dados, uma linguagem principal, linguagens de domínio específico do sistema operacional(shell e linguagens de scripts) e assim por diante. Cada tecnologia dessas exigiria anos de prática para ser apenas parcialmente comprendida.

Há programadores com mais de 30 anos de experência em linguagem C que adquirem novos conhecimentos diariamente. A quantidade de informação que existe em um grande sistema informatizado é simplesmente sobrehumana, ninguém é capaz de memorizar todo o código que existe por trás da multitude de bibliotecas existentes para linguagem C, ou do vasto universo de módulos Perl existente no CPAN, e assim por diante(até porque diversos novos módulos são adicionados todos os dias). Assim, a consulta à documentação é uma tarefa que programadores profissionais repetem por toda sua vida. A sintaxe de C é minúscula, possui poucas dezenas de símbolos. No entanto, existem infinitas formas de combinar esses símbolos, assim como existem infinitas obras que podemos escrever usando a sintaxe da lingua portuguesa.

Aprender uma linguagem de programação é uma combinação de arte e ciência. Os iniciantes devem se conscientizar que tornar-se um bom programador é um processo que leva anos, e que não pode ser simplesmente adquirido em dias ou semanas. Existem, é claro, pessoas que apresentam grande facilidade no aprendizado da sintaxe, da lógica e de conceitos gerais das linguagens de programação. Porém, até mesmo para essas pessoas a memorização das bibliotecas, a leitura de código para adquirir novos idiomas e a prática de escrever programas são pre-requisitos que irão exigir longos periodos e muito esforço, pois há passos que não podemos acelerar. Nossa capacidade de leitura e assimilação é limitada dentro de um determinado espaço de tempo – mesmo que o tempo seja bem aproveitado há apenas uma certa quantidade de conhecimento que podemos adquirir.

Devemos separar as etapas do aprendizado de programação. A lógica de programação é universal e será aplicável tanto em linguagens funcionais como imperativas. O estudo da lógica pode acontecer em paralelo, de forma independente, com o aprendizado de uma linguagem específica. A base matemática para a programação, derivada imediata da lógica, também é um conhecimento universal. Não existe “conhecimento demais em matemática”; este é também um processo de aprendizado permanente. Boas práticas de programação, formatar corretamente o código, escrever código legível e fácil de ser compreendido, comunicar-se eficientemente com outros membros de uma equipe de programação são outras habilidades que exigem aprendizado e que podem ser transmitidas.

Resta, por último, aquilo que não pode ser ensinado: a arte de criar bons sistemas. Este é um processo interminável, é algo que buscamos aprimorar a cada dia e que depende da criatividade, de insights e de muita prática. Neste blog perseguimos aquilo que pode ser ensinado, as boas práticas e o conhecimento das várias linguagens e seus idiomas característicos. O resto fica a cargo de você, caro leitor!

Standard