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:
| Label | Significado |
|---|---|
good-first-issue | Ideal para primeira contribuição |
E-easy | Dificuldade fácil (padrão do projeto Rust) |
E-medium | Dificuldade média |
E-mentor | Um mentor está disponível para ajudar |
E-help-wanted | O projeto precisa de ajuda externa |
C-cleanup | Limpeza de código/refatoração |
A-docs | Melhoria de documentação |
A-tests | Adicionar 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
- Comece por projetos que você usa: se você usa
clap,serdeouaxum, já conhece a API - Leia a lista de issues abertas: filtre por labels de dificuldade
- Escolha algo que entenda: documentação, testes e refatorações são ótimos para começar
- Verifique se ninguém já está trabalhando: leia os comentários da issue
- 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:
- Encontre uma issue com label
bugouC-bug - Reproduza o bug localmente
- Escreva um teste que falha com o bug
- Implemente a correção
- Verifique que o teste passa
- Envie o PR referenciando a issue
4. Novas funcionalidades
Contribuições maiores que adicionam funcionalidades ao projeto.
Processo típico:
- Discuta a feature na issue antes de implementar
- Obtenha aprovação dos maintainers
- Implemente em incrementos pequenos se possível
- Inclua testes e documentação
- 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ório | Descrição | Dificuldade |
|---|---|---|
rust-lang/rust | Compilador e stdlib | Alta |
rust-lang/rust-clippy | Linter oficial | Média |
rust-lang/rustfmt | Formatador de código | Média |
rust-lang/cargo | Gerenciador de pacotes | Média-Alta |
rust-lang/rust-analyzer | IDE support | Média-Alta |
rust-lang/rustlings | Exercícios de aprendizado | Baixa |
rust-lang/mdBook | Ferramenta de documentação | Baixa-Média |
rust-lang/book | O Rust Book | Baixa |
rust-lang/crates.io | Registry de crates | Média |
Como contribuir para rust-lang/rust
O compilador Rust pode parecer intimidador, mas há muitas áreas acessíveis.
Áreas para iniciantes:
- Mensagens de erro: melhorar a clareza das mensagens do compilador
- Documentação da stdlib: adicionar exemplos e esclarecer docs
- Testes: adicionar testes para edge cases
- 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:
- Novo lint: implementar uma nova regra de análise estática
- Falso positivo: corrigir um lint que reporta incorretamente
- Falso negativo: fazer um lint detectar mais casos
- Documentação: melhorar explicação e exemplos de lints
Projetos Populares que Aceitam Contribuições
Frameworks web
| Projeto | Stars | Tipo de contribuição | Dificuldade |
|---|---|---|---|
tokio-rs/axum | 18k+ | Features, docs, testes | Média |
actix/actix-web | 21k+ | Bugs, docs, middleware | Média |
tokio-rs/tokio | 26k+ | Performance, docs, bugs | Alta |
Ferramentas CLI
| Projeto | Stars | Tipo de contribuição | Dificuldade |
|---|---|---|---|
BurntSushi/ripgrep | 47k+ | Bugs, features | Média |
sharkdp/bat | 48k+ | Temas, bugs, docs | Baixa-Média |
sharkdp/fd | 33k+ | Features, bugs | Média |
starship/starship | 43k+ | Módulos, bugs, docs | Baixa-Média |
astral-sh/ruff | 30k+ | Lints, bugs, docs | Média |
astral-sh/uv | 20k+ | Features, bugs, docs | Média |
Bibliotecas essenciais
| Projeto | Stars | Tipo de contribuição | Dificuldade |
|---|---|---|---|
serde-rs/serde | 9k+ | Docs, bugs | Alta |
clap-rs/clap | 14k+ | Docs, features, bugs | Média |
dtolnay/anyhow | 5k+ | Docs, bugs | Média |
rayon-rs/rayon | 11k+ | Docs, performance | Média-Alta |
Projetos de infraestrutura
| Projeto | Stars | Tipo de contribuição | Dificuldade |
|---|---|---|---|
denoland/deno | 94k+ | Bugs, features | Alta |
nickel-org/nickel.rs | 3k+ | Manutenção, docs | Média |
servo/servo | 28k+ | Bugs, features | Alta |
Etiqueta de Pull Requests
Antes de abrir o PR
- Leia o CONTRIBUTING.md: cada projeto tem suas regras
- Verifique o estilo de código: siga as convenções do projeto
- Rode os testes localmente: nunca envie PR com testes falhando
- 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:
- Agradeça o review: “Obrigado pelo feedback! Vou ajustar.”
- Não leve para o pessoal: revisores estão melhorando o código, não criticando você
- Responda a todos os comentários: mesmo que seja “Feito!” ou “Concordo, ajustei”
- Pergunte se não entender: “Poderia elaborar? Não entendi o que ficaria melhor aqui”
- Implemente as sugestões: faça as mudanças e force-push para o branch
Ao revisar código de outros:
- Seja gentil e construtivo: “Que tal usar X em vez de Y? Seria mais idiomático porque…”
- Explique o porquê: não apenas diga o que mudar, mas por quê
- Elogie o que está bom: “Boa abordagem para o tratamento de erros aqui!”
- 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
- This Week in Rust: envie seus artigos e projetos para inclusão
- Reddit r/rust: compartilhe contribuições significativas
- Twitter/Mastodon: poste sobre o que está aprendendo e contribuindo
- Blog pessoal: escreva sobre experiências de contribuição
- 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.