Exploración de cómo se ha creado el software

Completado

El desarrollo de software moderno ha cambiado fundamentalmente de compilar todo desde cero hasta ensamblar aplicaciones de componentes existentes. Comprender este enfoque basado en componentes es esencial para implementar y administrar software de forma eficaz en entornos de desarrollo contemporáneos.

Modelo de software basado en componentes

Las aplicaciones actuales se crean mediante la combinación de código original con componentes reutilizables. En lugar de escribir cada parte de funcionalidad, los equipos de desarrollo ensamblan soluciones de:

  • Código de lógica de negocios original: Código personalizado que implementa requisitos empresariales, flujos de trabajo y características únicas específicos que diferencian la aplicación.
  • Bibliotecas y marcos de código abierto: Los componentes reutilizables creados y mantenidos por la comunidad, que proporcionan funcionalidad común, como el procesamiento de datos, la autenticación, las interfaces de usuario y los protocolos de comunicación.
  • Componentes comerciales: Bibliotecas de terceros ofrecidas por proveedores, a menudo proporcionando funcionalidad especializada, soporte técnico y garantías.
  • Código de integración: Código "Glue" que conecta componentes, adapta interfaces y organiza interacciones entre diferentes partes del sistema.

La investigación muestra sistemáticamente que las aplicaciones modernas constan de aproximadamente 80% componentes existentes mantenidos fuera del proyecto, con solo 20% siendo código original escrito por el equipo de desarrollo. Esta composición refleja un cambio fundamental en la forma en que se crea el software, desde la creación hasta el montaje.

¿Por qué el software se compila de esta manera?

El enfoque basado en componentes proporciona ventajas significativas:

Velocidad de desarrollo

La reutilización de componentes existentes acelera drásticamente el desarrollo:

  • Soluciones probadas: En lugar de resolver problemas que otros ya han resuelto, los equipos incorporan componentes probados por batalla que funcionan de forma confiable.
  • Tiempo de desarrollo reducido: La creación de un marco de trabajo de aplicaciones web, un controlador de base de datos o un sistema de autenticación desde cero tardaría meses o años. El uso de componentes existentes reduce esto a días o horas.
  • Céntrese en el valor empresarial: Los desarrolladores se centran en una lógica empresarial única en lugar de reinventar la infraestructura común.
  • Tiempo de comercialización más rápido: Las aplicaciones llegan a producción antes porque los equipos no crean todas las capas desde cero.

Calidad y confiabilidad

Los componentes de código abierto bien mantenidos suelen superar la calidad del código personalizado:

  • Investigación de la comunidad: Los proyectos populares de código abierto tienen miles de usuarios que identifican y notifican problemas, lo que conduce a código sólido y confiable.
  • Desarrollo experto: Muchos proyectos de código abierto son creados y mantenidos por expertos que se especializan en dominios de problemas específicos.
  • Mejora continua: Los proyectos activos reciben actualizaciones periódicas, correcciones de errores y mejoras de colaboradores en todo el mundo.
  • Pruebas de producción: Los componentes usados por miles de aplicaciones se han probado en diversos entornos y escenarios.

Rentabilidad

El uso de componentes de código abierto reduce los costos de desarrollo y mantenimiento:

  • Sin tarifas de licencia: La mayoría de los componentes de código abierto son libres de usar, evitando los costos de licencia por puesto o por implementación.
  • Carga de mantenimiento compartido: La comunidad contribuye a corregir errores y mejoras, lo que reduce los costos de mantenimiento de la organización.
  • Necesidades de personal reducidas: Los equipos no necesitan especialistas para cada capa de tecnología porque pueden incorporar conocimientos existentes a través de componentes.
  • Menor costo total de propiedad: Aunque los componentes comerciales tienen costos directos, las alternativas de código abierto suelen proporcionar funcionalidades similares sin tarifas de licencia.

Acceso a la innovación

Las comunidades de código abierto impulsan la innovación tecnológica:

  • Características de vanguardia: Muchas nuevas tecnologías y enfoques surgen primero en proyectos de código abierto.
  • Efectos del ecosistema: Los marcos populares crean ecosistemas de componentes, herramientas y conocimientos compatibles.
  • Adopción flexible: Las organizaciones pueden experimentar con nuevas tecnologías sin grandes compromisos financieros.
  • Conocimientos de la comunidad: La amplia documentación, los tutoriales y el soporte técnico de la comunidad facilitan la adopción.

Componentes de código abierto frente a código cerrado

Los componentes se incluyen en dos categorías fundamentales basadas en la disponibilidad del código fuente:

Componentes de código abierto

El código fuente abierto está disponible públicamente para que cualquier persona inspeccione, use, modifique y a menudo contribuya a:

  • Visibilidad del código fuente: Puede examinar la implementación real, comprender cómo funciona el componente y comprobar los procedimientos de seguridad.
  • Participación de la comunidad: Muchas personas pueden contribuir a mejoras, corregir errores y agregar características.
  • Uso regulado por licencias: Las licencias de código abierto especifican los usos permitidos, desde un uso sin restricciones hasta requisitos que las obras derivadas compartan la misma licencia.
  • Transparencia: Los investigadores de seguridad, los desarrolladores y los usuarios pueden auditar el código para detectar vulnerabilidades, puertas traseras o problemas de calidad.

Entre los componentes populares de código abierto se incluyen:

  • Lenguajes de programación y entornos de ejecución: Python, Node.js, .NET Core, Go, Rust.
  • Frameworks web: React, Angular, Vue.js, Express, Django, Spring Boot.
  • Bases: PostgreSQL, MySQL, MongoDB, Redis, Elasticsearch.
  • Herramientas de desarrollo: Visual Studio Code, Git, Docker, Kubernetes.
  • Bibliotecas: Lodash, Moment.js, NumPy, Pandas, TensorFlow.

Componentes de origen cerrado

Los componentes de código cerrado (propietario) proporcionan funcionalidad sin hacer que el código fuente esté disponible:

  • Distribución binaria: Los componentes se proporcionan como archivos binarios compilados o bibliotecas empaquetadas sin código fuente.
  • Control del fabricante: La organización que crea el software controla las actualizaciones, las características y los términos de licencia.
  • Soporte técnico comercial: Muchos componentes de código cerrado incluyen soporte técnico profesional, contratos de nivel de servicio y mantenimiento garantizado.
  • Transparencia limitada: Los usuarios no pueden inspeccionar los detalles de implementación, lo que dificulta la seguridad y las evaluaciones de calidad.

Entre los ejemplos se incluyen muchos controladores de base de datos comerciales, SDK propietarios, herramientas específicas del proveedor y bibliotecas específicas del sector especializadas.

Cómo se distribuyen los componentes

Los paquetes proporcionan un mecanismo formalizado para distribuir y administrar componentes:

Estructura del paquete

  • Código binario: Bibliotecas compiladas listas para usarse en aplicaciones.
  • Metadatos: Información sobre el paquete, incluido el nombre, la versión, el autor y la descripción.
  • Dependencias: Lista de otros paquetes necesarios para que funcione el componente.
  • Información de licencia: Términos legales que rigen cómo se puede usar el paquete.
  • Documentación: Instrucciones de uso, referencias de API y ejemplos.

Ecosistema de paquetes

Diferentes lenguajes de programación han establecido ecosistemas de paquetes:

  • npm (Administrador de paquetes de Node): Paquetes de JavaScript y TypeScript, el registro de paquetes más grande del mundo con más de 2 millones de paquetes.
  • PyPI (Índice de paquetes de Python): Paquetes de Python, que proporcionan bibliotecas para la ciencia de datos, el desarrollo web, la automatización, etc.
  • NuGet: paquetes .NET para aplicaciones de C#, F#y Visual Basic.
  • Maven Central: Paquetes de Java para el desarrollo empresarial y Android.
  • RubyGems: Paquetes de Ruby para aplicaciones web y automatización.
  • Crates.io: Paquetes de Rust para la programación de sistemas.

Herramientas de administración de paquetes

Los administradores de paquetes automatizan la descarga, instalación y actualización de dependencias:

  • Resolución de dependencias: Determine e instale automáticamente las dependencias necesarias.
  • Administración de versiones: Realice un seguimiento de las versiones de los paquetes que usa la aplicación.
  • Notificaciones de actualización: Informe a los desarrolladores cuando haya versiones más recientes disponibles.
  • Examen de vulnerabilidades: Algunos administradores de paquetes integran el examen de seguridad para identificar vulnerabilidades conocidas.

Las implicaciones del desarrollo basado en componentes

Aunque el enfoque basado en componentes proporciona enormes ventajas, también presenta desafíos:

Complejidad de la administración de dependencias

  • Árboles de dependencia: La aplicación puede depender directamente de 20 paquetes, pero esos paquetes dependen de otros, creando árboles de cientos o miles de dependencias.
  • Conflictos de versión: Es posible que distintos componentes requieran versiones incompatibles de dependencias compartidas.
  • Actualizar cascadas: La actualización de un componente puede requerir la actualización de muchos otros.

Consideraciones de seguridad

  • Vulnerabilidades heredadas: Las vulnerabilidades de seguridad en cualquier dependencia afectan a la aplicación.
  • Ataques de cadena de suministro: Los actores malintencionados pueden poner en peligro los paquetes populares para atacar aplicaciones que dependen de ellos.
  • Dependencias no mantenidas: Los componentes que ya no están mantenidos no recibirán actualizaciones de seguridad.

Cumplimiento de licencias

  • Obligaciones de licencia: Cada licencia de código abierto tiene requisitos: algunos permiten un uso comercial sin restricciones, otros requieren compartir el código fuente.
  • Proliferación de licencias: Una aplicación podría incorporar cientos de paquetes con docenas de licencias diferentes.
  • Carga de cumplimiento: Las organizaciones deben realizar un seguimiento de las obligaciones de licencia y garantizar el cumplimiento.

Dependencias operativas

  • Hospedaje externo: Muchas aplicaciones dependen de paquetes hospedados en registros públicos que podrían experimentar interrupciones.
  • Disponibilidad del Registro: Si un registro público deja de estar disponible, es posible que se produzcan errores en las compilaciones e implementaciones.
  • Eliminación del paquete: A veces, los autores pueden quitar paquetes de registros públicos e interrumpir las aplicaciones que dependen de ellos.

Comprender cómo se compila software moderno con componentes proporciona un contexto esencial para las preocupaciones operativas, legales y de seguridad que las organizaciones deben abordar al implementar software de código abierto. Las unidades restantes de este módulo exploran estos problemas y estrategias para administrarlos de forma eficaz.