Ulises Tamayo escribió en enero una herramienta de 180 líneas que toma los CSV que exporta la caja de tres papelerías en Mérida y arma con ellos una sola hoja semanal. Funcionó ocho meses. En septiembre le formatearon la computadora, clonó su propio repositorio, instaló, y el programa se cayó en la línea 4 por una función que ya no existe.
El mismo código, la misma máquina, otro día. Lo que cambió no está en el archivo.
La sintaxis de Python le costó a Ulises un fin de semana. Lo que le costó el día entero de septiembre no es sintaxis, y es la misma pieza en cada uno de los doce lenguajes de este tema: cómo declara un proyecto de qué depende, y cómo se obliga a una segunda instalación a estar de acuerdo con la primera.
Lo que un lenguaje de verdad pide aprender
Un tutorial cubre los ciclos, las funciones y la manera en que el lenguaje escribe una lista. Ese material es real y es la mitad chica. Debajo hay un gestor de paquetes, un lockfile, un paso de compilación, un corredor de pruebas, un formateador y una manera de publicar, y nada de eso sale en el tutorial porque nada de eso es el lenguaje. Son la razón por la que un programa que servía deja de servir en otra computadora, o en la misma seis meses después.
Lo aprovechable es que la forma de abajo se repite. uv en Python, npm en JavaScript y cargo en Rust son la misma herramienta con otro nombre: cada uno lee un archivo con lo que el proyecto necesita, lo resuelve a versiones exactas y escribe esas versiones exactas en un segundo archivo. Aprender la forma una vez hace que el segundo lenguaje cueste una fracción del primero, y por eso el primer lenguaje pesa menos de lo que casi todos suponen. Es también la razón por la que este tema no es el centro de programación aunque los cursos gratuitos lo pongan ahí.
Los tres renglones que terminan el segundo día
El error de Ulises salió de una versión. La biblioteca que usa publicó una entrega entre enero y septiembre, y una función se movió de lugar. El mecanismo que evita eso cabe en tres caracteres de puntuación.
En 2.4.1 el 2 es la versión mayor, el 4 la menor y el 1 el parche. Lo que promete quien publica es que un parche corrige algo, una menor agrega algo sin romper lo que había, y una mayor tiene permiso de romper. El número no es adorno: es una afirmación sobre lo que le va a pasar a tu código si aceptas la entrega.
Lo que un archivo de proyecto suele anotar es un rango y no una versión, y la puntuación carga el rango. El signo ^ en ^2.4.1 acepta la 2.9.0 y rechaza la 3.0.0. Ese era el ajuste de Ulises, y es el valor correcto por omisión: toma las correcciones y se queda del lado de la promesa. También significa que instalar en enero e instalar en septiembre puede entregar dos bibliotecas distintas, que es exactamente lo que pasó.
La salida es el segundo archivo, el que nadie abre. El lockfile fija las versiones exactas para que otra máquina reciba las mismas, y la computadora de uno, seis meses y un formateo después, cuenta como otra máquina. Se genera, no se escribe, va adentro del repositorio, y su trabajo entero es dejar anotada la resolución de cada rango en un momento para poder repetirla. En el repositorio de Ulises no había ninguno.
uv add pandasescribe el rango en el archivo del proyecto y la versión exacta en el lockfileuv syncinstala desde el lockfile en vez de volver a resolvergit add uv.lockes el paso que faltaba
Cuánto inglés ajeno hay que leer antes de contestar una petición
Los lenguajes se diferencian muchísimo en cuánto llega adentro de la caja, y la diferencia se puede contar. Escribir el mismo servidor mínimo, el que devuelve una línea de texto, instala 0 paquetes en Go, porque el servidor viene en la biblioteca estándar. La versión en Python instala 2, la de Rust instala 4, y la de JavaScript instala 49.
La edición en inglés lee esa cuenta como una medida de cuánto arma uno mismo. Desde acá hay una segunda lectura y pesa más: cada paquete instalado trae su README, su registro de cambios, su rastreador de errores y su manera propia de nombrar las cosas, y todo eso llega en inglés. Cuarenta y nueve paquetes son cuarenta y nueve estilos de documentación ajena el día que algo truena adentro de alguno de ellos. Cero paquetes son una sola fuente, escrita por un mismo equipo, con un solo vocabulario que aprender.
Ninguno de los dos lados gana. Un ecosistema que lo surte todo se mueve más rápido que un comité, y el precio se paga en árboles de dependencias en vez de en esperar la próxima entrega del lenguaje. La herramienta de Ulises declara tres dependencias e instala 26, porque esas tres traen las suyas, y uv tree es el comando que imprime el árbol completo en una pantalla. Las tres no son descuido: una de ellas es la lectura del formato de hoja de cálculo que él nunca iba a escribir.
El atasco de acá es el idioma del ecosistema
Quien se traba con un error en un lenguaje nuevo tiene dos posibilidades enfrente y no puede distinguirlas: o el concepto no cuadra, o la oración en inglés que lo describe no cuadra. La ambigüedad no es un detalle de traducción, porque decide qué hacer después. Si lo que falta es el concepto, la salida es leer más despacio. Si es la oración, la salida es buscar el término y seguir de largo.
Y el impuesto no cae parejo entre lenguajes. Python tiene la documentación oficial traducida al español, y la referencia web que sostiene a JavaScript también, en buena parte. Casi todo lo demás no: la traducción, cuando existe, la hace la comunidad y va una o dos versiones atrás de la original. Los mensajes de error no están traducidos en ninguno de los doce, y eso no va a cambiar.
De ahí sale un criterio que la edición en inglés no tiene motivo para escribir. El primer lenguaje conviene elegirlo también por cuánta de su documentación se lee sin diccionario; el segundo, ya con el oficio encima, se elige sin esa consideración. Python gana por la traducción y Java por otra vía, porque es lo que enseñan las ingenierías de sistemas y los programas técnicos de la región, de modo que hay a quién preguntarle en el pasillo. Ese segundo criterio no aparece en ninguna comparativa de lenguajes y decide más semestres que la sintaxis.
El otro atasco es más chico y es igual en cualquier idioma: intentar aprender un lenguaje leyendo sobre el lenguaje, sin instalar nada, porque instalar es la parte aburrida. Instalar es la materia.
Qué abrir en 2026, y lo que llega en la factura
Para Python, uv es la respuesta actual y reemplazó una pila de tres: pip para instalar, virtualenv para aislar y pyenv para las versiones del intérprete. Hace las tres cosas, es tan rápido que la velocidad alcanza a ser un argumento, y escribe el lockfile que a Ulises le faltaba. Para JavaScript, npm viene con Node y sigue siendo el que está por omisión, después de haber tomado el lugar de copiar a mano una carpeta de bibliotecas dentro del proyecto. Para Rust, cargo llega con el lenguaje y nunca hubo una segunda opción, que es el argumento callado a favor de los lenguajes que decidieron esto temprano.
Los tres son gratis y de código abierto, y se descargan sin traba desde México y desde Colombia. Lo que sí se siente es el peso. Una instalación de Node con las 49 dependencias de ese servidor mínimo son cientos de megabytes en disco y varios minutos de reloj en un equipo de hace seis años, y esa cuenta se vuelve a pagar cada vez que se clona el proyecto en otra parte. uv sync y su equivalente en cada ecosistema existen justo para no volver a resolver lo ya resuelto.
La factura de este tema es corta y conviene decirla completa: los tres gestores son gratis, los registros de paquetes son gratis, y publicar un paquete propio en cualquiera de los tres tampoco cobra. Lo que cobra dólares llega un tema después, cuando el programa tiene que correr en una máquina que uno no prendió, y eso vive en la puesta en producción. Lo que se paga aquí es disco, descarga y minutos, y se paga en el equipo que hay sobre la mesa, no en el del tutorial.
Un asistente de código escribe código correcto en un lenguaje que uno nunca abrió, y está en su punto de mayor confianza justo donde el ecosistema se aparta del que ya se conoce. No avisa que el lockfile se quedó fuera del repositorio.
Lo que nada de esto decide es en cuál de los doce gastar los próximos seis meses. La respuesta honesta depende de dónde tiene que correr el código y no del lenguaje, y para la mayoría de quienes leen esto ese lugar es el desarrollo web. La pregunta que conviene contestar antes que esa es qué cuesta una operación cuando hay más datos, porque esa no cambia al cambiar de lenguaje, y vive en los fundamentos de programación.