lunes, 1 de diciembre de 2014

Técnicas y Herramientas en el Proceso de Desarrollo de Software

Un proceso de desarrollo de software tiene como propósito la producción eficaz y eficiente de un producto software que reúna los requisitos del cliente.  Este proceso es intensamente intelectual, afectado por la creatividad y juicio de las personas involucradas. Aunque un proyecto de desarrollo de software es equiparable en muchos aspectos a cualquier otro proyecto de ingeniería, en el desarrollo de software hay una serie de desafíos adicionales, relativos esencialmente a la naturaleza del producto obtenido.

Un producto software en sí es complejo, es prácticamente inviable conseguir un 100% de confiabilidad de un programa por pequeño que sea. Existe una inmensa combinación de factores que impiden una verificación exhaustiva de las todas posibles situaciones de ejecución que se puedan presentar (entradas, valores de variables, datos almacenados, software del sistema, otras aplicaciones que intervienen, el hardware sobre el cual se ejecuta, entre otros.).

El proceso de desarrollo de software no es único. No existe un proceso de software universal que sea efectivo para todos los contextos de proyectos de desarrollo. Debido a esta diversidad, es difícil automatizar todo un proceso de desarrollo de software. A pesar de la variedad de propuestas de proceso de software, existe un conjunto de actividades fundamentales que se encuentran presentes en todos ellos: 

  • Especificación de software: Se debe definir la funcionalidad y restricciones operacionales que debe cumplir el software.
  • Diseño e Implementación: Se diseña y construye el software de acuerdo a la especificación.
  • Validación: El software debe validarse, para asegurar que cumpla con lo que quiere el cliente.
  • Evolución: El software debe evolucionar, para adaptarse a las necesidades del cliente.

Técnicas en el Proceso para el Desarrollo de un Software:

1. Técnica para la Recopilación de Datos.

La recolección de datos se refiere al uso de una gran diversidad de técnicas y herramientas que pueden ser utilizadas por el analista para desarrollar los sistemas de información, los cuales pueden ser la entrevistas, la encuesta, el cuestionario, la observación, el diagrama de flujo y el diccionario de datos.

Son todas las formas posibles de que se vale el investigador para obtener la información necesaria en el proceso investigativo. Todos estos instrumentos se aplicarán en un momento en particular, con la finalidad de buscar información que será útil a una investigación en común.

  • Entrevista.
  • Encuesta.
  • Cuestionario.
  • Observación.
  • Revisión documental.

2. Técnica de Costo-Beneficios.

El análisis de costo-beneficio es una técnica analítica que enumera y compara el costo neto de una intervención con los beneficios que surgen como consecuencia de aplicar dicha intervención. Para esta técnica, los costos y los beneficios de la intervención se expresan en unidades monetarias.

Sirve como guía para lograr una respuesta de viabilidad, que si bien nos es para nada definitiva, aterriza las expectativas que pueden ser profundizadas de ser necesario.

Lo relevante es que podemos estar en condiciones de tomar decisiones oportunas con un nivel de certeza muy razonable, sin invertirle tiempo valioso en analizar muchas ideas cuando pocas son acogidas e implementadas.


3. Técnica de Planificación y Control de Proyectos

La Planificación y Control de Proyectos de Software comprende una serie de procedimientos, sin embargo, se mencionaran solo los más complejos y/o significativos, los cuales son:

  • Objeto: En este procedimiento se describe la sistemática a seguir para una correcta planificación del desarrollo de una aplicación de software y de las medidas de control a establecer por el gabinete de programación.
  • Alcance: Todas las actividades encamina das a la planeación, programación y control de cada una de las fases requeridas para el desarrollo de una aplicación de software específica.
  • Entradas: El proceso da comienzo con la necesidad de desarrollar un nuevo software o modificar uno existente (sub-proyecto) y, por tanto, de realizar una planificación de las actividades necesarias para realizar dicha aplicación.
  • Salidas: Este proceso finaliza con la planeación, programación y control de cada una de las actividades en las que consistirá el proyecto de desarrollo de una aplicación de software específica.
  • Desarrollo: Para ejecutar un proyecto basado en el desarrollo de software es preciso definir la estructura en que se desglosan cada una de las actividades o tareas a realizar para, finalmente, asignar a cada miembro del equipo su correspondiente cuota de gestión. No solamente se requiere la lista, sino también una descripción de las actividades. Para ello, se asume una estructura concreta con los detalles de la gestión y que se desglosará en tres partes específicas:
  • Planificación: Se inicia descomponiendo el proyecto en actividades distintas, después se determinan las estimaciones de tiempo para cada actividad, se construye un diagrama de red (flechas) para estas actividades.



Herramientas en el Proceso de Desarrollo de un Software:

Las Herramientas de Ayuda al Desarrollo de Sistemas de Información, surgieron para intentar dar solución a los problemas inherentes a los proyectos de generación de aplicaciones informáticas: plazos y presupuestos incumplidos, insatisfacción del usuario, escasa productividad y baja calidad de los desarrollos. Algunas de estas herramientas se dirigen principalmente a mejorar la calidad, como es el caso de las herramientas CASE (Computer Aided Software Engineering-Ingeniería de Software Asistida por Ordenador). Otras van dirigidas a mejorar la productividad durante la fase de construcción, como es el caso de los lenguajes de cuarta generación (4GL-Fourth Generation Language).

1. Herramientas para diseñar software.
  • Existe al menos 20 herramientas libres para diseñar software totalmente libres.
  • Todas utilizan la notación UML
  • El nivel de avance entre una y otra es notable, casi todas ofrecen como funcionalidad: Diagramas de caso de uso, Diagramas de clasesDiagramas de secuencia.
  • Generación de código en java, c++, python y php.
  • Algunas entidad-relación (pero ninguna lo suficientemente avanzada)
  • Pocas herramientas permiten ingeniería reversa, y si lo hacen solo es de lenguajes tipo java o c++.
2. Herramientas para modelar bases de datos.
  • Algunas de las herramientas case libres permiten modelar bajo Entidad-Relación, sin embargo su funcionalidad es bastante limitada.
  • Básicamente existen herramientas orientadas a una db en especifico y estas son MySql y PostgreSQL, el de MySql (MySql WorkBench no es libre).
  • Permiten hacer ingeniería reversa de la db para las que fueron diseñadas, algunas otras soportan UnixODBC/Odbc según sea el caso.
  • Existen algunos modeladores en línea.
  • La documentación que generan es bien básica.

3. Herramientas para Ingeniería de Software Asistida por Computadora (CASE).

Son un conjunto de métodos, utilidades y técnicas que facilitan la automatización del ciclo de vida del desarrollo de sistemas de información, completamente o en alguna de sus fases.
  • El empleo de herramientas Case permiten integrar el proceso de ciclo de vida:
  • Análisis de datos y procesos integrados mediante un repositorio. 
  • Generación de interfaces entre el análisis y el diseño. 
  • Generación del código a partir del diseño. 
  • Control de mantenimiento. 

Actualmente, la tendencia en el desarrollo de software está enfocada hacia las microcomputadoras como plataformas de ingeniería de software, que se interconectan mediante redes para que puedan comunicarse de forma efectiva. La base de datos del proyecto (también denominada biblioteca del proyecto o depósito de software), está disponible a través de un servidor de archivos en red que es accesible desde todas las estaciones de trabajo. Un sistema operativo que gestiona el hardware, la red y las herramientas, mantiene todo el entorno unido.

La arquitectura de entorno, compuesta por la plataforma hardware y el soporte del sistema operativo (incluida la red y la gestión de la base de datos), constituye la base del CASE. Pero el entorno CASE, en sí mismo, necesita otros componentes. Un conjunto de servicios de potabilidad constituyen un puente entre las herramientas CASE y su marco de integración y la arquitectura de entorno. El marco de integración es un conjunto de programas especializados que permite a cada herramienta CASE comunicarse con las demás, para crear una base de datos de proyectos y mostrar una apariencia homogénea al usuario final (el ingeniero de software). Los servicios de potabilidad permiten que las herramientas CASE y su marco de integración puedan migrar a través de diferentes plataformas hardware y sistemas operativos, sin grandes esfuerzos de adaptación.







domingo, 30 de noviembre de 2014

Modelado de sistema


Modelado de Software.

El modelado de sistemas de software es una técnica para tratar con la complejidad inherente a estos sistemas. El uso de modelos ayuda al ingeniero de software a “visualizar” el sistema a construir. Además, los modelos de un nivel de abstracción mayor pueden utilizarse para la comunicación con el cliente, por ultimo, las herramientas de modelado y las de ingeniería de software automatizada pueden ayudar a verificar la corrección del modelo.



UML

UML es un popular lenguaje de modelado de sistemas de software. Se trata de un lenguaje gráfico para construir, documentar, visualizar y especificar un sistema de software. En otras palabras, UML se utiliza para definir un sistema de software. Posee la riqueza suficiente como para crear un modelo de sistema, pudiendo modelar los procesos de negocios, funciones, esquemas de bases de datos, expresiones de lenguajes de programación, etc. Para ello utiliza varios tipos diferentes de diagramas, por ejemplo, en UML 2.0 hay 13 tipos de diagramas. 


Tipos de Diagramas de UML

Dependiendo de las necesidades del programador, los diagramas UML se pueden clasificar por:

Estructura.
  • Diagrama de clases
  • Diagrama de objetos
  • Diagrama de componentes
  • Diagrama de estructura compuesta
  • Diagrama de paquetes
  • Diagrama de despliegue


Comportamiento.
  • Diagrama de casos de uso
  • Diagrama de actividades
  • Diagrama de estado


Interacción.
  • Diagrama de secuencia
  • Diagrama de colaboración UML 1.X / Diagrama de comunicación UML 2.0
  • Diagrama de tiempo
  • Diagrama de interacción






Metodos de desarrollo del software

En este caso se explicará el método conocido como: "método de solución de problemas mediante técnicas de ingeniería", el cual posee una serie de pasos a seguir para la realización de un software, estos son:


1. Definición del Problema                     

En esta etapa, también conocida como Especificación de Requerimientos, se establece el problema, aclarándolo lo más posible. Es la parte más crítica de la solución. Amerita un estudio cuidadoso. Se deben identificar las teorías, fundamentos y/o principios matemáticos, físicos o de cualquier índole que permitan fundamentar satisfactoriamente el problema.

2. Análisis

En esta etapa se deben identificar las entradas del problema, los resultados deseados o salidas y cualquier requerimiento o restricción adicional en la solución.
  • Identificar qué información se proporciona (datos del problema)
  • Identificar qué resultados deben calcularse y/o desplegarse
  • Determinar la forma y las unidades en qué se deben desplegar los resultados
  • Acotar las teorías, fundamentos y/o principios necesarios haciendo los supuestos y simplificaciones necesarias
  • Identificar los tipos y estructuras de datos necesarios para los datos del problema y para los resultados
  • Identificar las funciones u operaciones necesarias para cubrir los requerimientos del problema.


3. Diseño

El diseño consiste básicamente en desarrollar una lista de pasos llamados algoritmo o receta de la solución, verificando que el problema se resuelve como se desea.
  • Es la parte más difícil del proceso de solución del problema
  • Debe verificarse que es correcto el algoritmo antes de continuar
  • Se auxilia de técnicas de diseño como pseudocódigo y diagramas de flujo.


4. Implementación

Esta etapa consiste en implementar o escribir el algoritmo como un programa de computadora en un lenguaje de programación, convirtiendo cada paso del algoritmo en instrucciones en el lenguaje de programación.

Se requiere el conocimiento de un lenguaje de programación particular en lo referente a su gramática, sintáxis y semántica, para ello se recomienda leer el manual del programador o su equivalente y utilizarlo como consulta siempre que sea necesario.

Una manera de iniciar el conocimiento del lenguaje de programación es interpretando programas ejemplo, ejecutarlos, observar los resultados y analizar las entradas, las salidas y los procesos de cálculo y/o flujo de información mediante instrucciones de salida que finalmente.

5. Verificación y Prueba

Esta etapa consiste en probar el programa completo y verificar que trabaja como se esperaba, los pasos a seguir son: 
  • Se deben probar cada una de las funciones primero por separado y luego en conjunto
  • Se debe probar el programa completo con distintos conjuntos de datos de prueba
  • En caso de que haya errores repetir el paso 4 y 5 hasta la satisfacción de los requerimientos.

Metodologías o procesos de desarrollo de software

Metodología de desarrollo de software.

Un proceso de software detallado y completo suele denominarse “Metodología”. Las metodologías se basan en una combinación de los modelos de proceso genéricos (cascada, evolutivo, incremental, espiral entre otros). Adicionalmente una metodología debería definir con precisión los artefactos, roles y actividades involucrados, junto con prácticas y técnicas recomendadas, guías de adaptación de la metodología al proyecto, guías para uso de herramientas de apoyo, etc. Habitualmente se utiliza el término “método” para referirse a técnicas, notaciones y guías asociadas, que son aplicables a una (o algunas) actividades del proceso de desarrollo, por ejemplo, suele hablarse de métodos de análisis y/o diseño.

Las metodologías imponen un proceso disciplinado sobre el desarrollo de software con el fin de hacerlo más predecible y eficiente. Lo hacen desarrollando un proceso detallado con un fuerte énfasis en planificar inspirado por otras disciplinas de la ingeniería.



Las metodologías ingenieriles han estado presentes durante mucho tiempo. No se han distinguido precisamente por ser muy exitosas. Aún menos por su popularidad. La crítica más frecuente a estas metodologías es que son burocráticas. Hay tanto que hacer para seguir la metodología que el ritmo entero del desarrollo se retarda.

Hoy en día existen numerosas propuestas metodológicas que inciden en distintas dimensiones del proceso de desarrollo. Un ejemplo de ellas son las propuestas tradicionales centradas específicamente en el control del proceso. Estas han demostrado ser efectivas y necesarias en un gran número de proyectos, sobre todo aquellos proyectos de gran tamaño (respecto a tiempo y recursos).


La comparación y/o clasificación de metodologías no es una tarea sencilla debido a la diversidad de propuestas y diferencias en el grado de detalle, información disponible y alcance de cada una de ellas. A grandes rasgos, si tomamos como criterio las notaciones utilizadas para especificar artefactos producidos en actividades de análisis y diseño, podemos clasificar las metodologías en dos grupos: Metodologías Estructuradas y Metodologías Orientadas a Objetos. Por otra parte, considerando su filosofía de desarrollo, aquellas metodologías con mayor énfasis en la planificación y control del proyecto, en especificación precisa de requisitos y modelado, reciben el apelativo de Metodologías Tradicionales (o también denominadas Metodologías Pesadas, o Peso Pesado). Otras metodologías, denominadas Metodologías Ágiles, están más orientadas a la generación de código con ciclos muy cortos de desarrollo, se dirigen a equipos de desarrollo pequeños, hacen especial hincapié en aspectos humanos asociados al trabajo en equipo e involucran activamente al cliente en el proceso.


Sin embargo la experiencia ha demostrado que las metodologías tradicionales no ofrecen una buena solución para proyectos donde el entorno es volátil y donde los requisitos no se conocen con exactitud, porque no están pensadas para trabajar con incertidumbre.


Aplicar metodologías tradicionales nos obliga a forzar a nuestro cliente a que tome la mayoría de las decisiones al principio. Luego el coste de cambio de una decisión tomada puede llegar a ser muy elevado si aplicamos metodologías tradicionales.


Categorías de las metodologías.

Estructurada:

Los métodos estructurados comenzaron a desarrollarse a fines de los 70’s con la Programación Estructurada, luego a mediados de los 70’s aparecieron técnicas para el Diseño (por ejemplo: el diagrama de Estructura) primero y posteriormente para el Análisis (por ejemplo: Diagramas de Flujo de Datos). Estas metodologías son particularmente apropiadas en proyectos que utilizan para la implementación lenguajes de 3ra y 4ta generación.

Orientada a Objetos:

Su historia va unida a la evolución de los lenguajes de programación orientada a objeto, los más representativos: a fines de los 60’s SIMULA, a fines de los 70’s Smalltalk-80, la primera versión de C++ por Bjarne Stroustrup en 1981 y actualmente Java o C# de Microsoft. A fines de los 80’s comenzaron a consolidarse algunos métodos Orientadas a Objeto.

En 1995 Booch y Rumbaugh proponen el Método Unificado con la ambiciosa idea de conseguir una unificación de sus métodos y notaciones, que posteriormente se reorienta a un objetivo más modesto, para dar lugar al Unified Modeling Language (UML), la notación Orientada a Objetos más popular en la actualidad.















Tradicionales:

Las metodologías no ágiles son aquellas que están guiadas por una fuerte planificación durante todo el proceso de desarrollo; llamadas también metodologías tradicionales o clásicas, donde se realiza una intensa etapa de análisis y diseño antes de la construcción del sistema.

Todas las propuestas metodológicas antes indicadas pueden considerarse como metodologías tradicionales. Aunque en el caso particular de RUP, por el especial énfasis que presenta en cuanto a su adaptación a las condiciones del proyecto (mediante su configuración previa a aplicarse), realizando una configuración adecuada, podría considerarse Ágil.


Ágiles.

Un proceso es ágil cuando el desarrollo de software es incremental (entregas pequeñas de software, con ciclos rápidos), cooperativo (cliente y desarrolladores trabajan juntos constantemente con una cercana comunicación), sencillo (el método en sí mismo es fácil de aprender y modificar, bien documentado), y adaptable (permite realizar cambios de último momento).




Paradigmas de Programación.

¿Que son paradigmas de programación?


Un paradigma de programación es una propuesta tecnológica que es adoptada por una comunidad de programadores cuyo núcleo central es incuestionable en cuanto a que únicamente trata de resolver uno o varios problemas claramente delimitados. Es un estilo de programación empleado. La resolución de estos problemas debe suponer consecuentemente un avance significativo en al menos un parámetro que afecte a la ingeniería de software. Tiene una estrecha relación con la formalización de determinados lenguajes en su momento de definición. Un paradigma de programación está delimitado en el tiempo en cuanto a aceptación y uso ya que nuevos paradigmas aportan nuevas o mejores soluciones que la sustituyen parcial o totalmente.

El paradigma de programación que actualmente es el más usado es la orientación a objetos. El núcleo central de este paradigma es la unión de datos y procesamiento en una entidad llamada "objeto", relacionable a su vez con otras entidades "objeto".


Tradicionalmente datos y procesamiento se han separado en áreas diferente del diseño y la implementación de software. Esto provocó que grandes desarrollos tuvieran problemas de fiabilidad, mantenimiento, adaptación a los cambios y escatabilidad. Con la orientación a objetos y características como el encapsulado, polimorfismo o la herencia se permitió un avance significativo en el desarrollo de software a cualquier escala de producción.
Un paradigma de programación representa un enfoque particular o filosofía para diseñar soluciones. Los paradigmas difieren unos de otros, en los conceptos y la forma de abstraer los elementos involucrados en un problema, así como en los pasos que integran su solución del problema, en otras palabras, el cómputo.

La orientación a objeto parece estar ligada en sus orígenes con lenguajes como Lisp y Simula aunque el primero que acuñó el título de programación orientada a objetos fue Smalltalk.

¿Por qué paradigmas?

A lo largo de la historia de las ciencias de la computación han ido surgiendo herramientas, reglas, conceptos y otros elementos que permitieron la creación de los más variados lenguajes de programación. Algunos nacieron y al poco tiempo desaparecieron, mientras que otros hace años ya que se diseñaron y siguen vigentes. Muchos se fueron adaptando y renovándose para subsistir y se vuelven casi irreconocibles de sus orígenes y en cambio otros permanecen fieles a sus principios fundantes y casi inalterables, más allá de ciertos cambios cosméticos.

Los equipos, las metodologías y los campos de aplicación se transformaron radicalmente. Si Von Neumman se levantara de su tumba y se sentara frente a las computadoras de última generación se sentiría tan perdido como el inventor de la rueda al volante de un fórmula 1. Sin embargo, es probable que así como el conductor constataría que el vehículo sigue teniendo ruedas o preguntaría cómo hacen ahora para hacerla girar, los desarrolladores de software de otras épocas no dudarían de preguntar... ¿y cómo es la entrada de datos? ¿cómo los representan? ¿y el control de secuencia? ¿sigue existiendo el efecto de lado? Y la respuesta de un ingeniero en sistemas de esta época sería “Y... según el paradigma”.



Si algo caracteriza al panorama actual del desarrollo de sistemas es su complejidad y heterogeneidad. No existe una sola forma de pensar y encarar las soluciones, no son uniformes los conceptos que fundamentan los lenguajes, no es única la manera de programar. Los modelos de datos, estructuras de control, mecanismos de evaluación, sentencias, enlaces, expresiones, declaraciones y tantos otros elementos que conforman los lenguajes de programación actuales son muy diferentes entre unos y otros, hasta opuestos, pero es posible detectar cuáles son los conceptos que marcan diferencias mayores o menores, muestran puntos de contacto o de inflexión, establecen criterios de clasificaciones, y así, aportan elementos teóricos para sistematizar el análisis de la programación. 

De esta manera, tiene sentido hablar de la existencia de diferentes “paradigmas” de programación que aportan los fundamentos teóricos y conceptuales para desarrollar sistemas de una manera en particular, incluso podríamos decir con una “filosofía” especial, que los caracterizan, identifican y a la vez diferencian de los otros paradigmas.