segunda-feira, 2 de janeiro de 2012

Python para quem sabe Python: relato das primeiras turmas

Em 15 novembro de 2011 lancei a oficina Python para quem sabe Python para compartilhar um pouco do que aprendi em 13 anos de uso desta linguagem. Duas semanas depois, começamos duas turmas, com 29 pessoas no total, uma aos sábados de manhã e outra 3ª e 5ª-feira à noite. Fiquei muito feliz de encontrar entre os participantes alguns ex-alunos de outros cursos, outros parceiros de projetos anteriores, amigos da comunidade Python e gente nova para mim, a maioria de outros estados (eu moro em São Paulo).

A idéia da oficina PPQSP é revelar em profundidade algumas das "armas secretas" de Python. Não são segredos de verdade, tudo está muito bem documentado, mas são recursos que muitos programadores não usam, usam sem entender, ou usam menos do que poderiam, porque são diferentes do que se encontra em Java, C#, PHP, Ruby etc.

Os principais temas foram:

Iteráveis, iteradores e geradores

O importante padrão de projeto Iterator tem suporte sintático nativo em Python desde o início, por isso temos há 20 anos o melhor comando for do mercado (ultimamente imitado por outras linguagens).

Mas o Guido não ficou por aí, e incorporou os conceitos de geradores (expressões e funções geradoras) e, a partir do Python 2.6, as classes abstratas Iterable e Iterator que formalizam e explicitam estas idéias. Com funções geradoras podemos implementar co-rotinas em Python, e isso tem o potencial de simplificar bastante a programação assíncrona usada em sistemas Web de alto desempenho.

Exploramos em profundidade iteradores e iteráveis, desde uma discussão do padrão de projeto clássico, até vários exemplos e exercícios que ilustram como ele é implementado de forma pythônica. Concluímos a oficina demonstrando uma aplicação de função geradora como co-rotina para simplificar a programação assíncrona com o framework Tornado. O exemplo final está no repositório do curso no Github.

Metaprogramação com atributos dinâmicos

Desde as funções básicas getattr e setattr, passando por propriedades (properties) e chegando até os descritores (descriptors) que tornam possível a elegante e prática sintaxe de Models do Django.

Na aula "A caminho da metaclasse" evoluimos um exemplo gradualmente, em nove etapas, desde uma pequena classe com uma property até um proto-framework para definição declarativa de modelos com atributos validados, que ilustra o uso de uma metaclasse, um dos conceitos mais avançados em orientação a objetos.

Programação funcional e programação assíncrona

Em Python funções são objetos de primeira classe: podem ser atribuídas a variáveis, passadas como argumento e até criadas em tempo de execução. Isso possibilita o estilo funcional de programação, que tem ganhado importância ultimamente.

Depois de explorar um pouco desta teoria, partimos para a prática mostrando um dos principais usos de funções como objetos: a programação assíncrona, ou orientada a eventos. Neste tipo de programa usa-se intensivamente o padrão de callbacks, por isso a passagem de funções como argumentos e a definição de funções em tempo de execução viram práticas comuns.

Desenvolvemos um script cliente HTTP assíncrono usando o framework Tornado. Verificamos que ele é, em média, 5 vezes mais rápido que o script síncrono que realiza a mesma tarefa sem usar callbacks. Em seguida apontamos uma limitação da versão assíncrona, causada pela perda de contexto, um problema comum quando se trabalha com eventos e callbacks.

Então superamos este problema refazendo a solução assíncrona de três maneiras diferentes para comparar:
  1. definindo dinamicamente uma função, para carregar o contexto em uma closure; 
  2. definindo uma classe, e levando o contexto como atributos da instância;
  3. implementando uma co-rotina via função geradora; neste caso não precisamos nos preocupar com o contexto porque toda a lógica de uma requisição de dá no escopo local da função geradora, e o callback é engolido pelo o maquinário do Tornado.

Laboratórios

Conseguimos cobrir muitos conceitos em 12h. O feedback dos alunos foi muito positivo durante as aulas, mas sempre é possível melhorar, e nestas turmas a diferença entre uma aula na primeira turma e a mesma aula na segunda turma às vezes casos foi enorme, com melhorias importantes.

O desafio deste curso não é volume do conteúdo, mas a densidade: são vários conceitos sofisticados, que só com prática a gente pode dominar. Apresentei uma lista de exercícios durante o curso, e outra depois, para discussão no fórum de alunos, com meu apoio e supervisão. Nas próximas turmas as listas de exercícios se tornam laboratórios mais integrados ao fluxo do curso, estimulando a prática desde a primeira aula.

Se você já conhece Python mas gostaria de explorar alguns dos seus recursos mais avançados e exclusivos, experimente esta oficina. A pré-inscrição para a 3ª turma de Python para quem sabe Python já está no ar: basta fornecer seu e-mail.

2 comentários:

  1. Este comentário foi removido pelo autor.

    ResponderExcluir
  2. Tive o prazer de participar dessa primeira turma na qual foi uma grande oportunidade que tive de ampliar ainda mais o meu conhecimento a cerca dessa bela linguagem e novamente Parabéns ao Luciano pela iniciativa.

    ResponderExcluir