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.

562 lines
18 KiB

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Por que e Como Participar de Projetos Open Source</title>
<meta name="description" content="A framework for easily creating beautiful presentations using HTML">
<meta name="author" content="Hakim El Hattab">
<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="reveal.js/css/reveal.css">
<link rel="stylesheet" href="theme/azion.css" id="theme">
<!-- Code syntax highlighting -->
<link rel="stylesheet" href="reveal.js/lib/css/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 outside;
}
li {
display: block;
}
</style>
</head>
<body>
<div class="reveal">
<div class="slides">
<section>
<section data-background="_images/osi_keyhole_300X300_90ppi_0.png" data-header>
<h1 class="semi-opaque">Por que e Como Participar de Projetos Open Source</h1>
</section>
</section>
<section>
<section>
<img src="_images/avatar-20170726.png" alt="Me" style="float:left;width:200px;" class="no-border">
<div>
<ul class="empty">
<li>Júlio Biason</li>
<li><img src="_images/azion-logo.png" alt="Azion logo" class='company-logo'>Azion Technologies</li>
<li>@juliobiason</li>
<li>julio.biason@gmail.com</li>
<li><a href="http://presentations.juliobiason.net">http://presentations.juliobiason.net</a></li>
</ul>
</div>
</section>
<section>
<img src="_images/start-a-fight.jpg" alt="Eu faço perguntas em reuniões que eu não sei nada e reunião explode; não é de propósito" class='stretch'/>
<aside class="notes">
Eu sou famoso (ou era) por entrar eu reuniões, fazer uma
pergunta e a reunião explodir em discussões (úteis, diga-se
de passagem). Mas eu não fazia isso de propósito.
</aside>
</section>
<section>
<img src="_images/fast-speaker.jpg" alt="Eu falo rárpido">
<aside class="notes">
Eu também tenho costume de falar rápido.
Essa apresentação talvez termine em menos de
20 minutos, mas eu deixo mais tempo para as
perguntas dessa forma.
</aside>
</section>
</section>
<section>
<section>
<h1>Motivação</h1>
<aside class="notes">
O que me levou a fazer essa apresentação foi justamente a participação
em eventos passados do TcheLinux. Apesar de estar no meio do open source
desde 2000 e sempre estar usando (e ganhando dinheiro) com projetos
open source, eu sempre senti que não contribui o suficiente.
Mas existem coisas simples que qualquer um pode fazer e se eu não
consigo ajudar, pelo menos eu posso incentivar mais pessoas a participar.
E pode ser que alguém que eu incentive resolva justamente um
dos meus problemas.
</aside>
</section>
</section>
<section>
<section>
<h1>Por Que Participar?</h1>
<ul>
<li class="fragment">
Aprender algo novo
<aside class="notes">
O que a maior parte dos professores (principalmente) faz é sugerir
participar de um projeto open source para aprender uma nova
linguagem.
</aside>
</li>
<li class="fragment">
Para retornar à comunidade
<aside class="notes">
Essa deve ser o "por que" mais citado: O software está
disponível para quem quiser usar e seria interessante
que quem utilize retorne algo ao desenvolvimento.
</aside>
</li>
<li class="fragment">
"Code rot"
<aside class="notes">
Software, com o tempo, se "deteriora". Se não tiver alguém
olhando, ele pára de funcionar.
</aside>
</li>
<li class="fragment">
"Scratch an itch"
<aside class="notes">
Se tem algo lhe incomodando no software, ele pode ser alterado.
E se você não se sentir capaz de fazer, ainda é possível pedir
pra alguém resolver isso pra você (e talvez você queria pagar
essa pessoa...)
</aside>
</li>
<li class="fragment">
Fator abandono.
<aside class="notes">
Software estável recebe poucas atualizações, mas as pessoas
tendem a ver software com poucas atualizações como "abandonado".
Alguém olhando, comentando, discutindo features, explicando
como fazer as coisas deixa o projeto "vivo".
</aside>
</li>
</ul>
</section>
</section>
<section>
<section>
<h1>Como Participar</h1>
<p>Enviar código com novas features é a forma mais direta <span class="fragment">mas não a mais fácil.</span></p>
</section>
<section>
<h2>Enviar Código</h2>
<ul>
<li>Aclimate-se ao ambiente do projeto <span class="fragment">(IRC, Maillist, Slack, etc)</span></li>
<li class="fragment">Seguir os padrões de codificação do projeto <span class="fragment">(HACKING.md)</span></li>
<li class="fragment">Entender os objetivos do projeto <span class="fragment">(isso está na cabeça dos mantenedores)</span></li>
</ul>
<p class="fragment"><small>Anedota: Mitter.</small></p>
<aside class="notes">
Mitter foi meu projeto pessoal de um cliente Twitter. Meu plano
era ter a funcionalidade básica e o mínimo possível de
dependências.
Mitter tinha suporte apenas ao retweet nativo do sistema (aquele
que aparece como um link para outro tweet hoje), mas algumas
pessoas ainda usavam o "RT" pra indicar retweet.
Um usuário pediu pra criar a feature de retweet antigo. Eu tive
que explicar que suportar duas formas diferentes seria mais
complexo do que esperado e desejado para o projeto. Felizmente,
ele entendeu.
</aside>
</section>
<section>
<h2>Enviar Código</h2>
<p>Lembre-se: para alguém, o projeto é seu filho.</p>
<p class="frament"><small>Anedota: IceWM.</small></p>
<aside class="notes">
IceWM é um gerenciador de janelas com uso mínimo de memória, mas altamente
configurável. Depois de abandonado pelo desenvolvedor original, ele foi
mantido por outra pessoa. Eu comecei a portar os temas do Enlightment
(o gerenciador com os temas mais bonitos que havia), mas havia um
problema: Sombras nos títulos. Como o IceWM não tinha suporte às
sombras, alguns temas ficavam completamente ilegíveis. Eu corri
atrás do código onde mostrava o título (dica: eu procurei dentro
do código pela variável do arquivo de tema que definia a cor do
título) e adicionei a nova funcionalidade.
Como o meu patch gerou mais burburinho na lista de discussão e
IRC do que o que o mantenedor estava fazendo, ele portou meu
patch, trocando os nomes das variáveis. No final, eu fiquei como
"co-autor" da feature e não como contribuidor.
Mas eu ganhei a feature que eu queria.
(Dica: o que eu usei pra achar onde estava a função foi
`grep`.)
</aside>
</section>
<section>
<h2>Enviar Código</h2>
<p>Algumas vezes, o projeto já está abandonado pelo autor
original, mas a comunidade ainda mantém indiretamente.</p>
<p><small>Anedota: Blackbox.</small></p>
<aside class="notes">
Antes da explosão de gerenciadores *box (Fluxbox, OpenBox),
havia o Blackbox. Eu achei um problema com a margem que era
possível configurar entre janelas, que era passado inclusive
para as bordas da tela. Eu fiz o patch e mandei para a lista
de discussão do projeto, mas fui informado que o mantenedor
e autor original havia deixado o projeto pra trás, mas o patch
iria para um site de patchs para o projeto.
</aside>
</section>
<section>
<h2>Enviar Código</h2>
<p>
Muito raramente, o desenvolvedor simplesmente não tem tempo
para pesquisar como corrigir uma feature que ele mesmo quer
colocar.
</p>
<p><small>Anedota: Htop.</small></p>
<aside class="notes">
Uma noite, quando eu estava trabalhando até mais tarde, o
Hisham, autor do Htop, veio conversar comigo no IM da época
(que eu não lembro exatamente qual era), como era costume
quando ele tava perdido e querendo desopilar um pouco.
Ele me explicou que tava com um problema no top dele, para
mostrar o usuário correto em aplicativos que estavam em
unidades NFS, mas o `ps` mostrava corretamente.
"Olha o fonte do psutils, oras. É pra isso que é open source",
eu disse.
"Ah, não tô com vontade."
Por pura irritação, eu baixei o fonte do psutils e olhei o
nome da função que encontrava o usuário e passei pra ele.
Meu nome está no "Thanks" do Htop 1 até hoje simplesmente
por isso.
(Dica: o que eu sei pra encontrar a função foi `ctags` pra
mapear o conteúdo do projeto e fui correndo de função em
função)
</aside>
</section>
</section>
<section>
<section>
<h1>Como Participar</h1>
<p>Bug reports</p>
</section>
<section>
<h2>Bug Reports</h2>
<p>
Quando encontrar um problema, tente repetir; tente isolar
o que causa o problema (uma configuração, o nome do arquivo);
se conseguir, envie para o desenvolvedor.
</p>
<p><small>Anedota: Skyrim.</small></p>
<aside class="notes">
Não relacionado com open source, mas eu consigo, até hoje,
fazer o Skyrim crashear numa missão. E eu sei exatamente
como fazer o jogo explodir.
Infelizmente, como Skyrim não é um projeto open source,
eu não tenho um bug tracker pra reportar o erro.
</aside>
</section>
<section>
<h2>Bug Reports</h2>
<p>
Se possível, crie um teste que mostre como o
problema se repete (o que é mais fácil para bibliotecas
e frameworks do que projetos).
</p>
<p><small>Anedota: MongoEngine.</small></p>
<aside class="notes">
MongoEngine é uma biblioteca para acessar o banco de
dados MongoDB como se fosse um ORM, com schemas e tudo
mais (com a facilidade que, na mudança do schema, não
é preciso fazer migrações).
Como nós mantinhamos sempre a última versão, aconteceu
mais de uma vez que a última versão alterou um comportamento
completamente. Nesses casos, nós abrimos issues no Github
do autor, com o teste incluso, para mostrar o que estávamos
querendo fazer e o que estava acontecendo.
Em todos os casos, nós deixávamos a solução em aberto:
"se esse é o comportamento esperado da biblioteca, como
podemos obter o resultado esperado do teste?"
</aside>
</section>
<section>
<h2>O Fork</h2>
<p>
Quando o desenvolvedor original do projeto não tem mais
interesse e não quer continuar, sempre há a possbilidade
de ter um desenvolvimento em separado.
</p>
<p><small>Anedota: Jenkins, Pillow</small></p>
</section>
<section>
<h2>O Fork</h2>
<p>
... e há vezes que um fork, com ajuda da própria comunidade,
volta para o projeto original.
</p>
<p><small>Anedota: Compiz, GCC</small></p>
</section>
</section>
<section>
<section>
<h1>Como Participar</h1>
<p>Traduções</p>
</section>
<section>
<h2>Traduções</h2>
<p>Se você não entende de código, pode ajudar traduzindo
a aplicação para a sua língua.</p>
<p><small>Anedota: Mitter e Fábio Beneditto</small></p>
<aside class="notes">
Ainda no meu projeto do Mitter, eu tive pedidos de
traduzir o aplicativo para a língua deles. Infelizmente
Mitter não tinha suporte a traduções e tive que negar
a ajuda.
</aside>
</section>
</section>
<section>
<section>
<h1>Como Participar</h1>
<p>Artwork</p>
</section>
<section>
<h2>Artwork</h2>
<p>
Muitos projetos precisam de um site bonito e até
mesmo um logotipo interessante. Ajudar o desenvolvedor
mantendo um site que consiga comunicar o objetivo
do projeto sempre ajuda.
</p>
<p><small>Anedota: Alguma-Coisa-Dog.</small></p>
</section>
</section>
<section>
<section>
<h1>Como Participar</h1>
<p>Documentação</p>
</section>
<section>
<h2>Documentação</h2>
<p>
Desde "como instalar esse projeto" ao "o que ele faz",
ainda falta documentação de muita coisa. Nem é preciso
saber programar, pegando algumas dicas com o autor do
projeto.
</p>
<p class="fragment">
Dica: Embora alguns desenvolvedores reclamem da falta
de man pages, é possível fazer coisas bem legíveis
usando projetos como <a href="https://readthedocs.org/">ReadTheDocs</a>
e <a href="http://gitbook.com/">Gitbook</a>.
</p>
</section>
</section>
<section>
<section>
<h1>Como Participar</h1>
<p>Doações</p>
</section>
<section>
<h2>Doações</h2>
<p>
Alguns projetos tem pessoas trabalhando full time e
precisam de alguma forma de pagar essas pessoas.
</p>
<p><small>Anedota: VIM, Mozilla</small></p>
<aside class="notes">
VIM, por exemplo, pede que se tu gostou do editor,
ao invés de contribuir pagando alguma coisa pro
Bram Moolenaar, seja feita uma doação para as
crianças de Uganda (a bem pouco tempo, o Bram postava,
no fim do ano, quanto havia sido doado).
Apesar de receber grandes doações, a Mozilla
precisa de doações do "99%" para que não fique
a mercê dos grandes doadores.
</aside>
</section>
</section>
<section>
<section>
<h1>Como Participar</h1>
<p>Evangelização</p>
</section>
<section>
<h2>Evangelização</h2>
<p>
Você pode ajudar um projeto a crescer divulgando o mesmo
em palestas ou até mesmo comentando com seus colegas.
</p>
<p class="fragment">
Dica: Evite guerras santas do tipo "meu projeto vs seu projeto".
</p>
<p class="fragment"><small>Anedota: Eu ;).</small></p>
</section>
</section>
<section>
<section>
<h1>Como Participar</h1>
<p>"Obrigado"</p>
</section>
<section>
<h2>"Obrigado"</h2>
<p>Poucas coisas conseguem ser tão poderosas como um
simples "obrigado por ter feito esse projeto".</p>
<p class="fragment">
Dica: Cerveja e Pizza também contam como obrigados.
</p>
<p class="fragment"><small>Anedota: Htop.</small></p>
</section>
</section>
<section data-background='_images/thats-all-folks.jpg'>
<section>
<h1 class="fragment semi-opaque">Perguntas?</h1>
</section>
</section>
</div>
</div>
<script src="reveal.js/lib/js/head.min.js"></script>
<script src="reveal.js/js/reveal.js"></script>
<script>
// Full list of configuration options available at:
// https://github.com/hakimel/reveal.js#configuration
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>