---
title: "Contribuição Open Source em Rust: Guia Completo"
url: "https://rustlang.com.br/carreira/contribuicao-open-source/"
markdown_url: "https://rustlang.com.br/carreira/contribuicao-open-source.MD"
description: "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."
date: ""
author: ""
---

# 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:

| 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

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.

```rust
// 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.

```rust
#[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.

```rust
// 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:

```rust
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:**

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:**

```bash
# 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.

```bash
# 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

| 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

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

```bash
# 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

```markdown
## 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

```bash
# 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

```bash
# 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

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

### 4. Commit e push

```bash
# 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

```bash
# 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.
