Title: 1 - Introducción a la Ingeniería de Software
Course: 2025 - LISI - Ingenieria de Software 2-1

Definición de Ingeniería de Software

La Ingeniería de Software es una disciplina de la ingeniería que se centra en el diseño, desarrollo, mantenimiento, prueba y evaluación de aplicaciones y sistemas de software. Su objetivo principal es aplicar principios de ingeniería para garantizar que el software sea funcional, confiable, eficiente y escalable. Incluye el uso de metodologías estructuradas y herramientas tecnológicas para gestionar proyectos de software desde su concepción hasta su entrega y mantenimiento.

Ciclo de Vida del Software

El ciclo de vida del software describe las etapas principales que atraviesa un sistema de software desde su creación hasta su retiro. Estas etapas son:

1. Planificación y análisis de requisitos: Se identifican las necesidades del usuario y los requisitos funcionales y no funcionales del sistema.
2. Diseño: Se define la arquitectura del software, los diagramas de flujo, los modelos de datos y otros detalles técnicos.
3. Desarrollo o implementación: Los programadores escriben el código siguiendo el diseño establecido.
4. Pruebas: Se verifican y validan las funcionalidades del software para identificar y corregir errores.
5. Despliegue: El software se pone en producción y está disponible para los usuarios.
6. Mantenimiento: Se realizan actualizaciones, correcciones y mejoras continuas al software.
7. Retiro: Cuando el software ya no es necesario o viable, se retira del uso activo.

Modelos de Desarrollo

Los modelos de desarrollo son enfoques utilizados para gestionar el proceso de desarrollo de software. Los principales son:

1. Modelo en Cascada:
  - Descripción: Las fases del desarrollo se completan secuencialmente, una tras otra. Cada etapa debe finalizarse completamente antes de pasar a la siguiente.
  - Ventajas: Es sencillo de entender y aplicar, y es ideal para proyectos con requisitos claros y bien definidos desde el principio.
  - Desventajas: No se adapta bien a cambios en los requisitos una vez iniciadas las fases posteriores, y puede ser ineficiente si se detectan errores tardíos.
  - Aplicaciones comunes: Proyectos con especificaciones fijas, como sistemas de gestión empresarial estáticos.
  - Ejemplo: Desarrollo de un sistema de gestión de recursos humanos para una empresa que ya tiene definidos todos los requisitos desde el inicio.
2. Modelo Incremental:
  - Descripción: El software se desarrolla en múltiples incrementos o versiones funcionales, donde cada iteración incluye nuevas funcionalidades.
  - Ventajas: Permite la entrega rápida de partes funcionales del sistema y mejora la flexibilidad para realizar cambios.
  - Desventajas: La integración continua puede ser compleja si no se gestiona correctamente, y requiere una buena planificación.
  - Aplicaciones comunes: Sistemas que requieren una entrega rápida de módulos o funcionalidades, como aplicaciones web.
  - Ejemplo: Un sistema de banca en línea que inicialmente ofrece solo consultas de saldo y luego se expande para incluir transferencias y pagos.
3. Modelo Ágil:
  - Descripción: Se basa en iteraciones cortas llamadas sprints, con retroalimentación continua del cliente y adaptación constante a los cambios.
  - Ventajas: Alta adaptabilidad a los cambios, entrega continua de valor al cliente, y mejora la comunicación entre el equipo y los interesados.
  - Desventajas: Puede ser difícil de escalar en equipos grandes o en organizaciones con poca experiencia en metodologías ágiles.
  - Aplicaciones comunes: Desarrollo de productos digitales que evolucionan rápidamente, como aplicaciones móviles y servicios SaaS.
  - Ejemplo: Desarrollo de una aplicación de redes sociales donde cada sprint entrega nuevas funcionalidades basadas en la retroalimentación del usuario.
4. Modelo de Prototipado:
  - Descripción: Se crean prototipos rápidos del sistema para comprender mejor los requisitos del usuario y recibir retroalimentación temprana.
  - Ventajas: Mejora la comprensión de los requisitos y reduce el riesgo de desarrollar un sistema que no cumpla las expectativas del usuario.
  - Desventajas: Puede aumentar los costos y el tiempo si los prototipos no se planifican y gestionan adecuadamente.
  - Aplicaciones comunes: Sistemas con requisitos poco claros o que necesitan validación temprana, como herramientas innovadoras o personalizadas.
  - Ejemplo: Desarrollo de un nuevo software de diseño gráfico donde se prueban diferentes interfaces con usuarios antes de la versión final.
5. Modelo Espiral:
  - Descripción: Combina elementos del modelo en cascada y el incremental, con un enfoque en la evaluación de riesgos en cada iteración o espiral.
  - Ventajas: Identifica y mitiga riesgos desde las primeras etapas del proyecto, y permite la retroalimentación continua.
  - Desventajas: Es complejo y costoso de implementar, especialmente en proyectos pequeños.
  - Aplicaciones comunes: Sistemas críticos y de gran escala donde el control de riesgos es clave.
  - Ejemplo: Desarrollo de un sistema de control de tráfico aéreo donde cada iteración mejora la seguridad y confiabilidad.
6. Modelo DevOps:
  - Descripción: Integra el desarrollo y las operaciones para facilitar la entrega continua, la automatización y la colaboración.
  - Ventajas: Aumenta la velocidad de desarrollo, mejora la calidad del producto final y asegura una integración continua.
  - Desventajas: Requiere una cultura organizacional alineada y herramientas especializadas.
  - Aplicaciones comunes: Proyectos que necesitan despliegues frecuentes y actualizaciones continuas, como servicios en la nube.
  - Ejemplo: Desarrollo y mantenimiento de una plataforma de streaming donde se despliegan mejoras constantes sin afectar la disponibilidad.

Estos modelos proporcionan distintos enfoques para el desarrollo de software, permitiendo a las organizaciones seleccionar el que mejor se adapte a sus necesidades y requisitos específicos.

Calidad de Software y Buenas Prácticas

La calidad del software es la capacidad de un sistema para cumplir con las necesidades del usuario y las especificaciones establecidas. Incluye:

1. Características de calidad:
  - Funcionalidad: Cumplimiento de los requisitos especificados.
  - Fiabilidad: Resistencia a fallos y capacidad de funcionar bajo condiciones esperadas.
  - Eficiencia: Uso óptimo de recursos.
  - Usabilidad: Facilidad de uso para los usuarios finales.
  - Mantenibilidad: Facilidad para realizar modificaciones o mejoras.
  - Portabilidad: Adaptabilidad a diferentes entornos de ejecución.
2. Buenas Prácticas:
  - Definir y documentar los requisitos de manera clara.
  - Aplicar revisiones de código y pruebas continuas.
  - Usar control de versiones (e.g., Git).
  - Seguir principios de diseño modular y patrones de arquitectura.
  - Implementar métricas de calidad y pruebas automatizadas.

Herramientas y Tecnologías en Ingeniería de Software

Las herramientas tecnológicas facilitan el desarrollo, prueba y mantenimiento de software. Algunas de las más comunes incluyen:

1. Gestores de Proyectos:
  - Jira, Trello, Asana.
  - Ayudan a planificar, asignar tareas y realizar seguimientos.
2. Control de Versiones:
  - Git, GitHub, GitLab.
  - Facilitan la colaboración y el control de cambios en el código.
3. Entornos de Desarrollo Integrados (IDEs):
  - Visual Studio Code, IntelliJ IDEA, Eclipse.
  - Ofrecen herramientas para escribir, depurar y probar código.
4. Pruebas:
  - Selenium, JUnit, Postman.
  - Automatizan y aseguran la calidad del software.
5. Automatización y CI/CD:
  - Jenkins, Travis CI, GitHub Actions.
  - Permiten integración y despliegue continuos.
6. Contenedores y Virtualización:
  - Docker, Kubernetes, VirtualBox.
  - Ayudan en la creación de entornos consistentes y escalables.
7. Bases de Datos:
  - MySQL, PostgreSQL, MongoDB.
  - Soportan el almacenamiento y la gestión de datos.