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:
- Identifique sistematicamente
os top designers o mais cedo possível. - Tenha um mentor de carreira
que seja responsável pelo desenvolvimento do prospect e mantenha um
arquivo de carreira cuidadosamente. - 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.
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:
- Scheme: Structure and Interpretation of Computer
Programs (Abelson & Sussman) é provavelmente a melhor introdução à
ciência da computação, e ele ensina programação de uma maneira que você
consegue compreender a ciência da computação. Você pode assistir a vídeos online das
palestras
sobre esse livro, e também ter o texto online completo. O livro é desafiador é irá
eliminar pessoas que poderiam ser bem sucedidas com outras abordagens. - Scheme: How to Design Programs (Felleisen et al.) é um dos melhores livros
sobre como criar programar de uma maneira elegante e funcional. - Python: Python Programming: An Intro to CS (Zelle) é uma boa introdução ao uso
de Python. - Python: Vários tutoriais online estão disponíveis no Python.org.
- Oz: Concepts, Techniques, and Models of Computer
Programming (Van Roy & Haridi) é
visto por alguns como o sucessor moderno de Abelson & Sussman. É um
tour através das grandes ideias da programação, cobrindo uma área maior do
que Abelson & Sussman, sendo talvez mais simples de ler e entender. Ele
utiliza a linguagem Oz, que não é vastamente conhecida, mas serve como base
para o aprendizado de outras linguagens.
?
Texto original disponível em http://norvig.com/21-days.html