Carreira Dev

23 set, 2011

Ensine Programação a você mesmo em 10 anos

Publicidade

Por que todo mundo está com tanta pressa?

Entre em
uma livraria e você verá “Ensine Java a você mesmo em 7 dias” ao lado de
variações intermináveis oferecendo o ensino de Visual Basic, Windows,  Internet, e assim por diante em alguns dias ou
horas. Eu fiz a seguinte power search no Amazon.com:

     pubdate: after 1992 and title:
days and

      (title: learn or title: teach
yourself)

e recebi
248 resultados. Os primeiros 78 eram livros de computação (o número 79 era Aprenda Bengali em 30 dias). Eu substitui
“dias” por “horas” e tive resultados
parecidos: mais 253 livros, com 77 sendo de computação seguidos por Ensine Gramática e Estilo a você
mesmo em 24 horas

como número 78. No total de 200, 96% eram livros de computação.

A
conclusão a cheguei é que ou as pessoas estão com a maior pressa de
aprender sobre computadores ou os computadores são algo incrivelmente mais
fácil de aprender do que qualquer outra coisa. Não existem livros sobre como
aprender Beethoven, ou Física Quântica, ou até como vestir um cachorro em
poucos dias. Felleisen e outros autores falam
sobre essa tendência no seu livro Como criar programas, quando dizem que “programação
ruim é fácil. Idiotas são capazes de aprendê-la em 21 dias, mesmo se forem
burros”.

Vamos
analisar o que Aprenda C++ em três dias pode significar:

 

  • Aprenda: Em três dias, você não vai ter
    tempo para escrever vários programas significativos, e aprender com seus
    sucessos e fracassos. Você não terá tempo para trabalhar com um
    programador experiente e compreender como é viver em um ambiente C++.
    Resumindo, você não terá tempo de aprender muito. Então o livro só pode
    estar falando de uma familiaridade superficial, ao invés de um
    entendimento profundo. Como disse Alexander Pope, pouca aprendizagem é
    algo perigoso.
  • C++: Em três dias, você pode ser capaz
    de aprender um pouco da sintaxe do C++ (se você já sabe alguma outra
    linguagem), mas você não será capaz de aprender muito sobre como utilizar a
    linguagem. Resumindo, se você for um programador básico, você poderá
    aprender a escrever programas no estilo básico na sintaxe do C++, mas você
    não conseguirá aprender para que o C++ é realmente bom (ou ruim). Então
    para quê? Alan Perlis uma vez disse:
    “Uma linguagem que não afeta a maneira que você pensa sobre programação não
    vale a pena conhecer”. Uma razão provável é que você tem que aprender
    um pouco de C++ (ou mais provavelmente algo como JavaScript ou Flash’s Flex),
    porque você precisa da interface com uma ferramenta existente para
    realizar uma tarefa específica. Mas então você não está aprendendo como
    programar: você está aprendendo a realizar uma tarefa.
  • Em três dias: Infelizmente,
    isso não é suficiente, como mostra a próxima seção.

Ensine programação a você
mesmo em 10 anos

Os
pesquisadores (Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973)) mostraram que leva cerca de 10
anos para desenvolver expertise em qualquer uma de várias áreas pesquisadas,
incluindo jogar xadrez, composição musical, operação de telégrafo, pintura,
tocar piano, nadar, jogar tênis e pesquisar neuropsicologia e topologia. A
chave é a prática deliberativa: não apenas fazer de novo e de novo, mas se
desafiar com uma tarefa que está além da sua capacidade atual, tentando,
analisando sua performance durante e depois da sua execução e corrigindo seus
erros. Então, repita. E repita mais uma vez. Não existem atalhos: até Mozart,
que era um músico pródigo desde os 4 anos, levou mais de 13 anos até começar a
produzir música clássica mundial. Em outro campo, os Beatles pareciam ter
entrado em cena com hits número 1 e uma aparição no Ed Sullivan show em 1964.
Mas eles já tocavam em pequenos pubs em Liverpool e Hamburg desde 1957 e, mesmo
tendo tido apelação de massa desde cedo, seu primeiro sucesso critico, Sgt.
Peppers, foi lançado em 1967.

Malcolm Gladwell afirma que um estudo dos
estudantes na Berlin Academy of Music comparou os primeiros alunos da classe,
os medianos e os últimos, e perguntou a eles quanto haviam praticado:

Todos, de
todos os grupos, começaram a tocar mais ou menos juntos – perto dos 5 anos.
Nesses poucos anos, todos praticaram mais ou menos o mesmo tanto – cerca de 2 a
3 horas por semana. Mas por volta da idade de 8 anos, as diferenças reais
começaram a emergir. Os estudantes que eram os melhores da classe tinham
começado a praticar mais do que todos os outros: seis horas por semana aos 9
anos, 8 com 12 anos, 16 por semana com 14 anos e mais e mais, até a idade de 20
anos, em que eles estavam praticando mais de 30 horas por semana. Aos 20 anos,
a elite dos apresentadores tinha um total de 10 mil horas de prática durante o
curso de suas vidas. Os estudantes medianos tinham, por sua vez, 8 mil horas, e
os futuros professores de música pouco mais de 4 mil horas.

Então
parece que 10 mil horas, e não 10 anos, é o número mágico. (Henri
Cartier-Bresson (1908-2004) disse: “Suas primeiras 10 mil fotografias serão o
seu pior,” mas ele tirou mais de mil em uma hora.). Samuel Johnson (1709-1784)
foi ainda mais longe: ”a excelência em qualquer departamento pode ser atingida
somente com o trabalho de uma vida inteira; não é algo que pode ser comprado
por um preço menor.” E Chaucer (1340-1400) reclamou: “a vida é tão curta, e a
arte tão demorada para aprender”. Hippocrates (c. 400BC) é conhecido pelo
excerto “ars longa, vita brevis”, que é parte de uma passagem maior: “Ars longa, vita brevis, occasio praeceps, experimentum periculosum,
iudicium difficile”, que em português pode ser traduzido como “A vida é
curta, a arte longa, a oportunidade é efêmera, o experimento traiçoeiro, o
julgamento difícil. Apesar de estar em latim, ars pode significar arte ou
ofício, e a palavra grega original “techne só pode significar
“habilidade”, e não “arte”.

Aqui está
minha receita para o sucesso na programação:

  • Se interesse pela
    programação, mas porque ela é divertida. Certifique-se de que ela continue
    sendo divertida o suficiente para que você a aguente por 10 anos.
  • Converse com outros
    programadores; leia outros programas. Isso é mais importante que qualquer
    livro ou treinamento.
  • Programe. O melhor tipo de
    aprendizado é aprender fazendo. De maneira mais técnica,
    “o nível máximo de performance para indivíduos em um domínio específico
    não é atingido automaticamente como uma função da experiência estendida,
    mas o nível de performance pode ser aumentado até por indivíduos bastante
    experientes como um resultado de esforços deliberados para melhorar.”
    (p. 366) e “o aprendizado mais
    efetivo requer uma tarefa bem definida com um nível de dificuldade
    apropriado para o individuo em questão, feedback informativo e
    oportunidades para repetição e correção de erros.” (p. 20-21) O livro
    Cognition in Practice: Mind,
    Mathematics, and Culture in Everyday Life
    é uma referência
    interessante desse ponto de vista.
  • Se você quiser, gaste 4 anos
    na faculdade (ou mais na pós-graduação). Isso irá te garantir acesso a
    alguns trabalhos que requerem credenciais, e te dará um conhecimento
    mais profundo do campo, mas se você não gostar de escola, você pode (com
    certa dedicação) ter uma experiência similar no trabalho. De qualquer
    maneira, aprender sozinho com livros não será suficiente. “A educação na
    ciência da computação não deixa ninguém mais expert em programação mais do
    que pincéis de estudo e pigmentos deixam um pintor mais expert”, diz Eric
    Raymond, autor do The New Hacker’s Dictionary. Um dos melhores
    programadores que eu já contratei tinha apenas o segundo grau; ele
    produziu vários ótimos softwares, tem
    seu próprio news group, e ganhou dinheiro o
    suficiente em ações para comprar o seu próprio nightclub.
  • Trabalhe em projetos com
    outros programadores. Seja o melhor programador em alguns projetos; seja o
    pior em outros. Quando você for o melhor, conseguirá testar suas
    habilidades para liderar o projeto, e inspirar outros com a sua visão.
    Quando for o pior, você aprenderá o que os mestres fazem, e aprenderá com o
    que eles não gostam de fazer (porque eles fazem você fazer para eles).
  • Trabalhe em projetos depois
    de outros programadores. Esteja envolvido em compreender um programa
    escrito por outra pessoa. Veja o que é preciso para o compreender e o
    conserte quando o programador original não estiver por perto. Pense como
    criar seus programas para facilitar a vida daqueles que irão mantê-lo
    depois de você.
  • Aprenda pelo menos meia
    dúzia de linguagens de programação. Inclua uma linguagem que suporte
    abstrações de classes (como Java ou C++), uma que suporte abstração
    sintática (como Lisp), uma que suporte especificações declarativas (como
    Prolog ou C++ templates), uma que suporte coroutines (como Icon ou
    Scheme), e uma que suporte paralelismo (como Sisal).
  • Lembre-se de que existe um
    “computador” na “ciência da computação”. Saiba quanto tempo leva para o
    seu computador executar uma instrução, buscar uma palavra da memória (com
    e sem cache), ler palavras consecutivas do disco e buscar por um novo loção
    no disco (respostas abaixo).
  • Envolva-se com o esforço padrão
    de linguagens. Pode ser o ANSI C++ committee, ou poderia ser decidir que o
    estilo do seu código local tenha 2 ou 4 espaços de níveis de identação. De
    qualquer maneira, você aprenderá o que outras pessoas gostam em uma
    linguagem, o quanto elas gostam, e talvez um pouco sobre por que elas se
    sentem assim.
  • Tenha bom senso para se
    livrar do esforço padrão de linguagens o mais rápido possível.

Tendo
tudo isso em mente, é questionável quão longe você pode ir aprendendo com um
livro. Antes de o meu primeiro filho nascer, eu lia todos os livros de Como
Fazer, e ainda me sentia como um novato bobo. 30 meses depois, quando meu
segundo filho ia nascer, eu voltei para os livros? Não. Em vez disso, eu
contei com minha experiência pessoal, que foi muito mais útil do que milhares
de páginas escritas por experts.

Fred
Brooks, em seu artigo No Silver Bullet identificou um plano em três
partes para encontrar ótimos designers de softwares:

  1. Identifique sistematicamente
    os top designers o mais cedo possível.
  2. Tenha um mentor de carreira
    que seja responsável pelo desenvolvimento do prospect e mantenha um
    arquivo de carreira cuidadosamente.
  3. Forneça oportunidades para
    designers em crescimento interagirem um com os outros.

Isso
parte do pressuposto de que algumas pessoas já possuem as qualidades necessárias
para ser um ótimo designer; o trabalho é apropriadamente persuadi-las. Alan Perlis falou de maneira
mais sucinta: “Todo mundo pode aprender como esculpir; Michelangelo teria que aprender
como não esculpir. É assim também com ótimos programadores”.

Então vá
em frente e compre aquele livro de Java; você provavelmente irá fazer algum uso
dele. Mas você não vai mudar sua vida ou sua experiência em geral como
programador em 24 horas, dias ou meses.

Referências

Bloom,
Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.

Brooks,
Fred, No Silver Bullets, IEEE Computer, vol. 20, no. 4,
1987, p. 10-19.

Bryan,
W.L. & Harter, N. “Studies on the telegraphic language: The
acquisition of a hierarchy of habits. Psychology Review, 1899, 8,
345-375

Hayes,
John R., Complete Problem Solver Lawrence Erlbaum, 1989.

Chase,
William G. & Simon, Herbert A.
“Perception
in Chess”
Cognitive Psychology, 1973, 4, 55-81.

Lave,
Jean, Cognition in Practice: Mind,
Mathematics, and Culture in Everyday Life
, Cambridge University Press, 1988.


Respostas

Tempo
aproximado para várias operações em um PC comum::

Executar
uma instrução típica
1/1,000,000,000 seg = 1 nanoseg
Buscar do
cache L1
0.5 nanoseg
Branch
misprediction
5 nanoseg
Buscar
do cache L2
7 nanoseg
Mutex
lock/unlock
25 nanoseg
Buscar da
memória principal
100 nanoseg
Enviar
2K bytes em uma rede de 1 Gbps
20,000 nanoseg
Ler 1MB
sequencialmente da memória
250,000 nanoseg
Buscar
de um novo local de disco (seek)
8,000,000 nanoseg
Ler 1MB
sequencialmente do disco
20,000,000 nanoseg
Enviar
pacote dos EUA para a Europa e voltar
150 milisegundos = 150,000,000 nanoseg

Apêndice: escolha de linguagem

Várias
pessoas me perguntam qual linguagem de programação elas devem aprender
primeiro. Não existe uma só resposta, mas considere os pontos a seguir:

  • Use seus amigos. Quando me perguntam “qual
    sistema operacional devo usar, Windows, Unix, ou Mac?”, minha
    resposta normalmente é: “use o que seus amigos usam.” A vantagem que você
    ganha por aprender com seus amigos irá destacar qualquer diferença
    intrínseca entre SO, ou entre linguagens de programação. Considere também
    seus amigos futuros: a comunidade de programadores de que você fará parte, se
    continuar. A linguagem que você escolheu tem uma comunidade grande em
    expansão ou uma pequena que está morrendo? Existem livros, sites e fóruns
    online para você conseguir suas respostas? Você gosta das pessoas nesses
    fóruns?
  • Simplifique. Linguagens de
    programação como C++ e Java são designadas para desenvolvimento
    profissional por grandes times de programadores experientes que estão
    preocupados com a eficiência do tempo de execução do seu código. Como
    resultado, essas linguagens têm partes complicadas criadas para essas
    circunstâncias. Você está preocupado em aprender como programar. Você não
    precisa dessa complicação. Você quer uma linguagem que foi criada para ser
    fácil de aprender e lembrada por um único programador.
  • Toque. De qual maneira você
    preferiria aprender a tocar piano: da maneira normal e interativa, na qual
    você ouve o som cada vez que você toca uma nota, ou no modo em que você
    somente ouve as notas depois de terminar a música inteira? Obviamente a
    maneira interativa garante o aprendizado mais fácil para o piano, e também
    para a programação. Insista em uma linguagem com modo interativo e a
    utilize.

Dados esses
critérios, minhas recomendações para a primeira linguagem de programação seriam Python ou Scheme. Mas as
suas circunstâncias podem variar, e existem outras boas escolhas. Se você for
novo, você pode preferir Alice ou Squeak (pessoas mais
experientes também podem gostar delas). A coisa mais importante é que você
escolha uma e comece.

Apêndice: livros e outros recursos

Várias
pessoas me perguntaram quais livros e páginas da web elas deveriam consultar para
aprender. Repito que “aprender sozinho com um livro não vai ser o suficiente”, mas
eu recomendo os seguintes:

?

Texto original disponível em http://norvig.com/21-days.html