Taxonomía básica de artefactos de software
Metadatos de la lección
- Autoría:
- Ignacio Slater-Muñoz
- Última actualización:
- 8 de abril de 2026
Cambios recientes:
-
217ece5· 8 de abril de 2026 · 📝🧪 chore(notes): refine artifacts taxonomy and harden webpage references ( GitLab / GitHub ) -
a76aa7a· 2 de abril de 2026 · ✨ ♻️ feat(notes): add Node.js scripting lesson and catalog-driven references ( GitLab / GitHub ) -
4ba9211· 31 de marzo de 2026 · 📝✨ feat(unit-1): add software artifacts taxonomy lesson ( GitLab / GitHub )
Abstract
Esta lección abre la unidad con una pregunta previa a cualquier decisión de diseño: qué artefacto estamos construyendo y para quién. Antes de profundizar en la biblioteca, conviene distinguir el mapa más amplio en el que también aparecen aplicaciones, scripts, herramientas, plugins y paquetes.
La meta no es memorizar etiquetas, sino incorporar un criterio práctico para el resto del curso. Al distinguir relación de uso, contrato y distribución, se vuelve más claro qué vuelve particular a la biblioteca y por qué no se diseña igual que otros artefactos.
¿Qué es un artefacto de software?
Antes de distinguir entre biblioteca, aplicación, script, herramienta o paquete, conviene partir por el concepto más amplio que las reúne. Todas esas categorías son tipos de artefacto de software, no etiquetas aisladas.
Un artefacto de software es una unidad de software diseñada para ser creada, distribuida y usada dentro de un ecosistema técnico. No se define solo por su implementación, sino también por su propósito, su forma de uso y el tipo de consumo que habilita para personas, programas u otras herramientas.
Por eso, al diseñar software, no basta con preguntarse cómo construirlo. También hay que preguntarse qué artefacto estamos creando, quién lo va a usar y de qué manera. Esa distinción influye en decisiones de diseño, automatización, publicación y mantenimiento.
Por qué hace falta distinguir artefactos
En conversaciones técnicas es común usar palabras como biblioteca, herramienta o script como si fueran casi sinónimos. Sin embargo, cada una describe una relación de uso distinta: cambia quién consume el artefacto, cómo lo hace, qué estabilidad espera y qué contrato debe ofrecerse.
Esa diferencia importa porque el diseño no depende solo de la funcionalidad interna, sino también de la forma de uso que se expone hacia afuera. Una biblioteca se evalúa por la claridad y estabilidad de su API; una aplicación, por la experiencia de uso final; un script, por resolver una tarea concreta con la menor fricción posible.
Misma implementación, distinto artefacto
Dos soluciones pueden compartir gran parte del mismo código y aun así ser artefactos distintos. Lo decisivo no es solo la lógica interna, sino cómo se consumen y qué contrato prometen hacia afuera.
Por ejemplo, una misma lógica podría reutilizarse como biblioteca, exponerse como herramienta de línea de comandos o envolverse en un script de automatización. En cada caso cambian las decisiones de distribución, documentación, validación y mantenimiento.
Hacer esta distinción desde el comienzo evita mezclar preguntas diferentes. No es lo mismo automatizar una tarea local, empaquetar una herramienta para un equipo o publicar una biblioteca para que otras personas la integren en sus programas.
Definiciones operativas
En esta lección, la distinción base se organiza alrededor de formas de uso: biblioteca, aplicación, script y herramienta. La diferencia entre aplicación y herramienta es de enfoque: mientras una aplicación prioriza la experiencia de uso final, una herramienta prioriza la operación técnica clara y repetible. Además, se incorporan dos dimensiones complementarias: plugin, como extensión de un anfitrión, y paquete, como unidad de distribución.
Biblioteca
Una biblioteca está diseñada para ser integrada desde código de otro programa
mediante una API. Su foco no es la operación directa, sino la reutilización
programática. Ejemplos claros son kotlinx.coroutines
en el ecosistema Kotlin, o Requests,
biblioteca HTTP de Python.
Aplicación
Una aplicación está orientada al uso directo por parte de personas usuarias finales. A diferencia de una biblioteca, su contrato principal es la experiencia de uso final, no la API para integración. Una app Android escrita en Kotlin o Visual Studio Code son ejemplos de artefactos que se evalúan como producto final.
Script
Un script suele orientarse a automatizar una tarea concreta en un contexto
local o acotado. Su rasgo principal no es el lenguaje en que está escrito, sino el
hecho de priorizar rapidez y bajo costo de arranque por sobre un contrato público
estable para terceros. build.gradle.kts es un ejemplo típico de script.
Herramienta
Una herramienta es un artefacto pensado para uso técnico directo por parte de otras personas o equipos. Suele ofrecer una interfaz operable y repetible — por ejemplo, una CLI, un linter o un generador — y por eso exige instalación, documentación y comportamiento estable. ktlint y detekt son ejemplos del ecosistema Kotlin.
Plugin
Un plugin extiende el comportamiento de un artefacto anfitrión mediante puntos de extensión definidos por ese anfitrión. Se integra dentro del ciclo de vida de la plataforma que lo carga, no arbitrariamente desde código. Un plugin de Gradle o de IntelliJ IDEA son ejemplos típicos.
Paquete
Un paquete es una unidad de distribución dentro de un ecosistema. No describe primero cómo se usa el software, sino cómo se publica, instala y versiona. Un paquete puede contener una biblioteca, una herramienta, una aplicación o una combinación de ellas. Los artefactos publicados en Maven Central o los crates de Cargo son ejemplos.
Estas categorías no son excluyentes
Un mismo proyecto puede combinar varias de estas dimensiones. Por ejemplo, un paquete puede distribuir una biblioteca y, además, incluir una herramienta de línea de comandos apoyada en esa misma biblioteca.
Comparación por ejes
Una vez instalado artefacto como marco conceptual, una forma útil de comparar sus variantes es mirar siempre los mismos ejes. Así la distinción no depende solo de intuiciones vagas, del tamaño del proyecto o de detalles accidentales de la implementación.
Nota
Destinatario principal
- Biblioteca: otras personas desarrolladoras.
- Aplicación: personas usuarias finales.
- Script: quien automatiza una tarea local o de equipo.
- Herramienta: otras personas o equipos que necesitan operar una capacidad concreta.
Modo de consumo
- Biblioteca: integración desde código, importación o uso de una API pública.
- Plugin: carga por un anfitrión mediante puntos de extensión definidos.
- Aplicación: interfaz gráfica, web, móvil o consola interactiva; el foco está en la experiencia de uso final, no en la operación técnica.
- Script: ejecución acotada, normalmente desde terminal, CI, scheduler o hook; automatización de una tarea concreta en un contexto local o de equipo.
- Herramienta: comandos, flags, archivos de entrada y salida o flujos operacionales definidos.
Contrato visible
El contrato cambia según el ejemplo: en kotlinx.serialization se espera
estabilidad de API; en ktlint o detekt se espera operación
consistente, opciones claras y salida interpretable.
- Biblioteca: nombres, tipos, semántica, errores, compatibilidad.
- Plugin: compatibilidad con la API de extensión del anfitrión y su ciclo de vida.
- Aplicación: comportamiento visible, experiencia de uso y resultados funcionales.
- Script: entradas conocidas, tarea clara y comportamiento predecible dentro de su contexto acotado.
- Herramienta: interfaz de uso, documentación, instalación, mensajes de error y comportamiento repetible.
Estabilidad esperada
En la práctica, una biblioteca publicada para terceros en Maven Central
suele exigir más cuidado de compatibilidad que un script local como
backup.ps1.
- Biblioteca: alta; cambios controlados, versionado y cuidado de compatibilidad.
- Aplicación: puede cambiar internamente sin exponer cada detalle como contrato programático.
- Script: baja; alcance local y menor presión por estabilidad pública.
- Herramienta: alta; ya circula entre personas distintas y exige operación repetible por terceros.
- Plugin: media a alta; depende del contrato de extensión definido por el anfitrión y de su ciclo de vida.
Distribución
Este eje se entiende rápido al contrastar una biblioteca distribuida por Maven Central con una aplicación descargable mediante instalador o tienda.
- Biblioteca: suele viajar dentro de paquetes o repositorios de dependencias.
- Aplicación: instaladores, despliegues o publicación como producto listo para usarse.
- Script: archivo o conjunto pequeño de archivos compartidos de forma acotada.
- Herramienta: binarios, paquetes, repositorios internos o canales de instalación compartidos.
- Plugin: repositorios o portales del ecosistema anfitrión, junto con metadatos que permiten su carga automática o descubrimiento.
El paquete cruza a las otras categorías
Biblioteca, aplicación, script y herramienta describen principalmente una relación de uso. En cambio, paquete describe sobre todo una forma de distribución. En el ecosistema JVM, un artefacto publicado en Maven Central puede distribuir una biblioteca, y un plugin publicado en el Gradle Plugin Portal puede circular como paquete. En ese caso, plugin nombra la relación de extensión con su anfitrión; paquete, su forma de distribución.
Un ejemplo que integra varios ejes: un proyecto Kotlin/JVM puede publicar una biblioteca en Maven Central como paquete (distribución + consumo programático), incluir un plugin de Gradle (extensión + distribución en portal) e incluir una herramienta CLI también empaquetada (operación técnica + binario compartido). Cada uno de estos artefactos ocupa una fila distinta en los ejes, pero conviven en el mismo proyecto porque responden a necesidades diferentes de quien los consume.
Casos comparativos
De script local a herramienta compartida
Imagina un script que renombra archivos para una necesidad puntual local. Mientras solo lo use quien lo escribió, puede bastar con que funcione en su máquina y con algunos supuestos implícitos sobre rutas, nombres o permisos, porque todavía no existe un contrato de uso para otras personas.
La situación cambia cuando otras personas del equipo empiezan a depender de esa misma automatización. En ese momento ya no basta con que funcione: hace falta pensar en instalación, mensajes de error, parámetros claros, comportamiento repetible, compatibilidad del entorno y documentación de uso. La lógica puede seguir siendo parecida, pero el artefacto ya no se evalúa como script local, sino como una herramienta compartida.
El cambio importante no es de tamaño, sino de contrato. La pregunta ya no es solo si automatiza algo útil, sino si otra persona puede usarlo con confianza sin necesitar conocer la implementación. A partir de ahí, ya no basta con que la automatización exista: su uso también tiene que ser claro, repetible y predecible.
Biblioteca publicada en un paquete y consumida por una aplicación
Considera kotlinx.serialization como una biblioteca reutilizable. Su
API está pensada para otras personas que desarrollan software, así que importan
nombres claros, tipos coherentes y comportamiento estable.
Para circular en el ecosistema, esa biblioteca puede publicarse como paquete en Maven Central. El paquete no reemplaza a la biblioteca ni redefine su propósito: define su forma de distribución dentro del ecosistema, con versión, metadatos y dependencias. Luego, una aplicación — por ejemplo, una app Android en Kotlin — puede declarar esa dependencia y usar la biblioteca internamente para ofrecer una capacidad a sus personas usuarias.
Aquí conviven tres niveles distintos: la biblioteca define el contrato programático, el paquete define la forma de distribución y la aplicación organiza la experiencia de uso final. Distinguirlos evita mezclar decisiones de API, distribución y uso, incluso cuando estos niveles participan en una misma solución.
Gradle como herramienta, build.gradle.kts como script y plugin como
extensión
En un proyecto Kotlin/JVM, Gradle funciona como una herramienta de automatización: se usa mediante comandos y coordina tareas de compilación, pruebas, empaquetado y publicación.
Dentro de esa herramienta, build.gradle.kts actúa como script:
define reglas de build y automatización para el proyecto o módulo actual, aunque
parte de esa lógica pueda migrar después a convenciones más compartidas.
Un plugin, en cambio, es una extensión del anfitrión. En este caso, amplía Gradle a través de puntos de extensión definidos por la propia herramienta. Si ese plugin se publica en el Gradle Plugin Portal, sigue siendo un plugin; lo que cambia es su distribución como paquete.
Del mismo modo, una biblioteca publicada en Maven Central sigue siendo una biblioteca, aunque Gradle la descargue e integre en el build. Este ejemplo muestra que en un mismo ecosistema pueden convivir herramienta, script, plugin y paquete, cada uno con un papel distinto.
Criterio práctico para este curso
Desde aquí conviene usar una pregunta simple como filtro de diseño: ¿qué artefacto estamos construyendo y para quién? Esa pregunta ayuda a ordenar las decisiones que aparecen a lo largo del curso.
- Si estamos diseñando una biblioteca, el foco debe ponerse en la API, la claridad, la composición y la estabilidad para otras personas desarrolladoras.
- Si estamos resolviendo una automatización puntual, probablemente partimos con un script y luego evaluamos si debe convertirse en una herramienta compartida.
- Si discutimos publicación, registros o instalación, muchas veces el concepto clave ya no es la forma de uso, sino el paquete como unidad de distribución.
- Si pensamos en build y automatización, importa identificar qué artefacto se está sosteniendo, porque no todos exigen el mismo proceso ni el mismo nivel de contrato.
Este criterio no distingue artefactos por tamaño o complejidad, sino por la relación de uso que establecen y por las exigencias de diseño que esa relación trae consigo.
Conclusiones
Biblioteca, aplicación, script, herramienta, plugin y paquete no nombran lo mismo. Cada término destaca una relación distinta de uso, extensión o distribución, y con ella expectativas diferentes sobre interfaz, estabilidad, documentación y mantenimiento.
Distinguir estos artefactos desde el comienzo evita mezclar preguntas de diseño que conviene separar. Aunque distintos artefactos puedan compartir código, no establecen el mismo contrato hacia afuera ni se evalúan con los mismos criterios.
Puntos clave
- Una biblioteca se diseña para integración programática; una aplicación, para uso final directo.
- Un script suele resolver una automatización acotada; una herramienta exige una interfaz de uso más estable para terceros.
- Un plugin se define por extender a un anfitrión mediante puntos de extensión predefinidos.
- Un paquete es una unidad de distribución y puede transportar distintos tipos de artefacto.
- Estas categorías no son excluyentes: un mismo proyecto puede combinar varias.
- La pregunta qué artefacto estamos diseñando y para quién organiza mejor las decisiones de API, automatización, distribución y build.
Reflexión de cierre
Con este mapa general ya instalado, el curso puede concentrarse en la biblioteca como caso particular. La pregunta que sigue ya no es qué es un artefacto de software en general, sino qué exige diseñar una biblioteca reusable para otras personas desarrolladoras.¿Con ganas de más?
Referencias recomendadas
- “ What are Software Artifacts? ” en JFrogTe puede interesar si quieres ampliar la noción de artefacto más allá de biblioteca, paquete o binario aislado. El texto conecta artefactos con su papel en la cadena de suministro de software, su almacenamiento, su trazabilidad y su circulación en repositorios, lo que ayuda a entender por qué la pregunta por el artefacto no es solo terminológica, sino también operativa.