Rust

Epílogo — O que Vem Depois, Como Continuar Crescendo, e a Filosofia do Rust Já leu

12 min de leitura

Epílogo — O que Vem Depois, Como Continuar Crescendo, e a Filosofia do Rust
Rust — Artigo #52 Epílogo — O que Vem Depois, Como Continuar Crescendo, e a Filosofia do Rust Por Prof. Dr. Marcelo Fontes | Série: Dominando Rust em 1 Ano Cheg

Rust — Artigo #52

Epílogo — O que Vem Depois, Como Continuar Crescendo, e a Filosofia do Rust

Por Prof. Dr. Marcelo Fontes | Série: Dominando Rust em 1 Ano


Chegamos ao fim. Cinquenta e dois artigos, dezenas de projetos completos, centenas de exemplos executáveis. Você começou com fn main() { println!("Olá, mundo!"); } e chegou a sistemas distribuídos, compiladores, blockchains, e motores de machine learning. Mas terminar uma série de artigos não é o mesmo que dominar uma linguagem — é o começo.

Este artigo final não tem código novo para ensinar. Em vez disso, reflete sobre o que aprendemos, propõe caminhos concretos para continuar crescendo, e examina a filosofia que torna Rust diferente de qualquer outra linguagem que você provavelmente já usou.


O que você realmente aprendeu

Não foi só sintaxe

A maioria das pessoas pensa que aprender uma linguagem é aprender sua sintaxe. Rust prova que essa visão é incompleta. A sintaxe do Rust é relativamente simples — o que é profundo é o modelo mental que a linguagem força você a desenvolver.

// Você aprendeu a pensar em ownership:
// Quem possui este dado? Quando ele deixa de existir?

// Você aprendeu a pensar em borrowing:
// Quem está usando este dado agora? Por quanto tempo?

// Você aprendeu a pensar em lifetimes:
// Esta referência vai durar o suficiente?

// Você aprendeu a pensar em tipos como especificações:
// Este tipo torna o estado inválido irrepresentável?

// Você aprendeu a pensar em erros como valores:
// O que pode dar errado aqui? Como o chamador trata isso?

// Esses modelos mentais transferem para qualquer linguagem.
// Um programador Rust que volta para Python ou Go
// escreve código melhor nessas linguagens também.

O compilador como professor

// A relação com o compilador do Rust é única.
// Em outras linguagens, o compilador é um obstáculo:
// você escreve código, ele reclama de vírgulas e ponto-e-vírgulas.

// No Rust, o compilador é um professor exigente:

// error[E0502]: cannot borrow `v` as mutable because
//              it is also borrowed as immutable
//   --> src/main.rs:8:5
//    |
// 7  |     let primeiro = &v[0];
//    |                     - immutable borrow occurs here
// 8  |     v.push(42);
//    |     ^^^^^^^^^^ mutable borrow occurs here
// 9  |     println!("{}", primeiro);
//    |                    ------- immutable borrow later used here

// Este erro não é o compilador sendo difícil.
// É o compilador te mostrando um bug real:
// se push() realoca o vetor, `primeiro` aponta para memória liberada.
// Em C++, isso seria undefined behavior silencioso.
// Em Rust, é um erro de compilação com diagnóstico preciso.

// Depois de meses com Rust, você começa a ver esses padrões
// antes mesmo de escrever o código.
// Isso é o que "pensar em Rust" significa.

Os conceitos que mais transferem

Após um ano de Rust, estes são os conceitos cujo valor transcende a linguagem:

Tornar estados inválidos irrepresentáveis. Usar o sistema de tipos para garantir que código inválido não compile é uma técnica aplicável em TypeScript, Haskell, Scala — qualquer linguagem com tipos expressivos.

Erros como valores, não exceções. Result força tratamento explícito de casos de erro. Isso é uma disciplina de design, não apenas uma feature de linguagem. Em Go são múltiplos retornos. Em Haskell é Either. O padrão é universal.

Zero-cost abstractions. A ideia de que abstração não precisa custar performance é um princípio de design. Iteradores Rust compilam para loops tão eficientes quanto loops manuais. Esse é o padrão a aspirar em qualquer linguagem.

Ownership como documentação. Quando uma função recebe T (move), &T (borrow imutável), ou &mut T (borrow mutável), ela documenta sua intenção na assinatura. Esse nível de clareza de interface é uma prática que você pode aplicar mesmo em Python — só precisa ser disciplinado.


Onde Rust ainda é difícil

Honestidade é importante. Rust resolve muitos problemas mas cria alguns:

// 1. TEMPO DE COMPILAÇÃO
// Projetos grandes compilam lentamente.
// Estratégias: workspaces, compilação incremental, sccache.
// Está melhorando a cada release, mas é real.

// 2. CURVA DE APRENDIZADO EM EQUIPE
// Contratar Rust é difícil — ainda há menos engenheiros Rust
// que Python ou JavaScript no mercado.
// Treinar uma equipe leva meses.
// O investimento compensa em sistemas de longa duração.

// 3. ASYNC É AINDA COMPLEXO
// Async Rust funciona, mas as arestas ainda existem.
// Send + Sync em objetos trait, Pin, Unpin —
// você vai encontrar essas paredes.
// Melhorando com async closures, AsyncIterator, etc.

// 4. ECOSISTEMA MAIS JOVEM EM ALGUNS DOMÍNIOS
// Para ciência de dados, Rust ainda não tem o ecossistema
// Python/NumPy/Pandas. Para ML de pesquisa, PyTorch ainda domina.
// Para mobile nativo, Kotlin/Swift ainda dominam.
// Rust excele em infraestrutura, sistemas, e servidores.

// 5. ERGONOMIA EM PROTOTIPAGEM RÁPIDA
// Para scripts rápidos e prototipagem exploratória,
// Python ainda é mais rápido de escrever.
// Rust paga dividendos em sistemas que precisam durar.

Caminhos para continuar crescendo

Nível 1: Consolidar fundamentos (próximos 3 meses)

// Se você seguiu toda a série mas ainda se sente inseguro
// com lifetimes e ownership em código real:

// 1. Reescreva projetos antigos em Rust
//    Pegue algo que você escreveu em Python ou Go.
//    Reescreva em Rust. Não olhe Stack Overflow — lute
//    com o compilador. O atrito é o aprendizado.

// 2. Contribua com documentação de uma crate
//    Escolha uma crate que você usa.
//    Melhore um doc comment, adicione um exemplo.
//    PRs de documentação são bem recebidos e de baixo risco.

// 3. Leia código Rust de alta qualidade
//    tokio/src — concorrência assíncrona de produção
//    serde/src — generics e traits avançados
//    ripgrep/src — CLI e performance
//    rustfmt/src — parse e transformação de código

// 4. Resolva exercícios focados
//    exercism.io/tracks/rust — exercícios graduados
//    rustlings — exercícios interativos
//    Advent of Code em Rust — problemas reais

Nível 2: Especialização (meses 4-8)

// Escolha um domínio e aprofunde:

// SISTEMAS E INFRAESTRUTURA:
// → Leia: "Operating Systems: Three Easy Pieces" (gratuito online)
// → Construa: um sistema de arquivos simples com FUSE
// → Estude: tokio internals, como funciona o executor
// → Contribua: um driver de kernel em Rust (linux/rust/)

// WEB E APIs:
// → Domine: axum, tower middleware, tonic (gRPC)
// → Construa: um proxy reverso simples
// → Estude: HTTP/2, WebSockets, SSE em profundidade
// → Leia: "HTTP: The Definitive Guide"

// COMPILADORES E LINGUAGENS:
// → Leia: "Crafting Interpreters" (grátis online) — completo
// → Construa: uma linguagem com tipos (adicione tipos à Mira do Artigo #44)
// → Estude: cranelift, inkwell (LLVM bindings)
// → Explore: tree-sitter para parsing incremental

// EMBEDDED E SISTEMAS:
// → Compre: uma placa STM32 ou Raspberry Pi Pico
// → Leia: "The Embedded Rust Book" (grátis online)
// → Construa: um projeto físico do zero
// → Explore: Embassy para async embedded

// SEGURANÇA:
// → Leia: "Hacking: The Art of Exploitation"
// → Construa: um fuzzer simples
// → Estude: como vulnerabilidades reais acontecem em C
// → Contribua: RustSec advisory database

Nível 3: Maestria (meses 9-12 e além)

// Maestria não é saber tudo — é saber onde encontrar o que
// você não sabe e ter o modelo mental para aprender rápido.

// SINAIS DE MAESTRIA EM RUST:
// - Você lê erros do compilador e imediatamente entende
//   o que está errado no modelo mental, não apenas na sintaxe
// - Você projeta APIs que são difíceis de usar errado
// - Você sabe quando NÃO usar Rust (e escolhe conscientemente)
// - Você entende os tradeoffs de cada decision de design
//   (Box vs Arc, async vs threads, trait objects vs generics)
// - Você contribui com feedback útil em RFCs

// PROJETOS QUE INDICAM MAESTRIA:
// - Uma crate publicada com >100 downloads e issues respondidas
// - Um PR aceito em uma crate com >1000 downloads
// - Um sistema em produção com uptime >99.9% por >6 meses
// - Ter ensinado Rust para outra pessoa com sucesso

A filosofia do Rust

Depois de um ano imerso nessa linguagem, alguns princípios ficam claros:

Confiança do compilador, não do programador

// Toda linguagem tem uma filosofia implícita sobre onde
// colocar a confiança.

// C/C++: confia no programador
// "Você sabe o que está fazendo. Faça o que quiser."
// Resultado: máxima flexibilidade, máxima responsabilidade.

// Python/Ruby: confia no tempo de execução
// "Vamos descobrir erros quando eles acontecerem."
// Resultado: desenvolvimento rápido, bugs em produção.

// Java/C#: confia no gerenciador de memória
// "GC cuida da memória. Você cuida da lógica."
// Resultado: segurança com custo de runtime.

// Rust: confia no sistema de tipos
// "Se compilou, muitas classes de bugs são impossíveis."
// Resultado: segurança sem custo de runtime.

// Nenhuma filosofia é universalmente superior.
// Mas a filosofia do Rust tem uma consequência poderosa:
// mover bugs do runtime para o compile time.
// Um bug que você nunca vê em produção não tem custo.

Explicitude como respeito

// Rust é explícito sobre quase tudo:
// - Mutabilidade (`mut` é necessário)
// - Borrowing (`&` e `&mut` são explícitos)
// - Erros (não há exceções implícitas)
// - Unsafe (blocos marcados explicitamente)
// - Conversões numéricas (sem casting implícito)
// - Clone vs Copy (sem cópias silenciosas)

// Isso parece verboso no começo.
// Com o tempo, você percebe que é respeito pelo leitor.
// Código Rust diz exatamente o que faz.
// Você pode ler uma função e entender suas implicações
// sem precisar rastrear quem muda o quê por todo o codebase.

fn processar(dados: Vec<u8>) -> Vec<u8> {
    // Esta assinatura diz TUDO:
    // - Recebe propriedade de `dados` (vai consumir)
    // - Retorna um novo Vec<u8>
    // - Não pode falhar (sem Result)
    // - Não tem efeitos colaterais além do retorno
    dados.into_iter().map(|b| b.wrapping_add(1)).collect()
}

// Compare com Python:
// def processar(dados):
//     # O que é dados? Uma lista? Um gerador? Um numpy array?
//     # Retorna algo? None? Modifica dados in-place?
//     # Pode lançar exceção? Qual tipo?
//     pass  # você precisa ler o corpo para saber

O custo real é o custo de longo prazo

// Rust parece ter custo alto no início:
// - Mais tempo para escrever código
// - Mais tempo para satisfazer o compilador
// - Mais tempo para aprender

// Mas os custos que Rust elimina são maiores:
// - Debugging de segfaults às 3h da manhã
// - Caçar data races em produção
// - CVEs por buffer overflows
// - Refatorações que quebram invariantes sutis
// - "Funciona na minha máquina" por condições de corrida

// A curva de custo do Rust é:
//
//  Custo │          Python/Go
//        │         ╱──────────────────
//        │        ╱
//        │  Rust ╱
//        │      │
//        │      │  (custo inicial alto)
//        │      ╲___________
//        │                  ╲─────────── (custo de manutenção baixo)
//        └─────────────────────────────▶ Tempo
//
// Para scripts de 50 linhas: Python vence.
// Para sistemas de 50.000 linhas com 5 anos de vida: Rust vence.

Gratidão ao ecossistema

Esta série não seria possível sem o trabalho de milhares de pessoas:

O time da linguagem, que mantém uma das ferramentas mais bem documentadas e bem pensadas da história da programação. O cuidado com ergonomia, com diagnósticos de erro, com estabilidade — tudo isso é trabalho de anos de pessoas dedicadas.

Os autores das crates que usamos ao longo da série: tokio, serde, axum, rayon, clap, tracing, candle, bevy — e centenas de outras. Software de qualidade, muitas vezes mantido por uma pessoa no tempo livre, que milhões de projetos dependem.

A comunidade, que elegeu Rust como a linguagem "mais amada" por oito anos consecutivos. Essa distinção vem de uma cultura que genuinamente tenta ser útil, inclusive e técnica ao mesmo tempo.

Os autores de livros e artigos que pavimentaram o caminho: Jon Gjengset (Rust for Rustaceans), Steve Klabnik e Carol Nichols (The Rust Programming Language), Ryan Levick e todos que criaram conteúdo de qualidade.


Uma última reflexão

// No início desta série, eu disse que Rust é difícil
// do jeito certo.

// Depois de 52 artigos, espero que você entenda o que isso significa.

// Rust é difícil não porque tem sintaxe complicada
// ou porque os designers foram cruéis.
// É difícil porque força você a pensar sobre coisas
// que outras linguagens escondem de você.

// Ownership não é burocracia —
// é a linguagem te forçando a pensar sobre o ciclo de vida dos dados.

// Borrowing não é limitação —
// é a linguagem te forçando a pensar sobre acesso concorrente.

// Lifetimes não são ruído —
// são a linguagem tornando explícito o que C deixa implícito
// (e perigoso).

// O que parecia atrito no Artigo #1
// parece clareza no Artigo #52.

// Isso é o que aprender Rust realmente é:
// não decorar sintaxe,
// mas desenvolver um modelo mental mais preciso
// sobre como computadores funcionam e como software falha.

// Esse modelo mental não desaparece quando você
// fecha o editor de Rust.
// Ele vai com você para Python, para Go, para C++,
// para qualquer problema de software que você encontrar.

// Essa é a promessa do Rust, e — espero —
// o que você ganhou neste ano.

O que ler a seguir — lista definitiva

Fundamentos que aprofundam:

  • "Rust for Rustaceans" — Jon Gjengset — o livro para depois de dominar o básico
  • "Programming Rust" — Blandy, Orendorff, Tindall — referência técnica profunda
  • "The Rustonomicon" — unsafe Rust — https://doc.rust-lang.org/nomicon/

Sistemas que inspiram:

  • "Operating Systems: Three Easy Pieces" — grátis — https://ostep.org
  • "Computer Systems: A Programmer's Perspective" — Bryant & O'Hallaron
  • "Designing Data-Intensive Applications" — Martin Kleppmann

Craft e filosofia:

  • "A Philosophy of Software Design" — John Ousterhout — o melhor livro sobre design
  • "Working in Public" — Nadia Eghbal — sobre open source
  • "The Pragmatic Programmer" — Hunt & Thomas — atemporal

Continuar com Rust:

  • "This Week in Rust" — https://this-week-in-rust.org
  • Jon Gjengset no YouTube — https://youtube.com/@jonhoo — implementações ao vivo
  • "Crust of Rust" — série de vídeos reimplementando stdlib
  • Exercism Rust track — https://exercism.org/tracks/rust

Um convite

Se esta série te ajudou, a melhor forma de agradecer é multiplicar:

Escreva sobre algo que você aprendeu. Responda uma pergunta no fórum. Abra um PR com uma melhoria de documentação. Ensine um colega. Cada contribuição, por menor que seja, é um fio no tecido do ecossistema que te ajudou a chegar aqui.

A comunidade Rust é o que é porque pessoas antes de você decidiram contribuir. A próxima geração de programadores Rust vai se beneficiar do que você decide fazer agora.


fn main() {
    // Um ano atrás:
    println!("Olá, mundo!");

    // Hoje, você sabe que por trás desta linha simples existe:
    // - Uma macro que expande para fmt::Write
    // - Um lock no stdout para evitar data races entre threads
    // - Flush automático ao final da linha
    // - Zero alocações desnecessárias
    // - Comportamento definido em todas as plataformas
    //
    // E você sabe que isso importa.
    //
    // Bem-vindo ao outro lado.
}
Comentários

Mais em Rust

Compilação Condicional e Feature Flags — Gerenciando Variações do Código
Compilação Condicional e Feature Flags — Gerenciando Variações do Código

Rust — Artigo #37 Compilação Condicional e Feature Flags — Gerenciando Variaç...

Closures Avançadas e Programação Funcional — Indo Além do map e filter
Closures Avançadas e Programação Funcional — Indo Além do map e filter

&nbsp; Em um artigo anterior, introduzimos closures e os adaptadores mais co...

Rust e Machine Learning — Inferência, ONNX e Aceleração de Modelos
Rust e Machine Learning — Inferência, ONNX e Aceleração de Modelos

Rust — Artigo #46 Rust e Machine Learning — Inferência, ONNX e Aceleração de...