Por qué Rust es tu as bajo la manga en el portafolio
\n\nSi estás leyendo este artículo, probablemente ya sepas que Rust no es solo otro lenguaje de moda. Es una tecnología que adoran en FAANG y en las startups más populares. Pero una cosa es decir en el currículum «Sé Rust», y otra muy distinta es mostrar un proyecto funcional. Sin un portafolio, incluso el código más genial seguirá siendo solo texto en un editor de texto.
\n\nEn este artículo no vamos a discutir sintaxis ni a enseñarte los fundamentos. Iremos más allá: te mostraré 5 ideas reales de proyectos que cubrirán las necesidades del mercado y harán que el reclutador haga clic en tu currículum. Cada proyecto no es solo una «lista de tareas», sino una herramienta completa que podrás mostrar en una entrevista o publicar en GitHub.
\n\nBono: he añadido ejemplos de código para que puedas empezar de inmediato. ¡Allá vamos!
\n\nProyecto n.º 1: Utilidad CLI para análisis de logs
\n\nLa forma más rápida de adentrarse en el mundo de Rust es escribir algo útil para la línea de comandos. Las utilidades CLI son el pan de cada día para un desarrollador de Rust. Son rápidas, seguras y perfectas para demostrar habilidades con std::fs, clap y el manejo de errores.
¿Qué hace este proyecto?
\nLa utilidad log-analyzer lee un archivo de texto con logs (por ejemplo, de Nginx o de tu aplicación) y genera estadísticas: cantidad de errores, direcciones IP más frecuentes, marcas de tiempo. Todo ello con salida a color en la terminal.
\n\n¿Por qué es genial para el portafolio?
\n- \n
- Trabajo con el sistema de archivos y flujos \n
- Análisis de cadenas usando expresiones regulares o
nom\n - Argumentos de línea de comandos (crate
clap) \n - Salida a color (crate
colored) \n
Ejemplo 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("No se pudo abrir el archivo");\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!("Errores encontrados: {}", error_count);\n}\n\nConsejo: Añade manejo de argumentos con clap y soporte para formato JSON. Esto demostrará que sabes trabajar con serialización.
Proyecto n.º 2: Servidor web con Actix-web y API REST
\n\nRust no es solo para programación de sistemas. El desarrollo web en Rust está ganando terreno, y actix-web es uno de los frameworks más rápidos del mundo. Crea una API REST simple para gestionar tareas (CRUD). Es un clásico, pero en Rust se ve fresco.
¿Qué hay que implementar?
\n- \n
- Endpoints: GET, POST, PUT, DELETE para la entidad "Task" \n
- Almacenamiento de datos en memoria (con posibilidad de ampliación a base de datos) \n
- Validación de datos entrantes con
serde\n - Manejo de errores y devolución de códigos HTTP correctos \n
¿Por qué esto añadirá peso a tu portafolio?
\nDemostrarás que entiendes cómo construir APIs modernas. Los empleadores buscan personas que puedan escribir no solo un script, sino también la parte del servidor. Además, actix-web es una excelente manera de demostrar conocimiento de asincronía y concurrencia.
Código para empezar
\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>)