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

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 eraAprenda 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 da memória L1 0.5 nanoseg
Branch misprediction 5 nanoseg
Buscar do cache da memória L2 7 nanoseg
Mutex lock/unlock 25 nanoseg
Buscar da memória principal 100 nanoseg
Enviar 2 K bytes em uma rede de 1 Gbps 20,000 nanoseg
Ler 1 MB sequencialmente da memória 250,000 nanoseg
Buscar de um novo local de disco (seek) 8,000,000 nanoseg
Ler 1 MB 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:

Fonte: http://imasters.com.br/artigo/22152/desenvolvimento/ensine-programacao-a-voce-mesmo-em-10-anos

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

 

 

 

 

 

 

 

 

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s