Articulo de referencia

Mantenimiento de software

El mantenimiento del software consiste en la modificación del software después de su entrega. El mantenimiento de software suele considerarse una tarea menos cualificada y menos...

Este es un buen artículo. Haz clic aquí para obtener más información.

El mantenimiento del software consiste en la modificación del software después de su entrega.

El mantenimiento de software suele considerarse una tarea menos cualificada y menos gratificante que el desarrollo de nuevas funcionalidades. Por ello, es un objetivo frecuente de la subcontratación o la deslocalización . Generalmente, el equipo que desarrolla el software es diferente del que se encarga de su mantenimiento. Los desarrolladores carecen de incentivos para escribir código de fácil mantenimiento. El software suele entregarse incompleto y casi siempre contiene errores que el equipo de mantenimiento debe corregir. Inicialmente, el mantenimiento de software suele incluir el desarrollo de nuevas funcionalidades, pero a medida que el producto se acerca al final de su ciclo de vida, el mantenimiento se reduce al mínimo indispensable y, finalmente, se elimina por completo antes de que el producto se retire del mercado.

Cada ciclo de mantenimiento comienza con una solicitud de cambio, generalmente proveniente de un usuario final. Dicha solicitud se evalúa y, si se decide implementarla, el programador estudia el código existente para comprender su funcionamiento antes de realizar el cambio. Las pruebas para asegurar que se conserve la funcionalidad existente y se agregue la nueva funcionalidad deseada suelen representar la mayor parte del costo de mantenimiento.

El mantenimiento de software no ha sido tan estudiado como otras fases del ciclo de vida del software, a pesar de representar la mayor parte del costo. La comprensión del tema no ha cambiado significativamente desde la década de 1980. El mantenimiento de software se puede clasificar en varios tipos según sea preventivo o reactivo y según busque agregar funcionalidades o preservar las existentes, esto último generalmente ante un entorno cambiante.

Historia

A principios de la década de 1970, las empresas comenzaron a separar el mantenimiento de software con su propio equipo de ingenieros para liberar a los equipos de desarrollo de software de las tareas de soporte. [ 1 ] En 1972, RG Canning publicó "El iceberg del mantenimiento " , en el que sostenía que el mantenimiento de software era una extensión del desarrollo de software con un aporte adicional: el sistema existente. [ 1 ] La disciplina del mantenimiento de software ha cambiado poco desde entonces. [ 2 ] Una innovación del siglo XXI ha sido que las empresas publiquen deliberadamente software incompleto y planeen terminarlo después del lanzamiento. Este tipo de cambio, y otros que amplían la funcionalidad, a menudo se denomina evolución del software en lugar de mantenimiento. [ 2 ]

Ciclo de vida del software

Diagrama del ciclo de vida tradicional del desarrollo de software de 1988.

A pesar de las pruebas y el control de calidad , prácticamente todo el software contiene errores que impiden que el sistema funcione como se espera. El mantenimiento posterior al lanzamiento es necesario para corregir estos errores cuando se detectan. [ 3 ] La mayoría del software es una combinación de componentes de software comerciales preexistentes ( COTS) y de código abierto con código personalizado. El software COTS y de código abierto se actualiza normalmente con el tiempo, lo que puede reducir la carga de mantenimiento, pero las modificaciones a estos componentes de software deberán ajustarse en el producto final. [ 4 ] A diferencia del desarrollo de software , que se centra en cumplir con los requisitos especificados, el mantenimiento de software se basa en eventos, como las solicitudes de los usuarios o la detección de un error. [ 5 ] Su propósito principal es preservar la utilidad del software, generalmente ante cambios en los requisitos. [ 6 ]

Si se concibe como parte del ciclo de vida del desarrollo de software , el mantenimiento es la última y, por lo general, la fase más larga del ciclo, [ 7 ] [ 8 ] que comprende entre el 80 y el 90 por ciento del costo del ciclo de vida. [ 9 ] Otros modelos consideran el mantenimiento separado del desarrollo de software, en cambio, como parte del ciclo de vida del mantenimiento de software (SMLC). [ 8 ] Los modelos SMLC suelen incluir la comprensión del código, su modificación y su revalidación. [ 8 ]

Transición desde el lanzamiento al mantenimiento hasta el final de su vida útil.

Diagrama que muestra los pasos para la retirada del software

Con frecuencia, el software se entrega incompleto. Los desarrolladores prueban un producto hasta que se les acaba el tiempo o el presupuesto, ya que las consecuencias de un producto imperfecto son menores que las de exceder el plazo o el presupuesto. [ 10 ] La transición del equipo de desarrollo al de mantenimiento suele ser ineficiente, sin listas de problemas conocidos ni pruebas de validación, que el equipo de mantenimiento probablemente recreará. [ 11 ] Tras el lanzamiento, es probable que los miembros del equipo de desarrollo sean reasignados o dejen de estar disponibles. El equipo de mantenimiento requerirá recursos adicionales durante el primer año posterior al lanzamiento, tanto para soporte técnico como para corregir los defectos remanentes del desarrollo. [ 10 ]

Inicialmente, el software puede pasar por un período de mejoras después de su lanzamiento. Se agregan nuevas funciones según los comentarios de los usuarios. En algún momento, la empresa puede decidir que ya no es rentable realizar mejoras funcionales y restringir el soporte a la corrección de errores y actualizaciones de emergencia. Los cambios se vuelven cada vez más difíciles y costosos debido a la falta de experiencia o al deterioro de la arquitectura por el envejecimiento del software . Una vez que un producto deja de recibir mantenimiento y ni siquiera recibe este nivel limitado de actualizaciones, algunos proveedores intentarán obtener ingresos del software el mayor tiempo posible, aunque es probable que el producto sea cada vez más evitado. Finalmente, el software se retirará del mercado, aunque puede que siga en uso. Durante este proceso, el software se convierte en un sistema heredado . [ 12 ]

Ciclo de cambio

El primer paso en el ciclo de cambio es recibir una solicitud de cambio de un cliente y analizarla para confirmar el problema y decidir si se implementa el cambio. [ 13 ] Esto puede requerir la participación de varios departamentos; por ejemplo, el equipo de marketing puede ayudar a evaluar si se espera que el cambio genere más negocio. [ 14 ] La estimación del esfuerzo de desarrollo de software es un problema difícil, incluso para las solicitudes de cambio de mantenimiento, [ 15 ] pero es probable que la solicitud sea rechazada si es demasiado costosa o inviable. [ 16 ] Si se decide implementar la solicitud, se puede asignar a una versión programada e implementarla. [ 16 ] Aunque la metodología ágil no tiene una fase de mantenimiento, [ 17 ] el ciclo de cambio se puede llevar a cabo como un sprint de Scrum . [ 18 ]

Comprender el código existente es un paso esencial antes de modificarlo. [ 2 ] El ritmo de comprensión depende tanto de la base de código como de la habilidad del programador. [ 19 ] Seguir las convenciones de codificación, como usar nombres claros de funciones y variables que correspondan a su propósito, facilita la comprensión. [ 20 ] El uso de sentencias de bucle condicional solo si el código puede ejecutarse más de una vez, y la eliminación del código que nunca se ejecutará también pueden aumentar la comprensibilidad. [ 21 ] A los programadores experimentados les resulta más fácil comprender lo que hace el código a un nivel superior. [ 22 ] La visualización de software se utiliza a veces para acelerar este proceso. [ 23 ]

La modificación del código puede realizarse de cualquier forma. Por un lado, es común aplicar una solución rápida de manera improvisada sin disponer del tiempo suficiente para actualizar la documentación del código . [ 24 ] Por otro lado, la mejora iterativa y estructurada puede comenzar modificando el documento de requisitos de nivel superior y propagando el cambio a los niveles inferiores del sistema. [ 25 ] La modificación suele incluir la refactorización del código (mejorar la estructura sin cambiar la funcionalidad) y la reestructuración (mejorar la estructura y la funcionalidad simultáneamente). [ 26 ] A diferencia del software comercial, los ciclos de cambio del software libre y de código abierto se limitan en gran medida a la codificación y las pruebas, con una documentación mínima. Los proyectos de software de código abierto, en cambio, dependen de listas de correo y de un gran número de colaboradores para comprender la base de código y corregir errores de manera eficiente. [ 27 ]

Un problema adicional con el mantenimiento es que casi cada cambio en el código introducirá nuevos errores o efectos en cadena inesperados , que requieren otra ronda de correcciones. [ 2 ] Las pruebas pueden consumir la mayor parte de los recursos de mantenimiento para el código crítico para la seguridad, debido a la necesidad de revalidar todo el software si se realizan cambios. [ 28 ] La revalidación puede incluir revisión de código , pruebas de regresión con un subconjunto de pruebas unitarias , pruebas de integración y pruebas de sistema . [ 26 ] El objetivo de las pruebas es verificar que se conserve la funcionalidad anterior y que se haya agregado la nueva funcionalidad. [ 29 ]

Categorías de mantenimiento de software

El objetivo principal del mantenimiento de software es garantizar que el producto siga cumpliendo con los requisitos de usabilidad. En ocasiones, esto puede implicar ampliar las capacidades del producto más allá de lo previsto inicialmente. [ 30 ]

Según la especificación ISO / IEC 14764, el mantenimiento del software se puede clasificar en cuatro tipos: [ 31 ]

  • Mantenimiento correctivo : modificación del software para corregir un error u otro fallo que impida cumplir con los requisitos, generalmente reportado por un usuario final. [ 31 ] [ 32 ]
  • Mantenimiento preventivo : modificación prospectiva del software después de su entrega para asegurar que siga cumpliendo los requisitos o solucionar problemas que aún no se han manifestado. [ 33 ] [ 31 ] Este tipo de mantenimiento se realiza especialmente en sistemas que requieren alta seguridad o disponibilidad. [ 33 ] La renovación del software es una forma de mantenimiento preventivo para limpiar el estado y prevenir problemas futuros. [ 33 ]
  • Mantenimiento adaptativo: modificación del software realizada después de la entrega para asegurar su continua usabilidad en un entorno cambiado o en constante cambio. [ 31 ] [ 33 ]
  • Mantenimiento perfectivo: mejora del software después de su entrega para optimizar cualidades como la experiencia del usuario , la eficiencia del procesamiento y la mantenibilidad . [ 33 ] [ 34 ] El mantenimiento perfectivo es necesario si se realizan otros tipos de mantenimiento, ya que la modificación de una base de código existente, de lo contrario, aumentaría la complejidad y provocaría el deterioro de la estructura existente. [ 34 ] El mantenimiento perfectivo puede incluir la reescritura de la documentación , la refactorización del código y la optimización del rendimiento. [ 33 ]

Según algunas estimaciones, la mejora (las dos últimas categorías) comprende alrededor del 80 por ciento del mantenimiento del software. [ 35 ]

Mantenibilidad

La mantenibilidad es la cualidad del software que permite modificarlo fácilmente sin afectar la funcionalidad existente. [ 31 ] Según la especificación ISO/IEC 14764, la actividad para garantizar la mantenibilidad del software antes de su lanzamiento se considera parte del mantenimiento del software. [ 5 ] Muchas organizaciones de desarrollo de software descuidan la mantenibilidad, aunque hacerlo aumentará los costos a largo plazo. [ 36 ] La deuda técnica se incurre cuando los programadores, a menudo por pereza o urgencia para cumplir con un plazo, eligen soluciones rápidas y poco elegantes en lugar de incorporar la mantenibilidad en su código. [ 37 ] Una causa común es la subestimación en la estimación del esfuerzo de desarrollo de software , lo que lleva a la asignación insuficiente de recursos al desarrollo. [ 38 ] Un aspecto importante es contar con una gran cantidad de pruebas de software automatizadas que puedan detectar si la funcionalidad existente se ve comprometida por un cambio. [ 31 ]

Se puede calcular un índice de mantenibilidad con ciertas fórmulas a partir de medidas de líneas de código , medidas de McCabe y medidas de complejidad de Halstead .

La medición y el seguimiento de la mantenibilidad tienen como objetivo ayudar a reducir o revertir la tendencia de un sistema hacia la "entropía del código" o la degradación de su integridad, e indicar cuándo resulta más económico y/o menos arriesgado reescribir el código que modificarlo.

Un desafío con la mantenibilidad es que muchos cursos de ingeniería de software no la enfatizan y asignan tareas únicas con especificaciones claras e inmutables. [ 39 ] Los cursos de ingeniería de software no cubren sistemas tan complejos como los que se presentan en el mundo real. [ 40 ] Los ingenieros de desarrollo que saben que no serán responsables del mantenimiento del software no tienen incentivos para incorporar la mantenibilidad. [ 2 ]

Personal

El mantenimiento suele considerarse un trabajo poco gratificante para los ingenieros de software , quienes, si se les asignaba a esta tarea, tenían más probabilidades de renunciar. [ 41 ] [ 42 ] A menudo se paga menos que un trabajo comparable en el desarrollo de software. [ 42 ] La tarea suele asignarse a trabajadores temporales o personal menos cualificado, [ 2 ] [ 43 ] aunque los ingenieros de mantenimiento también suelen ser mayores que los desarrolladores, en parte porque deben estar familiarizados con tecnologías obsoletas. [ 43 ] En 2008, alrededor de 900 000 de los 1,3 millones de ingenieros y programadores de software que trabajaban en Estados Unidos realizaban tareas de mantenimiento. [ 44 ]

Las empresas comenzaron a formar equipos separados para el mantenimiento, lo que llevó a la subcontratación de este trabajo a otra empresa y, a principios del siglo XXI, a veces a la deslocalización del trabajo a otro país, ya sea como parte de la empresa original o como una entidad separada. [ 45 ] [ 9 ] Las fuentes típicas de subcontratación son países desarrollados como Estados Unidos, Reino Unido, Japón y Australia, mientras que los destinos suelen ser países de menor costo como China, India, Rusia e Irlanda. [ 46 ] Las razones para la deslocalización incluyen aprovechar los menores costos laborales, permitir el soporte las 24 horas, reducir la presión de tiempo sobre los desarrolladores y acercar el soporte al mercado del producto. [ 47 ] Las desventajas de la deslocalización incluyen barreras de comunicación en forma de factores tales como la zona horaria y la disyunción organizacional y las diferencias culturales. [ 9 ] A pesar de que muchos empleadores consideran el mantenimiento como un trabajo de menor cualificación y la fase del desarrollo de software más adecuada para la deslocalización, [ 9 ] [ 48 ] requiere una comunicación estrecha con el cliente y una respuesta rápida, ambas obstaculizadas por estas dificultades de comunicación. [ 9 ]

Alternativas al mantenimiento

En ingeniería de software, el término sistema heredado no tiene un significado fijo, pero a menudo se refiere a sistemas antiguos que son grandes, difíciles de modificar y, además, necesarios para las necesidades empresariales actuales. Con frecuencia, los sistemas heredados están escritos en lenguajes de programación obsoletos , carecen de documentación, presentan una estructura que se deteriora tras años de cambios y dependen de expertos para su funcionamiento. [ 49 ] Al tratar con estos sistemas, en algún momento se acumula tanta deuda técnica que el mantenimiento deja de ser práctico o económico. [ 12 ] Otras opciones incluyen:

  • Congelación: no se realiza más trabajo en el sistema heredado. [ 50 ] Esta opción puede elegirse si el proveedor desea seguir obteniendo ingresos el mayor tiempo posible evitando los costos de mantenimiento. [ 12 ]
  • Externalizar la funcionalidad del sistema heredado a otra empresa, especialmente si no se considera una función empresarial central. [ 50 ]
  • Descartar el sistema heredado existente y desarrollar una nueva aplicación desde cero para cumplir el mismo propósito que el sistema heredado. [ 50 ] Sin embargo, este enfoque es ineficiente debido a que se descarta un sistema que funciona, y con este enfoque existe el peligro de que el nuevo sistema no satisfaga los requisitos comerciales cambiantes. [ 50 ]
  • Envolver la aplicación heredada en una capa de abstracción para simplificar las interfaces obsoletas. [ 50 ] El código fuente no se modifica, pero la nueva interfaz permite que un componente probado y comprobado sea accedido por aplicaciones más recientes. Este enfoque no soluciona ninguno de los problemas relacionados con el mantenimiento de un sistema heredado. [ 51 ] Bases de datos, funciones y aplicaciones completas pueden envolverse de esta manera. [ 52 ]
  • Migrar el sistema heredado a una nueva plataforma puede reducir el costo del desarrollo de nuevo software al reutilizar la implementación, el diseño, las especificaciones y los requisitos del sistema heredado. [ 53 ] La migración puede tardar de 5 a 10 años, pero resulta en una mayor flexibilidad y ahorros a largo plazo en el mantenimiento del software. [ 54 ] Hasta el 80 por ciento del costo se destina a las pruebas; es decir, a garantizar que el nuevo sistema tenga el mismo resultado que el sistema antiguo. [ 55 ] Una vez finalizado el nuevo sistema, es necesario realizar una transición del sistema antiguo al nuevo con una mínima interrupción de las funciones empresariales. [ 55 ]

Investigación

A pesar de consumir la mayor parte de los recursos de desarrollo de software, el mantenimiento es la fase menos estudiada del desarrollo de software. [ 56 ] [ 57 ] Gran parte de la literatura se ha centrado en cómo desarrollar código mantenible desde el principio, con menos énfasis en motivar a los ingenieros para que hagan de la mantenibilidad una prioridad. [ 58 ] A partir de 2020Las soluciones automatizadas para la refactorización de código con el fin de reducir el esfuerzo de mantenimiento son un área activa de investigación, [ 59 ] al igual que la evaluación de la mantenibilidad mejorada mediante aprendizaje automático . [ 60 ]

Véase también

Referencias

  1. ^ Tripatía y Naik 2014 , p.25. 
  2. 1 2 3 4 5 6 Offutt, Jeff (enero de 2018). "Descripción general del mantenimiento y la evolución del software" . Departamento de Ciencias de la Computación de la Universidad George Mason . Recuperado el 5 de mayo de 2024 .
  3. ^ Tripatía y Naik 2014 , p. 4.
  4. ^ Tripatía y Naik 2014 , págs .
  5. ^ Tripatía y Naik 2014 , p.26. 
  6. ^ Madhusudhan y otros. 2017 , pág. 761.
  7. Varga 2018 , pág. 3.
  8. ^ Tripatía y Naik 2014 , p.7. 
  9. ^ Ulziit y cols . 2015 , pág.764. 
  10. 1 2 Reifer 2012 , pág. 22.
  11. Reifer 2012 , pág. 21.
  12. ^ Tripatía y Naik 2014 , p.89. 
  13. ^ Madhusudhan y otros. 2017 , pág. 763.
  14. ^ Tripatía y Naik 2014 , p. 120.
  15. ^ Madhusudhan y otros. 2017 , pág. 762.
  16. ^ Tripatía y Naik 2014 , p.123. 
  17. Ali et al. 2024 , pág. 126.
  18. Ali et al. 2024 , pág. 130.
  19. ^ Tripatía y Naik 2014 , p. 296.
  20. ^ Tripatía y Naik 2014 , págs .
  21. ^ Tripatía y Naik 2014 , p. 309.
  22. ^ Tripatía y Naik 2014 , p. 297.
  23. ^ Tripatía y Naik 2014 , págs .
  24. ^ Tripatía y Naik 2014 , págs .
  25. ^ Tripatía y Naik 2014 , p. 86.
  26. ^ Tripatía y Naik 2014 , p.94. 
  27. ^ Tripatía y Naik 2014 , p. 59.
  28. Reifer 2012 , pág. 5.
  29. ^ Tripatía y Naik 2014 , p. 98.
  30. Varga 2018 , pág. 4.
  31. ^ Varga 2018 , pág .5. 
  32. ^ Tripatía y Naik 2014 , págs .
  33. ^ Tripatía y Naik 2014 , p .  27.
  34. 1 2 Varga 2018 , págs. 5–6.
  35. Varga 2018 , pág. 5, nota 4.
  36. Varga 2018 , pág. 12.
  37. Varga 2018 , págs. 6–7.
  38. Varga 2018 , pág. 7.
  39. Varga 2018 , págs. 7–8.
  40. Varga 2018 , pág. 9.
  41. ^ Madhusudhan y otros. 2017 , pág. 764.
  42. 1 2 Reifer 2012 , pág. 7.
  43. 1 2 Reifer 2012 , pág. 8.
  44. Reifer 2012 , pág. 1.
  45. ^ Rahman y col. 2024 , pág. 1.
  46. Rahman et al. 2021 , Antecedentes de la investigación.
  47. ^ Ulziit y col. 2015 , pág. 763.
  48. Reifer 2012 , pág. 2.
  49. ^ Tripatía y Naik 2014 , págs .
  50. ^ Tripatía y Naik 2014 , p . 188. 
  51. ^ Tripatía y Naik 2014 , p. 189.
  52. ^ Tripatía y Naik 2014 , p. 191.
  53. ^ Tripatía y Naik 2014 , págs .
  54. ^ Tripatía y Naik 2014 , p. 195.
  55. ^ Tripatía y Naik 2014 , p.196. 
  56. ^ Madhusudhan y otros. 2017 , pág. 759.
  57. ^ Ulziit y col. 2015 , pág. 766.
  58. Reifer 2012 , págs. 4–5.
  59. Baqais y Alshayeb 2020 , pág. 459.
  60. Alsolai y Roper 2020 , pág. 106214.

Fuentes

  • Ali, Muhammad; Cheema, Sehrish Munawar; Naz, Ammerha; Pires, Ivan Miguel (2024). «SAMSEF: Un marco de trabajo Scrum para el mantenimiento ágil de software que mejora la eficiencia y la efectividad». Buenas prácticas y nuevas perspectivas en sistemas y tecnologías de la información . Notas de clase en redes y sistemas. Vol.  989. Springer Nature Suiza. pp. 126–136 . doi : 10.1007/978-3-031-60227-6_11 . ISBN  978-3-031-60226-9.
  • Alsolai, Hadeel; Roper, Marc (2020). "Una revisión sistemática de la literatura sobre técnicas de aprendizaje automático para la predicción de la mantenibilidad del software" (PDF) . Information and Software Technology . 119 106214. doi : 10.1016/j.infsof.2019.106214 .
  • Baqais, Abdulrahman Ahmed Bobakr; Alshayeb, Mohammad (2020). "Refactorización automática de software: una revisión sistemática de la literatura". Software Quality Journal . 28 (2): 459– 502. doi : 10.1007/s11219-019-09477-y .
  • Madhusudhan, V.; Suma, V.; Rao, Jawahar J. (2017). Mantenimiento de software: desde la perspectiva del esfuerzo y los costos requeridos . Actas de la Conferencia Internacional sobre Ingeniería de Datos y Tecnología de la Comunicación. Springer. pp. 759–768 . ISBN  978-981-10-1678-3.
  • Rahman, Hanif Ur; da Silva, Alberto Rodrigues; Alzayed, Asaad; Raza, Mushtaq (2024). "Una revisión sistemática de la literatura sobre decisiones de deslocalización del mantenimiento de software". Information and Software Technology . 172 107475. doi : 10.1016/j.infsof.2024.107475 .
  • Rahman, Hanif Ur; Raza, Mushtaq; Afsar, Palwasha; Khan, Habib Ullah (2021). "Investigación empírica de los factores que influyen en la decisión de subcontratar el mantenimiento de aplicaciones en el extranjero" . IEEE Access . 9 : 58589–58608 . Bibcode : 2021IEEEA...958589R . doi : 10.1109/ACCESS.2021.3073315 . hdl : 10576/37687 . ISSN 2169-3536 . 
  • Reifer, Donald J. (2012). Recetas para el éxito en el mantenimiento de software . CRC Press. ISBN 978-1-4398-5167-8.
  • Tripatía, Priyadarshi; Naik, Kshirasagar (2014). Evolución y mantenimiento del software: un enfoque profesional . John Wiley e hijos. ISBN 978-0-470-60341-3.
  • Ulziit, Bayarbuyan; Warraich, Zeeshan Akhtar; Gencel, Cigdem; Petersen, Kai (2015). "Un marco conceptual de desafíos y soluciones para la gestión del mantenimiento global de software". Journal of Software: Evolution and Process . 27 (10): 763– 792. doi : 10.1002/smr.1720 .
  • Varga, Ervin (2018). Desentrañando el mantenimiento y la evolución del software: Pensando de forma innovadora . Springer. ISBN 978-3-319-71303-8.