Artículo

Rust: el lenguaje de programación que no sabías que necesitabas aprender

1663005408916 (1) - Pau Segarra
Pau Segarra
36
35
8 minutos de lectura
5 de mayo de 2026

Índice

  1. Introducción
  2. El problema de los lenguajes permisivos
  3. El caso de `null`: el vacío invisible
  4. Cómo aplicar esta mentalidad fuera de Rust
  5. Los enums: modelar estados reales
  6. Rust y la obsesión por los estados imposibles
  7. El problema de las excepciones invisibles
  8. El Result Pattern cambia la cultura del error
  9. Ownership: el cambio mental más profundo
  10. El compilador como arquitecto pesado
  11. La mutabilidad deja de ser el estado por defecto
  12. Rust te obliga a reducir ambigüedad
  13. El efecto psicológico de Rust
  14. Rust como filosofía más que como herramienta
  15. Un matiz importante antes de terminar
  16. Conclusión

Introducción

Hay lenguajes que simplemente añades a tu caja de herramientas. Aprendes la sintaxis, entiendes cuatro patrones habituales, memorizas cómo funcionan las librerías más comunes y, con eso, ya eres capaz de producir software.

Y luego está Rust.

Rust no es solamente un lenguaje de programación. Es una presión constante sobre tu forma de pensar. Una especie de sistema filosófico disfrazado de compilador. Un lenguaje que, más que darte libertad absoluta, te obliga a justificar tus decisiones.

Cuando vienes de ecosistemas como Java, JavaScript o incluso C++, el choque inicial suele ser brutal. No porque Rust sea especialmente complejo en sintaxis —de hecho, muchas veces es sorprendentemente pequeño— sino porque ataca directamente costumbres que llevamos años normalizando.

Rust cuestiona cosas que en otros lenguajes damos por hechas:

– ¿Por qué existe `null`?
– ¿Por qué los errores son excepciones invisibles que pueden explotar en cualquier sitio?
– ¿Por qué una función puede modificar cualquier cosa sin dejarlo claro?
– ¿Por qué compartimos estado mutable alegremente?
– ¿Por qué asumimos que el programador “ya tendrá cuidado”?

En muchos lenguajes modernos, el objetivo principal es maximizar velocidad de desarrollo inmediata.

Rust, en cambio, intenta maximizar otra cosa: claridad de intención.

Y eso cambia completamente cómo escribes software.

El problema de los lenguajes permisivos

La mayoría de lenguajes populares modernos están construidos sobre una idea bastante optimista:

“El programador sabrá lo que hace”.

Eso tiene ventajas.

Puedes avanzar rápido. Puedes improvisar. Puedes mutar estructuras libremente. Puedes devolver `null` cuando algo falla. Puedes lanzar excepciones desde cualquier sitio. Puedes compartir referencias mutables.

El problema es que esa libertad genera deuda invisible.

Muchos bugs en producción no aparecen porque un algoritmo sea incorrecto. Aparecen porque el estado del sistema es ambiguo.

Rust parte de una idea radicalmente distinta:

“Si algo es peligroso, debe quedar explícitamente representado en el código”.

Y eso tiene consecuencias enormes.

El caso de `null`: el vacío invisible

Uno de los ejemplos más claros es el tratamiento de la ausencia de valor.

JavaScript:



Esto compila. Y posiblemente explote en runtime.

En Java pasa algo parecido:



¿Qué devuelve si no existe? ¿`null`? ¿lanza excepción? ¿objeto vacío?

Ahora mira Rust:



El tipo ya te está diciendo algo importantísimo:

“esta función puede no devolver un usuario”.

Ahora el consumidor está obligado a enfrentarse a esa realidad.



Rust convierte casos ambiguos en contratos explícitos.

Cómo aplicar esta mentalidad fuera de Rust

Aprender Rust no solo mejora cómo escribes Rust. Muchas veces mejora cómo escribes cualquier lenguaje.

Por ejemplo, en Java puedes empezar a escribir esto:



En vez de esto:



El objetivo ya no es solamente “hacer que funcione”.

El objetivo es representar la incertidumbre en el propio tipo.

Los enums: modelar estados reales

En muchos lenguajes, terminamos usando combinaciones de strings, booleanos y nulls para representar estados posibles.

JavaScript:



O peor:



Rust empuja hacia otro enfoque:

Y además, el compilador puede ayudarte.



Si mañana añades un nuevo estado, el compilador te obliga a revisar todos los sitios afectados.

Y esto ocurre porque cuando haces un `match` sobre un enum, Rust obliga a cubrir todos los casos posibles. No puedes olvidarte accidentalmente de un estado nuevo sin que el compilador proteste.

En muchos otros lenguajes puedes modelar algo parecido, pero normalmente sigue existiendo la posibilidad de ignorar casos sin darte cuenta.

Rust no solo detecta errores. También detecta inconsistencias de diseño.

Rust y la obsesión por los estados imposibles

Hay una idea muy poderosa detrás de Rust:

“los estados inválidos deberían ser imposibles de representar”.

Por ejemplo, imagina esto en JavaScript:




O esto en Java:

Nada impide esto:



Rust normalmente empuja hacia otro enfoque:



Ahora no puede existir un pago marcado como pagado sin fecha.

El propio modelo lo impide.

El problema de las excepciones invisibles

En Java:



La firma no refleja realmente lo que puede pasar.

Rust obliga a explicitarlo:



Otra vez: el tipo cuenta la verdad.

El Result Pattern cambia la cultura del error

Rust introduce una disciplina distinta:

– los errores son valores
– los errores forman parte del contrato
– los errores deben propagarse conscientemente

Después de trabajar con Rust, mucha gente empieza a evitar excepciones incluso en otros lenguajes.

Por ejemplo, en TypeScript:

Ownership: el cambio mental más profundo

Rust destruye una costumbre muy arraigada:

“asumir que podemos compartir y mutar datos libremente”.

Rust introduce una idea extremadamente estricta:

“solo puede existir una referencia mutable activa”.

O muchas referencias inmutables. Pero no ambas.

Esto evita race conditions, estado corrupto y mutaciones inesperadas.

El compilador como arquitecto pesado

Muchos desarrolladores describen el compilador de Rust como algo agotador.
Pesado, exigente, a veces incluso frustrante.

Mientras en otros lenguajes puedes escribir código rápidamente y descubrir los problemas más tarde —muchas veces en producción— Rust te obliga a enfrentarte a ellos desde el principio.

Y eso puede resultar desesperante al inicio.

El compilador se queja constantemente.

Te dice que una referencia vive demasiado.
Te dice que estás moviendo un valor incorrectamente.
Te dice que hay un posible problema de ownership.
Te dice que existe mutabilidad compartida peligrosa.

Al principio parece que el lenguaje está luchando contra ti. Pero con el tiempo ocurre algo curioso. Empiezas a darte cuenta de que muchas veces el compilador tenía razón.

Muchos errores que en otros lenguajes descubrirías horas, días o semanas después, Rust los detecta antes siquiera de ejecutar el programa.

Y ahí cambia completamente la relación con el compilador.
Deja de sentirse como un enemigo.
Empieza a sentirse como una especie de revisor obsesivo que constantemente intenta evitar que hagas algo peligroso.

Rust convierte el compilador en una herramienta activa de diseño.

No solo verifica sintaxis.

También cuestiona decisiones arquitectónicas, ownership ambiguo, estados peligrosos y flujos potencialmente inseguros.

Y aunque eso ralentiza mucho el desarrollo al principio, también obliga a desarrollar una disciplina mental distinta.

Una donde los problemas no se esconden fácilmente debajo de la alfombra.

Empiezas a evitar estados ambiguos.
Empiezas a reducir mutabilidad.
Empiezas a modelar explícitamente los errores.
Empiezas a diseñar contratos más honestos.

La mutabilidad deja de ser el estado por defecto

Rust hace algo muy interesante: las variables son inmutables por defecto.



Si quieres mutabilidad:



Eso obliga a preguntarte:

“¿realmente necesito mutar esto?”

Rust te obliga a reducir ambigüedad

Muchos bugs nacen de ambigüedad.

Rust es, en gran medida, una guerra contra la ambigüedad:

– Ambigüedad sobre ownership
– Ambigüedad sobre errores
– Ambigüedad sobre ausencia de datos
– Ambigüedad sobre mutabilidad
– Ambigüedad sobre estados posibles

El efecto psicológico de Rust

Después de usar Rust durante un tiempo, empiezas a ver problemas de diseño en código que antes considerabas normal.

Funciones que devuelven `null`.
APIs que lanzan excepciones arbitrarias.
Objetos mutables compartidos por todas partes.
Estados imposibles representados como strings.

Rust reprograma parcialmente tu intuición.

Rust como filosofía más que como herramienta

El verdadero valor de Rust no es solo rendimiento. Ni siquiera seguridad de memoria.

El verdadero valor es que obliga a hacer explícitas decisiones que otros lenguajes permiten esconder.

Un matiz importante antes de terminar

Sería injusto decir que todo esto es exclusivo de Rust.

Muchos equipos experimentados ya utilizan, enums bien diseñados, programación inmutable o patrones similares a `Result` u `Optional`.

El problema es que en muchos lenguajes esas prácticas son opcionales.

Rust no te sugiere estas prácticas. Rust constantemente te empuja hacia ellas.

En otros lenguajes puedes escribir código siguiendo la filosofía de Rust.

En Rust, muchas veces, no tienes otra opción.

Conclusión

Aprender Rust puede sentirse incómodo.

Muchas veces parece que el compilador está constantemente bloqueándote.

Pero con el tiempo entiendes algo importante.

Rust no está intentando fastidiarte.

Está intentando obligarte a enfrentarte a problemas que otros lenguajes permiten ignorar hasta producción.

Ese es probablemente el mayor impacto de Rust.

No te enseña solamente otro lenguaje.

Te enseña a desconfiar de la ambigüedad.

Y una vez desarrollas esa mentalidad, ya no programas igual en ningún otro lenguaje.

Pau Segarra
Ingeniero de software especializado en construir plataformas cloud-native seguras, escalables y diseñadas para ser reutilizadas.

Otros artículos que te pueden interesar

Battiato y Sinek: Buscando un centro de gravedad permanente
El Círculo Dorado plantea que las organizaciones más exitosas y duraderas no comienzan comunicando qué hacen, sino por qué lo hacen. Se trata de un modelo simple pero…
Crea una API REST local en minutos con json-server y json-server-auth
¿Alguna vez has tenido que detener tu desarrollo porque no tienes un backend funcional? Con json-server y json-server-auth, puedes crear un servidor local en minutos, completo con autenticación….
Series temporales: la bola de cristal científica
Recuerdo perfectamente el primer día que me explicaron qué eran las series temporales. La Almudena que estaba sentada en aquel máster de estadística de la Universidad de Santiago…