< html >
< head >
< meta charset = "utf-8" / >
< title > Desculpe Python, Não Sou Eu, É Você< / title >
< meta name = "apple-mobile-web-app-capable" content = "yes" >
< meta name = "apple-mobile-web-app-status-bar-style" content = "black-translucent" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui" >
<!-- <link rel="stylesheet" href="dist/reset.css"> -->
<!-- <link rel="stylesheet" href="dist/reveal.css"> -->
<!-- <link rel="stylesheet" href="dist/theme/night.css" id="theme"> -->
< link rel = "stylesheet" href = "reveal.js/css/reveal.css" >
< link rel = "stylesheet" href = "reveal.js/css/theme/night.css" id = "theme" >
<!-- Code syntax highlighting -->
< link rel = "stylesheet" href = "dist/highlight/zenburn.css" >
<!-- Printing and PDF exports -->
< script >
var link = document.createElement( 'link' );
link.rel = 'stylesheet';
link.type = 'text/css';
link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
document.getElementsByTagName( 'head' )[0].appendChild( link );
< / script >
<!-- [if lt IE 9]>
< script src = "lib/js/html5shiv.js" > < / script >
<![endif]-->
< style type = "text/css" media = "screen" >
.happy {
color: yellow;
}
.reveal section img {
border: none;
}
.reveal ul.empty {
list-style: none inside;
}
.revel ul.empty li {
display: block;
}
.cursor {
background-color: #666;
color: white;
}
img {
max-height: 90%;
}
td.seen {
font-style: italic;
font-weight: bold;
}
.semi-opaque {
background-color: rgba(0, 0, 0, 0.7);
}
.sidebyside {
display: flex;
}
.side {
flex: 1;
}
< / style >
< / head >
< body >
< div class = "reveal" >
< div class = "slides" >
< section data-background = "_images/dear-john.jpg" data-header >
< h2 class = "semi-opaque" >
Desculpe Python, Não Sou Eu, É Você
< / h2 >
< / section >
< section >
< h2 > Quem?< / h2 >
< / section >
< section data-background = "_images/me-background.png" >
< div class = "semi-opaque" >
< h3 > Júlio Biason< / h3 >
< ul class = "empty" >
< li > Programador a 30 anos< / li >
< li > Programando em Python desde 1998< / li >
< li > Praticante de mototerapia< / li >
< li > Trekkie< / li >
< / ul >
< / div >
< / section >
< section >
< h3 > JulioBiason.me< / h3 >
< ul >
< li > < a href = "https://presentations.juliobiason.me/" > Presentations< / a > < / li >
< li > < a href = "https://blog.juliobiason.me/" > Blog< / a > < / li >
< li > < a href = "https://git.juliobiason.me/" > Git< / a > < / li >
< li > < a href = "https://resume.juliobiason.me/" > CV/Resumé< / a > < / li >
< li > < a href = "https://books.juliobiason.me/" > Books< / a > < / li >
< / ul >
< p class = "fragment" > + < a href = "https://functional.cafe/@juliobiason" > https://functional.cafe/@juliobiason< / a > < / p >
< p class = "fragment" > + julio.biason@pm.me< / p >
< / section >
< section >
< h3 > O Flerte< / h3 >
< / section >
< section >
<!-- C para bolsa, ainda não num relacionamento abusivo -->
< img src = "_images/tng-selar.webp" class = "stretch" >
< aside class = "notes" >
Então, tava eu lá na univerdade, fazendo minhas
coisinha na bolsa de inicialização científica, vivendo
com C, que apesar de não dar muito certo, e ter seus
momentos meio abusivos, eu respeito pacas até hoje...
< / aside >
< / section >
< section >
< img src = "_images/tng-duras-sisters.gif" class = "stretch" >
< aside class = "notes" >
... e teve momentos em que eu precisava de ajudar pra processar os
resultados desses programas em C, e aí o pessoal me falou do AWK...
... mas AWK era esquisitão, até fazia as coisas que eu
precisava, mas não era uma conversa em que os dois
falavam de forma simples e clara...
< / aside >
< / section >
< section >
< img src = "_images/ds9-ishka.gif" class = "stretch" >
< aside class = "notes" >
Também me falaram de Perl, mas só pra ver como ele
conversava, já dava pra ver a gente nunca ia se
entender direito.
< / aside >
< / section >
< section >
< img src = "_images/tng-marina.gif" class = "stretch" >
< aside class = "notes" >
... até que alguém falou "Fala ali com Python". E,
nossa, a conversa rolou solta.
< / aside >
< / section >
< section >
< h3 > O Início do Relacionamento< / h3 >
< / section >
< section >
< img src = "_images/tng-deanna-troi-mosaic.jpg" class = "stretch" >
< / section >
< section >
< h4 > "Vamos fazer um browser em Python!"< / h4 >
< small >
- Bando de sem-noção na universidade, eu incluso.
< / small >
< / section >
< section >
<!-- simulador de hardware, pra entregar projeto antes do resto -->
< img src = "_images/graph.png" class = "stretch" >
< aside class = "notes" >
Teve um projeto de hardware que eu tava trabalhando na
parte de apresentação dos dados, a parte do hardware e
inteface com a mesma não tava pronta, nós fizemos um
"simulador" das respostas da interface e entregamos o
projeto antes do hardware!
< / aside >
< / section >
< section >
< h3 > Relacionamento Sério< / h3 >
< / section >
< section >
< img src = "_images/sydney.jpg" class = "stretch" >
< aside class = "notes" >
Em 2007, por causa do nosso relacionamento, a gente foi
parar na Austrália, em Sydney.
< / aside >
< / section >
< section >
< img src = "_images/tilefile.jpg" class = "stretch" >
< aside class = "notes" >
A empresa era chamada Tilefile, e a gente trava
trabalhando no backend, antes de Django, antes de
Flask, e fazendo coisas malucas, como guardar os dados
como pickle, e depois adicionando uma camada que lia de
um banco de dados e retornava no mesmo formato do
pickle.
< / aside >
< / section >
< section >
< img src = "_images/mitter.png" class = "stretch" >
< aside class = "notes" >
... e, depois de um dia juntos no trabalho, eu chegava
em casa e ficava mais tempo com Python, trabalhando num
cliente para o Twitter, antes de ser X, e mais antes
ainda deles fecharem a API.
< / aside >
< / section >
< section >
< img src = "_images/tng-deanna-ricker-bridge.gif" class = "stretch" >
< aside class = "notes" >
Assim, a gente tava o tempo todo junto no trabalho...
< / aside >
< / section >
< section >
< img src = "_images/tng-deanna-riker-off-bridge.gif" class = "stretch" >
< aside class = "notes" >
... e em casa.
< / aside >
< / section >
< section >
< h3 > Separação Não Prevista< / h3 >
< / section >
< section >
< img src = "_images/snw-chapel.webp" class = "stretch" >
< aside class = "notes" >
Aí eu tive que voltar pro Brasil, e a gente teve que se
separar.
O que eu consegui foi um trabalho em PHP, mas por baixo
dos panos eu tentei fazer uma integração de uma
biblioteca em C++ em Python, e aprendi da pior forma o
quão horrível a biblioteca ctypes é.
< / aside >
< / section >
< section >
< h3 > A Volta da Paixão< / h3 >
< / section >
<!-- surgiu a chance de trabalhar junto de novo -->
< section >
< img src = "_images/tng-lavelle-promotion.webp" class = "stretch" >
< / section >
<!-- ... mas virou objective - c -->
< section >
< img src = "_images/ent-tpol.webp" class = "stretch" / >
< aside class = "notes" >
Mas o projeto em Python acabou virando 1 ano de
Objective-C.
< / aside >
< / section >
< section >
< img src = "_images/tng-q-snap.gif" class = "stretch" >
< aside class = "notes" >
E finalmente surgiu o projeto em Python, com Flask.
< / aside >
< / section >
< section >
< img src = "_images/consuela-lemon-pledge.gif" class = "stretch" >
< aside class = "notes" >
Quando eu finalmente consegui voltar a programar com Python,
fizemos um framework em cima do Flask chamado "Consuela", que
eu fiquei sabendo anos depois que a empresa para qual eu fiz
ainda estava usando.
< / aside >
< / section >
<!-- Django -->
< section >
< img src = "_images/tng-troi-cowboy.webp" class = "stretch" / >
< aside class = "notes" >
E em Django.
< / aside >
< / section >
< section >
< h3 > Nova Separação< / h3 >
< / section >
< section >
< img src = "_images/tos-kirk-sidelook.webp" class = "stretch" >
< aside class = "notes" >
Mas aí eu resolvi mudar de empresa, acabei caindo num
projeto Java.
< / aside >
< / section >
< section >
<!-- <img src="_images/voy - janeway - congratulations.webp" class="stretch"> -->
< img src = "_images/ds9-dax-kick-ass.gif" class = "stretch" >
< aside class = "notes" >
Por fora, eu comecei a olhar para Rust, porque era o
burburinho que tava se falando na época -- e eu tava
entediado com Java, e queria aprender algo novo.
"Uma linguagem que não muda a sua forma de pensar em
programação, não vale a pena ser aprendida -- Alan Perlis"
< / aside >
< / section >
< section >
< h3 > Mais do Mesmo< / h3 >
< / section >
< section >
< img src = "_images/tng-troi-cowboy2.gif" class = "stretch" >
< aside class = "notes" >
Quando eu consegui voltar pro Python, eu voltei também
com Django. E aí a situação já tava morna, era algo
como "mais do mesmo", "caí na rotina"...
< / aside >
< / section >
< section >
<!-- <img src="_images/voy - janeway - correct.webp" class="stretch"> -->
< img src = "_images/ds9-dax-eyebrows.gif" class = "stretch" >
< aside class = "notes" >
Por algum motivo, eu continuei tentando aprender Rust.
Várias coisas "clicaram" do jeito certo com a
linguagem.
Teve inclusive um pequeno projeto que eu fiz com
websockets que precisava de performance (dados vindos
com muita frequencia) e que entraria com outro projeto
em C++, mas controle de dependências em C++ é um porre
do inferno, e eu estava preocupado que Python não teria
a performance necessária. No fim, até meu chefe (que
fez a parte em C++) disse que o código ficou bonito.
< / aside >
< / section >
< section >
< h3 > O Começo das Brigas< / h3 >
< / section >
<!-- Múltiplas versões, incluindo não - mantidas -->
< section >
< div class = "sidebyside" >
< div class = "side" >
< img src = "_images/tng-deanna-riker-hug.gif" style = "float:left;width=200px" >
< / div >
< div class = "side" >
< img src = "_images/tng-deanna-riker-hug-2.gif" style = "float:right;width=200px" >
< / div >
< / div >
< aside class = "notes" >
A máquina de testes usa Python 3.6.
Usuários instalam as versões mais novas.
Tem que funcionar em todas.
("Vou usar o Walrus operator! Olha que lindo!" "Não tem
Walrus no 3.6")
Não só isso, mas cada desenvolvedor tem uma máquina
diferente, tem alguns ainda usando OpenSUSE15 (que
perdeu suporte em 2018!) e não querem mudar porque para
o que eles precisam fazer, funciona.
< / aside >
< / section >
< section >
< img src = "_images/tng-enterprise-explodes.gif" class = "stretch" >
< aside class = "notes" >
Tentar distribuir scripts nesse ambiente é sofrimento
que não termina mais. É versão diferente de Python, é
diferenças entre distribuições.
Install no WSL quebrava pacotes por culpa da versão do
Python no sistema.
Gerado EXE (com Nuitka) começou a explodir o Git.
< / aside >
< / section >
< section >
< img src = "_images/ds9-dax-bathlet.jpg" class = "stretch" >
< aside class = "notes" >
Adivinha quem veio me salvar desses problemas?
< / aside >
< / section >
< section >
< p > < code >
pip install < span class = "fragment" > --break-system-packages< / span >
< / code > < / p >
< aside class = "notes" >
A gota d'água veio quando eu fui tentar empacotar um
script dentro de um docker pra rodar por dentro do
sistema de CI (e evitar todos os problemas que eu tava
tendo até o momento). Peguei a versão mais nova do
Ubuntu, criei meu docker file com "run apt update",
"run apt upgrade", "run apt install python", "run pip
install [pacote]" e fui agraciado pela mensagem que eu
tenho que ter um virtualenv.
< / aside >
< / section >
< section >
< img src = "_images/tos-kirk-what.gif" class = "stretch" >
< / section >
< section >
< img src = "_images/tng-picard-slow-facepalm.gif" class = "stretch" >
< aside class = "notes" >
Quer dizer que não tem uma forma de isolar instalações
de Python?
< / aside >
< / section >
< section >
< img src = "_images/tos-kirk-slap.gif" class = "stretch" >
< aside class = "notes" >
POR QUE DIABOS EU TENHO QUE USAR VIRTUALENV ENQUANTO
QUE O DEBIAN NÃO PRECISA?
< / aside >
< / section >
< section >
< h3 > Despedida< / h3 >
< / section >
< section >
< img src = "_images/tng-data-goodbye.gif" class = "stretch" >
< / section >
<!-- rust tá resolvendo tudo de forma melhor, mesmo que mais trabalhoso -->
< section >
< img src = "_images/friendship-py-ended.jpg" class = "stretch" / >
< aside class = "notes" >
Mesmo com o trabalho que é fazer, Rust tem resolvido as
coisas de forma muito melhor.
Perdi na sintaxe, ganhei em todos os demais aspectos:
Eu consigo facilmente compilar para qualquer Linux (e
até pra Windows a partir do Linux), eu posso atualizar
a linguagem sem problemas.
< / aside >
< / section >
< section >
< img src = "_images/tng-picard-sigh.gif" class = "stretch" >
< / section >
< section >
< h2 > Falando sério...< / h2 >
< / section >
< section >
< h3 > O Projeto< / h3 >
< p > Não é o padrão de 90% das instalações do Python, em que
ele pode ser completamente isolado (Docker) ou roda em
uma máquina apenas (CD).< / p >
< / section >
< section >
< p > ... mesmo assim, quanto tempo se sabe que distribuição
de pacotes é um porre e não se olha isso com seriedade?< / p >
< aside class = "notes" >
Outro problema que pode se ter com pacotes é que a
lista de dependências pode forçar atualizar coisas que
a gente não quer.
Armin Ronacher -- Flask -- postou recentemente uma
idéia de como ter múltiplas versões de um mesmo pacote
num projeto.
Aliás, cadê vendoring?
Cadê PyPI privado?
< / aside >
< / section >
<!-- <section> -->
<!-- <h3>Problema de HTTP:</h3> -->
<!-- <p> -->
<!-- Anos de surras com wget/curl/etc me ensinaram como -->
<!-- autenticar a requisição e como fazer pip sem -->
<!-- precisar que usuário se autentique. -->
<!-- </p> -->
<!-- <aside class="notes"> -->
<!-- Por sorte eu sei como URLs funcionam, e sei como fazer -->
<!-- uma requisição HTTP autenticada que funciona em -->
<!-- qualquer lugar. -->
<!-- </aside> -->
<!-- </section> -->
< section >
<!-- ferramentas pra python não estão mais sendo escritas em Python (ruff, uv, Pyright) -->
< h3 > Para Python, não Python:< / h3 >
< ul >
< li > < code > ruff< / code > : Rust< / li >
< li > < code > uv< / code > : Rust< / li >
< li > < code > Pyright< / code > : JavaScript< / li >
< li > (< code > ruff-ls< / code > : Rust)< / li >
< / ul >
< / section >
< section >
< img src = "_images/python-poetry.png" class = "stretch" >
< aside class = "notes" >
Só pra ter uma ideia: Poetry, que é o primeiro
gerenciador de pacotes pra Python a suportar
o pyproject, costuma entrar em loops e ficar
30 minutos resolvendo dependencias.
O npm é em JavaScript -- JavaScript! -- e resolve
dependencias muitíssimo mais rápido (e olha que é
JS e tudo tem 2000 dependências!)
< / aside >
< / section >
<!-- parece estar indo pro lado certo, mas extremamente lento (falta de interesse?) -->
< section >
< h3 > Algumas melhorias...< / h3 >
< ul >
< li > GIL-less Python< / li >
< li > JIT compilation< / li >
< / ul >
< aside class = "notes" >
GIL-less Python pode melhorar performance,
mas a gente sabe que o que precisa de performance
está em C, e eles mesmos tem os controles
de threads do lado deles. GIL-less Python
facilita pra integração desses usos
(e não porque vai ser mais rápido em Python)
JIT... De novo, performance vem de C, e
considerando o eco-sistema, é bem difícil
de conseguir alcançar algo parecido com o
que é o Lua -- e muito menos Java, que tem
40 anos de pesquisa em como fazer um JIT.
< / aside >
< / section >
< section >
< img src = "_images/disc-earth.jpg" class = "stretch" >
< / section >
< section >
< img src = "_images/federation-blocks.jpeg" class = "stretch" >
< / section >
< section >
< h3 > Rust:< / h3 >
< ul >
< li class = "fragment" > ... não me deixa cruzar a rua sem olhar pros dois lados< span class = "fragment" > mesmo que a rua seja de mão única< / span > < / li >
< li class = "fragment" > ... não me deixa sair de moto sem usar capacete e protetor< span class = "fragment" > mesmo que seja pra tirar a moto da garagem< / span > < / li >
< li class = "fragment" > ... não me deixa tomar banho se não tiver o tapetinho pra não escorregar no chuveiro< / li >
< / ul >
< / section >
< section >
< strong > ... mas é bom ver alguém que tá se preocupando comigo e não que
me deixe ser "porra louca" e me deixe na mão na hora de lidar com
os outros.
< / strong >
< / section >
<!-- o que acontece quando C++/Java tiver uma interface bacana pra AI/ML/Data Science? -->
<!--
< section >
< p > Ferramentas de ML/AI são em C++.< / p >
< p class = "fragment" > C++ é complicado de programar.< / p >
< p class = "fragment" > Mas como Python é só uma cola...< / p >
< p class = "fragment" > < strong > o que vai acontecer quando
alguém insano o suficiente escrever um Jupyter em C++?
< / strong > < / p >
< / section >
-->
<!-- <section> -->
<!-- <img src="_images/py - so - 2024.png" class="stretch"> -->
<!-- </section> -->
<!-- <section> -->
<!-- <img src="_images/so - salary - 2024.png" class="stretch"> -->
<!-- </section> -->
< section >
< h2 > Enfim...< / h2 >
< / section >
< section >
< ul >
< li > Gerenciamento de dependências é um porre a anos --
e isso ninguém quer botar a mão.< / li >
< li > Para aplicações isoladas, "distribuição" é ok. Não
é pro resto.< / li >
< li > A sintaxe é o que tá segurando Python no mercado.< / li >
< / ul >
< / section >
< section >
< p > CodeShow: < a href = "https://www.youtube.com/watch?v=tJYKrViTvJM" >
O MAIOR PROBLEMA DO PYTHON FINALMENTE RESOLVIDO
< / a > < / p >
< small >
Várias soluções criadas, < strong > nenhuma oficial< / strong > .
< / small >
< / section >
< section >
< img src = "_images/federation-blocks.jpeg" class = "stretch" >
< / section >
<!-- <section> -->
<!-- <img src="_images/tng - picard - paranoia.webp" class="stretch"> -->
<!-- </section> -->
< section data-background = '_images/thats-all-folks.jpg' >
< / section >
< / div >
< / div >
< script src = "reveal.js/lib/js/head.min.js" > < / script >
< script src = "reveal.js/js/reveal.js" > < / script >
<!-- <script src="dist/reveal.js"></script> -->
<!-- <script src="plugin/highlight/highlight.js"></script> -->
< script >
Reveal.initialize({
controls: true,
progress: true,
history: true,
center: true,
// showNotes: true,
transition: 'slide', // none/fade/slide/convex/concave/zoom
// Optional reveal.js plugins
dependencies: [
{ src: 'reveal.js/lib/js/classList.js', condition: function() { return !document.body.classList; } },
{ src: 'reveal.js/plugin/markdown/marked.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'reveal.js/plugin/markdown/markdown.js', condition: function() { return !!document.querySelector( '[data-markdown]' ); } },
{ src: 'reveal.js/plugin/highlight/highlight.js', async: true, callback: function() { hljs.initHighlightingOnLoad(); } },
{ src: 'reveal.js/plugin/zoom-js/zoom.js', async: true },
{ src: 'reveal.js/plugin/notes/notes.js', async: true }
]
});
< / script >
< / body >
< / html >
<!--
vim:ts=4:sw=4:sts=4:et
-->