Por que Rust é seu trunfo no portfólio
\n\nSe você está lendo este artigo, provavelmente já sabe que Rust não é apenas mais uma linguagem da moda. É uma tecnologia adorada no FAANG e em startups hypadas. Mas uma coisa é dizer no currículo "Conheço Rust", e outra bem diferente é mostrar um projeto funcional. Sem portfólio, até o código mais genial continua sendo apenas texto em um editor de texto.
\n\nNeste artigo, não vamos discutir sintaxe ou ensinar os fundamentos. Vamos além: mostrarei 5 ideias reais de projetos que atendem às necessidades do mercado e farão o recrutador clicar no seu currículo. Cada projeto não é apenas um "todo list", mas uma ferramenta completa que você pode apresentar em uma entrevista ou publicar no GitHub.
\n\nBônus: adicionei exemplos de código para você começar imediatamente. Vamos lá!
\n\nProjeto nº 1: Utilitário CLI para análise de logs
\n\nA maneira mais rápida de entrar no mundo Rust é escrever algo útil para a linha de comando. Utilitários CLI são o pão com manteiga do desenvolvedor Rust. São rápidos, seguros e ideais para demonstrar habilidades com std::fs, clap e tratamento de erros.
O que este projeto faz?
\nO utilitário log-analyzer lê um arquivo de texto com logs (por exemplo, do Nginx ou da sua aplicação) e exibe estatísticas: número de erros, IPs mais frequentes, timestamps. Tudo isso com saída colorida no terminal.
\n\nPor que isso é ótimo para o portfólio?
\n- \n
- Trabalho com sistema de arquivos e streams \n
- Parsing de strings usando expressões regulares ou
nom\n - Argumentos de linha de comando (crate
clap) \n - Saída colorida (crate
colored) \n
Exemplo de código
\nuse clap::Parser;\nuse std::fs::File;\nuse std::io::{BufRead, BufReader};\n\n#[derive(Parser)]\n#[command(name = "log-analyzer")]\nstruct Args {\n #[arg(short, long)]\n file: String,\n}\n\nfn main() {\n let args = Args::parse();\n let file = File::open(&args.file).expect("Não foi possível abrir o arquivo");\n let reader = BufReader::new(file);\n\n let mut error_count = 0;\n for line in reader.lines() {\n let line = line.unwrap();\n if line.contains("ERROR") || line.contains("error") {\n error_count += 1;\n }\n }\n\n println!("Erros encontrados: {}", error_count);\n}\n\nDica: Adicione tratamento de argumentos via clap e suporte ao formato JSON. Isso mostrará que você sabe trabalhar com serialização.
Projeto nº 2: Servidor web com Actix-web e REST API
\n\nRust não é apenas para programação de sistemas. O desenvolvimento web em Rust está ganhando força, e actix-web é um dos frameworks mais rápidos do mundo. Crie uma REST API simples para gerenciamento de tarefas (CRUD). É um clássico, mas em Rust parece novo.
O que implementar?
\n- \n
- Endpoints: GET, POST, PUT, DELETE para a entidade "Task" \n
- Armazenamento de dados em memória (com possibilidade de expansão para banco de dados) \n
- Validação de dados de entrada via
serde\n - Tratamento de erros e retorno de códigos HTTP adequados \n
Por que isso dará peso ao portfólio?
\nVocê mostrará que entende como construir APIs modernas. Empregadores procuram pessoas que sabem escrever não apenas scripts, mas também o backend. Além disso, actix-web é uma excelente maneira de demonstrar conhecimento de assincronia e concorrência.
Código para começar
\nuse actix_web::{web, App, HttpServer, Responder, HttpResponse};\nuse serde::{Deserialize, Serialize};\nuse std::sync::Mutex;\n\n#[derive(Serialize, Deserialize, Clone)]\nstruct Task {\n id: u32,\n title: String,\n completed: bool,\n}\n\nstruct AppState {\n tasks: Mutex<Vec<Task>>,\n}\n\nasync fn get_tasks(data: web::Data<AppState>)