El desarrollo de software es el proceso utilizado para crear software. Programar y mantener el código fuente es el paso central de este proceso, pero también incluye concebir el proyecto, evaluar su viabilidad, analizar los requisitos del negocio, diseñar el software , probarlo y lanzarlo . 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 una serie de 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 intentar detectar problemas como vulnerabilidades y errores de seguridad lo antes posible ( pruebas de desplazamiento a la izquierda ) para reducir el costo de rastrearlos y solucionarlos. [13]
En 2009, se estimó que el 32 por ciento de los proyectos de software se entregaron a tiempo y dentro del presupuesto, y con toda la funcionalidad. Se entregó un 44 por ciento adicional, pero faltaba al menos una de estas características. El 24 por ciento restante fue cancelado 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 surgir de una investigación de mercado que incluya la demografía de nuevos clientes potenciales, 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 coste de desarrollo y su calendario. Sobre la base de este análisis, la empresa puede tomar la decisión comercial de invertir en un mayor desarrollo. [17] Después de decidir desarrollar el software, la empresa se concentra en entregar el producto al costo y tiempo estimados o menos, y con un alto estándar de calidad (es decir, sin 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 un plazo. [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 del producto a partir de la cual los desarrolladores pueden trabajar. Los analistas de software a menudo descomponen el proyecto en objetos más pequeños, componentes que pueden reutilizarse para aumentar la rentabilidad, la eficiencia y la confiabilidad. [19] Descomponer el proyecto puede permitir una implementación multiproceso que se ejecute significativamente más rápido en computadoras multiprocesador . [21]
Durante las fases de análisis y diseño del desarrollo de software, el análisis estructurado a menudo se utiliza 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 relaciones entre 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 opciones 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 el hardware y las comunicaciones de 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 generar módulos distintos que puedan reutilizarse con 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 de 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 que carece de documentación sobre su funcionalidad. [28] Es especialmente probable que estas normas fracasen en presencia de plazos. [29] Como resultado, probar, depurar y revisar el código se vuelve mucho más difícil. La refactorización de 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 garantizar que el código se ejecute correctamente y sin errores. Cada desarrollador de software realiza la depuración en su propio código para confirmar que el código hace lo que 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 realizadas por otros desarrolladores se utilizan a menudo para examinar el nuevo código agregado al proyecto y, según algunas estimaciones, reducen drásticamente la cantidad de errores que persisten una vez completadas las pruebas. [32] Una vez que se ha enviado el código, el control de calidad (un departamento separado 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 verificación de estrés y carga (si el software es resistente a niveles elevados de entrada o uso), pruebas de integración (para garantizar que el software se integra adecuadamente con otro software) y pruebas de compatibilidad (que miden la capacidad del software). rendimiento en diferentes sistemas operativos o navegadores). [31] Cuando las pruebas se escriben antes del código, esto se denomina desarrollo basado en 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 antes. También podría haber un retorno a fases de desarrollo anteriores si las necesidades del usuario cambiaran o no se entendieran correctamente. [34]
El desarrollo de software lo realizan desarrolladores de software, que normalmente trabajan en equipo. Las comunicaciones eficientes entre los miembros del equipo son esenciales para el éxito. Esto se logra más fácilmente si el equipo es pequeño, está acostumbrado a trabajar en conjunto y está ubicado cerca uno del otro. [36] Las comunicaciones también ayudan a identificar problemas en un estado anterior de desarrollo y evitar esfuerzos duplicados. Muchos proyectos de desarrollo evitan el riesgo de perder conocimientos esenciales 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 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. Aunque a los trabajadores del software propietario se les paga, la mayoría de los contribuyentes al software de código abierto son voluntarios. [38] Alternativamente, pueden ser pagados por empresas cuyo modelo de negocio no implica vender el software, sino algo más, como servicios y modificaciones del software de código abierto. [39]
La ingeniería de software asistida por computadora (CASE) son herramientas 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 por escribir o uno ya existente para ayudar a integrarlo con un nuevo código o realizar ingeniería inversa (por ejemplo, para cambiar el lenguaje de programación ). [41]
La documentación se presenta en dos formatos que normalmente se mantienen separados: la destinada a los desarrolladores de software y la que se pone a disposición del usuario final para ayudarle a utilizar 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), es decir, cómo otro puede acceder a la pieza de software, y a menudo los 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 la escriben con mayor frecuencia redactores 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 generación de estimaciones suele ser delegado por el director del 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: cuantos más requisitos, mayor será el costo de desarrollo. También son esenciales a considerar en la estimación aspectos no relacionados con la funcionalidad, como la experiencia de los desarrolladores de software y la reutilización del código. [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 simple editor de texto . [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 registra una nueva versión, el software guarda una copia de seguridad de todos los archivos modificados. Si varios programadores están trabajando en el software simultáneamente, gestiona la combinación de sus cambios de código. El software destaca 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 los puntos de vista sobre el sistema y su entorno , para ser utilizado 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ían de las limitaciones, controles y controles de cumplimiento establecidos. [56]
La propiedad intelectual puede ser un problema cuando los desarrolladores integran código o bibliotecas de código abierto en un producto propietario, porque la mayoría de las licencias de código abierto utilizadas para el software requieren 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]