Perfil

Flávio Juvenal @fjsj


Sobre mim

Partner at Vinta Software (www.vinta.com.br), a Brazilian firm that works on Django and React products. Loves quality code and tries to apply the Zen of Python to everything.

Vinta is hiring! Check: https://vintasoftware.typeform.com/to/sDAc6t

Propostas

Aplicando usabilidade para reusar Django apps

A própria documentação do Django diz que "Reusabilidade é o modo de vida em Python. Você só precisa escrever as partes que tornam seu projeto único". A maneira de escrever código reusável em Django é através de Django apps. É fácil desenvolver Django apps, a vasta quantidade de apps disponíveis no PyPI e no Django Packages prova isso.


No entanto, um aspecto frequentemente ignorado de apps Django é que eles também são interfaces: uma que conecta o desenvolvedor a uma solução reusável. Heurísticas de usabilidade são úteis para avaliar uma interface. Nesta talk, vamos aprender como aplicar conceitos de usabilidade para escrever Django apps melhores: mais simples, cosnsitentes, flexíveis e com menos riscos.


Os tópicos a serem discutidos incluem:
- Simplicidade
* Foco nos 80% dos casos de usos
* Reduzir o emaranhado para os 80%
* "Progressive disclosure"
* Bom comportamento padrão
* Inputs amigáveis
* Como criar abstrações
* Abstrações vazadas: "The Law of Leaky Abstractions"
- Consistência
* "Recognition rather than recall"
* Idiomas de Django
* Interfaces declarativas
* Similar junto, diferente separado
* Falsa consistência
- Flexibilidade
* Deixando os 20% dos casos de usos possível
* Aumentando a granularidade
* Múltiplos níveis de abstração
* Extensibilidade dos idiomas de Django
* Aumentando as oportunidades de extensão
- Risco
* Comportamento perigoso por padrão
* Prevenindo erros comuns
* "Fail-fast"

Como fazer boas libs? O que torna uma biblioteca fácil de usar

Não é fácil escrever uma biblioteca boa. É difícil agradar a todos. Mas também é difícil agradar até quem acha que a nossa biblioteca faz algo útil. Não é fácil nem mesmo quando fazemos algo reusável só para nós mesmos.


Ainda bem que muitos outros programadores já erraram antes de nós. E que Python tem exemplos de dezenas de boas bibliotecas com as quais podemos nos inspirar.


Essa palestra resumirá o que torna uma biblioteca boa, de acordo com nossa experiência e com a experiência de outros programadores que já escreveram sobre isso. Algumas características de boas bibliotecas são:
- Pouco fluxo
- Poucos efeitos colaterais
- Interesses claros e separados
- Alta valência
- Baixa verbosidade
- Consistência
- Muitos dados puros
- Baixo risco


Como você pode ver, alguns aspectos acima são similares ao Zen of Python. Por isso também mostraremos funcionalidades do Python que ajudam a programar boas interfaces. Além disso, para resumir tudo definiremos um checklist que você poderá usar sempre que for escrever um módulo reusável. Esperamos que isso ajude você a programar melhor, o que certamente agradará seus parceiros de trabalho e a comunidade.

Como fazer boas libs? O que torna uma biblioteca fácil de usar

Não é fácil escrever uma biblioteca confortável de usar. É difícil agradar a todos. Mas também é difícil agradar até quem acha que a nossa biblioteca faz algo útil. Não é fácil nem mesmo quando fazemos algo reusável só para nós mesmos.


Ainda bem que muitos outros programadores já erraram antes de nós. E existem em Python e fora dele diversos exemplos de boas libs nas quais podemos nos inspirar.


Essa palestra resumirá o que torna uma biblioteca boa, de acordo com nossa experiência e com a experiência de outros programadores que já escreveram sobre isso. Algumas características de boas bibliotecas são:



  • Alta Consistência

  • Muitos dados puros

  • Baixa Verbosidade

  • Respeito ao Principle of Least Astonishment

  • Alta Extensibilidade

  • Baixa Retenção

  • Vários níveis de abstrações

  • Alta granularidade

  • Interesses claros e separados

  • Pythonica


Como você pode ver, alguns aspectos acima são similares ao Zen of Python. Por isso também mostraremos funcionalidades do Python que ajudam a programar boas interfaces. Além disso, para resumir tudo definiremos um checklist que você poderá usar sempre que for escrever um módulo reusável. Esperamos que isso ajude você a programar melhor, o que certamente agradará seus parceiros de trabalho e a comunidade.


UPDATE: Slides em: http://www.vinta.com.br/blog/2016/python-brasil12-talks/

Como fazer boas libs? O que torna uma biblioteca fácil de usar

Não é fácil escrever uma biblioteca boa. É difícil agradar a todos. Mas também é difícil agradar até quem acha que a nossa biblioteca faz algo útil. Não é fácil nem mesmo quando fazemos algo reusável só para nós mesmos.


Ainda bem que muitos outros programadores já erraram antes de nós. E que Python tem exemplos de dezenas de boas bibliotecas com as quais podemos nos inspirar.


Essa palestra resumirá o que torna uma biblioteca boa, de acordo com nossa experiência e com a experiência de outros programadores que já escreveram sobre isso. Algumas características de boas bibliotecas são:
- Pouco fluxo
- Poucos efeitos colaterais
- Interesses claros e separados
- Alta valência
- Baixa verbosidade
- Consistência
- Muitos dados puros
- Baixo risco


Como você pode ver, alguns aspectos acima são similares ao Zen of Python. Por isso também mostraremos funcionalidades do Python que ajudam a programar boas interfaces. Além disso, para resumir tudo definiremos um checklist que você poderá usar sempre que for escrever um módulo reusável. Esperamos que isso ajude você a programar melhor, o que certamente agradará seus parceiros de trabalho e a comunidade.

Como procurar questões técnicas no Google, ou seja, como programar

Para ser um(a) bom(oa) programador(a) é necessário uma boa dose de estudos. Todo(a) desenvolvedor(a) precisa de bases sólidas em conhecimentos necessários a programação: estruturas de dados, algoritmos, bancos de dados, sistemas operacionais e etc.  

Mas mesmo tendo uma boa base, durante seu trabalho o(a) desenvolvedor(a) encontra problemas bem específicos que travam seu progresso, tais como: bugs, comportamento inesperado, problemas de configuração e falta de ferramentas para atingir um objetivo. Quase sempre alguém já teve este mesmo problema e a solução está escondida em alguma parte da internet. O problema é como encontrar essa solução!  

Além disso, nem toda biblioteca, ferramenta ou linguagem tem uma boa documentação, o que torna difícil encontrar respostas para dúvidas específicas sem realizar uma busca geral.  

Nesta palestra vamos ensinar a procurar dúvidas técnicas de programação de forma efetiva no Google. E também como avaliar a qualidade das soluções encontradas. Saber realizar boas buscas e ter senso crítico diante do que for encontrado é essencial para programar bem. Vamos ajudar você a desenvolver essas capacidades com dicas, truques e boas práticas em buscas por soluções de programação no Google.

Como procurar questões técnicas no Google, ou seja, como programar

Para ser um(a) programador(a) de qualidade é necessário uma boa dose de estudos. Todo(a) desenvolvedor(a) precisa de bases sólidas em conhecimentos necessários a programação: estruturas de dados, algoritmos, bancos de dados, sistemas operacionais e etc.


Mas mesmo tendo uma boa base, durante seu trabalho o(a) desenvolvedor(a) encontra problemas bem específicos que travam seu progresso, tais como: bugs, comportamento inesperado, problemas de configuração e falta de ferramentas para atingir um objetivo. Quase sempre alguém já teve este mesmo problema e a solução está escondida em alguma parte da internet. O problema é como encontrar essa solução!


Além disso, nem toda biblioteca, ferramenta ou linguagem tem uma boa documentação, o que torna difícil encontrar respostas para dúvidas específicas sem realizar uma busca geral.


Nesta palestra vamos ensinar a procurar dúvidas técnicas de programação de forma efetiva no Google. E também como avaliar a qualidade das soluções encontradas. Saber realizar boas buscas e ter senso crítico diante do que for encontrado é essencial para programar bem. Vamos ajudar você a desenvolver essas capacidades com dicas, truques e boas práticas em buscas por soluções de programação no Google.

Como procurar questões técnicas no Google, ou seja, como programar

Para ser um(a) programador(a) de qualidade é necessário uma boa dose de estudos. Todo(a) desenvolvedor(a) precisa de bases sólidas em conhecimentos necessários a programação: estruturas de dados, algoritmos, bancos de dados, sistemas operacionais e etc.


Mas mesmo tendo uma boa base, durante seu trabalho o(a) desenvolvedor(a) encontra problemas bem específicos que travam seu progresso, tais como: bugs, comportamento inesperado, problemas de configuração e falta de ferramentas para atingir um objetivo. Quase sempre alguém já teve este mesmo problema e a solução está escondida em alguma parte da internet. O problema é como encontrar essa solução!


Além disso, nem toda biblioteca, ferramenta ou linguagem tem uma boa documentação, o que torna difícil encontrar respostas para dúvidas específicas sem realizar uma busca geral.


Nesta palestra vamos ensinar a procurar dúvidas técnicas de programação de forma efetiva no Google. E também como avaliar a qualidade das soluções encontradas. Saber realizar boas buscas e ter senso crítico diante do que for encontrado é essencial para programar bem. Vamos ajudar você a desenvolver essas capacidades com dicas, truques e boas práticas em buscas por soluções de programação no Google.

E-commerce com django-oscar

Como utilizar a lib django-oscar para construir um e-commerce completo e personalizado. O Oscar permite a criação de e-commerces com diversas funcionalidades como suporte a produtos digitais e físicos, promoções, vouchers, integração com gateways de pagamento, etc.

Fazendo apresentações real-time com Jupyter

Já pensou em fazer apresentações inserindo comandos em um intepretador de Python, mas tem dificuldade em digitar tudo manualmente? Com o Jupyter e o RISE você consegue gerar slides em reveal.js que suportam execução de Python em tempo real.


Nesta palestra vamos ensinar a fazer essas apresentações e customizá-las. Tomaremos como base o que foi feito na palestra Python WAT, apresentada na Python Nordeste 2016.

Fazendo apresentações real-time com Jupyter

Já pensou em fazer apresentações inserindo comandos em um intepretador de Python, mas tem dificuldade em digitar tudo manualmente? Com o Jupyter e o RISE você consegue gerar slides em reveal.js que suportam execução de Python em tempo real.


Nesta palestra vamos ensinar a fazer essas apresentações e customizá-las. Tomaremos como base o que foi feito na palestra Python WAT, apresentada na Python Nordeste 2016.

Fix My Django - repositório de soluções para erros e exceções do Django

Em desenvolvimento: https://github.com/vintasoftware/fixmydjango


Fix My Django (http://fixmydjango.com) é um site que agrega exceções comuns do Django e mostra como solucioná-las. O diferencial é que você pode instalar a lib do Fix My Django em seu projeto e quando uma exceção ocorrer no devserver, caso esta exceção esteja listada no Fix My Django, o template de erro exibirá um link para as possíveis soluções (exemplo aqui: https://s3.amazonaws.com/fixmydjango/Screen+Shot+2015-07-07+at+13.46.54.png).


Na palestra discutirei como a lib do Fix My Django foi implementada e como a comunidade pode contribuir para expandí-lo para tornar Django um framework ainda mais amigável para iniciantes.


Sobre o autor:
Flávio Juvenal é sócio da Vinta, um studio de software de Recife/PE especializado no desenvolvimento web e mobile, sempre utilizando Django como a primeira escolha para framework web. A Vinta atende clientes de todo o Brasil e também de Nova Iorque e São Francisco.

HATEOAS: construindo APIs realmente RESTful

Você quer ser cool e ter uma API RESTful? Desculpa, mas o que é realmente cool ultimamente são Hypermedia APIs? É, isso é bem hipster, então você pode não ter ouvido falar sobre.  

A ideia por trás das Hypermedia APIs é o HATEOAS (Hypermedia as the Engine of Application State). Esse é o pior acrônimo da história, mas é uma boa ideia. A web em si é uma grande obra de engenharia e ela é possível graças ao HATEOAS. Então por que não usar esse poder em nossas APIs?  

Nesta palestra vamos explicar em termos práticos o que são Hypermedia APIs e porque você deve aspirar que suas APIs sejam assim. Vamos trabalhar com um exemplo divertido em Django REST Framework para demonstrar como a Hypermedia facilita as transições que guiam o estado da aplicação para frente.

HATEOAS: construindo APIs realmente RESTful

Você quer ser cool e ter uma API RESTful? Desculpa, mas o que é realmente cool ultimamente são Hypermedia APIs? É, isso é bem hipster, então você pode não ter ouvido falar sobre.


A ideia por trás das Hypermedia APIs é o HATEOAS (Hypermedia as the Engine of Application State). Esse é o pior acrônimo da história, mas é uma boa ideia. A web em si é uma grande obra de engenharia e ela é possível graças ao HATEOAS. Então por que não usar esse poder em nossas APIs?


Nesta palestra vamos explicar em termos práticos o que são Hypermedia APIs e porque você deve aspirar que suas APIs sejam assim. Vamos trabalhar com um exemplo divertido em Django REST Framework para demonstrar como a Hypermedia facilita as transições que guiam o estado da aplicação para frente.

HATEOAS: construindo APIs realmente RESTful

Você quer ser cool e ter uma API RESTful? Desculpa, mas o que é realmente cool ultimamente são Hypermedia APIs? É, isso é bem hipster, então você pode não ter ouvido falar sobre.


A ideia por trás das Hypermedia APIs é o HATEOAS (Hypermedia as the Engine of Application State). Esse é o pior acrônimo da história, mas é uma boa ideia. A web em si é uma grande obra de engenharia e ela é possível graças ao HATEOAS. Então por que não usar esse poder em nossas APIs?


Nesta palestra vamos explicar em termos práticos o que são Hypermedia APIs e porque você deve aspirar que suas APIs sejam assim. Vamos trabalhar com um exemplo divertido em Django REST Framework para demonstrar como a Hypermedia facilita as transições que guiam o estado da aplicação para frente.

Não é bem assim... quando Python não é como você espera

Apesar de ser uma linguagem bonita e fácil de aprender, nem tudo em Python é como esperamos. Vamos explorar aspectos da linguagem que não são triviais e oferecer alternativas. Esta palestra é essencial para iniciantes, mas pode prover insights para pythonistas experientes também.


Alguns dos tópicos que vamos explorar:
- Esquecendo __init__.py
- Esquecendo parênteses
- Escopo
- Referências
- Operador is
- Variáveis de classe
- Argumentos default mutáveis
- Closures com late binding
- Sobrescrevendo a biblioteca padrão sem querer
- Capturando múltiplas exceções
- .pyc

Normalização: quando usar e quando não usar em Django

Normalização é definido como o processo de (re)estruturar um banco de dados de acordo com várias "formas normais", isto é, conjuntos de critérios que uma arquitetura de banco deve seguir para garantir a integridade dos dados.


Para manter uma aplicação Django, desenvolvedores precisam adicionar ou remover campos e tabelas no banco de dados. Mas é fácil introduzir mudanças que levam a redundância ou inconsistências por conta de violações de normalização. Frequentemente, desenvolvedores não sabem exatamente como seguir as regras das formas normais devido ao excesso de formalismo nelas. É difícil entender qual aplicação prática de uma regra como "cada atributo não-chave não deve possuir dependência transitiva para cada chave candidata". Essa palestra visa remediar isso ao mostrar exemplos práticos em Django que discutem as formas normais mais importantes, além de bibliotecas que ajudam a manter a consistência quando não é possível ou desejável seguir certas formas normais.


Os tópicos a serem abordados incluem:


- Filosofia DRY do Django: "Cada dado deve estar em um, e apenas um, lugar. Redundância é ruim. Normalização é bom."
- Formas normais explicadas em linguagem amigável com exemplos em Django
- Migrando os dados ao normalizar
- Quando não normalizar:
  * Complexidade desnecessária, ex. endereço de usuário
  * Problemas de performance
- Evitando desnormalização:
  * Annotations e aggregations
  * Caching
- Sem normalização, padrões e bibliotecas para garantir consistência:
  * django-denorm
  * django-model-utils FieldTracker
  * save e signals

Prevenindo dores de cabeça com linters e checagens automáticas

É comum usar linters como flake8 para checar a sintaxe e o padrão de código em projetos Python. Porém, ainda é raro o uso de outras checagens automáticas que podem evitar problemas de legibilidade, segurança, configuração, erros comuns, etc. Por exemplo:


- Seus imports são uma bagunça? Sem ordem, misturando módulos da stdlib com externos? Organize-os automaticamente com um clique usando isort.
- Cansado de checar se as libs que você usa receberam atualizações de segurança? Deixe safety fazer isso para você.
- Quer impedir que código inseguro entre no seu projeto? Escreva análises estáticas customizadas com bandit.
- Estressado com seu colega que deu push em um arquivo de vários MBs no repositório, deixando-o lento? Ou com outro que commitou com um pdb no código? Impeça esses erros de serem commitados com um pre-commit hook.
- Esqueceu funções e classes não usadas no código? Previna isso usando vulture.


Como podemos ver nos exemplos acima, muitos problemas podem ser evitados através do uso de linters, os quais podem ser integrados em tempo de commit ou de continous integration. Nesta palestra, apresentaremos os linters listados acima e outros, explicaremos como utilizá-los e detalharemos quais boas práticas eles cobrem. Além disso, como Django é um dos frameworks web mais utilizados em Python, abordaremos o Django system check framework, o qual pode ser utilizado para escrever checagens customizadas integradas a ele.

Python WAT: quando Python não é como você espera

Apesar de ser uma linguagem elegante, intuitiva e fácil de aprender, nem tudo em Python é como esperamos. Vamos explorar aspectos da linguagem que não são triviais e oferecer alternativas. Esta palestra é essencial para iniciantes, mas pode prover insights para pythonistas experientes também.


Os tópicos a serem abordados são:
- Sobrescrevendo a Biblioteca Padrão
- Identidade de objetos
- Referências
- Atribuição em tuplas
- Escopo
- Variáveis de classe
- Argumentos default mutáveis
- Closures com late binding


Esta palestra é similar a que foi apresentada na Python Nordeste 2016, mas contará com recursos de introspecção para exibição dos memes.

Python WAT: quando Python não é como você espera

Apesar de ser uma linguagem elegante, intuitiva e fácil de aprender, nem tudo em Python é como esperamos. Vamos explorar aspectos da linguagem que não são triviais e oferecer alternativas. Esta palestra é essencial para iniciantes, mas pode prover insights para pythonistas experientes também.


Os tópicos a serem abordados são:
- Sobrescrevendo a Biblioteca Padrão
- Identidade de objetos
- Referências
- Atribuição em tuplas
- Escopo
- Variáveis de classe
- Argumentos default mutáveis
- Closures com late binding


Esta palestra é similar a que foi apresentada na Python Nordeste 2016, mas contará com recursos de introspecção para exibição dos memes.

[Web] [BD] Normalize até machucar, desnormalize até funcionar em Django

Esta palestra foi apresentada na Python Nordeste 2018. Slides disponíveis em: http://bit.ly/pyne-normal


Será que você como programador Django realmente leva em consideração todas possíveis redundâncias de dados dos seus models? Tudo bem, talvez na primeira vez que você definiu seu esquema de banco de dados você tenha pensado nisso, mas e quando fez sua última migração? Será que o novo campo que você introduziu não é redundante pois é computável a partir de outros campos?


Muitos desenvolvedores, mesmo os mais experientes, ignoram a boa prática que é considerar o BD como uma representação de fatos sobre a realidade. Se houver mais de uma maneira de extrair um único fato do BD, então há uma redundância nele! No pior caso, uma redundância pode causar anomalias nos dados e bugs na aplicação. No melhor caso, uma redundância exige mais código de aplicação com testes para manter dados redundantes consistentes. Ou seja, redundância é uma dor de cabeça! Será que existe uma forma inteligente de descobrir e evitar redundância de dados? Ou quando for necessário ser redundante por questões de performance, fazer dados computados com o mínimo de código e o máximo de automação? A resposta é sim: com técnicas de Normalização e Desnormalização respectivamente.


Normalização é um processo que envolve seguir uma série de regras para reestruturar um banco de dados sem perder os fatos originais representados por ele. O conjunto tradicional dessas regras são as Formas Normais: 1NF, 2NF, etc... sim, aquela coisa chata e super formal que alguns já viram. Mas, na verdade, nem as formas normais são suficientes para evitar tipos comuns de redundância*! Por isso, nesta palestra você aprenderá uma regra mais geral sobre normalização em uma linguagem amigável. Mostraremos diferentes exemplos em Django sobre redundâncias não-triviais e como resolvê-las. Também veremos como query expressions, uma funcionalidade de Django que muitos não conhecem e que permite evitar redundâncias ao computar dados em momento de consulta.


Sabendo que Normalização pode gerar problemas de performance, vamos discutir Desnormalização, que é diferente de não-normalizar. Na realidade, desnormalizar significa usar técnicas como cronjobs, indexes, caching, materialized views, triggers e NoSQL para agilizar consultas em uma tabela normalizada sem perder consistência.


Com os insights sobre Normalização e Desnormalização apresentados nesta palestra, programadores Django aprenderão novas técnicas para ter um BD que representa fatos sobre a realidade sem inconsistências.



* Talvez você duvide disso, mas realmente as Formas Normais só discutem dependências (e por sua vez redundâncias) em uma única tabela, ignorando dependências entre tabelas que são muito comuns em aplicações reais. Mais sobre isso neste artigo revisado por Codd, Fagin e Date, figuras chave do modelo relacional.