El desarrollo de software es el proceso utilizado para crear software. La programación y el mantenimiento del código fuente es el paso central de este proceso, pero también incluye la concepción del proyecto, la evaluación de su viabilidad, el análisis de los requisitos comerciales, el diseño del software , las pruebas y el lanzamiento . La ingeniería de software , además del desarrollo, también incluye la gestión de proyectos , la gestión de empleados y otras funciones generales. [1] El desarrollo de software puede ser secuencial, en el que cada paso se completa antes de que comience el siguiente, pero también se han ideado métodos de desarrollo iterativos en los que se pueden ejecutar varios pasos a la vez y se pueden revisar los pasos anteriores para mejorar la flexibilidad, la eficiencia y la programación.
El desarrollo de software involucra a profesionales de diversos campos, no solo programadores de software sino también personas especializadas en pruebas, redacción de documentación, diseño gráfico , soporte al usuario, marketing y recaudación de fondos. En el desarrollo de software se utilizan habitualmente diversas herramientas y modelos, como el entorno de desarrollo integrado (IDE), el control de versiones , la ingeniería de software asistida por computadora y la documentación de software .
Cada una de las metodologías disponibles se adapta mejor a tipos específicos de proyectos, en función de diversas consideraciones técnicas, organizativas, de proyecto y de equipo. [3]
Otro enfoque en muchas metodologías de programación es la idea de tratar de detectar problemas tales como vulnerabilidades de seguridad y errores lo más pronto posible ( pruebas de desplazamiento a la izquierda ) para reducir el costo de seguimiento y reparación de los mismos. [13]
En 2009, se estimó que el 32 por ciento de los proyectos de software se entregaron en los plazos previstos y dentro del presupuesto, y con todas las funciones. Otro 44 por ciento se entregó, pero carecía de al menos una de estas funciones. El 24 por ciento restante se canceló antes de su lanzamiento. [14]
El ciclo de vida del desarrollo de software se refiere al proceso sistemático de desarrollo de aplicaciones . [15]
Las fuentes de ideas para productos de software son abundantes. Estas ideas pueden provenir de estudios de mercado que incluyan la demografía de posibles nuevos clientes, clientes existentes, prospectos de ventas que rechazaron el producto, otro personal interno de desarrollo de software o un tercero creativo. Las ideas para productos de software generalmente son evaluadas primero por el personal de marketing para determinar su viabilidad económica, su adecuación a los canales de distribución existentes, los posibles efectos en las líneas de productos existentes, las características requeridas y su adecuación a los objetivos de marketing de la empresa. En la fase de evaluación de marketing, se evalúan los supuestos de costo y tiempo. [16] El análisis de viabilidad estima el retorno de la inversión del proyecto , su costo de desarrollo y el marco de tiempo. Con base en este análisis, la empresa puede tomar una decisión comercial para invertir en un mayor desarrollo. [17] Después de decidir desarrollar el software, la empresa se enfoca en entregar el producto al costo y tiempo estimados o por debajo de ellos, y con un alto estándar de calidad (es decir, ausencia de errores) y la funcionalidad deseada. Sin embargo, la mayoría de los proyectos de software se retrasan y, a veces, se hacen concesiones en las características o la calidad para cumplir con una fecha límite. [18]
El análisis de software comienza con un análisis de requisitos para capturar las necesidades comerciales del software. [19] Los desafíos para la identificación de necesidades son que los usuarios actuales o potenciales pueden tener necesidades diferentes e incompatibles, pueden no comprender sus propias necesidades y cambiar sus necesidades durante el proceso de desarrollo de software. [20] En última instancia, el resultado del análisis es una especificación detallada para el producto con la que los desarrolladores pueden trabajar. Los analistas de software a menudo descomponen el proyecto en objetos más pequeños, componentes que se pueden reutilizar para aumentar la rentabilidad, la eficiencia y la confiabilidad. [19] La descomposición del proyecto puede permitir una implementación multiproceso que se ejecuta significativamente más rápido en computadoras multiprocesador . [21]
Durante las fases de análisis y diseño del desarrollo de software, a menudo se utiliza el análisis estructurado para dividir los requisitos del cliente en partes que los programadores de software puedan implementar. [22] La lógica subyacente del programa puede representarse en diagramas de flujo de datos , diccionarios de datos , pseudocódigo , diagramas de transición de estados y/o diagramas de relación de entidades . [23] Si el proyecto incorpora una pieza de software heredado que no ha sido modelado, este software puede modelarse para ayudar a garantizar que se incorpore correctamente con el software más nuevo. [24]
El diseño implica decisiones sobre la implementación del software, como qué lenguajes de programación y software de base de datos utilizar, o cómo se organizarán las comunicaciones de hardware y red. El diseño puede ser iterativo y se consulta a los usuarios sobre sus necesidades en un proceso de prueba y error . El diseño a menudo involucra a personas expertas en aspectos como el diseño de bases de datos , la arquitectura de pantalla y el rendimiento de servidores y otro hardware. [19] Los diseñadores a menudo intentan encontrar patrones en la funcionalidad del software para crear módulos distintos que se puedan reutilizar con la programación orientada a objetos . Un ejemplo de esto es el modelo-vista-controlador , una interfaz entre una interfaz gráfica de usuario y el backend . [25]
La característica central del desarrollo de software es crear y comprender el software que implementa la funcionalidad deseada. [26] Existen varias estrategias para escribir el código. El software cohesivo tiene varios componentes que son independientes entre sí. [19] El acoplamiento es la interrelación de diferentes componentes de software, lo que se considera indeseable porque aumenta la dificultad del mantenimiento . [27] A menudo, los programadores de software no siguen las mejores prácticas de la industria, lo que da como resultado un código ineficiente, difícil de entender o carente de documentación sobre su funcionalidad. [28] Es especialmente probable que estos estándares se rompan en presencia de plazos. [29] Como resultado, probar, depurar y revisar el código se vuelve mucho más difícil. La refactorización del código , por ejemplo, agregar más comentarios al código, es una solución para mejorar la comprensibilidad del código. [30]
La prueba es el proceso de asegurar que el código se ejecuta correctamente y sin errores. La depuración la realiza cada desarrollador de software en su propio código para confirmar que el código hace lo que se pretende. En particular, es crucial que el software se ejecute en todas las entradas, incluso si el resultado es incorrecto. [31] Las revisiones de código por parte de otros desarrolladores se utilizan a menudo para examinar el nuevo código añadido al proyecto y, según algunas estimaciones, reducen drásticamente la cantidad de errores que persisten después de que se completa la prueba. [32] Una vez que se ha enviado el código, el control de calidad (un departamento independiente de no programadores para la mayoría de las grandes empresas) prueba la precisión de todo el producto de software. Las pruebas de aceptación derivadas de los requisitos del software original son una herramienta popular para esto. [31] Las pruebas de calidad también suelen incluir la comprobación de estrés y carga (si el software es robusto a altos niveles de entrada o uso), pruebas de integración (para garantizar que el software esté adecuadamente integrado con otro software) y pruebas de compatibilidad (medición del rendimiento del software en diferentes sistemas operativos o navegadores). [31] Cuando las pruebas se escriben antes que el código, esto se denomina desarrollo impulsado por pruebas . [33]
La producción es la fase en la que se implementa el software para el usuario final. [34] Durante la producción, el desarrollador puede crear recursos de soporte técnico para los usuarios [35] [34] o un proceso para corregir errores que no se detectaron anteriormente. También puede haber un retorno a fases de desarrollo anteriores si las necesidades del usuario cambiaron o se entendieron mal. [34]
El desarrollo de software es realizado por desarrolladores de software , que generalmente trabajan en equipo. La comunicación eficiente entre los miembros del equipo es esencial para el éxito. Esto se logra más fácilmente si el equipo es pequeño, está acostumbrado a trabajar en conjunto y se encuentra cerca unos de otros. [36] Las comunicaciones también ayudan a identificar problemas en una etapa anterior del desarrollo y evitan la duplicación de esfuerzos. Muchos proyectos de desarrollo evitan el riesgo de perder conocimiento esencial que posee un solo empleado al garantizar que varios trabajadores estén familiarizados con cada componente. [37] El desarrollo de software involucra a profesionales de varios campos, no solo programadores de software sino también personas especializadas en pruebas, redacción de documentación, diseño gráfico , soporte al usuario, marketing y recaudación de fondos. Aunque los trabajadores de software propietario reciben un pago, la mayoría de los contribuyentes al software de código abierto son voluntarios. [38] Alternativamente, pueden recibir pagos de empresas cuyo modelo de negocio no implica vender el software, sino algo más, como servicios y modificaciones al software de código abierto. [39]
La ingeniería de software asistida por computadora (CASE) es una herramienta para la automatización parcial del desarrollo de software. [40] CASE permite a los diseñadores esbozar la lógica de un programa, ya sea uno que se va a escribir o uno ya existente para ayudar a integrarlo con un nuevo código o aplicarle ingeniería inversa (por ejemplo, para cambiar el lenguaje de programación ). [41]
La documentación se presenta en dos formas que generalmente se mantienen separadas: la destinada a los desarrolladores de software y la que se pone a disposición del usuario final para ayudarlo a usar el software. [42] [43] La mayor parte de la documentación para desarrolladores se presenta en forma de comentarios de código para cada archivo, clase y método que cubren la interfaz de programación de aplicaciones (API) (cómo otro puede acceder a la pieza de software) y, a menudo, detalles de implementación. [44] Esta documentación es útil para que los nuevos desarrolladores comprendan el proyecto cuando comienzan a trabajar en él. [45] En el desarrollo ágil, la documentación a menudo se escribe al mismo tiempo que el código. [46] La documentación del usuario es escrita con mayor frecuencia por escritores técnicos . [47]
Una estimación precisa es crucial en la etapa de viabilidad y para entregar el producto a tiempo y dentro del presupuesto. El proceso de generar estimaciones a menudo es delegado por el gerente de proyecto . [48] Debido a que la estimación del esfuerzo está directamente relacionada con el tamaño de la aplicación completa, está fuertemente influenciada por la adición de características en los requisitos: cuanto más requisitos, mayor será el costo de desarrollo. Los aspectos no relacionados con la funcionalidad, como la experiencia de los desarrolladores de software y la reutilización del código, también son esenciales para considerar en la estimación. [49] A partir de 2019 [update], la mayoría de las herramientas para estimar la cantidad de tiempo y recursos para el desarrollo de software fueron diseñadas para aplicaciones convencionales y no son aplicables a aplicaciones web o aplicaciones móviles . [50]
Un entorno de desarrollo integrado (IDE) admite el desarrollo de software con funciones mejoradas en comparación con un editor de texto simple . [51] Los IDE a menudo incluyen compilación automatizada , resaltado de sintaxis de errores, [52] asistencia de depuración, [53] integración con control de versiones y semiautomatización de pruebas. [51]
El control de versiones es una forma popular de gestionar los cambios realizados en el software. Cada vez que se incorpora una nueva versión, el software guarda una copia de seguridad de todos los archivos modificados. Si varios programadores trabajan en el software simultáneamente, gestiona la fusión de los cambios en el código. El software resalta los casos en los que existe un conflicto entre dos conjuntos de cambios y permite a los programadores solucionar el conflicto. [54]
Un modelo de vista es un marco que proporciona puntos de vista sobre el sistema y su entorno para su uso en el proceso de desarrollo de software . Es una representación gráfica de la semántica subyacente de una vista.
El propósito de los puntos de vista y las vistas es permitir a los ingenieros humanos comprender sistemas muy complejos y organizar los elementos del problema en torno a dominios de especialización . En la ingeniería de sistemas físicamente intensivos, los puntos de vista a menudo corresponden a capacidades y responsabilidades dentro de la organización de ingeniería. [55]
Las funciones de aptitud son pruebas automatizadas y objetivas para garantizar que los nuevos desarrollos no se desvíen de las restricciones, verificaciones y controles de cumplimiento establecidos. [56]
La propiedad intelectual puede ser un problema cuando los desarrolladores integran código fuente abierto o bibliotecas en un producto propietario, porque la mayoría de las licencias de código abierto utilizadas para el software exigen que las modificaciones se publiquen bajo la misma licencia. Como alternativa, los desarrolladores pueden elegir una alternativa propietaria o escribir su propio módulo de software. [57]