Contribuição Open Source em Rust: Guia Completo

Como contribuir para projetos Rust open source. Encontre good-first-issues, contribua para o compilador Rust, crates populares e construa reputação na comunidade. Etiqueta de PR e code review.

Contribuição Open Source em Rust: Guia Completo

Contribuir para projetos open source é uma das formas mais eficazes de crescer como desenvolvedor Rust, construir reputação na comunidade e se destacar no mercado de trabalho. A comunidade Rust é conhecida mundialmente por ser acolhedora e organizada, com processos bem definidos para ajudar novos contribuidores. Este guia vai te mostrar como encontrar projetos para contribuir, como fazer sua primeira contribuição com confiança e como construir uma presença duradoura no ecossistema open source.


Por Que Contribuir para Open Source

Benefícios para sua carreira

  • Experiência comprovável: PRs aceitos em projetos conhecidos são referências poderosas
  • Aprendizado acelerado: você aprende lendo e modificando código de produção escrito por desenvolvedores experientes
  • Networking natural: interagir com maintainers e outros contribuidores cria conexões profissionais
  • Visibilidade: contribuições ficam públicas e são vistas por recrutadores
  • Domínio do ecossistema: você conhece crates por dentro, não apenas pela documentação
  • Prática de code review: dar e receber feedback de código de alto nível

Benefícios para a comunidade

  • Projetos dependem de contribuições para evoluir
  • Diversidade de contribuidores traz perspectivas novas
  • Documentação e tradução ajudam a expandir o alcance do Rust
  • Relatórios de bug e triagem de issues são essenciais

Encontrando Boas Primeiras Issues

Labels para iniciantes

A maioria dos projetos Rust usa labels padronizados para indicar issues acessíveis:

LabelSignificado
good-first-issueIdeal para primeira contribuição
E-easyDificuldade fácil (padrão do projeto Rust)
E-mediumDificuldade média
E-mentorUm mentor está disponível para ajudar
E-help-wantedO projeto precisa de ajuda externa
C-cleanupLimpeza de código/refatoração
A-docsMelhoria de documentação
A-testsAdicionar ou melhorar testes

Onde buscar issues

GitHub Search direto:

Use estas buscas no GitHub para encontrar issues em projetos Rust:

label:"good first issue" language:Rust state:open
label:"E-easy" language:Rust state:open
label:"help wanted" language:Rust state:open

Sites agregadores:

  • up-for-grabs.net: filtre por Rust
  • goodfirstissue.dev: filtre por Rust
  • This Week in Rust: seção “Call for Participation” na newsletter semanal
  • Are We Web Yet: lista de projetos web que precisam de ajuda

Estratégia para encontrar sua primeira issue

  1. Comece por projetos que você usa: se você usa clap, serde ou axum, já conhece a API
  2. Leia a lista de issues abertas: filtre por labels de dificuldade
  3. Escolha algo que entenda: documentação, testes e refatorações são ótimos para começar
  4. Verifique se ninguém já está trabalhando: leia os comentários da issue
  5. Comente antes de começar: “Gostaria de trabalhar nesta issue. Tenho alguma dúvida sobre X.”

Tipos de Contribuição

1. Documentação

A forma mais acessível de contribuir, e extremamente valorizada.

// Antes: sem documentação
pub fn parse_config(path: &str) -> Result<Config, Error> {
    // ...
}

// Depois: com documentação completa
/// Lê e analisa um arquivo de configuração no formato TOML.
///
/// O arquivo deve conter as seções `[server]` e `[database]`
/// com os campos obrigatórios definidos em [`Config`].
///
/// # Arguments
///
/// * `path` - Caminho para o arquivo de configuração TOML
///
/// # Errors
///
/// Retorna [`Error::Io`] se o arquivo não puder ser lido,
/// ou [`Error::Parse`] se o conteúdo não for TOML válido.
///
/// # Examples
///
/// ```no_run
/// use minha_lib::parse_config;
///
/// let config = parse_config("config.toml")?;
/// println!("Servidor: {}:{}", config.server.host, config.server.port);
/// # Ok::<(), minha_lib::Error>(())
/// ```
pub fn parse_config(path: &str) -> Result<Config, Error> {
    // ...
}

O que documentar:

  • Funções públicas sem doc comments
  • Exemplos de uso em módulos
  • Guias no README e em arquivos de documentação
  • Tradução de documentação para português

2. Testes

Adicionar testes é sempre bem-vindo e ensina muito sobre o código.

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_parse_config_valido() {
        let config_str = r#"
            [server]
            host = "localhost"
            port = 8080

            [database]
            url = "postgres://localhost/test"
        "#;

        let temp = tempfile::NamedTempFile::new().unwrap();
        std::fs::write(temp.path(), config_str).unwrap();

        let config = parse_config(temp.path().to_str().unwrap()).unwrap();
        assert_eq!(config.server.host, "localhost");
        assert_eq!(config.server.port, 8080);
    }

    #[test]
    fn test_parse_config_arquivo_inexistente() {
        let result = parse_config("/caminho/que/nao/existe.toml");
        assert!(matches!(result, Err(Error::Io(_))));
    }

    #[test]
    fn test_parse_config_toml_invalido() {
        let temp = tempfile::NamedTempFile::new().unwrap();
        std::fs::write(temp.path(), "isso não é toml {{{").unwrap();

        let result = parse_config(temp.path().to_str().unwrap());
        assert!(matches!(result, Err(Error::Parse(_))));
    }

    #[test]
    fn test_parse_config_secao_faltando() {
        let config_str = r#"
            [server]
            host = "localhost"
            port = 8080
        "#;

        let temp = tempfile::NamedTempFile::new().unwrap();
        std::fs::write(temp.path(), config_str).unwrap();

        let result = parse_config(temp.path().to_str().unwrap());
        assert!(result.is_err());
    }
}

3. Correção de bugs

Corrigir bugs reportados é uma contribuição de alto impacto.

Processo típico:

  1. Encontre uma issue com label bug ou C-bug
  2. Reproduza o bug localmente
  3. Escreva um teste que falha com o bug
  4. Implemente a correção
  5. Verifique que o teste passa
  6. Envie o PR referenciando a issue

4. Novas funcionalidades

Contribuições maiores que adicionam funcionalidades ao projeto.

Processo típico:

  1. Discuta a feature na issue antes de implementar
  2. Obtenha aprovação dos maintainers
  3. Implemente em incrementos pequenos se possível
  4. Inclua testes e documentação
  5. Envie o PR com descrição detalhada

5. Melhoria de performance

Se você identificar um gargalo de performance, isso é extremamente valorizado.

// Antes: alocação desnecessária
fn contar_ocorrencias(texto: &str, palavra: &str) -> usize {
    texto.split_whitespace()
        .collect::<Vec<&str>>()  // alocação desnecessária
        .iter()
        .filter(|w| **w == palavra)
        .count()
}

// Depois: sem alocação extra
fn contar_ocorrencias(texto: &str, palavra: &str) -> usize {
    texto.split_whitespace()
        .filter(|w| *w == palavra)
        .count()
}

Ao propor melhorias de performance, sempre inclua benchmarks:

use criterion::{criterion_group, criterion_main, Criterion};

fn benchmark_contagem(c: &mut Criterion) {
    let texto = "Rust é uma linguagem de programação que roda Rust muito rápido em Rust";

    c.bench_function("contar_ocorrencias", |b| {
        b.iter(|| contar_ocorrencias(texto, "Rust"))
    });
}

criterion_group!(benches, benchmark_contagem);
criterion_main!(benches);

Contribuindo para o Projeto Rust Oficial

Repositórios do projeto Rust

RepositórioDescriçãoDificuldade
rust-lang/rustCompilador e stdlibAlta
rust-lang/rust-clippyLinter oficialMédia
rust-lang/rustfmtFormatador de códigoMédia
rust-lang/cargoGerenciador de pacotesMédia-Alta
rust-lang/rust-analyzerIDE supportMédia-Alta
rust-lang/rustlingsExercícios de aprendizadoBaixa
rust-lang/mdBookFerramenta de documentaçãoBaixa-Média
rust-lang/bookO Rust BookBaixa
rust-lang/crates.ioRegistry de cratesMédia

Como contribuir para rust-lang/rust

O compilador Rust pode parecer intimidador, mas há muitas áreas acessíveis.

Áreas para iniciantes:

  1. Mensagens de erro: melhorar a clareza das mensagens do compilador
  2. Documentação da stdlib: adicionar exemplos e esclarecer docs
  3. Testes: adicionar testes para edge cases
  4. Diagnósticos: melhorar sugestões de correção do compilador

Setup do ambiente:

# Clonar o repositório
git clone https://github.com/rust-lang/rust.git
cd rust

# Configurar para build de desenvolvimento
cp config.example.toml config.toml
# Edite config.toml conforme necessário

# Build (vai demorar na primeira vez)
./x build

# Rodar testes
./x test

# Build apenas do stage 1 (mais rápido)
./x build --stage 1

Como contribuir para Clippy

O Clippy é um dos melhores projetos para começar a contribuir no ecossistema oficial.

# Clonar e setup
git clone https://github.com/rust-lang/rust-clippy.git
cd rust-clippy

# Build
cargo build

# Rodar testes
cargo test

# Testar um lint específico
cargo test nome_do_lint

Tipos de contribuição no Clippy:

  1. Novo lint: implementar uma nova regra de análise estática
  2. Falso positivo: corrigir um lint que reporta incorretamente
  3. Falso negativo: fazer um lint detectar mais casos
  4. Documentação: melhorar explicação e exemplos de lints

Projetos Populares que Aceitam Contribuições

Frameworks web

ProjetoStarsTipo de contribuiçãoDificuldade
tokio-rs/axum18k+Features, docs, testesMédia
actix/actix-web21k+Bugs, docs, middlewareMédia
tokio-rs/tokio26k+Performance, docs, bugsAlta

Ferramentas CLI

ProjetoStarsTipo de contribuiçãoDificuldade
BurntSushi/ripgrep47k+Bugs, featuresMédia
sharkdp/bat48k+Temas, bugs, docsBaixa-Média
sharkdp/fd33k+Features, bugsMédia
starship/starship43k+Módulos, bugs, docsBaixa-Média
astral-sh/ruff30k+Lints, bugs, docsMédia
astral-sh/uv20k+Features, bugs, docsMédia

Bibliotecas essenciais

ProjetoStarsTipo de contribuiçãoDificuldade
serde-rs/serde9k+Docs, bugsAlta
clap-rs/clap14k+Docs, features, bugsMédia
dtolnay/anyhow5k+Docs, bugsMédia
rayon-rs/rayon11k+Docs, performanceMédia-Alta

Projetos de infraestrutura

ProjetoStarsTipo de contribuiçãoDificuldade
denoland/deno94k+Bugs, featuresAlta
nickel-org/nickel.rs3k+Manutenção, docsMédia
servo/servo28k+Bugs, featuresAlta

Etiqueta de Pull Requests

Antes de abrir o PR

  1. Leia o CONTRIBUTING.md: cada projeto tem suas regras
  2. Verifique o estilo de código: siga as convenções do projeto
  3. Rode os testes localmente: nunca envie PR com testes falhando
  4. Rode clippy e rustfmt: código limpo é essencial
# Antes de abrir qualquer PR
cargo fmt --all -- --check
cargo clippy --all-targets --all-features -- -D warnings
cargo test --all-features

Escrevendo uma boa descrição de PR

## O que este PR faz

Adiciona suporte a timeout configurável para conexões HTTP.
Resolve #1234.

## Motivação

Atualmente, o timeout é fixo em 30 segundos, o que causa
problemas em conexões lentas. Este PR permite configurar
o timeout via `Config::timeout()`.

## Mudanças

- Adicionado campo `timeout` em `Config`
- Implementado `Config::timeout()` para configuração
- Adicionados testes para timeout customizado
- Atualizada documentação com exemplo de uso

## Como testar

    cargo test test_timeout_customizado

## Checklist

- [x] Testes adicionados
- [x] Documentação atualizada
- [x] clippy sem warnings
- [x] rustfmt aplicado
- [x] CHANGELOG atualizado (se aplicável)

Durante o code review

Ao receber feedback:

  1. Agradeça o review: “Obrigado pelo feedback! Vou ajustar.”
  2. Não leve para o pessoal: revisores estão melhorando o código, não criticando você
  3. Responda a todos os comentários: mesmo que seja “Feito!” ou “Concordo, ajustei”
  4. Pergunte se não entender: “Poderia elaborar? Não entendi o que ficaria melhor aqui”
  5. Implemente as sugestões: faça as mudanças e force-push para o branch

Ao revisar código de outros:

  1. Seja gentil e construtivo: “Que tal usar X em vez de Y? Seria mais idiomático porque…”
  2. Explique o porquê: não apenas diga o que mudar, mas por quê
  3. Elogie o que está bom: “Boa abordagem para o tratamento de erros aqui!”
  4. Diferencie sugestões de requisitos: marque claramente o que é blocker vs nice-to-have

Exemplo de interação saudável em PR

Reviewer: Excelente PR! Algumas sugestões:

1. Na linha 42, considere usar `map_err` em vez de `match`
   para manter a cadeia de operações fluente.

2. O teste `test_timeout` poderia verificar o caso edge
   de timeout = 0. O que acha?

3. Nit: a doc comment na linha 15 tem um typo: "configuação"
   → "configuração"

Contribuidor: Obrigado pelas sugestões!

1. Ótima ideia! Refatorei usando `map_err`, ficou bem
   mais limpo. Veja o commit abc123.

2. Adicionei teste para timeout = 0 e descobri que
   causava panic. Corrigi retornando erro nesse caso.
   Veja commit def456.

3. Corrigido! Commit ghi789.

Reviewer: Perfeito! LGTM (Looks Good To Me). Aprovado!

Construindo Reputação através de OSS

Estratégia de longo prazo

Meses 1-3: Primeiras contribuições

  • Contribua com documentação e testes
  • Faça 3-5 PRs pequenos em projetos diferentes
  • Participe de discussões em issues

Meses 3-6: Contribuições mais substanciais

  • Corrija bugs e implemente pequenas features
  • Torne-se contribuidor regular de 1-2 projetos
  • Ajude a triar issues e revisar PRs de outros

Meses 6-12: Estabeleça presença

  • Contribuições significativas (features grandes, performance)
  • Considere criar e publicar sua própria crate
  • Escreva blog posts sobre suas contribuições
  • Apresente em meetups da comunidade

12+ meses: Liderança

  • Torne-se maintainer de projetos
  • Mentore novos contribuidores
  • Organize eventos e iniciativas na comunidade
  • Suas contribuições servem como referência profissional

Visibilidade na comunidade

  1. This Week in Rust: envie seus artigos e projetos para inclusão
  2. Reddit r/rust: compartilhe contribuições significativas
  3. Twitter/Mastodon: poste sobre o que está aprendendo e contribuindo
  4. Blog pessoal: escreva sobre experiências de contribuição
  5. Meetups e conferências: apresente sobre projetos em que contribuiu

Contribuindo com a Comunidade Rust Brasil

Projetos brasileiros

A comunidade Rust brasileira tem projetos e iniciativas onde suas contribuições são especialmente valiosas:

  • Tradução de documentação: ajudar a traduzir o Rust Book e documentação oficial
  • Criação de conteúdo em português: tutoriais, artigos e vídeos
  • Organização de eventos: meetups, workshops e hackathons locais
  • Mentoria: ajudar novatos a aprender Rust

Como participar

  • Telegram Rust Brasil: grupo ativo com discussões diárias
  • Discord Rust Brasil: servidor com canais temáticos
  • Meetups presenciais: São Paulo, Rio, BH, Curitiba, Porto Alegre
  • Rust Latam: conferência latino-americana de Rust

Fluxo de Trabalho Completo

Aqui está o passo a passo detalhado para fazer uma contribuição:

1. Fork e clone

# Fork no GitHub (botão Fork no navegador)

# Clone seu fork
git clone https://github.com/SEU_USUARIO/projeto.git
cd projeto

# Adicione o repositório original como remote
git remote add upstream https://github.com/DONO/projeto.git

2. Crie um branch

# Atualize seu fork
git fetch upstream
git checkout main
git merge upstream/main

# Crie branch para sua contribuição
git checkout -b fix/melhorar-mensagem-erro-1234

3. Faça as mudanças

# Edite, teste, itere
cargo test
cargo clippy
cargo fmt

4. Commit e push

# Commits descritivos
git add -A
git commit -m "Fix: melhora mensagem de erro para configuração inválida

Quando o arquivo de configuração contém campos desconhecidos,
a mensagem agora lista quais campos são válidos e sugere
a correção mais próxima.

Resolve #1234"

# Push para seu fork
git push origin fix/melhorar-mensagem-erro-1234

5. Abra o Pull Request

  • Vá ao GitHub e abra o PR do seu fork para o repositório original
  • Preencha a descrição seguindo o template do projeto
  • Marque a issue relacionada com “Resolves #1234” ou “Fixes #1234”
  • Aguarde o review com paciência

6. Responda ao feedback

  • Implemente as mudanças solicitadas
  • Marque comentários como resolvidos
  • Peça re-review quando estiver pronto

Ferramentas Úteis para Contribuidores

# Ferramentas essenciais
rustup component add clippy rustfmt

# Para coverage de testes
cargo install cargo-tarpaulin

# Para benchmarks
cargo install cargo-criterion

# Para auditoria de segurança
cargo install cargo-audit

# Para verificar compatibilidade MSRV
cargo install cargo-msrv

# Para ver a documentação localmente
cargo doc --open

# Para rodar testes com output detalhado
cargo test -- --nocapture

# Para rodar apenas testes que combinam com um padrão
cargo test nome_do_teste

# Para verificar se nenhuma dependência tem vulnerabilidades
cargo audit

Conclusão

Contribuir para open source em Rust é uma jornada que beneficia tanto sua carreira quanto a comunidade. Os pontos essenciais são:

  • Comece pequeno: documentação, testes e triagem de issues são ótimos começos
  • Seja consistente: contribuições regulares constroem reputação ao longo do tempo
  • Comunique-se bem: interações respeitosas e claras são tão importantes quanto o código
  • Aprenda com o feedback: code review é uma das melhores formas de aprendizado
  • Contribua para projetos que usa: a motivação é natural e o contexto já existe
  • Não tenha medo: a comunidade Rust é conhecida por ser acolhedora com novatos

Sua primeira contribuição será a mais difícil. A segunda será mais fácil. E a partir da terceira, você estará no ritmo. Comece hoje — abra o GitHub, encontre uma issue que interesse e deixe seu primeiro comentário.