Parte de una serie sobre |
Desarrollo de software |
---|
La construcción de software es una disciplina de ingeniería de software . Es la creación detallada de software funcional y significativo mediante una combinación de codificación, verificación , pruebas unitarias , pruebas de integración y depuración . Está vinculada a todas las demás disciplinas de ingeniería de software, especialmente al diseño y las pruebas de software . [1]
La necesidad de reducir la complejidad se debe principalmente a la capacidad limitada de la mayoría de las personas para almacenar estructuras e información complejas en sus memorias de trabajo. La reducción de la complejidad se logra haciendo hincapié en la creación de código que sea simple y legible en lugar de inteligente. La minimización de la complejidad se logra mediante el uso de estándares y numerosas técnicas específicas de codificación. También se apoya en técnicas de calidad centradas en la construcción. [2]
Anticipar los cambios ayuda a los ingenieros de software a crear software extensible, lo que significa que pueden mejorar un producto de software sin alterar la estructura subyacente. [2] Las investigaciones realizadas durante 25 años demostraron que el costo de la reelaboración puede ser de 10 a 100 veces (5 a 10 veces para proyectos más pequeños) más caro que lograr que los requisitos sean correctos la primera vez. Dado que el 25% de los requisitos cambian durante el desarrollo de un proyecto promedio, la necesidad de reducir el costo de la reelaboración ilustra la necesidad de anticipar el cambio. [3]
Construir para verificación significa crear software de tal manera que los ingenieros de software que escriben el software puedan detectar fácilmente los fallos , así como durante las pruebas independientes y las actividades operativas. Las técnicas específicas que respaldan la construcción para verificación incluyen seguir estándares de codificación para respaldar las revisiones de código , las pruebas unitarias , la organización del código para respaldar las pruebas automatizadas y el uso restringido de estructuras de lenguaje complejas o difíciles de entender , entre otras. [2]
La reutilización sistemática puede permitir mejoras significativas en la productividad, la calidad y los costos del software. La reutilización tiene dos facetas estrechamente relacionadas: [2]
Las normas, ya sean externas (creadas por organizaciones internacionales) o internas (creadas a nivel corporativo), que afectan directamente las cuestiones de construcción incluyen: [2]
Se han creado numerosos modelos para desarrollar software , algunos de los cuales enfatizan la construcción más que otros. Algunos modelos son más lineales desde el punto de vista de la construcción, como los modelos de ciclo de vida en cascada y de entrega por etapas. Estos modelos tratan la construcción como una actividad que ocurre solo después de que se haya completado un trabajo significativo de prerrequisitos, incluido el trabajo detallado de requisitos , el trabajo de diseño extenso y la planificación detallada . Otros modelos son más iterativos , como el prototipado evolutivo , la programación extrema y Scrum . Estos enfoques tienden a tratar la construcción como una actividad que ocurre simultáneamente con otras actividades de desarrollo de software , incluidos los requisitos , el diseño y la planificación , o se superpone a ellas. [1]
La elección del método de construcción es un aspecto clave de la actividad de planificación de la construcción. La elección del método de construcción afecta el grado en que se realizan los requisitos previos de construcción (por ejemplo, análisis de requisitos , diseño de software , etc.), el orden en que se realizan y el grado en que se espera que se completen antes de que comience el trabajo de construcción. La planificación de la construcción también define el orden en que se crean e integran los componentes , los procesos de gestión de la calidad del software , la asignación de tareas a ingenieros de software específicos y las otras tareas, según el método elegido . [1]
Se pueden medir numerosas actividades y artefactos de construcción, incluidos el código desarrollado, el código modificado, el código reutilizado, el código destruido, la complejidad del código, las estadísticas de inspección del código, las tasas de reparación y detección de fallas, el esfuerzo y la programación. Estas mediciones pueden ser útiles para administrar la construcción, garantizar la calidad durante la construcción, mejorar el proceso de construcción, así como por otras razones. [1]
La construcción de software está impulsada por muchas consideraciones prácticas:
Para tener en cuenta las lagunas imprevistas en el diseño del software , durante la construcción del software se deben realizar algunas modificaciones de diseño en una escala más pequeña o más grande para completar los detalles del diseño del software . [4]
Los investigadores han descubierto que una de las características de diseño que resulta beneficiosa es el bajo abanico de distribución . El ocultamiento de información resultó ser una técnica de diseño útil en programas grandes que los hacía más fáciles de modificar por un factor de 4. [5]
Los lenguajes de construcción incluyen todas las formas de comunicación mediante las cuales un ser humano puede especificar una solución ejecutable a un problema en una computadora. Entre ellos se encuentran los lenguajes de configuración, los lenguajes de herramientas y los lenguajes de programación : [6]
Los programadores que trabajan en un lenguaje que han utilizado durante tres años o más son aproximadamente un 30 por ciento más productivos que los programadores con experiencia equivalente que son nuevos en un lenguaje. Los lenguajes de alto nivel como C++, Java, Smalltalk y Visual Basic ofrecen entre 5 y 15 veces más productividad, confiabilidad, simplicidad y comprensión que los lenguajes de bajo nivel como el ensamblador y C. Se ha demostrado que un código equivalente necesita menos líneas para implementarse en lenguajes de alto nivel que en lenguajes de nivel inferior. [7]
Las siguientes consideraciones se aplican a la actividad de codificación de construcción de software: [8]
El propósito de las pruebas de construcción es reducir la brecha entre el momento en que se insertan fallas en el código y el momento en que se detectan esas fallas. En algunos casos, las pruebas de construcción se realizan después de que se haya escrito el código. En la programación de prueba primero , los casos de prueba se crean antes de que se escriba el código. La construcción implica dos formas de prueba, que a menudo las realiza el ingeniero de software que escribió el código : [1]
Implementar la reutilización de software implica más que crear y utilizar bibliotecas de activos. Requiere formalizar la práctica de la reutilización mediante la integración de procesos y actividades de reutilización en el ciclo de vida del software . Las tareas relacionadas con la reutilización en la construcción de software durante la codificación y las pruebas son: [1]
Las principales técnicas utilizadas para garantizar la calidad del código a medida que se construye incluyen: [15]
Los estudios han demostrado que es necesario utilizar una combinación de estas técnicas para lograr una alta tasa de detección de defectos. Otros estudios demostraron que diferentes personas tienden a encontrar diferentes defectos. Un estudio descubrió que las prácticas de programación extremas de programación en pares , verificación de escritorio , pruebas unitarias , pruebas de integración y pruebas de regresión pueden lograr una tasa de detección de defectos del 90%. [16] Un experimento que involucró a programadores experimentados descubrió que, en promedio, pudieron encontrar 5 errores (9 en el mejor de los casos) de 15 errores mediante pruebas. [18]
El 80% de los errores tienden a concentrarse en el 20% de las clases y rutinas del proyecto. El 50% de los errores se encuentran en el 5% de las clases del proyecto. IBM pudo reducir los defectos reportados por los clientes en un factor de diez a uno y reducir su presupuesto de mantenimiento en un 45% en su sistema IMS reparando o reescribiendo solo 31 de 425 clases. Alrededor del 20% de las rutinas de un proyecto contribuyen al 80% de los costos de desarrollo. Un estudio clásico de IBM encontró que algunas rutinas propensas a errores de OS/360 eran las entidades más costosas. Tenían alrededor de 50 defectos por cada 1000 líneas de código y arreglarlos cuesta 10 veces lo que se necesitó para desarrollar todo el sistema. [18]
Una actividad clave durante la construcción es la integración de rutinas , clases , componentes y subsistemas construidos por separado. Además, puede ser necesario integrar un sistema de software en particular con otros sistemas de software o hardware. Las preocupaciones relacionadas con la integración de la construcción incluyen la planificación de la secuencia en la que se integrarán los componentes , la creación de un andamiaje para respaldar las versiones provisionales del software , la determinación del grado de prueba y el trabajo de calidad realizado en los componentes antes de que se integren y la determinación de los puntos del proyecto en los que se prueban las versiones provisionales del software . [1]
Los lenguajes orientados a objetos admiten una serie de mecanismos de tiempo de ejecución que aumentan la flexibilidad y adaptabilidad de los programas, como la abstracción de datos , la encapsulación , la modularidad , la herencia , el polimorfismo y la reflexión . [19] [20]
La abstracción de datos es el proceso mediante el cual los datos y los programas se definen con una representación similar en forma a su significado, mientras se ocultan los detalles de implementación. [21] La investigación académica mostró que la abstracción de datos hace que los programas sean aproximadamente un 30% más fáciles de entender que los programas funcionales. [10]
Las afirmaciones son predicados ejecutables que se colocan en un programa y que permiten realizar comprobaciones en tiempo de ejecución del programa. [19] El diseño por contrato es un enfoque de desarrollo en el que se incluyen condiciones previas y posteriores para cada rutina. La programación defensiva es la protección de una rutina para que no se interrumpa debido a entradas no válidas. [22]
El manejo de errores se refiere a la práctica de programación de anticipar y codificar las condiciones de error que pueden surgir cuando se ejecuta el programa. El manejo de excepciones es una construcción del lenguaje de programación o un mecanismo de hardware diseñado para manejar la ocurrencia de excepciones, condiciones especiales que cambian el flujo normal de ejecución del programa. [23] La tolerancia a fallas es una colección de técnicas que aumentan la confiabilidad del software al detectar errores y luego recuperarse de ellos si es posible o contener sus efectos si la recuperación no es posible. [22]
La programación basada en estados es una tecnología de programación que utiliza máquinas de estados finitos para describir los comportamientos del programa. [22] Un método basado en tablas es un esquema que utiliza tablas para buscar información en lugar de utilizar instrucciones lógicas (como if y case). [24]
La configuración en tiempo de ejecución es una técnica que vincula los valores de las variables y las configuraciones del programa cuando éste se está ejecutando, generalmente mediante la actualización y lectura de archivos de configuración en un modo justo a tiempo. La internacionalización es la actividad técnica de preparar un programa, generalmente un software interactivo, para que admita múltiples configuraciones regionales. La actividad correspondiente, la localización , es la actividad de modificar un programa para que admita un idioma local específico. [24]