3. Problemas que resuelve la Ingeniería de Software

3.1 Introducción

La Ingeniería de Software existe porque desarrollar software real presenta dificultades que no se resuelven solo escribiendo más código. Un programa puede comenzar como algo pequeño y comprensible, pero con el tiempo aparecen nuevas funciones, más usuarios, integraciones, errores, cambios de reglas, decisiones técnicas acumuladas y varias personas trabajando sobre la misma base de código.

Cuando esos problemas no se gestionan, el proyecto se vuelve impredecible: cuesta saber qué debe hacerse, cuándo estará listo, qué partes funcionan, qué riesgos existen y cuánto esfuerzo demandará modificar el sistema. La Ingeniería de Software aporta prácticas para reducir ese desorden y convertir el desarrollo en un proceso más controlado.

En este tema veremos los problemas más comunes que intenta resolver o administrar esta disciplina.

3.2 Complejidad creciente

El software tiende a volverse complejo porque cada funcionalidad se relaciona con otras. Una pantalla puede depender de permisos, reglas de negocio, bases de datos, servicios externos, validaciones, mensajes, reportes y configuraciones.

Al principio, el equipo puede comprender todo con facilidad. Pero cuando el sistema crece, una modificación pequeña puede afectar partes que no eran evidentes. Por ejemplo, cambiar la forma de calcular un descuento puede impactar en facturación, reportes, promociones, impuestos y auditoría.

La Ingeniería de Software ayuda a manejar esa complejidad mediante diseño modular, separación de responsabilidades, documentación, pruebas, arquitectura y criterios claros para organizar el sistema.

Idea clave: la complejidad no desaparece, pero puede organizarse para que el sistema sea más fácil de comprender, modificar y probar.

3.3 Requisitos ambiguos o incompletos

Un problema frecuente es que las necesidades del usuario no están expresadas con suficiente claridad. Frases como "el sistema debe ser rápido", "la pantalla debe ser simple" o "el reporte debe mostrar las ventas" pueden parecer claras, pero admiten muchas interpretaciones.

Si el equipo comienza a construir sin aclarar esas ideas, puede entregar algo técnicamente correcto pero incorrecto para el usuario. El problema no estará necesariamente en el código, sino en una comprensión incompleta del objetivo.

La Ingeniería de Software propone técnicas para relevar, analizar, especificar y validar requisitos. Esto permite transformar necesidades generales en acuerdos más precisos.

  • Identificar usuarios y actores involucrados.
  • Definir funcionalidades esperadas.
  • Aclarar reglas de negocio.
  • Establecer restricciones y prioridades.
  • Definir criterios de aceptación.
  • Validar lo entendido con personas del negocio.

3.4 Cambios constantes

En muchos proyectos, los requisitos cambian mientras el software se desarrolla. Esto puede ocurrir porque el negocio cambia, aparecen nuevas leyes, los usuarios entienden mejor lo que necesitan, surge un competidor, se descubre una limitación técnica o se incorporan nuevos sistemas.

El cambio no siempre es un error de planificación. Muchas veces es parte natural del desarrollo de software. El problema aparece cuando el sistema y el proceso no están preparados para cambiar.

La Ingeniería de Software ayuda a enfrentar el cambio mediante:

  • Diseños que reduzcan dependencias innecesarias.
  • Control de versiones para registrar la evolución del código.
  • Pruebas para detectar regresiones.
  • Priorización de tareas y gestión del alcance.
  • Comunicación clara sobre impacto, costo y riesgo de cada cambio.

3.5 Comunicación entre personas

El desarrollo de software es una actividad técnica, pero también humana. En un proyecto participan usuarios, clientes, analistas, desarrolladores, testers, responsables de proyecto, diseñadores y personas de operaciones. Cada grupo puede tener un lenguaje, una expectativa y una preocupación distinta.

Muchos problemas aparecen por malentendidos: el usuario espera una cosa, el analista documenta otra, el desarrollador interpreta otra y el tester verifica algo diferente.

Para reducir estos problemas, se utilizan prácticas como reuniones de refinamiento, documentación compartida, prototipos, diagramas, casos de uso, historias de usuario, criterios de aceptación y revisiones frecuentes.

3.6 Coordinación del trabajo en equipo

Cuando una sola persona trabaja en un proyecto pequeño, puede tomar muchas decisiones de forma informal. En cambio, cuando varias personas trabajan sobre el mismo sistema, es necesario coordinar tareas, archivos, cambios, estilos, prioridades y entregas.

Sin coordinación, pueden ocurrir conflictos y pérdidas de tiempo:

  • Dos personas modifican la misma parte sin saberlo.
  • Una funcionalidad depende de otra que todavía no está lista.
  • El código no sigue una estructura común.
  • No queda claro quién debe revisar o aprobar un cambio.
  • Se integran cambios grandes demasiado tarde.
  • El equipo no sabe qué está terminado y qué está pendiente.

La Ingeniería de Software incorpora herramientas y prácticas como control de versiones, ramas, revisiones de código, tableros de tareas, integración continua y acuerdos de equipo.

3.7 Calidad insuficiente

Un sistema puede compilar, ejecutarse y aun así tener mala calidad. Puede ser lento, inseguro, difícil de usar, frágil ante errores, inaccesible para ciertos usuarios o demasiado costoso de mantener.

La calidad debe analizarse desde varias dimensiones:

Problema Consecuencia Prácticas que ayudan
Errores funcionales El sistema no hace lo que debería hacer. Requisitos claros, pruebas y revisión de casos críticos.
Bajo rendimiento El usuario espera demasiado o el sistema no soporta la carga. Medición, optimización y pruebas de rendimiento.
Falta de seguridad Datos o funciones sensibles quedan expuestos. Diseño seguro, validaciones, permisos y revisión técnica.
Mala usabilidad El usuario se equivoca, abandona o necesita ayuda constante. Diseño centrado en el usuario, prototipos y validación temprana.
Baja mantenibilidad Cada cambio requiere demasiado esfuerzo. Modularidad, código claro, pruebas y refactorización.

3.8 Dificultad para detectar errores

En sistemas reales, los errores no siempre aparecen de forma evidente. Algunos solo ocurren con ciertos datos, determinados permisos, una configuración especial, una cantidad alta de usuarios o una combinación particular de pasos.

Además, una corrección puede introducir un nuevo defecto en una funcionalidad que antes funcionaba. Esto se conoce como regresión.

La Ingeniería de Software reduce este riesgo mediante pruebas manuales y automatizadas, revisión de código, integración continua, ambientes de prueba, monitoreo y análisis de defectos. El objetivo no es encontrar todos los errores posibles, sino detectar a tiempo los más importantes y evitar que se repitan problemas conocidos.

3.9 Mantenimiento costoso

Muchos sistemas viven durante años. Después de la primera entrega, habrá que corregir errores, adaptar reglas, agregar funciones, actualizar dependencias, mejorar seguridad y responder a nuevas necesidades.

Si el sistema fue construido sin orden, el mantenimiento puede volverse más caro que el desarrollo inicial. Esto ocurre cuando el código está duplicado, los módulos están demasiado acoplados, no existen pruebas, falta documentación o las decisiones técnicas no se entienden.

La Ingeniería de Software intenta que el mantenimiento sea posible y razonable. Para eso promueve código comprensible, arquitectura adecuada, documentación útil, pruebas de regresión, refactorización y gestión de deuda técnica.

3.10 Estimación y planificación poco realistas

Otro problema común es no saber cuánto tiempo llevará construir una funcionalidad o completar un proyecto. Estimar software es difícil porque muchas tareas tienen incertidumbre: puede faltar información, aparecer una dificultad técnica, cambiar un requisito o descubrirse una dependencia no prevista.

La Ingeniería de Software no permite predecir el futuro con exactitud, pero ayuda a planificar mejor mediante:

  • División del trabajo en partes más pequeñas.
  • Identificación de dependencias.
  • Registro de riesgos.
  • Priorización de funcionalidades.
  • Seguimiento del avance real.
  • Revisión periódica del alcance.

Una planificación útil no es la que nunca cambia, sino la que permite tomar decisiones informadas cuando la realidad cambia.

3.11 Riesgos técnicos y de negocio

Todo proyecto de software tiene riesgos. Algunos son técnicos: una tecnología desconocida, una integración compleja, problemas de rendimiento, falta de seguridad o dependencia de una biblioteca externa. Otros son de negocio: prioridades cambiantes, presupuesto limitado, usuarios no disponibles o expectativas poco claras.

Ignorar los riesgos no los elimina. Por eso se deben identificar, comunicar y revisar durante el proyecto.

Riesgo Ejemplo Respuesta posible
Técnico No sabemos si una API externa soporta el volumen esperado. Hacer una prueba de concepto y medir antes de comprometer la solución.
De requisitos El usuario no puede explicar con claridad una regla de negocio. Construir ejemplos, prototipos o casos de uso para validar el entendimiento.
De equipo Solo una persona conoce una parte crítica del sistema. Documentar, revisar código y compartir conocimiento.
De entrega La fecha comprometida no coincide con el alcance esperado. Priorizar funciones, negociar alcance y entregar incrementos.

3.12 Falta de visibilidad del avance

En muchos proyectos se cree que algo está "casi terminado", pero después aparecen detalles pendientes, pruebas fallidas, integraciones incompletas o decisiones sin resolver. La falta de visibilidad genera falsas expectativas y dificulta la toma de decisiones.

Para mejorar la visibilidad se pueden usar prácticas como:

  • Definir qué significa que una tarea esté terminada.
  • Trabajar con entregas pequeñas y verificables.
  • Registrar tareas pendientes y bloqueos.
  • Mostrar avances funcionales, no solo explicar avances técnicos.
  • Medir defectos, cambios y riesgos relevantes.
  • Comunicar desviaciones temprano.

La transparencia ayuda a corregir el rumbo antes de que los problemas sean demasiado grandes.

3.13 Entregar valor al usuario

Un proyecto puede producir mucho código y aun así entregar poco valor. Esto ocurre cuando se construyen funcionalidades que nadie usa, cuando el sistema no resuelve el problema principal o cuando la experiencia de uso impide aprovechar la solución.

La Ingeniería de Software recuerda que el objetivo no es solamente entregar archivos, pantallas o componentes. El objetivo es resolver una necesidad real mediante software.

Por eso se trabaja con prioridades, validación temprana, participación de usuarios, criterios de aceptación y revisión continua del producto. Estas prácticas ayudan a mantener el foco en el valor, no solo en la actividad técnica.

3.14 Resumen de problemas y respuestas

Problema Cómo ayuda la Ingeniería de Software
Complejidad creciente Diseño modular, arquitectura, separación de responsabilidades y documentación.
Requisitos confusos Relevamiento, análisis, criterios de aceptación y validación con usuarios.
Cambios constantes Gestión del alcance, control de versiones, pruebas y diseño mantenible.
Trabajo en equipo desordenado Procesos, roles, revisión de código, integración continua y comunicación.
Calidad insuficiente Pruebas, revisiones, estándares, atributos de calidad y mejora continua.
Mantenimiento difícil Código claro, refactorización, documentación, pruebas y gestión de deuda técnica.
Planificación incierta Estimación, priorización, seguimiento, gestión de riesgos y entregas incrementales.

3.15 Qué debes recordar de este tema

  • La Ingeniería de Software surge para manejar problemas reales de desarrollo, no solo para escribir código.
  • La complejidad, los cambios y los requisitos ambiguos son normales en proyectos de software.
  • El trabajo en equipo exige comunicación, acuerdos y herramientas compartidas.
  • La calidad debe gestionarse desde el inicio y no solamente al final.
  • El mantenimiento puede volverse muy costoso si el sistema no fue diseñado con cuidado.
  • La planificación debe considerar incertidumbre, riesgos y prioridades.
  • El objetivo final es entregar valor real a usuarios y organizaciones.

3.16 Conclusión

La Ingeniería de Software no existe para complicar el desarrollo, sino para ordenar problemas que aparecen naturalmente cuando el software crece y se vuelve importante. Sus prácticas ayudan a entender mejor las necesidades, coordinar equipos, reducir defectos, controlar cambios, mejorar la calidad y sostener el producto en el tiempo.

Para quien comienza, la idea principal es esta: los problemas del software no son solamente problemas de código; también son problemas de comunicación, diseño, cambio, calidad, mantenimiento y gestión.

En el próximo tema veremos el software como producto, proyecto y servicio, para comprender mejor las distintas formas en que una solución de software genera valor y requiere responsabilidades diferentes.