domingo, 11 de agosto de 2019

Ingeniería de Software


Muchas veces me pregunte como funcionaba un computador cuando era niño, esa curiosidad me abrió un mundo desconocido (y temible en ese entonces), Un mundo donde no usabas el compu para jugar o estar en redes sociales, un mundo visto desde la otra cara de la moneda, me di cuenta que todas las cosas que ofrece esta maravillosa maquina son posibles ya que alguien pensó en un pasado y programo paso a paso todo lo que vemos en el monitor, si, hay personas que se pasan armando un rompecabezas virtual para que nosotros disfrutemos de las ultimas novedades, hoy en día gracias a Internet.


 Muchas personas usan cualquier tipo de software todos los días y no se dan cuenta, algunos jóvenes no van mas allá de que las apps como WhatsApp o Facebook fueron creadas por alguien, y pocos en realidad conocen el noble trabajo de programar. Siendo honesto este blog lo hice por que era una tarea, pero me la voy a disfrutar y a compartir lo que vaya aprendiendo de la ingeniería de Software, a alguien tal vez le sea útil, Quien Sabe...



Bueno, entonces... ¿Qué es La Ingeniería De Software?


Si tiene el nombre de ingeniería ya sabes que va a ser un  área del saber muy compleja, en si lo es, pero no te asustes, si buscas en Google o en cualquier otro motor de búsqueda te van a aparecer muchas respuestas, que, podrían darte la idea de que la ingeniería de Software es una ciencia del saber mega complicada, y que solo es para un reducido numero de personas con las capacidades necesarias para ejercer esta profesión, PERO déjame decirte que no es así, cualquier persona que utilice un computador puede aprender ingeniería de Software, eso si, tiene que ser muy amigo de Computador.

La Ingeniería de Software es una área o disciplina que se dedica a la creación de Software y al mantenimiento de este, y ¿Qué hace exactamente el Software creado? Pues este Software se creo para solucionar un problema en especifico para alguien que lo requiere, un ejemplo de esto es el semáforo, las luces de este no cambian por que si, una persona desde un computador les dijo que hacer mediante la programación, y es mucho más que eso, también en esta área del conocimiento son necesarias cosas como el trabajo en equipo.

Ahora sabiendo que es la Ingeniería de Software y que esta crea o mantiene el software, debemos centrarnos en el, El software es todo el complemento de instrucciones lógicas que hace funcionar al computador, y es como una semilla durante su creación, por que nace de una idea y/o necesidad, y a medida que los programadores lo crean, este  evoluciona hasta el producto final que puede ser usado por cualquier usuario.

El Ciclo De Vida Del Software

Como ya mencione arriba, un software se crea para resolver un problema, este problema requiere de una solución que será el software listo, pero para tenerlo listo, es necesario un análisis sobre como actuara el software, después se creara una primera versión y se probará para verificar que si solucione el problema, encontrar errores o cambiar y mejorar algunos aspectos del Software, viendo todos estos pasos podemos identificar un ciclo, A este ciclo se le llama Ciclo de vida de un Software.

el ciclo de vida del software es como un registro de todo lo que se hace para tenerlo listo, empieza desde que la idea es preconcebida para solucionar un problema, o incluso desde que el problema mismo es identificado, y sigue paso a paso la metodología utilizada para idear una estrategia de desarrollo, el desarrollo empieza y termina, se prueba una primera versión del software, se toma nota de los errores y de los cambios que se quieren realizar, una o más veces (las que sean necesarias) para tener una versión final de excelente calidad apropiada para que un usuario pueda usarlo cómodamente.



En la imagen se puede apreciar de manera sencilla el ciclo necesario para darle “vida” al software, que comienza como una necesidad, y curiosamente se puede homologar a cómo nacieron las grandes invenciones de la humanidad, es decir, por medio de las necesidades y en ese sentido, un tipo de software creado de cualquier índole es el equivalente electrónico a un invento, y para darle vida hay que analizar una necesidad o problema y ofrecer una solución mediante el diseño del software y su posterior desarrollo, ya teniendo un prototipo del software se procede a probarlo, a ver sus fallos para su corrección y su validación para que pueda ser usado, el software también puede ser actualizado constantemente para implementar ideas y funciones nuevas, es decir, un software puede estar sujeto a modificaciones y mejoras constantes para ofrecer más calidad y más servicios según sean las ideas gestionadas, y al estar en constante cambio el software evoluciona.


Metodología De Desarrollo Del Software 


Como el desarrollo del software implica resolver una necesidad, el trabajo para desarrollar dicho software no se hace a la ligera, a lo largo del tiempo se han creado estrategias para que crear software se vuelva mas eficiente y rápido posible, y para eso están las metodologías de desarrollo de software.

Una metodología de desarrollo de Software es una estrategia o plan de trabajo que toma en cuenta todos los factores posibles en cuanto desarrollo de software se refiere, factores como los costes de desarrollo, la planificación, la calidad, los recursos humanos y las dificultades del proyecto, básicamente las metodologías son un proceso en conjunto (tal conjunto tiene forma en base a modelos de sistemas, reglas, sugerencias de diseño y guías), hay que tener en cuenta que las metodologías de desarrollo de software tienen mucho que ver con la ya nombrada comunicación, la manipulación de modelos, e intercambio de información y datos.


Estas metodologías de desarrollo tienen unas fases basadas en el ciclo de vida de un software, y como son varias cada una llama a dichas fases de diferente manera, pero básicamente tienen unas  ideas base:
  • Análisis
  • Diseño
  • Desarrollo 
  • Pruebas
  • Verificación y Mantenimiento

Estas fases varían según la metodología, en unas aparecen con otro nombre, en otras se fusionan cn otras fases o se descomponen, pero en esencia, son las mismas.

Ahora para terminar, veremos los diferentes tipos de metodologías de desarrollo de software:

METODOLOGÍAS DE DESARROLLO DE SOFTWARE


Modelo en Cascada: La característica de esta metodología de desarrollo de software es que cada etapa o proceso para desarrollar tiene que ir en un orden, y además, no se puede empezar otra fase sin haber terminado la etapa inmediatamente anterior.

las fases de este modelo incluyen Análisis de requisitos, Diseño del sistema, Diseño del programa, codificación, pruebas, verificación y mantenimiento, teniéndose que llevar estas fases de manera lineal y ordenada.

Este modelo es muy conocido por los desarrolladores, es fácil de planear al igual que sencillo, además que los usuarios lo pueden comprender fácilmente los usuarios, teniendo estas características como sus ventajas


 Aun con esto, pocas veces un proyecto rara vez sigue una secuencia lineal y la imposibilidad de esta metodología de dar marcha atrás para correcciones puede llevar ala fracaso y los errores en el código del software se detectan en las fases de prueba, para volver a reprogramar el código y pasarlo otra vez por las fases de esta metodología, perdiendo tiempo aumentando el coste de desarrollo.
  
Modelo Prototipado: Este modelo se caracteriza por una constante evolución del software producido, ya que en su desarrollo se van entregando versiones de prueba para el cliente, después de haberlo probado el cliente dirá que se debe mejorar y cualquier error y cosas que se deben cambiar, el desarrollador pasa a empezar de nuevo, etapa a etapa, a rediseñar el software, en un ciclo constante de evolución, desde su formulación de necesidades del software para un usuario, pasando por la etapa de desarrollo, las pruebas, las pruebas del usuario, las correcciones, el rediseño hasta el producto final.

  Al igual que todas las demás metodologías sus etapas son las típicas, desde el análisis y requisitos, pasando por su diseño y la etapa de pruebas, con la única diferencia de que esta metodología sigue  un ciclo de manera circular al entregar un prototipo al usuario, que después va a ser corregido desde el principio y reprogramado hasta que se tenga un producto de calidad.

Desde que se conocen las necesidades del usuario se pueden hacer maquetas o bocetos de diversas maneras de visualizar el proyecto, desde simples dibujos hasta el código mismo, desde ese punto se puede comenzar a desarrollar el producto y probarlo varias veces  hasta su desarrollo final.

Este modelo aumenta el éxito y la garantía de que al cliente le gusta al estar en constante evolución, también es ideal para cuando se desarrolle un producto ligero y no altera el flujo del 
ciclo de vida del software.

Para que este modelo sea exitoso, el software a diseñar no debe tener una gran complejidad, ya que hace muy muy difícil (si no es que imposible) el desarrollo de prototipos para revisión del usuario, también el coste de los prototipos debe ser mucho barato comparándolo con la versión final para evitar pérdidas, además se necesitan los lenguajes y herramientas de desarrollo que se ajusten a la evolución del software, y muy importante debe ser un software experimentable, debido a su ciclo de evolución.

Esta metodología puede llevar a confusiones, pues el usuario puede creer que el prototipo probado es el software en si, solo por que ve que funciona y realmente no comprende que recién se está probando un software aún en creación, y el desarrollador puede caer en la tentación de crear la estructura final sin tener en cuenta la calidad que el software debe tener.

Esta metodología tiene varios tipos de modelos: Modelo de prototipos rápidos donde se crean prototipos rápidamente, se analizan y se desechan en un corto periodo de tiempo, Modelos de prototipo reutilizable llamado también Evolutionary Prototyping donde partes del prototipo se utilizan en el desarrollo del producto final, no solo se utiliza en el desarrollo de software sino también del hardware, Modelo de prototipos modular llamado también prototipado incremental donde se añaden nuevas características al prototipo mientras el ciclo de diseño avanza, Modelo de prototipos horizontal útil para evaluar el alcance de un software pero no su uso real, ya que este modelo analiza funciones y aspectos del prototipo NO operativas, Modelo de prototipos vertical El prototipo cubre sólo un pequeño número de funciones operativas. Resulta muy útil para evaluar el uso real sobre una pequeña parte del producto, Modelo de prototipos de baja-fidelidad donde el prototipo se muestra en papel y lápiz, suele aplicarse a test baratos y el Modelo de prototipos de alta-fidelidad donde el prototipo se crea de la manera más cercana al diseño real del software en términos de aspecto, impresiones, interacción y tiempo.

También hay dos tipos de prototipos: el prototipo desechable que nos sirve para eliminar dudas sobre lo que realmente quiere el cliente además para desarrollar la interfaz que más le convenga al cliente, y el Prototipo evolucionario que es un modelo aspirante a 
software que aun no esta pulido, y por lo tanto es de baja calidad.

Modelo Incremental: en este modelo se crea la arquitectura completa del software, seguido de sucesivos incrementos funcionales, cada incremento tiene su ciclo de vida y se basa en el anterior, pero no se debe cambiar ni su funcionalidad ni sus interfaces, una vez hecho el incremento, no se cambia nada de este, simplemente se corrigen los errores.

Durante el proceso al comienzo se debe empezar por los objetivos más difíciles propuestos por el usuario, para que en cada actualización la dificultad de los incrementos sea menor.

Entre sus ventajas tenemos que el cliente puede probar el software cada cierto tiempo, sin necesidad de esperar hasta el final del proyecto, se minimizan los errores en el software, la calidad del producto final tiene muchas probabilidades de ser alta, aun así este modelo presenta muchos inconvenientes que lo hacen inefectivo en el caso de que se requiera un software muy específico:

Difícil de aplicar a sistemas transaccionales que tienden a ser integrados y a operar como un todo.
 Riesgos largos y complejos.

 Pueden aumentar el coste debido a las pruebas.

Los errores en los requisitos se detectan tarde

El modelo incremental no es recomendable para casos de sistemas de tiempo real, de alto nivel de seguridad, de procesamiento distribuido y/o de alto índice de riesgos.

Requiere de mucha planeación, tanto administrativa como técnica.

Requiere de metas claras para conocer el estado del proyecto.


Modelo en espiral: describe el ciclo de vida de un software por medio de espirales, que se repiten hasta que el producto esté terminado, los espirales representan mejoras y correcciones en el software de manera pequeña, además se está trabajando en el software constantemente.

Una de sus características más importantes es que minimiza los riesgos en el desarrollo del software, pero incrementa el coste del desarrollo, también el esfuerzo y un lanzamiento del producto retardado, además en los lugares donde se toman decisiones sobre los ciclos siguientes, existe el riesgo de que se formen bucles y el proyecto tarde más tiempo si se toman decisiones equivocadas,lo que implica riesgos,, y el control de requisitos y desarrollo puede ser complejo. aún,así se pueden compensar con sus ventajas:

Los conflictos entre los requisitos de un software y su diseño se evitan eficazmente mediante el enfoque cíclico, ya que los requisitos pueden comprobarse constantemente y, si es necesario, modificarse.

Se puede obtener feedback de los usuarios, desarrolladores y clientes en las primeras fases del proyecto. Sin embargo, esta estructura también requiere una gestión que tenga en cuenta los ciclos del producto y pueda responder rápidamente a los riesgos.

Modelo RAD (Rapid Application Development): este modelo se basa en la rapidez, donde se puede interactuar con el cliente y a la vez, un desarrollo notablemente más veloz que otros modelos, en este modelo se pueden usar las herramientas CASE (que básicamente son herramientas que ahorran tiempo y esfuerzo al equipo de desarrollo generando código automáticamente solo con el diseño dado) aunque en este modelo se usan prototipos, el ámbito de desarrollo no está enfocado en estos si no en el producto final en sí. además de generar la documentación necesaria para su desarrollo y futuro mantenimiento.

Sus ventajas son: el proyecto puede ser trasladado a otra plataforma, entrega temprana al cliente, compromiso con la calidad del software, entrega temprana al cliente, menor codificación manual, mayor flexibilidad, menos posibilidad de fallos, menor costo y ciclos de desarrollo pequeños.

Sus desventajas son: inconveniencia con proyectos grandes, se necesitan grandes recursos humanos para una correcta gestión de los equipos de trabajo, buena comunicación entre el desarrollador y el cliente, alto coste de herramientas integradas y equipo, progreso más difícil de medir, menos eficiente y con poca precisión científica.

Modelo Scrum: es una metodología ágil para gestionar proyectos en pequeños bloques o sprints con grupos pequeños de personas que se encargan de una tarea específica, luego se revisa cada sprint y se mejora en orden, este modelo se suele planificar por semanas, al final de cada sprint (mínimo una semana y máximo tres o cuatro semanas) donde hay reuniones de revisión de trabajo, y donde según el avance se priorizan y planifican las actividades de la semana siguiente, este modelo se centra en ajustar sus resultados y responder a las exigencias del cliente, por eso siempre se revisan los entregables al final de cada sprint, siendo el desarrollo incremental del software y no de manera lineal como en otros modelos.

Lo más destacable de este modelo es que hay roles asignados a sus procesos de trabajo que son:

Project Owner quien se asegura de que el proyecto vaya de acuerdo a la estrategia de desarrollo, escribe historias de usuario, las prioriza y coloca en el Product Backlog.

Master Scrum o Facilitador quien elimina los obstáculos que impiden que el equipo cumpla su objetivo.

Developer Team Member quienes son los encargados de crear el producto para que pueda estar listo con los requerimientos necesarios, cada equipo varía en tamaño, por ejemplo google tiene 15000 desarrolladores trabajando en una rama de código.

Ventajas del modelo Scrum:

Puedes ir enviando entregables al cliente mientras vas atacando los objetivos más sencillos, eso te hace ganar tiempo para atacar los objetivos más complejos.

El ScrumMaster tiene el conocimiento necesario para lograra el objetivo primario y secundario, además de controlar el proyecto y asignar roles.

Cada persona sabe lo que tiene que hacer y n es necesario estar reorganizando una y otra vez los tracks de cada persona

Se involucra desde un principio y se da un rol a todos los stakeholders (personas que van al participar en el proyecto incluyendo cliente final, los testers etc)

Desventajas del modelo Scrum:

Algunos miembros de tu equipo pueden saltarse pasos para llegar rápidamente al sprint final.

El cliente siempre va a pedir informes con la fecha exacta, o incluso antes, cuando es posible que el proyecto no haya avanzado.

Demasiadas reuniones para poco avance, a veces es muy cansador y estresante reunirse muchas veces para tratar un mismo tema, algunos van perdiendo motivación e interés.

Si una persona renuncia o hay algún cambio es complicado reemplazar ese rol, ya que la persona que se va se lleva el conocimiento específico y afecta a todo el proyecto. 




Y bueno, creo que eso es todo :D




No hay comentarios.:

Publicar un comentario

Diagramas UML

¿Que son Diagramas UML? Estos diagramas son un estándar unificado para representar procesos de cualquier proyecto de software. UML (...