Importancia de una planificación de un desarrollo de Software José Felipe Cervantes Hernández Facultad de Informática Culiacán, Universidad Autónoma de Sinaloa [email protected] Resumen El software es todo lo que administra y maneja nuestro computador, se encarga de llevar a cabo la comunicación entre hardware y usuario, ya que los dispositivos como teclado y ratón no tendrían utilidad si no tuvieran un software que los manejase, estos se clasifican como, sistemas operativos, software de programación y software de aplicación, siendo este ultimo y el primero los mas comunes ya que sin un sistema operativo no seriamos capaces de usar nuestra computadora, incluso no podríamos usar nuestro celular, el proceso de creación de un software no se puede generalizar, ya que cada software tiene sus objetivos y resuelve distintos problemas, o necesidades, así que primero se debe llevar una planificación de que necesidad vamos a cubrir, las tareas que debemos llevar a cabo, la documentación de cada proceso que se llevará a cabo, el análisis de como se van a resolver las problemáticas que se presenten dentro del desarrollo de nuestro software, traducir todo el proyecto a un lenguaje o varios lenguajes de programación, y por ultimo entregarlo en una fase de mantenimiento o beta, donde todos los errores que hayan quedado o surjan durante su uso sean resueltos en la brevedad que salen, para darle una garantía al cliente que su software será de calidad, además debemos cuidar que nuestro software sea confiable, este bien optimizado, rápido y disponible para cualquier plataforma que desee el cliente. Introducción En esta investigación, indagaremos profundamente el concepto de “Software”, partiendo de la pregunta inicial ¿Qué es el Software?; viendo más de cerca como es su elaboración, su implementación en diferentes ámbitos y como es que cualquier tipo de dispositivo electrónico actual posee algún tipo de software para el buen funcionamiento de estos mismos; así mismo ver los distintos tipos de software; además de su uso en el campo educativo, su proceso de desarrollo y algunos conceptos de la ingeniería en software. Analizaremos algunas metodologías para el desarrollo del software y sus criterios de selección para una correcta ejecución de estas; sus principios éticos y algunas aplicaciones de la ingeniería en software. Además, veremos los distintos tipos de métodos para realizar un proyecto de software y todas las fases por las que se deben pasar para poder desarrollar un software. ¿Qué es el software? El software son todos los programas o códigos informáticos que permiten una interacción armoniosa entre el hardware y usuario, un gran ejemplo de software y la razón por la cual podemos usar nuestras computadoras de manera intuitiva y rápida es el sistema operativo. Este a su vez se encarga de elaborar, almacenar y procesar cierta información que forma parte de cualquier sistema de cómputo, siguiendo un conjunto de instrucciones, procedimientos, reglas datos y documentación respectivos. Clasificación del software La clasificación de un software es complicada, debido a que la cantidad de software que existe en la actualidad (año 2022), es casi prácticamente infinita, así que este se clasifica respecto a su función, o el campo donde se desarrolla. Según el siguiente diagrama es como se clasifica el software, con los aspectos que ya mencionamos anteriormente. Clasificación de Software Software de base o sistemas Software de programación. Software de Aplicación Empezamos con el software base, este como habíamos mencionado en el concepto del software se encarga de hacer funcionar nuestros dispositivos, es el que recopila la información que se manda a través del hardware y nuevamente la envía de regreso al usuario. Dentro de este software tenemos lo que es el sistema operativo, los drivers o controladores y algunas librerías que nos desbloquean funciones especiales. A partir de aquí veremos los softwares de programación, que no son más que un programa que permite crear más programas, o, dicho de otra manera, un software que permite hacer más software. Estos programas no se guían por las instrucciones que conocemos comúnmente, como los clics del ratón, estos programas funcionan con su propio lenguaje, su propia sintaxis y funciones, ya que dependiendo para que necesitásemos crear software, serán las instrucciones que le daremos a este software de programación. Algunos ejemplos de lenguajes de programación son Java, C y C++; Algunos sistemas operativos son creados en estos programas o lenguajes de programación, y aunque en cada lenguaje la sintaxis es diferente, la semántica o significado de nuestras instrucciones será la misma para cualquier lenguaje. Por último, el software de aplicación, este se puede clasificar en dos tipos según su uso, puede ser de uso general o de uso especifico, por ejemplo, un software de uso general se puede usar para distintos propósitos, Word es uno de ellos, ya que en Word podemos hacer textos, cuadros, mapas conceptuales, listas, incluyendo proyectos de investigación como el que está leyendo usted. En cambio, el software especifico es utilizado para una sola tarea, por ejemplo, Photoshop, el cual es exclusivamente para edición de fotografías, y aunque la comunidad haga un uso distinto de este, el propósito principal es el antes mencionado, al igual que Audacity, este es para edición exclusiva de audio, evidentemente para diferentes propósitos, pero solo te permite editar audios. Características del software Como ya sabemos, un software es todo un conjunto de programas, instrucciones y procedimientos que se relacionan con el funcionamiento de un sistema informático, esto incluyendo el sistema operativo de nuestras computadoras. El software posee 3 características principales, características operativas, de transición, revisión. Las características operativas del software son factores de funcionalidad, es como se mira el software desde la perspectiva de los usuarios, los aspectos principales de la “parte exterior” son: Corrección: Se debe cumplir con todas las exigencias del cliente hasta que este mismo este satisfecho. Usabilidad: Este software además de cumplir con las exigencias del cliente, la interfaz debe ser intuitiva y fácil de usar, además que el cliente pueda aprender rápidamente a usar todas las funcionalidades de dicho programa. Integridad: El software no debe impedir con el rendimiento o información del cliente, al ser un software de calidad no debe ser invasivo para el equipo de nuestro cliente. Fiabilidad: El producto final no debe tener ni un solo defecto o fallo y lo más importante, no debe fallar durante la ejecución de este, debe ser estable y usable al 100%. Eficiencia: Esta es la forma en la que el software esta optimizado, un software que esta correctamente optimizado y se considera eficiente no debe acaparar todos los recursos del equipo, este debe ser eficaz en cuanto almacenamiento y tiempos de espera. Seguridad: El software no debe ser vulnerable y no debe exponer la información que nuestro cliente desee depositar en nuestro sistema. Características de transición del software: Interoperabilidad: Es la eficiencia con la que nuestro software intercambia información con otros programas dentro del equipo. Reutilización: El código fuente del software puede tener modificaciones sencillas para cambiar el propósito de este, reduciendo los costos de producción para otro sistema con otro propósito. Portabilidad: Este debe ser capaz de realizar todas sus funciones de la misma manera en todos los entornos posibles donde este se llevará a cabo. Características de revisión de software: Estos son los factores de ingeniería los cuales llevaran a cabo la revisión de la calidad del código fuente, la documentación de este y su escritura. Capacidad de mantenimiento: El mantenimiento de este para tratar cualquier tipo de bug debe ser sencillo para cualquier usuario. Flexibilidad: Los cambios en nuestro software deben ser simples, así poder cambiar su propósito de manera sencilla. Extensibilidad: Debe ser fácil de agregar funciones nuevas, sin alterar el funcionamiento principal de este. Escalabilidad: Debe ser fácil de actualizar para nuevas funciones. Capacidad de prueba: Debe ser sencillo de probar para saber si contiene errores. Modularidad: Debe contener distintos módulos independientes dentro de él. Interacción entre hardware y software El software de sistema como mencionamos anteriormente funciona directamente en los dispositivos de hardware de nuestro equipo, este nos brinda una plataforma para ejecutar cualquier aplicación, algunos ejemplos de sistemas son Windows, Linux, Unix y IOS. Algunas similitudes entre el hardware y el software son que ambos dependen de la medida lógica, y son deterministas, es decir que un software y un hardware funcionan siempre igual ante las mismas instrucciones, siempre y cuando no haya algo mal dentro de alguno de estos. Evidentemente las diferencias entre uno y otro son que el hardware es la parte física de nuestra computadora, el software mientras tanto es todo lo intangible de nuestro equipo, sin embargo, ninguno de estos tendría funcionalidad sin el otro. Aunque el hardware podría llegar a encender, es porque ya tiene software dentro de él, y el software no podría ser utilizado sin algo físico que le dé indicaciones sobre qué acción realizar. Proceso de desarrollo de software El proceso de desarrollo es una descripción de la secuencia de actividades a seguir por un grupo de trabajadores para generar un conjunto de productos coherentes, los cuales cumplen con el sistema deseado, principalmente el objetivo básico para el proceso de cualquier desarrollo de software es: Predecir costos. Mantener un nivel de calidad. Predecir el tiempo de desarrollo. Para comenzar el desarrollo de un software se debe tener bien en mente cual es el objetivo principal, cual es la problemática que yo deseo resolver, de lo contrario, el proyecto podría alargarse más de lo deseado, causando retrasos en los tiempos de entrega, lo cual llevaría a pérdidas millonarias, ya que este tipo de proyectos al no tener ningún límite físico, se puede hacer cualquier cosa con el software, dejando volar la imaginación de los creadores. Si bien no existe ningún proceso generalizado para todos los proyectos, existen algunas maneras de clasificarlo dependiendo de la naturaleza del software y la experiencia de la empresa para crear dichos softwares. Tipos de aplicaciones: Aplicaciones monoprocesadas: Se ejecutan en un solo computador, esta no se comunica con ningún tipo de aplicación externa a ella. Aplicaciones Embebidas: Se ejecuta en un entorno computarizado especial, este requiere codiseño hardware/software, es decir, desarrollar hardware para tu software, no necesariamente nuevo hardware, si no adaptar tu hardware a tu tipo de software o el uso de este mismo. Aplicaciones de tiempo real: Tiene entre sus especificaciones requerimiento temporal, es decir aplicaciones que requieren de constante actualización, como lo pueden ser los GPS. Aplicaciones distribuidas: Estas se ejecutan en múltiples procesadores, normalmente requiere intercomunicación a través de alguna red. Objetivos de un proceso de desarrollo Tener una guía correcta de ejecución de tu proyecto que defina los procesos a seguir y tareas que se requieren. Mejorar la calidad del producto en cuanto la disminución del número de fallos, bajar la severidad de cualquier defecto de nuestro software, mejorar la reusabilidad de este y que este sea lo más estable y mantenible posible. Mejorar la predictibilidad del producto, saber cuánto tiempo requiere y la cantidad de trabajo que llevará. Generar la información necesaria a los encargados de supervisar el proyecto, así ellos harán un seguimiento más efectivo para no causar confusiones. Específicamente un proceso de desarrollo debe proporcionar una plantilla de desarrollo del proyecto en el cual quede bien definido el rol de cada trabajador que intervenga en él, mejorar la calidad del producto, lo cual depende directamente de reducir los defectos que se producen en su desarrollo, reducir la gravedad de los defectos que puedan quedar en el proyecto final, para que estos no afecten en gran medida el desempeño de nuestro proyecto, mejorar la estabilidad del proyecto, reducir costos y predecir el tiempo de producción. Elementos básicos de un proyecto Los elementos básicos de un proceso de desarrollo de software es definir los papeles que juegan los trabajadores, las actividades que desarrollan y los productos que deben generarse. Cada trabajador debe tener su papel dentro de él, lo que define sus actividades respectivas y los productos que debe tener. Las actividades son todas las tareas que debe realizar el trabajador para cumplir con su parte del proyecto, esto a alto nivel son concebidas como las fases del proceso (especificación, análisis, etc.) mientras que las de bajo nivel son más específicas (crear diagramas, escribir código, hacer reportes, etc.). Los productos son documentos o información que debe ser creada como consecuencia de la actividad que se desarrolla. El producto último es el sistema que se desarrolla, pero entre las fases del proyecto debe generarse una gran cantidad de documentos intermedios. Cada actividad debe tener un objetivo principal, el cual es generar productos bien definidos para el proyecto. Escalabilidad La escalabilidad es una propiedad importante en el proceso, ya que la dimensión de los proyectos de desarrollo de software es muy variables e infinitas. Este describe el esfuerzo que se le debe dar a un proyecto debe aumentar o mantenerse, nunca bajar, cuando la complejidad de un proyecto crece, aumentan los niveles de abstracción que se usan, se incrementan la intercomunicación entre los trabajadores, se es más difícil localizar errores. Lo más importante es buscar que el esfuerzo crezca linealmente, ya que, si este crece de manera exponencial, el nivel de esfuerzo no aumente en paralelo con la complejidad lo que significa que la calidad baja. Claves tecnológicas para los procesos de desarrollo Existen un conjunto de tecnología y criterios que facilitan los procesos de desarrollo: Modelado Visual: Facilita la capacidad de apreciar los diferentes elementos e interacciones del sistema en los diferentes niveles de abstracción. Modelos Ejecutables: La mejor gestión de los errores que inevitablemente se introducen a lo largo del proceso de desarrollo consiste en detectarlos y corregirlos tan pronto como se cometan. Para que esto se pueda realizar eficientemente conviene tener capacidad de realizar las pruebas directamente desde los modelos, bien mediante debbuger a nivel de modelo, o bien, mediante la generación automática de prototipos que los hagan ejecutables. Relación biunívoca entre modelos y códigos: El proceso de desarrollo de las aplicaciones se basa en modelos que se desarrollan para que los diseños sean comprensibles y gestionables, y en código que es el producto final y es necesario que ambos se mantengan en todas las fases sintonizados. Esto se consigue si se automatiza el tránsito entre ambos. Automatización de las pruebas a partir de las especificaciones: El número de prueba que hay que realizar para detectar errores se incrementa de forma acumulativa, como consecuencia de que no solo hay que verificar los nuevos elementos sino su interferencia con lo ya probado. Frameworks: Los frameworks son aplicaciones parcialmente desarrolladas que se utilizan como plantillas para el desarrollo de nuevas aplicaciones. Desarrollo incremental e iterativo: Los sistemas de desarrollo deben basarse en la generación iterativas de prototipos utilizables que vayan aumentando gradualmente su funcionalidad en las sucesivas etapas hasta conseguir que sea plena. Principales tareas en los procesos de software Primero es necesario comprender la naturaleza del proyecto. Esto lleva su tiempo para poder comprenderlo ya que debemos saber lo que desean los clientes, incluso cuando ellos no tienen la idea clara de lo que quieren. La documentación es parte fundamental de los proyectos, aunque es probable que la documentación sufra cambios. Por esa misma razón debe de tenerse una estrategia para conservar todos los documentos que se vayan generando en el proceso. Parte del proceso es reunir los requisitos o metas que va cumpliendo la aplicación conforme avanza el proyecto, analizar el problema, desarrollar una solución y crear el programa que lo solucione. Parte más importante del proyecto cuando está terminado es revisar todas sus partes y probarlo para minimizar el rango de error. Al final del proyecto se debe entregar con una “Garantía”, así podremos saber si hay errores y solucionarlos en la brevedad con la que estos surgen. Niveles de madurez de los procesos de desarrollo El proceso de desarrollo de un software se divide en cinco fases o niveles, el primitivo, el cual tu proyecto o el proceso de este no está formalizado aún, y el equipo resuelve los problemas sobre la marcha, solo reconoce que el equipo es capaz de producir productos software, el éxito de este mismo depende totalmente de la experiencia de las personas de tu equipo. Pasamos con el programado, el proceso es capaz de definir tiempos o plazos medianamente razonables y verificar los avances del proyecto en lapsos de tiempo determinados, este ya incluye registros de costos y tiempos. El nivel sistemático es el proceso que esta sistemáticamente definido y reduce la dependencia de los trabajadores con experiencia, es comprendido por todas las partes que intervienen en el proyecto. Con este nivel se consigue predecir los resultados de tu proyecto. El nivel administrado puede predecir ciertos costos y ya incluye la programación de tareas, el rendimiento es medible objetiva y cuantitativamente. Por último, el nivel optimizado, que es el que hemos estado mencionando en esta investigación, en este nivel es totalmente necesario disponer de estrategias adaptativas que permitan la adopción de las nuevas tecnologías, su proceso es un proceso de metas e incluye de manera sistemática el proceso mismo de la organización. Dentro del proceso de desarrollo de aplicaciones software existen distintos modelos para la organización de estos proyectos como, por ejemplo: Modelo en cascada: Este se compone por Análisis, diseño, codificación, pruebas de los distintos módulos, integración de las soluciones, prueba de tu sistema y mantenimiento. Aunque este modelo parece que lo tiene todo, tiene ciertos desperfectos, ya que la prueba efectiva solo se hace cuando ya tenemos todo el código diseñado, sin embargo, esto es malo, ya que lo más optimo es realizar pruebas cada cierto tiempo para ir descartando errores que salgan al final, ya que cuando se descubren dichos problemas la aplicación esta desarrollada casi al 100%. Proceso en espiral El ciclo de vida iterativo se basa en una idea simple: Para comprender, diseñar e implementar un sistema complejo, deben emplearse sucesivas etapas en las que en cada una de ellas se realiza una evoluciona respectos a la anterior. Los sistemas complejos que funcionan en la Naturaleza y en el campo de la tecnología han resultado siempre de la evolución de sistemas más simples. En cada etapa de desarrollo del sistema es necesario conseguir que sea estable frente a los cambios que va a suponer su evolución en la siguiente etapa. Las metodologías orientadas a objetos se construyen alrededor de conceptos como encapsulamiento y modularidad y presentan una mayor robustez frente a cambios. La orientación a objetos favorece el desarrollo de programas según un método iterativo. Hay varias razones para utilizar el modelo en espiral: Con este modelo se pueden reducir riesgos. La generación de versiones parciales permite que el cliente se involucre en el proceso de desarrollo de la aplicación. Permite reunir a lo largo del proceso métrica del proceso en cada iteración. Y utilizar la información para las siguientes. El proceso en espiral se ajusta al avance de los proyectos típicos; sin embargo, requiere una administración mucho más cuidadosa, ya que hay que conseguir que la documentación sea consistente después de cada iteración. En particular el código debe corresponder al diseño documentado y debe satisfacer los requisitos documentados. Características del proceso iterativo El proceso se basa en el desarrollo de prototipos ejecutables, y por tanto tangibles y medibles. Las entregas fuerzan al equipo a dar regularmente resultados concretos, lo que evita el síndrome del “90% terminado y 90% por hacer” El desarrollo regular de las iteraciones facilita que se aborden desde el principio los problemas, y si se presentan, se tenga un tiempo razonable para resolverlo. A lo largo del desarrollo se muestran prototipo a los clientes o a los usuarios, lo que supone que: •El usuario se enfrenta a situaciones de uso concreto y le requiere estructurar mejor sus deseos. El usuario se constituye en colaborador del proyecto y asume su responsabilidad. El equipo está continuamente motivado por objetivos tangibles muy próximos. La integración se hace de forma progresiva y desaparece el Bing-Bang de la integración. Los progresos se evalúan sobre sistemas demostrables, lo que hace que los gestores responsables se tomen en serio los resultados intermedios. Generación de requerimientos Al método iterativo se le suele atribuir que fomenta la generación ilimitada de requerimientos por parte de los clientes y usuarios. Este temor no es fundado. Sea cual sea el procedimiento de desarrollo, las necesidades siempre aparecen cuando el cliente o el usuario se enfrenta con la aplicación. Cuanto mejor esté elaborada la fase de especificación, se generarán menos nuevos requerimientos. En la figura se compara el ritmo de generación de requerimientos en el caso de proceso en cascada y de un proceso iterativo: •En el proceso en cascada se definen unos requerimientos iniciales como consecuencia de la fase inicial de especificación. Luego el cliente se desentiende y los requerimientos no suben (si acaso bajan porque el programador trata de evitar los problemas que se le presentan). Al final, después de la integración el cliente se enfrenta con el sistema y se produce una explosión de requerimientos cuando el plazo de finalización está muy próximo. •En el proceso iterativo, la generación de requerimientos iniciales es la misma. En las sucesivas iteraciones, el usuario se enfrenta con los prototipos y generan nuevos requerimientos incrementase. Con el proceso iterativo no se produce la explosión final de requerimientos. Casos de uso Los casos de uso expresan la funcionalidad que los usuarios requieren de la aplicación que se desarrolla y deben tenerse presente como los objetivos que guían las sucesivas actividades del proceso de desarrollo de esta. Los casos de uso formulan las necesidades de los usuarios con el lenguaje de los actores. Los modelos de casos de uso describen los servicios que se esperan del sistema, utilizando para ello la forma de interacciones entre los actores y el sistema. Durante la fase de análisis de los objetos, se comprueba mediante diagramas de secuencias o de colaboración que el conjunto de objetos resultante satisface las necesidades requeridas en los casos de uso. Los casos de uso marcan las necesidades de la aplicación a efectos de la implementación, fundamentalmente en lo que afecta a los requerimientos no funcionales. Por último, los casos de uso sirven de base para establecer las pruebas funcionales que validan la operatividad de la aplicación. Arquitectura La arquitectura se preocupa de la integridad, uniformidad, simplicidad, reusabilidad y estética de la aplicación. La arquitectura es la estructura maestra que soporta la aplicación y su formulación estable debe hacerse al principio del proceso de desarrollo. No existe una arquitectura universal válida para cualquier aplicación, pero si existen arquitecturas reutilizables dentro de un ámbito concreto. La arquitectura se ha definido como la unión de Componentes, Formas y Motivaciones. Los componentes son las clases y objetos, las formas son las agrupaciones de clases y objetos (patterns), y las motivaciones explican por qué cada agrupación es la adecuada en cada contexto. Características que debe ofrecen una buena arquitectura son: Simplicidad: Entendida como una estructura basada en pocos y bien definidos criterios. Elegancia: Su estructura se basa en líneas bien definidas que se mantienen uniformemente a lo largo de toda la aplicación y en la ausencia de atajos y casos especiales que la oscurecen. Inteligibilidad: Debe ser fácil de comprender, ya que va a ser utilizada por todos los que intervienen en el desarrollo de la aplicación y que la utilizan como guía de sus actividades. Niveles de abstracción bien definidos: La abstracción correcta de los componentes que se propongan a nivel de la arquitectura es la principal herramienta para simplificar la estructura y facilitar su evolución y reusabilidad. Separación entre interfaz e implementación: La separación sistemática entre interfaces e implementaciones, ayuda al mantenimiento de la aplicación. Si en el mantenimiento se respetan las interfaces, se pueden modificar las implementaciones de un componente sin efectos secundarios sobre otros Análisis Fase ingeniería en sistemas La fase de Ingeniería de sistemas es el diseño arquitectural al máximo nivel del prototipo que se desarrolla en la iteración actual. Es una subfase opcional que solo se ejecuta en sistemas complejos en los que van a ser desarrollados por varios grupos de trabajo. El propósito de la fase es descomponer el sistema en módulos independientemente especificados (subsistemas) que puedan ser desarrollados independientemente por los diferentes equipos. Las actividades primarias de esta fase son: •Definir la arquitectura de subsistemas. •Definir las interfaces y los protocolos de interacción de los subsistemas definidos. •Definir como los subsistemas colaboran entre sí para implementar los casos de uso del sistema, especificando los papeles que juegan cada subsistema en la colaboración, pero sin detallar su estructura interna. •Descomponer los casos de uso y los requerimientos del sistema en casos de uso y en requerimientos de los subsistemas. El producto primario usado en esta fase son los diagramas de subsistema. Estos son diagramas de clase UML en los que los elementos primarios son subsistemas, controladores, interfaces, actores y diagramas de secuencia de alto nivel. Sobre cada subsistema definido en esta fase debe ser aplicado y generar los mismos productos que se desarrollaron en la fase de análisis de requerimiento para el sistema completo. Análisis de objetos Un caso de uso es una caja negra que representa la funcionalidad del sistema a través de las interacciones de los actores y el sistema. En esta fase se establece la estructura interna del sistema. Cada caso de uso se concibe como la colaboración de un conjunto de objetos que responden al dominio o dominios de la aplicación, que deben ser identificados y caracterizada sus interfaces en esta fase. Si la fase previa de ingeniería de sistemas está presente, esta fase debe realizarse separadamente por subsistema. Debe tenerse cuidado de minimizar la introducción de aspectos relativos al diseño. Solo debe capturarse la funcionalidad esencial, y dejar los aspectos relativos a los requerimientos de QoS para próximas fases. Debe plantearse si el esquema de objetos que resulta del análisis es correcto, y para ello, en sucesivas fases de nano ciclos, deben validarse la consistencia y completitud de la estructura que se propone. Si se disponen herramientas de ejecución del modelo, esto puede automatizarse, en caso contrario, pueden realizarse a través de familias de diagramas de secuencias que ilustren los mecanismos de colaboración para los escenarios contemplados en los casos de uso. Los productos que se generan en esta fase son los diagramas de clases que modelan los objetos definidos, y los diagramas de secuencias que ilustran sus colaboraciones. Diseño arquitectural Hay muchas formas de definir el termino arquitectura. En este curso la entendemos como el conjunto de estrategias y decisiones de diseño que afectan globalmente al sistema. La arquitectura se refiere principalmente a la organización estructural del sistema, y solo implícitamente como objetivo final tiene en cuenta los aspectos de comportamiento y funcionales del sistema. La arquitectura se puede diseñar a base de estudiar cinco vistas complementarias que hacen referencia a aspectos estructurales típicos en los sistemas: •Vista de subsistemas y componentes: Hace referencia a los grandes módulos (subsistemas y componentes) con que se construyen la aplicación. •Vista de Concurrencia y Recursos: Hace referencia a los niveles de concurrencia que se deben incorporar en la aplicación y en los recursos necesarios para una operación concurrente segura. •Vista de Seguridad y Fiabilidad: Hace referencia a los niveles de redundancia necesarios para hacer fiable el sistema y a la gestión de los fallos que puedan producirse en la aplicación. •Vista de Distribución: Hace referencia a como se establecen diferentes espacios de direcciones, como se distribuyen los módulos software entre ellos, y los mecanismos, formatos y protocolos de colaboración entre ellos. •Vista de Despliegue: Hace referencia a la forma de mapear los componentes software en los diferentes elementos físicos (procesadores, discos, dispositivos, etc.) que constituyen la plataforma hardware del sistema. La representación del diseño arquitectural utiliza los tipos de vistas propios de una descripción estructural, esto es, diagramas de clases para definir los objetos y diagramas de secuencia para describir las colaboraciones entre ellas. Diseño de mecanismos La fase de diseño de mecanismos hace referencia a la optimización de colaboraciones en grupos individuales reducidos. Es un tipo de tarea similar a la realizada en la fase de diseño de la arquitectura, salvo que se reduce localmente a un mecanismo de colaboración. Al igual que en el diseño de la arquitectura, el diseño de los mecanismos debería basarse en patrones de diseño, cuyos beneficios y efectos sean bien conocidos, sin embargo, estos patrones son diferentes de los patrones estructurales. La vista que se genera en esta fase de diseño de mecanismos se compone de diagramas de clases que completan la definición de los objetos que intervienen, así como diagramas de descripción de las interacciones tales como diagramas de secuencias, de colaboración y diagramas de estados. A este nivel, estos dos últimos tipos de diagramas son muy útiles. Diseño detallado La fase de diseño detallado elabora los aspectos internos de los objetos y clases, y su ámbito se reduce a cada clase de forma independiente. Los aspectos de las clases que son habitualmente tratados en esta fase son: Las estructuras de datos internas de las fases. La implementación y optimización de los algoritmos y su descomposición cuando son complejos. La optimización de la máquina de estados de los objetos. Las estrategias de elaboración de los objetos. Las estructuras con las que se elaboran las asociaciones, en particular cuando son múltiples y requieren mecanismos contenedores. La implementación de las visibilidades, en especial cuando son cruzadas y no son directamente implementables, así como los criterios de modularización y encapsulamiento de las clases. Estudio de los mecanismos de garantizar en tiempo de ejecución que las precondiciones son satisfechas y como responder cuando no se satisfacen. Hay muchos criterios y guías para realizar el diseño de las clases, y suele corresponder con las estrategias de programación básica. No suelen basarse en patrones sino en bloques de sentencias proporcionadas por el lenguaje. El resultado de esta fase son clases completamente definidas, en las que sus estructuras de datos internas quedan perfectamente definidas, así como los diagramas de estados y actividades que especifican las operaciones y métodos de sus interfaces. Traducción y elaboración La fase de transducción concierne con la correcta construcción de los elementos arquitecturales que trabajen correctamente. Esta fase incluye la generación del código (que puede generarse automáticamente por herramientas o manualmente, o por combinación de ambas que es lo más habitual, la prueba a nivel de código fuente de los algoritmos e interacciones, la compilación y compatibilidad de enlazado de los módulos compilados y la instalación y ejecución de del código ejecutable generado. Así mismo, debe establecerse un plan de verificación de los elementos construidos. Los principales productos a que da lugar la fase de traducción y elaboración son: El código fuente de los elementos definidos en el diseño. Un plan de prueba , de las asociaciones, de las operaciones y de las interacciones. Un informe sobre los módulos elaborados y su forma de utilización. Los componentes de software compilados. Testeo de proyecto La fase de Prueba construye (Integración y prueba) el prototipo con los elementos diseñados y verifica si el prototipo satisface o no (Valida) los requerimientos funcionales y de QoS establecidos para él. La prueba se limita a demostrar que las interfaces de los elementos estructurales operan correctamente y satisfacen las restricciones establecidas. El proceso suele se incremental, se van integrando sucesivos elementos estructurales y se va verificando que operan correctamente. Si se encuentran defectos y problemas durante esta fase, deben ser reportados y analizados ya que son el objetivo final de la iteración, y deben ser considerados como la base de las siguientes iteraciones. Conclusión Es muy importante una buena planificación y análisis antes de avanzar con cualquier proyecto de software, ya que esto nos ayuda a evitar problemas de desarrollo, ahorrar o aproximar tiempos y costos, y esto es muy importante para las empresas, ya que estas siempre buscan maximizar sus ganancias y reducir costos, además que los proyectos que no se planean de manera adecuada suelen ser mas costosos y salir en tiempos mas extensos ya que siempre salen problemas y el nivel de dificultad aumenta desproporcionalmente conforme a el nivel de análisis del proyecto, por que un proyecto debe estar en constante análisis, para poder así darse cuenta de los posibles errores de nuestro proyecto. La correcta planificación de un proyecto ayuda a ahorrar costos y maximizar la calidad de este, lo cual es lo que buscamos el 100% de los casos. Fuentes Bibliográficas Definición de software: Qué es, para que sirve y porque es tan importante. (s. f.). Profesional Review. https://www.profesionalreview.com/2020/01/26/definicionsoftware/#¿Que_es_el_software Hardware y Software. Definición. Ejemplos. Similitudes y Diferencias - CAVSI. (s. f.). CAVSI. https://www.cavsi.com/preguntasrespuestas/hardware-y-software-definicion-ejemplos/ Informática Básica: ¿Qué es hardware y software? (s. f.). GCFGlobal.org. https://edu.gcfglobal.org/es/informatica-basica/que-es-hardware-y-software/1/ Software de sistema: ¿qué es? Tipos, ejemplos y características. (s. f.). TecnoMagazine. https://tecnomagazine.net/software-de-sistema/ Vista de clasificación del software | con-ciencia boletín científico de la escuela preparatoria no. 3. (s. f.). REPOSITORIO ACADÃMICO DIGITAL. https://repository.uaeh.edu.mx/revistas/index.php/prepa3/article/view/449/5398