# Dependencia de software

> Código escrito por otra gente que tu programa necesita para funcionar.

- Nivel: Intermedio
- Temas: Software
- URL: https://tidbit.legios.com.ar/es/software-dependency/
- En inglés: [Software dependency](https://tidbit.legios.com.ar/software-dependency/)

Una **dependencia de software** es cualquier pedazo de código externo del que depende tu programa: una biblioteca de software para manejar fechas, un framework para armar páginas web, un driver para hablar con una base de datos. En vez de escribir todo desde cero, quienes desarrollan anotan los paquetes que necesitan en un archivo (`package.json` en JavaScript, `requirements.txt` o `pyproject.toml` en Python, `go.mod` en Go) y un gestor de paquetes los descarga.

Las dependencias tienen sus propias dependencias. Tu app quizás usa 20 paquetes de forma directa, pero esos traen otros, y esos otros traen más: son las **dependencias transitivas**, y una app web moderna suele terminar con cientos o miles. Un **lockfile** registra la versión exacta de cada una, para que el código que corre en la compu de un compañero y en el servidor sea exactamente el mismo.

Esto ahorra una cantidad enorme de trabajo, y también implica confiar en un montón de desconocidos. En 2016 un desarrollador borró un paquete minúsculo llamado `left-pad` y rompió builds en todo el mundo. En 2021 una falla en Log4j, una biblioteca de logs escondida dentro de incontables programas en Java, fue una de las vulnerabilidades más graves en años. En 2024 alguien pasó dos años ganándose la confianza del proyecto `xz` antes de colar una puerta trasera. Hoy los equipos usan herramientas como Dependabot para recibir alertas y actualizaciones, y fijan versiones siguiendo las reglas del versionado semántico.

Cuando las versiones chocan (el paquete A necesita la versión 1 de algo y el paquete B, la versión 2) se habla de **infierno de dependencias**. Mantener la lista corta y al día es parte del trabajo.

## Una analogía

Una receta que dice "agregá un frasco de pesto comprado". Te ahorrás una hora, pero ahora tu plato depende de los ingredientes de esa marca, y si cambian la receta o sale un lote fallado, tu cena también sale mal.

## Para quedarse

- Una dependencia es código externo que tu programa necesita; la instala un gestor de paquetes.
- Por las dependencias transitivas, unos pocos paquetes directos pueden traer cientos más.
- El lockfile fija versiones exactas para que todas las máquinas corran el mismo código.
- Cada dependencia también es un riesgo de seguridad y de mantenimiento a vigilar.

## Para seguir leyendo

- [Dependabot (documentación de GitHub)](https://docs.github.com/es/code-security/dependabot)
- [Dependency hell en Wikipedia (en inglés)](https://en.wikipedia.org/wiki/Dependency_hell)

## Términos relacionados

- [Biblioteca de software](https://tidbit.legios.com.ar/es/software-library/): Código ya hecho para una tarea común que se enchufa dentro de otros programas.
- [Framework](https://tidbit.legios.com.ar/es/framework/): Un esqueleto ya armado para una app: define la estructura y llama a tu código.
- [Sitio web](https://tidbit.legios.com.ar/es/website/): Un conjunto de páginas web bajo una dirección, guardadas en un servidor.
- [Base de datos](https://tidbit.legios.com.ar/es/database/): Un depósito ordenado de datos que los programas consultan y actualizan sin riesgo.
- [Paquete](https://tidbit.legios.com.ar/es/packet/): El pedacito en que se corta cada dato de internet antes de viajar.
- [JavaScript](https://tidbit.legios.com.ar/es/javascript/): El lenguaje de programación que corre en las páginas web y las vuelve interactivas.
- [Python](https://tidbit.legios.com.ar/es/python/): Un lenguaje de programación muy usado, conocido por ser fácil de leer y de escribir.
- [Go](https://tidbit.legios.com.ar/es/go/): Un lenguaje de programación simple y rápido de Google, pensado para servidores y la nube.
