Código y Tipado

Published by

on

En un pasado no muy lejano, el tipado en código era observado como una reliquia de un mundo al que apostábamos dejar atrás para comenzar a trabajar con herramientas cada vez más flexibles que nos permitieran construir nuevas herramientas.

Sin embargo hoy tenemos nuevos lenguajes en auge (Rust, Kotlin, Swift) con tipado fuerte/estático. ¿Qué pasó en el camino? Mantenibilidad, calidad y escala.

El Auge de los Lenguajes de Tipado Dinámico

Durante los años 2000 y 2010, lenguajes como JavaScript, Python y Ruby ganaron una enorme popularidad. Su sintaxis sencilla y la ausencia de tipado estricto permitían escribir código más rápidamente y con menos restricciones. Esta flexibilidad era especialmente valorada en startups y proyectos de espíritu agile, en dónde el feedback y la adaptabilidad son clave.

Argumentaría que una de las principales virtudes es que es sumamente sencillo esbozar ideas con código y ejecutarlas para probarlas. Es rápido y práctico, nos permite tener una idea y acortar el feedback loop con el desarrollador sin tener que lidiar con compiladores – puaj! Supe ser un gran entusiasta de la posibilidad que esto traía.

El lado oscuro de la felicidad

A medida que las aplicaciones y las bases de código crecían, comenzaron a surgir problemas. La falta de tipado explícito dificultaba el mantenimiento y la comprensión del código, especialmente en equipos grandes o distribuidos.

Los errores de tipo, que podrían haberse detectado en tiempo de compilación con un sistema de tipado estático, saltaban en producción, causando fallos y afectando la experiencia del usuario.

Particularmente, muy pocos estaban explotando la flexibilidad al límite de forma contínua. Sencillamente, una vez superada la etapa de iteraciones más vertiginosas, se llegaba a una situación más estable dónde por distintas razones se convergía a algo más estable. Por ejemplo, porque la base de datos si imponía tipos de amplia conveniencia para tener buena performance.

¿Qué dejamos en el camino?

El tipado estático ofrece múltiples ventajas y que suman valor especialmente en bases de código más grandes:

  • Detección Temprana de Errores. Los errores de tipo se identifican durante la compilación, evitando fallos en tiempo de ejecución.
  • Mejora en la Legibilidad y Mantenibilidad. Los tipos actúan como documentación viva, facilitando la comprensión del código por parte de nuevos desarrolladores y facilitando el escalado de los mismos. Símil al esquema de una DB relacional.
  • Refactorización Segura. Cambiar y mejorar el código es más seguro cuando el compilador puede verificar la consistencia de los tipos. Esto nos permite tener mejoras sostenibles de calidad.
  • Asistencias más efectiva. Los editores y entornos de desarrollo pueden ofrecer autocompletado y análisis más precisos, aumentando la productividad.

El retorno de un nuevo tipado

Reconociendo estos desafíos, la industria comenzó a reevaluar el valor del tipado estático. Lenguajes y herramientas que combinaban lo mejor de ambos mundos empezaron a ganar tracción. Microsoft desarrolló TypeScript por ejemplo, añadiendo tipado estático opcional a JavaScript y permitiendo a los desarrolladores beneficiarse de la flexibilidad del lenguaje original mientras mejoraban la seguridad y mantenibilidad del código.

De manera similar, Python introdujo las type annotations en versiones más recientes, permitiendo el uso opcional de tipado en distintos momentos y detectar errores antes de que ocurran.

Un aspecto clave es que la re-adopción y re-valorización del tipado en estos lenguajes, también vino acompañada de nuevo tooling como linters y analizadores estáticos de código cada vez más potentes, capaces de brindar información más efectiva sobre incompatibilidades y potenciales errores. Y esto era un abismo contra lo que podía ofrecer un error de compilación en C++ al nivel que habían campeonatos de horrores.

Condensar todas las lecciones aprendidas

Hemos aprendido que la flexibilidad sin control puede conducir a problemas de calidad y sostenibilidad. Al integrar prácticas de tipado más estrictas, no estamos renunciando a la agilidad, sino fortaleciendo las bases sobre las cuales construimos soluciones más robustas y confiables.

La clave está en encontrar un equilibrio. Mientras que el tipado dinámico ofrece rapidez y flexibilidad en las primeras etapas de un proyecto, el tipado estático proporciona la estructura necesaria para mantener y escalar una aplicación a largo plazo. La adopción de sistemas de tipado gradual, donde los desarrolladores pueden añadir tipos según sea necesario, ha sido una solución efectiva para muchos equipos.