My presentations, using Reveal.js (mostly in Portuguese).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

722 lines
28 KiB

<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">
2 months ago
<!-- <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 -->
2 months ago
<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>
2 months ago
<section data-background="_images/me-background.png">
<div class="semi-opaque">
<h3>Júlio Biason</h3>
2 months ago
<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>
3 months ago
<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>
2 months ago
<img src="_images/tng-deanna-troi-mosaic.jpg" class="stretch">
</section>
2 months ago
<section>
<h4>"Vamos fazer um browser em Python!"</h4>
2 months ago
<small>
- Bando de sem-noção na universidade, eu incluso.
</small>
2 months ago
</section>
3 months ago
<section>
3 months ago
<!-- simulador de hardware, pra entregar projeto antes do resto -->
<img src="_images/graph.png" class="stretch">
3 months ago
<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>
3 months ago
<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>
3 months ago
</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>
3 months ago
</section>
<section>
3 months ago
<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>
4 months ago
<!-- surgiu a chance de trabalhar junto de novo -->
<section>
<img src="_images/tng-lavelle-promotion.webp" class="stretch">
</section>
2 months ago
4 months ago
<!-- ... 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>
2 months ago
<section>
<img src="_images/tng-q-snap.gif" class="stretch">
2 months ago
<aside class="notes">
E finalmente surgiu o projeto em Python, com Flask.
</aside>
</section>
2 months ago
3 months ago
<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"/>
2 months ago
<aside class="notes">
E em Django.
</aside>
</section>
<section>
3 months ago
<h3>Nova Separação</h3>
</section>
2 months ago
<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>
2 months ago
<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>
2 months ago
<!-- <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>
2 months ago
<section>
<h3>O Começo das Brigas</h3>
</section>
3 months ago
<!-- Múltiplas versões, incluindo não-mantidas -->
3 months ago
<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>
3 months ago
<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.
2 months ago
("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.
3 months ago
</aside>
</section>
<section>
<img src="_images/tng-enterprise-explodes.gif" class="stretch">
3 months ago
<aside class="notes">
2 months ago
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.
3 months ago
Gerado EXE (com Nuitka) começou a explodir o Git.
</aside>
</section>
2 months ago
<section>
<img src="_images/ds9-dax-bathlet.jpg" class="stretch">
<aside class="notes">
Adivinha quem veio me salvar desses problemas?
</aside>
</section>
4 months ago
<section>
<p><code>
2 months ago
pip install <span class="fragment">--break-system-packages</span>
4 months ago
</code></p>
2 months ago
<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>
3 months ago
</section>
4 months ago
3 months ago
<section>
<img src="_images/tos-kirk-what.gif" class="stretch">
</section>
<section>
<img src="_images/tng-picard-slow-facepalm.gif" class="stretch">
2 months ago
<aside class="notes">
Quer dizer que não tem uma forma de isolar instalações
de Python?
</aside>
3 months ago
</section>
<section>
<img src="_images/tos-kirk-slap.gif" class="stretch">
2 months ago
<aside class="notes">
POR QUE DIABOS EU TENHO QUE USAR VIRTUALENV ENQUANTO
QUE O DEBIAN NÃO PRECISA?
</aside>
4 months ago
</section>
<section>
<h3>Despedida</h3>
</section>
2 months ago
<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"/>
3 months ago
<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>
2 months ago
<img src="_images/tng-picard-sigh.gif" class="stretch">
</section>
<section>
2 months ago
<h2>Falando sério...</h2>
</section>
3 months ago
<section>
2 months ago
<h3>O Projeto</h3>
<p>
Não é o que a maioria dos projetos consegue fazer, com
ambiente isolado (container) ou que roda em máquinas
específicas (CD).
</p>
<small class="fragment">
... o que não quer dizer que instalar e controlar
dependências nesses ambientes seja muito melhor; só
estão "escondendo" o problema.
</small>
3 months ago
</section>
<section>
2 months ago
<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?
2 months ago
2 months ago
Cadê PyPI privado?
</aside>
</section>
<section>
<img src="_images/bruno-rocha-uv.png" class="stretch">
<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>
<h3>Melhorias Recentes</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> -->
<!-- <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> -->
3 months ago
4 months ago
<section>
<!-- ferramentas pra python não estão mais sendo escritas em Python (ruff, uv, Pyright) -->
2 months ago
<h3>Para Python, não Python:</h3>
4 months ago
<ul>
<li><code>ruff</code>: Rust</li>
<li><code>uv</code>: Rust</li>
<li><code>Pyright</code>: JavaScript</li>
2 months ago
<li>(<code>ruff-ls</code>: Rust)</li>
4 months ago
</ul>
</section>
2 months ago
<section>
<img src="_images/python-poetry.png" class="stretch">
2 months ago
<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>
<section>
<img src="_images/disc-earth.jpg" class="stretch">
</section>
<section>
<img src="_images/federation-blocks.jpeg" class="stretch">
</section>
3 months ago
<section>
2 months ago
<h3>Rust:</h3>
3 months ago
<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>
3 months ago
<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? -->
<!--
4 months ago
<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> -->
4 months ago
<!-- <section> -->
<!-- <img src="_images/so-salary-2024.png" class="stretch"> -->
<!-- </section> -->
4 months ago
2 months ago
<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>Eu não entendo porque olhar GIL e JIT quando tem
esse problema <strong>a anos</strong>.</li>
2 months ago
<li>A sintaxe é o que tá segurando Python no mercado.</li>
</ul>
</section>
<section>
<img src="_images/federation-blocks.jpeg" class="stretch">
</section>
<!-- <section> -->
<!-- <img src="_images/tng-picard-paranoia.webp" class="stretch"> -->
<!-- </section> -->
<section>
<img src="_images/tos-kirk-with-and-without-team.jpg" class="stretch">
</section>
4 months ago
<section data-background='_images/thats-all-folks.jpg'>
2 months ago
</section>
</div>
</div>
2 months ago
<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
2 months ago
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>
2 months ago
2 months ago
<!--
vim:ts=4:sw=4:sts=4:et
-->