segunda-feira, 23 de junho de 2008

Como aprender computação

Dia desses o Lameiro me passou uma lista de livros para desenvolvedores, e eu achei a lista bastante curiosa. Se eu fosse criar uma similar, eu não colocaria nenhum dos livros citados naquela lista! Ao invés disso, a minha lista com os top 10 livros de computação seria a abaixo:


1 - Gödel, Escher, Bach (Hofstadter): Eu começaria com o GEB, por dois motivos. O primeiro é que ele é um ótimo reality check: se você não gostar do GEB, então mude de área, porque computação não é a sua praia :) O segundo motivo é que esse livro tem uma excelente introdução à lógica (proposicional e de predicados), que é a ferramenta básica onde você constrói a ciência da computação.

2 - Concrete Mathematics (Knuth): Você não precisa saber matemática para programar, mas se você quiser ser um bom programador, então matemática é essencial. O Concrete tem todo o básico que você precisa pra fazer análises de complexidade computacional, e tudo escrito de maneira extremamente bem-humorada.

3 - Algorithms in C++ (Sedgewick): Se você já sabe lógica e matemática, então agora pode partir pro estudo de algoritmos. O Sedgewick tem todos os algoritmos básicos, e é uma leitura bem leve: se você está começando com algoritmos agora, esse precisa ser o seu primeiro livro. Ele não vai muito fundo em nenhum tópico, mas isso é compensado pela extrema didática nos tópicos. O livro ainda tem código exemplo pra todos os algoritmos, e várias edições, uma pra cada linguagem (eu sei que tem, pelo menos, C, C++, Java e Pascal).

4 - Introduction to Algorithms (Cormen): Os algoritmos que você aprendeu no Sedgewick, você vai estudar em detalhes no Cormen. Esse livro é extremamente formal, e talvez por isso é o livro-texto usado nos cursos de computaçao do MIT. Ele também cobre algoritmos mais avançados, que o Sedgewick apenas cita (por exemplo, Fibonacci Heap)

5 - The Art of Computer Programming (Knuth): O tAoCP está para o Cormen assim como o Cormen está pro Segdewick, aqui você vai dissecar os algoritmos até o último bit deles. Além de ser uma coleção excelente, a encadernação é muito bonita (mas não se engane, ele fica ótimo na prateleira, mas melhor ainda na sua cabeça).

6 - Effective C++ (Meyers): Agora que você sabe os algoritmos, precisa de uma linguagem para programá-los. Pra falar a verdade, a escolha de linguagem nem importa tanto assim, mas se você escolher uma, aprenda-a tão bem quanto possível. Eu escolhi C++, e esse livro do Meyers é o que diferencia as crianças dos adultos (especialmente para aquelas horas quando você cria uma classe sem destrutor virtual e não sabe por que a memória está vazando).

7 - Effective STL (Meyers): Já teve uma época em que eu não gostava de C++, mas isso é porque eu sou velho o suficiente pra ter mexido em C++ antes que os compiladores tivessem templates. Com templates a linguagem fica muito mais atraente, e esse é o livro que vai te ensinar a dominar a STL.

8 - The Practice of Programming (Kernighan, Pike): Se você leu tudo até agora, então você já é um programador muito bom na teoria. Na prática, entretanto, tem um monte de skills que ainda faltam. Nesse livro você aprende sobre as coisas que usualmente não se aprende na escola: debugging, otimização, unit testing, documentação.

9 - Programming Pearls (Bentley): Com os livros lidos até agora, você já deve ser um excelente programador. O passo final é passar de programador para um true hacker, e esse é um passo que não requer só conhecimento, você também precisa de manha, criatividade e insight. Eu não sei se dá pra ensinar essas coisas, mas esse livro certamente é o que chega mais próximo disso.

10 - The Mythical Man-Month (Brooks): Depois de ler todos os livros acima você estará próximo do nirvana, mas pra atingir o zen da programação de verdade, é preciso lembrar que projetos não precisam só de computadores, precisam de pessoas também. O Mythical Man-Month é um livro de gerência de projetos de software escrito em 1975, mas é surpreendente como ele continua atual. A tecnologia avança, mas as pessoas continuam as mesmas :)

É claro que pra manter uma lista com só dez itens, muita coisa boa fica de fora. Mas a lista acima tem um mérito: foi com esses livros que eu aprendi computação de verdade (vale lembrar que eu sou autodidata, minha graduação foi em engenharia elétrica, e eu quase não tive computação em aulas). Se funcionou pra mim, pode ser que funcione pra você também :)

20 comentários:

  1. Tem a lista do Jeff Atwood também.

    As três listas são boas e eu gostaria de ter lido mais livros das três.

    A lista do Phillip tem o objetivo de melhorar o conhecimento de OOP de gente que já programa, a sua tem o objetivo de ensinar um leigo a programar bem e a do Jeff Atwood tem um foco maior em interface e no usuário. Tudo isso é bom.

    A verdade é, a maior parte dos programadores male male lêem um Java/C++/C# How to Program por cima e vão pro mercado. Triste isso.

    ResponderExcluir
  2. Olá Pinguim.

    Bem, a lista de livros do Philip é para quem já sabe programar (como dito no primeiro parágrafo do blog dele). Acredito que a sua lista e a dele são relativamente complementares, cada uma a seu tempo. Depois de conhecer a teoria de algoritmos, ED, uma linguagem de programação e desenvolver o espírito hacker, acredito que é necessário aprender como transformar aquele monte de idéias malucas em um código legível, reutilizável e fácil de dar manutenção no longo prazo. A lista do Philip tem ótimos livros para este segundo conjunto de objetivos, mas certamente não é "Como aprender computação", nem tinha o objetivo de ser. A sua lista certamente está bem mais próxima desse objetivo.

    Abraços e obrigado pela lista. Será muito útil.

    ResponderExcluir
  3. Vou começar faculdade de Ciência esse ano, e tô com um pouco de medo de não gostar de matemática tanto quanto é necessário...

    Vou tentar ler esses livros aí e descobrir :P

    Quem sabe eu não viro um 1337 h4x0r, né?

    ResponderExcluir
  4. Como você colocou dois livros do Meyers, vale a pena olhar essa série de artigos dele, listando os mais importantes livros, artigos e pessoas do c++:
    http://www.artima.com/cppsource/top_cpp_books.html
    Legal é essa confissão dele:
    "I have not written production software in over 20 years, and I have never written production software in C++. Nope, not ever. Furthermore, I’ve never even tried to write production software in C++, so not only am I not a real C++ developer, I’m not even a wannabe."

    ResponderExcluir
  5. Muito boa a lista de livros porposta, pena que o meu inglês é muito fraco, acho que já sai em desvantagem com relação aos demais colegas!!

    ResponderExcluir
  6. Eis a grande diferença entre a ciência (computação) e a técnica (geralmente chamada de "informática").

    A biblioteca do IME é um paraiso para quem sabe o que escolher na prateleira :-)

    Muito boa a lista!

    ResponderExcluir
  7. Achei a lista do Lameiro mais uma lista de hypes. Gostei bem mais mais da sua.

    É claro, gostei de alguns livros da lista do Lameiro, não gostei de alguns da sua e citaria alguns livros diferentes, isso sempre acontece. =)

    Se entrarmos nessa discussão – que lista cada um faria –, criaríamos um meme.

    []'s
    Cacilhas, La Batalema

    ResponderExcluir
  8. Gostei da lista, e realmente dá para fazer um "meme" da idéia...
    Acabei montando a minha lista, e vou postar no meu
    [jabá]blog[/jabá]

    Quanto à diferença entre ciência e técnica (que o cesar chamou de informática) eu acredito essa diferença está mais na prioridade e na ordem dos livros. Sou tecnólogo de formação e li os livros do Knuth, Wirth, Herbert Schildt, Meyer, etc. Mas também li Yourdon, Gane e Sarson, Brooks, entre outros... Abraços

    ResponderExcluir
  9. Boa lista, mas você está sugerindo desperdiçar muito tempo com C++ em pleno 2008; tempo que seria muito melhor gasto com o bom e velho SICP.

    Eu trabalho no Google e não sei programar. Aprender a programar leva dez anos. Estou estudando a oito, quase chegando lá… ;)

    ResponderExcluir
  10. A lista é muito boa, mas gostaria de tecer alguns comentários:

    1) o CLRS não é adotado apenas nos cursos do MIT, mas por todo departamento de computação de qualquer Universidade razoável;

    2) o CLRS não é nem de longe "extremamente formal". É um trabalho formidável, mas o formalismo do livro é apenas o minimamente necessário para um estudo decente de algoritmos (essa era a intenção dos autores). Uma discussão bem mais formal pode ser encontrada em Sedgewick, "An Introduction to the Analysis of Algorithms";

    3) Matemática Concreta é um livro sensacional e vai muito além do ferramental matemático básico. Apesar de ser uma leitura interessante para todos, não recomendo como livro de cabeceira para quem está começando, visto que apesar de conter partes de mais fácil digestão, o todo é bem difícil: pode assustar. Para quem está começando os apêndices matemáticos do CLRS já devem bastar. É verdade que uma breve olhada no Matemática Concreta, vez ou outra, pode ser útil (a sacada de integrar os dois lados de uma recorrência me fez ficar de queixo caído).

    De resto, exceto por um ou outro \epsilon, concordo com tudo o que vc disse e parabéns pelo post e pelo blog.

    ResponderExcluir
  11. Já que você falou no The Mythical Man-Month vale a pena comentar que depois de ler ele vale a pena gastar um fim de semana para ler o "Peopleware: Productive Projects and Teams" (Tom DeMarco / Timothy Lister). Ele dá algumas soluções para os problemas de administração de pessoal apontados pelo Brooks =)

    ResponderExcluir
  12. Ótima lista, mas considerando a ordem eu tiraria o Sedgewick e colocaria o SICP no lugar. O Cormen é mais formal mas é didático o bastante para poder ser usado como introdução, sabendo o que estudar na hora certa.

    ResponderExcluir
  13. Faltou algo de Dados, como o Chris Date.

    ResponderExcluir
  14. ricbit, peguei a muda de aveleiro no shalom e falei com o guri deitado ate ele mandar usar o galho pela tela pra procurar agua, mas a porca nao deixa usar nenhum objeto. lembra o que tinha que fazer? tem que fazer algo com a muda antes de usar?

    ResponderExcluir
  15. Você precisa conversar com um carinha antes. Eu não lembro o nome dele, mas é no lado oeste do mapa.

    ResponderExcluir
  16. Cara, muito legal a sua lista, muito obrigado. Já comecei a ler o GEB e estou curtindo muito!

    Pena q não tem mais prá vender em português... (a única cópia q eu achei, estão vendendo por R$ 490!!!) Mas a em inglês não é muito difícil.

    ResponderExcluir
  17. Eu não recomendaria o TAoCP ou o Matemática Concreta para iniciantes. Tem um monte de ótimos programadores por aí que nunca leram nenhum dos dois.

    Pensando em termos de utilidade para o programador atual, muita coisa no TAoCP ou é pouco relevante nas plataformas atuais, ou está em um nível de abstração muito mais baixo do que a maioria vai usar. Claro que é bom saber em maiores detalhes, ou como as coisas acontecem no nível mais baixo, mas não é absolutamente necessário.

    Dos volumes 1 e 2 tem pouca coisa que eu acho diretamente útil, por exemplo. Embora as técnicas de análise sejam sempre válidas, os algoritmos em si eu não uso. Acredito que é situação parecida com a maioria das pessoas na área.

    Acho o CLRS muito melhor para quem está atuando hoje. Tenho e li vários livros sobre algoritmos, e o CLRS, para mim, tem o equilíbrio ideal entre rigor e pragmatismo. Os exercícios são similarmente bons (os do TAoCP tendem a ser muito orientados para a matemática).

    Também incluiria o SICP, acho leitura essencial para quem quer entender a computação.

    ResponderExcluir
  18. Ah, se o cara não sabe matemática, então ele aprendeu programação mas não aprendeu computação. Tem algoritmo mais complicado que você só vai achar a complexidade se souber resolver uma série.

    ResponderExcluir
  19. Sim, me dei conta no meio do comentário que você falou sobre computação e não só programação.

    Mesmo assim, minha opinião sobre o TAoCP se mantém. E estou na dúvida se todo cientista da computação precisa saber analisar algoritmos complicados.

    Depende também dos limites do que é considerado computação. Arquitetura, análise e projeto de sistemas são computação? Engenharia de Software é computação? Um arquiteto ou analista (ou pesquisador em eng. de software) precisa saber analisar algoritmos complicados?

    Não estou colocando essas perguntas como retóricas, estou em dúvida sobre isso mesmo.

    ResponderExcluir
  20. A resposta correta é que tanto faz. O importante é que você ache uma definição para "computação" que te satisfaça, e ela não precisa necessariamente ser igual à minha. É uma aplicação direta da lei de Ricbit: http://blog.ricbit.com/2009/11/lei-de-ricbit.html

    Eu concordo que nem todo cientista da computação precisa saber analisar algoritmos complicados, só os que trabalham com tecnologia de ponta.

    ResponderExcluir