domingo, junho 09, 2013

Crítica: Dive Into Python 3

Há anos está nas minhas resoluções de ano novo o estudo de Python. Aproveitando uma iniciativa no Garoa Hacker Clube, passei as últimas semanas lendo o livro "Dive Into Python 3" de Mark Pilgrim, cujo texto está disponível on-line gratuitamente. Seguem os meus comentários da experiência.


Python

De um modo geral, Python não conseguiu ainda me entusiasmar. É uma linguagem com alguns tipos de dados e construções muito interessantes e possui bibliotecas bem abrangentes, mas tem algumas coisas que me incomodam.

Um primeiro ponto é a rigidez na formatação, com fim de linha e espaços sendo significativos. Quando aprendi a programar o mundo estava deixando para trás os cartões perfurados e suas imposições. Compiladores e programas se vangloriavam de aceitar entradas com formato livre. Desta forma, para mim, comandos finalizados por fim de linha e o uso de espaços para indicar blocos de comandos soam como retrocessos. Não que não existam boas razões para o Python ser assim.

Outro ponto que me incomoda é quanto aos tipos. Eu gosto de linguagens que obrigam a declarar as variáveis e não permitem mudar o tipo delas durante a execução. Em Python não existe declaração de variáveis e o tipo pode mudar durante a execução (dynamic typing). Embora o tipo seja conferido (strongly typed), é uma verificação em tempo de execução e a determinação do tipo é feita pelo uso e não por herança (duck typing - se comporta-se como um pato, é um pato). Não sei como são as ferramentas equivalentes ao lint para Python, mas, sem uma conferência estática que consiga analisar todos os fluxos no programa, existe o risco de um erro de tipo ficar oculto por muito tempo (até que um dia o programa siga um caminho que não tinha sido percorrido antes, uma variável tenha um tipo incorreto e resulte em um erro de execução).

Uma outra coisa que achei estranha foi o fato da versão 3 "quebrar" um número significativo de programas e bibliotecas desenvolvidos com a versão 2.

Provavelmente o uso contínuo de Python deve mitigar estes incomodos.

O Livro

"Dive Into Python 3" é uma indicação bastante comum para quem quer aprender Python. As (poucas) avaliações na Amazon são bem divididas, com a maior parte das críticas dirigidas à formatação e não ao conteúdo. Os comentários que escutei no grupo de estudos do Garoa foram fortemente positivos. Apesar de tudo isto, eu não gostei do livro.

Meu primeiro problema foi com a abordagem. Eu gosto de livros técnicos organizados como uma sequência lógica, onde cada capítulo se apoia nos fundamentos apresentados no anterior. "Dive Into Python 3" não é assim. Ele apresenta Python em uma ordem que me pareceu caótica, dando ênfase a aspectos complexos ou menores antes de fixar a base.

O capítulo 1 começa apresentando como declarar funções, sem falar antes nas regras básicas de sintaxe, tipos de dados ou controle de fluxo. Aborda ainda a ordem do diretórios onde as bibliotecas são procuradas e exceções.

O capítulo 2 apresenta os tipos de dados. Este capítulo eu gostei. É ligeiramente estranho, mas razoável, ele falar sobre um módulo para manipular frações em um capítulo intitulado "tipos de dados nativos". Uma curiosidade: Python tem dois operadores de divisão, / e //. O significado do operador / mudou do Python 2 para 3 e o operador // é descrito como uma "divisão inteira esquisita" (e que nem sempre retorna um resultado inteiro).

O capítulo 3 pula para um assunto muito interessante mas complexo: "comprehensions". Para explicar isto, faz um pequeno desvio para o acesso a diretórios. O que é "comprehension"? Uma forma de aplicar uma função a cada elemento de uma lista, dicionário ou conjunto.

O capítulo 4 volta para um assunto mais básico: strings. A maior parte do capítulo trata da questão de codificação de caracteres (Python utiliza Unicode). Em seguida há uma discussão longa sobre formatação. Outros métodos de manipulação de strings são abordados de forma mais apressada.

O capítulo 5 aborda expressões regulares. Como ele mesmo diz na primeira linha: você tinha um problema, resolve usar expressões regulares e agora tem dois problemas... É mais um assunto interessante e potencialmente útil, mas é outro módulo externo e me pergunto se aqui era o melhor ponto para falar sobre isto.

O capítulo 6 trata de outro assunto "avançado": closures e generators. O capítulo 7 expande isto para iterators, além de discutir um pouco sobre o conceito de classe. O capítulo 8 fala nos "advanced iterators" e desagua em uma discussão sobre eval.

Os capítulos 9 e 10 deixam de lado a discussão da linguagem em si, abordando unit testing e refactoring.

Os capítulo 11 e 12 tratam da manipulação de arquivos e XML. O capítulo 13 fala da serialização de objetos. O capítulo 14 se chama "HTTP Web Services", trata do uso do protocolo HTTP através das bibliotecas http.client, urlib.request e httplib2 (e não exatamente do que normalmente chamamos de Web Services).

O capítulo 15 é um exemplo meio estranho: o transporte de um módulo feito para o Python 2 para o Python 3. O capítulo 16 trata da distribuição de bibliotecas.

Fechando o livro, os apêndices: Uso do aplicativo 2to3 para migrar código do Python 2 para o 3, uma lista dos nomes dos métodos especiais sugestão de passos seguintes e um curto troubleshooting.

Veredito

Como mencionei, muita gente gosta deste livro, eu não.

Me parece um livro esquizofrênico, que não se decide entre ensinar para novatos, mostrar pontos mais complexos ou ajudar quem deseja migrar da versão 2 para a 3 de Python. Não me parece adequado para quem está aprendendo Python como primeira linguagem (e nem se propõe a isto).

De qualquer forma, o texto está à disposição para quem quiser dar uma olhada e chegar a seu próprio veredito.

4 comentários:

Marlon C Sousa disse...

uma alternativa interessante para o aprendizado de python: http://www.openbookproject.net/thinkcs/python/english3e/

Daniel Quadros disse...

Marlon, boa dica, vou dar uma olhada.

Breno Augusto Cruz Faria disse...

Daniel, tudo bem? Uma outra dica para o pessoal que quer aprender Python, em português é:
http://ricardoduarte.github.io/python-para-desenvolvedores/

Abraço.

Anônimo disse...

Bem bacana suas considerações. Sempre ouvi elogios a respeito do livro, porém essa é a primeira vez que vejo considerações 'sem paixão', trazendo maior realismo ao o que realmente o livro é.

Parabéns pelo artigo.

Abraço!