Peter Norwig: Aprenda Programação em ... 10 Anos

Nota do tradutor: Este artigo foi publicado por Peter Norvig em 2001. De acordo com a versão de 2001, foi realizada uma tradução para o russo . Em 2014, o artigo foi atualizado, mas a tradução não foi atualizada. Portanto, concluí minha tradução do artigo em sua versão moderna de 2014. Acredito que o artigo não perdeu sua relevância, embora esteja um pouco desatualizado. Se você encontrar algum erro de tradução, escreva de forma pessoal.

Onde está todo mundo com tanta pressa?


Vá a qualquer livraria e você verá imediatamente um livro sobre como aprender Java em 24 horas, além de inúmeras opções sobre como aprender C, SQL, Ruby, algoritmos etc. em alguns dias ou horas. Pesquisa avançada da Amazon [ title: teach, yourself, hours, since: 2000 ] lista 512 livros. Dos dez primeiros, nove são livros sobre programação (apenas um é sobre contabilidade). Você obterá os mesmos resultados substituindo "ensinar a si mesmo" por "aprender" e "horas" por "dias".

Isso leva à conclusão: ou as pessoas têm pressa de aprender programação, ou de alguma maneira fabulosa é mais fácil aprender programação do que qualquer outra coisa. Felleisen et al. mencionaram isso em seu livro How to Design Programs , quando escreveram: “Má programação é fácil. "Os idiotas podem aprender isso em 21 dias, mesmo se estiverem cheios de nerds." O site de quadrinhos Abtruse Goose também abordou esse tópico ( aqui está o link ).

Vamos ver o que o título do livro Teach Yourself C ++ in 24 Hours pode significar:

  • Ensine-se: em 24 horas, você não terá tempo para escrever alguns programas importantes e tirar conclusões de seus sucessos e fracassos. Você não terá tempo para trabalhar com um programador experiente e entender qual é a ideologia do C ++. Em suma, neste curto espaço de tempo você não aprenderá muito. Portanto, o livro tem em mente apenas um conhecimento superficial, mas não um entendimento profundo. Como Alexander Pope disse: " Pouco conhecimento é uma coisa perigosa ".
  • C ++: em 24 horas, você é capaz de aprender algo com a sintaxe C ++ (se você já conhece outra linguagem de programação), mas não sabe muito como usar essa linguagem. Em resumo, se você diz um programador Básico, aprende a escrever programas no estilo Básico usando a sintaxe C ++, mas não entende para que tarefas o C ++ é realmente bom (ou ruim). Então o que você diz? Como Alan Perlis disse: " Se uma linguagem não muda sua compreensão de programação, aprendê-la é inútil ". Bem, exceto que você precisa aprender um pouco de C ++ para entender como usar algum tipo de biblioteca para uma tarefa específica. Mas, neste caso, não estamos falando sobre o ensino de programação na linguagem; você está apenas aprendendo a concluir uma tarefa específica.
  • in 24 Hours: Infelizmente, como mostro abaixo, esse tempo não é suficiente.

Aprenda programação em 10 anos


Estudos ( Bloom (1985) , Bryan & Harter (1899) , Hayes (1989) , Simmon & Chase (1973) ) mostraram que são necessários cerca de dez anos para dominar habilidades em uma área específica, por exemplo, em jogando xadrez, composição musical, trabalhando com telégrafo, desenhando, tocando piano, natação, tênis, neurofisiologia e topologia. O segredo está na prática ponderada : não apenas a repetição mecânica, mas a busca por tarefas superiores ao seu nível atual, resolvendo-as, analisando suas ações durante a solução e depois de resolvidas, corrigindo os erros cometidos. E de novo E de novo Não há caminho mais curto: até Mozart, que aos 4 anos se tornou um garoto milagroso musical, levou 13 anos antes de começar a criar música de classe mundial. Os Beatles em 1964 entraram em cena com vários hits e se apresentaram no show de Ed Sullivan. Mas antes disso eles tocavam nos pequenos clubes de Liverpool e Hamburgo desde 1957. E apesar da fama mundial entre os fãs, seu primeiro sucesso entre os críticos musicais veio com o lançamento do Sargento Pepper em 1967.

Essa idéia foi popularizada por Malcolm Gladwell em seu livro, embora ele fale de 10.000 horas, não de 10 anos. O famoso fotógrafo Henri Cartier-Bresson (1908-2004) expressou essa idéia da seguinte maneira: " As primeiras 10.000 fotografias serão as piores " (ele nem suspeitava que com uma câmera digital algumas pessoas conseguem atingir esse valor em uma semana). A experiência real vem com a vida: Samuel Johnson (1709-1784) escreveu: “A experiência em qualquer campo só pode ser adquirida através do trabalho de uma vida; não há preço mais baixo ”; Chaucer (1340-1400) reclamou: " Tão pouco para viver, tanto para aprender ". Hipócrates (400 aC) é famoso por sua afirmação “a vida é curta, a ciência é vasta ”, que soa completamente assim: “Ars longa, vita brevis, ocasio praeceps, experimentum periculosum, iudicium difficile” e na tradução russa “Life Em resumo, a ciência é vasta, o caso dos abalos, a experiência é enganosa, o julgamento é difícil. ” Obviamente, nem um único número pode ser a resposta exata: não há razão para supor que todas as habilidades (programação, jogo de xadrez, damas, instrumentos musicais) exijam exatamente o mesmo tempo para dominá-las, bem como o que diferentes pessoas exigem exatamente ao mesmo tempo. Como o professor K. Anders Ericsson disse : “ Na maioria das áreas, é simplesmente incrível quanto tempo leva até os mais talentosos para dominar. O número '10.000 horas' apenas ajuda você a entender que estamos falando de vários anos de trabalho duro de 10 a 20 horas por semana para atingir o nível mais alto, mesmo para os talentos mais talentosos desde o nascimento

Então você quer se tornar um programador


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

  • Interesse-se por programar e crie algo apenas por diversão. Deve ser tão interessante para você que não seria uma pena gastar os próximos 10 anos / 10.000 horas nela.
  • Programa . O melhor treinamento é a prática . Em termos técnicos, “o nível máximo de desempenho de um indivíduo em um determinado campo não é alcançado automaticamente com a experiência; pelo contrário, o nível de produtividade pode ser aumentado mesmo nos indivíduos mais experientes devido a um desejo consciente de melhoria” ( p. 366 ) e “para o treinamento mais eficaz necessário a tarefa com o nível apropriado de complexidade para um indivíduo em particular, uma avaliação compreensível de sua implementação e a possibilidade de sua repetida implementação e correção de erros Ibok ”(pp. 20-21) O livro Cognição na prática: mente, matemática e cultura na vida cotidiana é uma leitura muito instrutiva sobre esse pensamento.
  • Converse com outros programadores; leia outros programas. Isso é muito mais importante do que qualquer livro ou curso de treinamento.
  • Se você quiser, dedique quatro anos aos estudos na universidade (ou na pós-graduação). Isso lhe dará acesso ao trabalho que requer títulos e títulos comprovados. Mas se você não gosta de estudar, pode (com certo zelo) obter todo o mesmo conhecimento por conta própria ou no trabalho. De qualquer forma, aprender apenas com os livros não é suficiente. " A educação em ciência da computação não tornará ninguém especialista em programação, assim como estudar pincéis e pigmentos coloridos não pode tornar ninguém um artista mestre " , escreve Eric Raymond , autor do The New Hacker's Dictionary. O melhor programador que eu já tive que contratar tinha apenas um curso escolar abrangente, e ele criou excelentes programas , moderou a lista de e-mails de seus fãs e ganhou dinheiro suficiente em opções para comprar sua própria boate .
  • Trabalhe em projetos com outros programadores. Seja o melhor programador em um projeto; ser o pior nos outros. Quando você é o melhor, testa sua capacidade de liderar um projeto e inspira outras pessoas com sua visão. Quando você é o pior, aprende com os mestres o que eles fazem e o que não gostam de fazer (é isso que eles instruem você a fazer).
  • Trabalhe em projetos após outros programadores. Tente descobrir um programa escrito por outra pessoa. Dê uma olhada no que é necessário para entender o código e corrigi-lo quando não houver programadores por perto que o tenham escrito. Pense em como criar seus programas para facilitar o suporte para quem trabalhar com eles depois de você.
  • Aprenda pelo menos meia dúzia de linguagens de programação . Escolha um idioma para o aprendizado baseado em abstrações de classe (por exemplo, Java ou C ++), um que suporte abstrações funcionais (por exemplo, Lisp ou ML ou Haskell), um que suporte abstração sintática (por exemplo, Lisp), uma linguagem declarativa (por exemplo, , Prolog ou C ++ - modelos) e um - enfatizando a simultaneidade (por exemplo, Clojure ou Go).
  • Não se esqueça que na frase "ciência da computação" está a palavra computador . Lembre-se de quanto tempo leva para o seu computador executar uma instrução, ler uma palavra de máquina da memória (com e sem erro no cache), ler uma sequência de palavras de máquina de um disco, procurar um registro em um disco ( Respostas aqui )
  • Participe da padronização de uma linguagem de programação. Pode ser uma comissão ANSI C ++, ou uma reunião em sua equipe, onde você determina quantos espaços você deixa para identificação no código - 2 ou 4. Em qualquer caso, você descobrirá o que as outras pessoas gostam no idioma, quão profundamente elas se sentem e também talvez você descubra de onde veio.
  • Saiba quando é hora de deixar a comissão de padronização de idiomas o mais rápido possível.

Com todas as opções acima, apenas ler livros não lhe dará muito. Antes do nascimento do meu primeiro filho, eu li todos os livros sobre cuidar de bebês e ainda não entendi o que fazer. 30 meses depois, quando meu segundo filho estava se preparando para nascer, você acha que eu procurei nos livros para refrescar minha memória? Não. Confiei em minha própria experiência, que acabou sendo muito mais útil e melhor do que milhares de páginas escritas por especialistas.

Fred Brooks, em seu artigo " Silver Bullet Não Existe " , descreveu três etapas para encontrar grandes programadores:

  1. Identifique sistematicamente os melhores programadores o mais cedo possível
  2. Designe um mentor para o programador que se envolverá no desenvolvimento de talentos e monitore cuidadosamente sua carreira
  3. Incentive a comunicação de talentos crescentes entre si de todas as formas, para que eles troquem idéias

Acontece que algumas pessoas já possuem qualidades que lhes permitem se tornar grandes programadores; eles só precisam ser direcionados no caminho certo. Alan Perlis colocou de forma mais sucinta: “ Todos podem ser ensinados a esculpir esculturas; Michelangelo teria que aprender a não esculpir. Da mesma forma, com os grandes programadores ". Perlis queria dizer que os grandes têm algumas qualidades internas que não são adquiridas através do treinamento. Mas de onde vêm essas qualidades? É congênito? Ou eles são produzidos pelo zelo? Como disse Aguste Gusto (personagem do desenho animado Ratatouille ), " qualquer um pode cozinhar, mas apenas o destemido pode se tornar ótimo ". Acredito que, no nosso caso, estamos falando de um desejo ardente de dedicar a maior parte da minha vida à auto-aprendizagem focada em programação. Mas pode haver uma palavra mais apropriada e destemida . Ou, como disse Anton Yego (crítico de Aguste Gusto): " nem todo mundo pode se tornar um grande artista, mas um grande artista pode aparecer de todos os lugares ".

Então, vá em frente, compre um livro sobre Java / Ruby / JavaScript / PHP; talvez você se beneficie disso. Mas você não poderá mudar sua vida e não se tornará um especialista em programação em 24 horas ou em 21 dias. Que tal passar 24 meses de trabalho duro continuamente dominando o assunto? Agora já estamos tendo uma conversa séria ...

Literatura


  • Bloom, Benjamin (ed.) Developing Talent in Young People, Ballantine, 1985.
  • Brooks, Fred, sem balas de prata, IEEE Computer, vol. 20, n. 4, 1987, p. 10-19.
  • Bryan, WL & Harter, N. "Estudos sobre a linguagem telegráfica: A aquisição de uma hierarquia de hábitos. Psychology Review, 1899, 8, 345-375
  • Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.
  • Chase, William G. e Simon, Herbert A. "Percepção no xadrez" Psychology Cognitive, 1973, 4, 55-81.
  • Lave, Jean, Cognição na Prática: Mente, Matemática e Cultura na Vida Cotidiana, Cambridge University Press, 1988.

As respostas


Tempo estimado para executar várias operações em um PC típico:
execução de uma instrução típica1 / 1.000.000.000 seg = 1 nanosseguro
ler do cache L10,5 nanoseg
erro na previsão da transição5 nanosec
ler do cache L27 nanosec
captura / liberação de mutex25 nanosec
lendo da memória principal100 nanosec
envie 2K pela rede de 1Gbps20.000 nanossegundos
lendo 1MB sequencialmente da memória250.000 nanossegundos
ler do disco com a pesquisa (busca)8.000.000 nanosec
ler 1MB sequencialmente do disco20.000.000 nanosec
enviando um pacote de dados dos EUA para a Europa e de volta150 milissegundos = 150.000.000 nanossegundos


Aplicação: seleção de idioma


Alguns leitores me perguntaram qual linguagem de programação eles deveriam aprender primeiro. Não há uma resposta única para esta pergunta, mas considere os seguintes pontos:

  • Entre em contato com seus amigos . Quando eles me perguntam: "qual sistema operacional devo escolher - Windows, UNIX ou Mac?", Respondo: "use o que seus amigos usam". O que você aprende com seus amigos cobrirá mais do que quaisquer diferenças internas entre sistemas operacionais ou linguagens de programação. Considere também seus futuros amigos: a comunidade de programadores, da qual você fará parte se continuar seu treinamento. O idioma de sua escolha tem uma grande comunidade em crescimento ou é pequeno e está desaparecendo gradualmente? Existem muitos livros, sites e fóruns em que você pode obter respostas? Você gosta de pessoas participando desses fóruns?
  • Comece simples . As linguagens de programação C ++ e Java são projetadas para o trabalho profissional de grandes equipes de programadores experientes que estão mais preocupados com a eficiência de sua execução de código. Como resultado, essas linguagens de programação possuem estruturas complexas para resolver esses problemas. É importante que você aprenda a programar. Você não precisa de complexidade extra. Você precisa de um idioma criado especialmente para ser fácil de aprender e lembrar.
  • Tocar. Como você gostaria de aprender a tocar piano: da maneira interativa usual, quando você ouve todas as notas assim que pressiona uma tecla, ou no "modo batch" - quando você ouve toda a melodia depois de pressionar todas as notas de uma música nas teclas? Obviamente, a maneira interativa é muito mais fácil, assim como a programação. Selecione um idioma que tenha um modo interativo de operação e reproduza-o.

Dado todos esses critérios, recomendo Python ou Scheme como a primeira linguagem de programação. Ou JavaScript, mas não porque é ideal para iniciantes, mas porque há muitos livros didáticos nesse idioma, por exemplo, na Kahn Academy . Mas o seu caso em particular pode ser especial, portanto, existem muitos outros idiomas para você escolher. Se você tem menos de dez anos, pode gostar do idioma de Alice, Squeak ou Blockly (os alunos mais velhos também podem gostar). O principal é fazer uma escolha e começar a aprender.

Apêndice: Livros e outros recursos


Me perguntam quais livros e sites são melhores para aprender. Vou repetir novamente: “ler livros por si só não é suficiente”, mas recomendo o seguinte:

Source: https://habr.com/ru/post/pt416167/


All Articles