O texto abaixo foi traduzido pelo meu amigo Augusto Radtke e de autoria de Peter Norvig. dirigido para todos que fazem cincia da computao, ou estudam em alguma rea das cincias exatas ou tem interesse ou at mesmo em necessidade de aprender a programar. Para quem j fez Inteligncia Artificial na faculdade deve conhecer o Norvig do seu livro verde, o Artificial Intelligence, a Modern Approach, ou AIMA para os ntimos. Ele era chefe de desenvolvimento dos robs que foram pra marte da NASA, agora trabalha no Google. Ou seja, ele sabe do que est falando! O texto longo (uns 10 minutos de leitura).
Aprenda a Programar em Dez Anos Peter Norvig Traduo por Augusto Radtke Porque todo mundo tem tanta pressa? Entre em qualquer livraria, voc vai ver Aprenda Java em 7 dias assim como diversas variaes oferecendo lies de Visual Basic, Windows, Internet e por ai vai, em dias ou horas. Eu fiz a seguinte pesquisa na Amazon.com: pubdate: after 1992 and title: days and
(title: learn or title: teach yourself) e encontrei 248 entradas. As primeiras 78 eram livros sobre computadores (nmero 79 era Learn Bengali in 30 days). Troquei dias por horas e encontrei resultados incrivelmente similares: 253 livros, 77 de computadores, seguidos de Teach Yourself Grammar and Style in 24 Hours no nmero 78. Do total de 200, 96% eram livros de computadores. A concluso que ou as pessoas esto com muita pressa de aprender sobre computadores, ou computadores so extremamente fceis de aprender do que qualquer outra coisa. No h livros de como aprender Beethoven, ou Fsica Quntica ou at adestramento de ces em alguns dias.
Vamos analisar o que um ttulo como Learn Pascal in Three Days pode significar: Aprenda: Em trs dias voc no ter tempo de escrever programas significantes, e aprender com seu sucesso ou fracasso. Voc no ter tempo para trabalhar com um programador experiente e entender o que conviver neste ambiente. Em resumo, voc no ter tempo para aprender muito. Logo eles s podem estar falando a respeito de entendimento supercial, como disse Alexander Pope, aprender pouco uma coisa perigosa. Pascal: Em trs dias voc deve ser capaz de aprender a sintaxe do Pascal (isso se voc j conhece uma linguagem similar), mas no vai aprender muito sobre como utilizar essa sintaxe. Em resumo, se voc era, vamos dizer, um programador Basic, voc pode aprender a escrever programas no estilo Basic usando a sintaxe do Pascal mas no aprender em que o Pascal bom (ou ruim). Ento, qual o ponto? Alan Perlis disse certa vez: Uma linguagem no afeta a maneira que voc pensa sobre programao. Um ponto se voc precisar aprender um pouco de Pascal (ou algo como Visual Basic ou Javascript) porque voc precisa interagir com alguma ferramenta existente para uma tarefa especfica. Mas nesse caso voc no esta aprendendo a programar, voc est aprendendo a como resolver essa tarefa. em trs dias: Infelizmente, no suficiente, como veremos a seguir. Aprenda a Programar em Dez Anos. Pesquisadores (Hayes, Bloom) tem demonstrado que leva em torno de dez anos para desenvolver percia em qualquer de uma variedade de reas, includindo jogar xadrez, compor msicas, pintar, tocar piano, nadar, jogar tnis e pesquisar neuropsicologia ou topologia. Aparentemente no h atalhos: at Mozart, que foi um prodgio musical aos 4 anos levou mais 13 antes de compor msica de primeira classe. De outra forma, ou Beatles parecem ter disparado nas paradas em primeiro lugar com a apario no show do Ed Sullivan em 1964. Mas eles estavam tocando em pequenos clubes em Liverpool e Hamburgo desde 1957, e mesmo que eles conseguiram uma apario em masa, o primeiro grande sucesso mesmo, Sgt. Peppers, foi lanado em 1967. Samuel Johnson pensa que pode levar mais do que dez anos: Excelncia em qualquer departamento pode ser alcanada apenas com o trabalho de uma vida toda; no possvel compra-l por menos. E Chaucer reclamou: vida to curta, leva tantu pra aprender. Sim, tantu, e no tanto, um dia voc entende.Ento aqui vai minha receita para sucesso na programao: Aprenda ingls. Leia o original deste texto. Essa traduo s est aqui para exercitar o meu ingls, no o seu. (Nota do tradutor) Se interesse por programao, e faa porque legal. Tenha certeza que isso continue a ser legal para voc dedicar dez anos nisso. Converse com outros programadores; leia outros programas. Isso mais importante do que qualquer livro ou curso de treinamento. Programe. O melhor tipo de aprendizado aprender fazendo. Colocando de uma forma mais tcnica, o nvel mximo de performace individual em um domnio no alcanado automaticamente em funo de uma experincia extendida, mas sim aumentado mesmo por indivduos extramente experientes por um esforo deliberativo de melhorar. (p. 366) e o aprendizado mais efetivo requer uma tarefa bem definida com uma dificuldade apropriada para o indivduo em particular, dado que exista um retorno sobre a experincia e oportunidades de repetio e correes de erros. (p. 20-21) do livro Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, que uma referncia interessante deste ponto de vista. Se voc quiser, gaste quatro anos em uma universidade (ou mais em uma ps-graduao). Isso lhe dar acesso a alguns empregos que requerem alguma formao e um grande entendimento do campo de trabalho, mas se voc no gosta muito de ir para escolha, voc pode (com alguma dedicao) conseguir alguma experincia similiar sobre esse tipo de trabalho. Em qualquer caso, apenas ler livros no ser suficiente. Educao em cincias da computao no faz de ningum um gnio em programao tanto quanto estudar pincis e pigmentos no fazem um bom pintor. diz Eric Raymond, autor de The New Hackers Dictionary. Um dos melhores programadores que eu j contratei tinha apenas o segundo grau, e ele produziu vrios softwares incrveis, tem seu prprio grupo de discusso, e fez dinheiro suficiente em aes para comprar seu prprio clube nortuno. Trabalhe em projetos com outros programadores. Seja o melhor programador em alguns projetos, seja o pior em outros. Quando voc o melhor voc testa suas habilidades para liderar um projeto, e para inspirar outros com a sua viso. Quando voc o pior aprende o que os mestres ensinam e o que no gostam de fazer (porque eles fazem voc fazer por eles). Trabalhe em projetos aps outros programadores. Esteja envolvido em entender um programa escrito por outro. Veja o que preciso para entender e consertar quando o programador original no esta por perto. Pense em como desenvolver seus programas para que seja fcil para quem for mante-ls aps voc. Aprenda pelo menos meia dzia de linguagens de programao. Includa na lista uma linguagem orientada a objetos (como Java ou C++), uma que seja de abstrao funcional (como Lisp ou ML), uma que suporte abstrao sinttica (como Lisp), uma que suporte especificao declarativa (como Prolog ou C++ com templates), uma que suporte co-rotinas (como Icon ou Scheme), e uma que suporte paralelismo (como Sisal). Lembre-se que h um computador em cincia da computao. Saiba quanto tempo leva para o seu computador computar uma instruo, carregar uma palavra ad memria (com e sem cache), ler palavras consecutivas do disco rgido, procurar por uma nova posio no disco.(As respostas esto aqui.) Se envolva no esforo de padronizao de uma linguagem. Pode ser o comite ANSI C++, ou na padronizao de programao na sua empresa, se utilizaram identao com 2 ou 4 espaos. Em qualquer caso, voc aprende o que outras pessoas gostam em uma linguagem, o quanto eles gostam e talvez um pouco do porque eles gostam. Tenha o bom senso de cair fora desse processo de padronizao to rpido quanto possvel.
Com tudo isso em mente, questionvel o quo longe voc pode ir apenas lendo livros. Antes que do meu primeiro filho nascer eu li todos os livros de Como Fazer e ainda me sentia como um novato. Trinta meses depois, quando nasceu meu segundo filho, voltei aos livros para relembra? No, ao invs disso resolvi utilizar minha experincia pessoal do primeiro filho, que se tornou muito mais til do que milhares de pginas escritas por especialistas. Fred Brooks, em seu trabalho No Silver Bullets identificou um plano em trs partes para encontrar grandes projetistas de software: 1. Sistematicamente identifique os melhores projetistas o quanto antes. 2. Atribua um orientador de carreira responsvel pelo desenvolvimento cuidadosamente de um plano de carreira 3. Promova oportunidades para desenvolvedores em aprendizado interagir e estimular uns aos outros. Isto assumo que algumas pessoas j possuem as qualidades necessrias para ser um grande desenvolvedor de software; o grande trabalho apenas coloca-los no caminho correto. AlanPerlis coloca de forma mais sucinta: Qualquer um pode ser ensinado a esculpir: Michelangelo precisaria ser ensinado a no esculpir. o mesmo com grandes programadores. Ento v em frente e compre aquele livrode Java; provavelmente voc ter algum uso dele. Mas isso no vai mudar a sua vida, ou o seu conhecimento como um programador em 24 horas, dias, ou meses.
Referncias 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. Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.
Respostas O tempo aproximado de execuo de vrias operaes num PC tpico de 1Ghz no vero de 2001: executar uma instruo simples 1 nseg = (1/1,000,000,000) seg extrair uma palavra da memria L1 2 nseg extrair uma palavra da memria RAM 10 nsec extrair uma palavra consecutivamente do disco rgido 200 nseg extrair uma palavra de uma nova posio o disco (busca) 8,000,000nseg = 8mseg
Apndice: Escolha de Linguagem Muitas pessoas tem me perguntado sobre qual linguagem devem aprender primeiro. No h resposta, mas considere estes pontos: Use os seus amigos. Quando me perguntam que sistema operacioal devo usar, Windows, Unix ou Mac? minha resposta geralmenet : use o que seus amigos usarem. A vantagem que voc poder aprender com os seus amigos vence qualquer diferena entre sistemas operacionais ou linguagens. Considere tambm seus futuros amigos: a comunidade de programadores que voc far parte se continuar. A sua escolha possuia uma grande comunidade de usurios ou apenas uma comunidade morta? Existem livros, sites e frums para encontrar respostas? Voc gosta das pessoas desses frums? Mantenha-se simples. Linguagens como C++ ou Java so desenvolvidas para utilizao profissional por um grande time de desenvolvedores experientes que esto preocupados com a eficincia de execuo de seus cdigos. Como resultado, essas linguagens possuem partes complicadas desenvolvidas para essas circunstncias. Voc esta focado em aprender a programar, no precisa dessa preocupao. Voc precisa de uma linguagem que foi desenvolvida para ser fcil de aprender e lembrar. Interaja. Como normalmente voc aprenderia piano: de modo interativo, no qual voc escuta uma nota logo que pressiona uma tecla ou de um modo automizado em que voc escuta cada nota quando a msica termina de tocar? Claramente, aprender interativamente muito mais fcil, e assim com a programao. Insista em uma linguagem com um modo interativo e use-o. Baseado nesses critrios, minhas recomendaes para uma primeira linguagem seria Python ou Scheme. Mas as suas circunstncias podem variar, e existem outras boas opes. Se a sua idade ainda tiver apenas um dgito, melhor escolher Alice ou Squeak (aprendizes mais velhos podem gostar tambm). O importante voc escolher e comear.
Apndice: Livros e outros recursos Muitas pessoas me perguntam em quais livros e pginas elas devem aprender. Eu repito que apenas ler livros no suficiente mas eu posso recomendar o seguinte: Scheme: Structure and Interpretation of Computer Programs (Abelson & Sussman) provavelmente a melhor introduo a cincia da computao e ele faz ensinando a programar enquanto voc aprende computao. Voc pode ver vdeos de aulas desde livro, assim como o texto completo. online O livro desafiante e talvez algumas pessoas precisem de outra forma de aprendizado. Scheme: How to Design Programs (Felleisen et al.) um dos melhores livros sobre como projetar programas de forma elegante e funcional. Python:Python Programming: Uma introduo a computao (Zelle) e tambm a linguagem Python. Python: Vrios tutorials online esto disponveis em Python.org. Oz: Concepts, Techniques, and Models of Computer Programming (Van Roy & Haridi)parece ser um sucessor moderno para Abelson & Sussman. um tour pelas grandes idias da programao, muito mais amplo que Abelson & Sussman mas mantendo uma certa facilidade de leitura. Ele utiliza uma linguagem, Oz, que no muito reconhecida mas serve como base para outras linguagens.
EXtreme Programming Práticas para o Dia A Dia No Desenvolvimento Ágil de Software (Portuguese Edition) by Daniel Wildt, Dionatan Moura, Guilherme Lacerda, Rafael Helm