sábado, 23 de marzo de 2013

Gestión de Proyectos de Software


En todo proyecto de software existe la necesidad de tener una adecuada gestión de los proyectos, para esto se debe contar con el personal capacitado, seleccionar el mejor proceso de acuerdo al problema que se vaya a tratar, y por supuesto una excelente planificación, con el fin de obtener un producto a tiempo y de calidad.

Cuando se desea realizar una gestión adecuada, eficaz y eficiente en la gestión de proyectos de software, es necesario que se ponga en funcionamiento cuatro características muy importantes en esta gestión, las cuatro P: personal, producto, proceso y proyecto. El gestor de proyectos muchas de las veces se olvida que el éxito o fracaso de los proyectos depende fundamentalmente del equipo humano con el que trabaje. 
El gestor debe basarse en procesos válidos y que verdaderamente le sirvan a su proyecto, no construir soluciones elegantes para problemas equivocados. Todo proyecto debe tener consigo una planificación previa, no se debe aventurar al éxito sin antes conocer los beneficios, contras y coste de cada uno de los proyectos. La ejecución de las cuatro características marcará el rumbo del éxito del gestor y de sus proyectos.

Actividades y herramientas para el desarrollo del desarrollo de software

Actividades del proceso de desarrollo de software representados en el desarrollo en cascada. Hay algunos modelos más para representar este proceso.

Planificación


La importante tarea a la hora de crear un producto de software es obtener los requisitos o el análisis de los requisitos. Los clientes suelen tener una idea más bien abstracta del resultado final, pero no sobre las funciones que debería cumplir el software.
Una vez que se hayan recopilado los requisitos del cliente, se debe realizar un análisis del ámbito del desarrollo. Este documento se conoce como especificación funcional.

Implementación, pruebas y documentación


La implementación es parte del proceso en el que los ingenieros de software programan el código para el proyecto.
Las pruebas de software son parte esencial del proceso de desarrollo del software. Esta parte del proceso tiene la función de detectar los errores de software lo antes posible.
La documentación del diseño interno del software con el objetivo de facilitar su mejora y su mantenimiento se realiza a lo largo del proyecto. Esto puede incluir la documentación de un API, tanto interior como exterior.

Despliegue y mantenimiento


El despliegue comienza cuando el código ha sido suficientemente probado, ha sido aprobado para su liberación y ha sido distribuido en el entorno de producción.
Entrenamiento y soporte para el software es de suma importancia y algo que muchos desarrolladores de software descuidan. Los usuarios, por naturaleza, se oponen al cambio porque conlleva una cierta inseguridad, es por ello que es fundamental instruir de forma adecuada a los futuros usuarios del software.
El mantenimiento y mejora del software de un software con problemas recientemente desplegado puede requerir más tiempo que el desarrollo inicial del software. Es posible que haya que incorporar código que no se ajusta al diseño original con el objetivo de solucionar un problema o ampliar la funcionalidad para un cliente. Si los costes de mantenimiento son muy elevados puede que sea oportuno rediseñar el sistema para poder contener los costes de mantenimiento.

Modelos de desarrollo de software

Hay varios modelos para perfilar el proceso de desarrollo, cada uno de las cuales cuenta con pros y contras. El proyecto debería escoger el más apropiado para sus necesidades. En ocasiones puede que una combinación de varios modelos sea apropiado.

Modelo de cascada

El modelo de cascada muestra un proceso donde los desarrolladores han de seguir las siguientes fases de forma sucesiva:
  1. Especificación de requisitos
  2. Diseño del software
  3. Construcción o Implementación del software
  4. Integración
  5. Pruebas (o validación)
  6. Despliegue (o instalación)
  7. Mantenimiento
Siguiendo el modelo de cascada de forma estricta, sólo cuando se finaliza una fase, comienza la otra. En ocasiones se realiza una revisión antes de iniciar la siguiente fase, lo que permite la posibilidad de cambios (lo que puede incluir un proceso de control formal de cambio). Las revisiones también se utilizan para asegurar que la fase anterior ha sido totalmente finalizada; los criterios para completar una fase se conocen frecuentemente con el término inglés "gate" (puerta). Este modelo desaconseja revisitar y revisar fases que ya se han completado. Esta falta de flexibilidad en un modelo de cascada puro ha sido fuente de crítica de los defensores de modelos más flexibles.

Modelo de espiral

La principal características del modelo en espiral es la gestión de riesgos de forma periódica en el ciclo de desarrollo. Este modelo fue creado en 1988 por Barry Boehm, combinando algunos aspectos clave de las metodologías del modelo de cascada y del desarrollo rápido de aplicaciones, pero dando énfasis en un área que para muchos no jugó el papel que requiere en otros modelos: un análisis iterativo y concienzudo de los riesgos, especialmente en el caso de sistema complejos de gran escala.
La espiral se visualiza como un proceso que pasa a través de algunas iteraciones con el diagrama de los cuatro cuadrantes representativos de las siguientes actividades:
  1. crear planes con el propósito de identificar los objetivos del software,seleccionados para implementar el programa y clarificar las restricciones en el desarrollo del software;
  2. Análisis de riesgos: una evaluación analítica de programas seleccionados, para evaluar como identificar y eliminar el riesgo;
  3. la implementación del proyecto: implementación del desarrollo del software y su pertinente verificación;
Modelo de espiral con énfasis en los riesgos, haciendo hincapié en las condiciones de las opciones y limitaciones para facilitar la reutilización de software, la calidad del software puede ayudar como una meta propia en la integración en el desarrollo del producto. Sin embargo, el modelo en espiral tiene algunas limitaciones, entre las que destacan:
  1. El énfasis se sitúa en el análisis de riesgo, y por lo tanto requiere de clientes que acepten este análisis y actúen en consecuencia. Para ello es necesaria confianza en los desarrolladores así como la predisposición a gastar más para solventar los temas, por lo cual este modelo se utiliza frecuentemente en desarrollo interno de software a gran escala.
  2. Si la implementación del riesgo de análisis afectará de forma esencial los beneficios del proyecto, no debería utilizarse este modelo.
  3. Los desarrolladores de software han de buscar de forma explícita riesgos y analizarlos de forma exhaustiva para que este modelo funcione.
La primera fase es la búsqueda de un plan para conseguir los objetivos con las limitaciones del proyecto para así buscar y eliminar todos los riesgos potenciales por medio de un cuidadoso análisis, y si fuera necesario incluyendo la fabricación de un prototipo. Si es imposible descartar algunos riesgos, el cliente ha de decidir si es conveniente terminar el proyecto o seguir adelante ignorando los riesgos. Por último, se evalúan los resultados y se inicia el diseño de la siguiente fase.

Desarrollo iterativo e incremental

El desarrollo iterativo recomienda la construcción de secciones reducidas de software que irán ganando en tamaño para facilitar así la detección de problemas de importancia antes de que sea demasiado tarde. Los procesos iterativos pueden ayudar a desvelar metas del diseño en el caso de clientes que no saben cómo definir lo que quieren.

Desarrollo ágil

El desarrollo ágil de software utiliza un desarrollo iterativo como base para abogar por un punto de vista más ligero y más centrado en las personas que en el caso de las soluciones tradicionales. Los procesos ágiles utilizan retroalimentación en lugar de planificación, como principal mecanismo de control. La retroalimentación se canaliza por medio de pruebas periódicas y frecuentes versiones del software.
Hay muchas variantes de los procesos ágiles:
  • En el caso de la programación extrema (XP), las fases se realizan en pasos muy cortos (o "continuos") con respecto al anterior. El primer paso (intencionalmente incompleto) por los pasos puede ocurrir en un día o en una semana, en lugar de los meses o años de cada paso completo en el modelo en cascada. En primer lugar, se crean pruebas automatizadas para proveer metas concretas al desarrollo. Después se programa el código, que será completo cuando todas las pruebas se superan sin errores, y los desarrolladores ya no sabrían como mejorar el conjunto de pruebas necesario. El diseño y la arquitectura emergen a partir de la refactorización del código, y se da después de programar. El diseño lo realizan los propios desarrolladores del código. El sistema, incompleto, pero funcional se despliega para su demostración a los usuarios (al menos uno de los cuales pertenece al equipo de desarrollo). Llegado este punto, los profesionales comienzan a escribir las pruebas para la siguiente parte del sistema de más importancia.

Codificación y corrección

El desarrollo de codificación y corrección (en inglés "Code and fix") es, más que una estrategia predeterminada, el resultado de una falta de experiencia o presión que se ejerce sobre los desarrolladores para cumplir con una fecha de entrega. Sin dedicar tiempo de forma explícita para el diseño, los programadores comienzan de forma inmediata a producir código. Antes o después comienza la fase de pruebas de software (a menudo de forma tardía) y los inevitables errores que se encuentran han de eliminarse antes de poder entregar el software.

Modelos de ciclo de software


La ingeniería del software establece y se vale de una serie de modelos que establecen y muestran las distintas etapas y estados por los que pasa un producto software, desde su concepción inicial, pasando por su desarrollo, puesta en marcha y posterior mantenimiento, hasta la retirada del producto. A estos modelos se les denomina “Modelos de ciclo de vida del software”. El primer modelo concebido fue el de Royce, más comúnmente conocido como Cascada o “Lineal Secuencial”. Este modelo establece que las diversas actividades que se van realizando al desarrollar un producto software, se suceden de forma lineal.

Principios de la ingeniería del software


Entre los principios más destacados de la ingeniería del software, podemos señalar los siguientes:

  •  Haz de la calidad la razón de trabajar.
  •  Una buena gestión es más importante que una buena tecnología.
  • Las personas y el tiempo no son intercambiables. 
  • Seleccionar el modelo de ciclo de vida adecuado.
  • Entregar productos al usuario lo más pronto posible.
  •   Determinar y acotar el problema antes de escribir los requisitos.
  •  Realizar un diseño.
  •  Minimizar la distancia intelectual.
  • Documentar.
  •  Las técnicas son anteriores a las herramientas.
  •  Primero hazlo correcto, luego hazlo rápido.
  • Probar, probar y probar.
  • Introducir las mejoras y modificaciones con cuidado.
  • Asunción de responsabilidades.
  •  La entropía del software es creciente.
  • La gente es la clave del éxito.
  • Nunca dejes que tu jefe o cliente te convenza para hacer un mal trabajo.
  • La gente necesita sentir que su trabajo es apreciado.
  • La educación continua es responsabilidad de cada miembro del equipo.
  • El compromiso del cliente es el factor más crítico en la calidad del software.
  • Tu mayor desafío es compartir la visión del producto final con el cliente.
  • La mejora continua de tu proceso de desarrollo de software es posible y esencial. 

¿Cual es el ciclo de vida del software?

El término ciclo de vida del software describe el desarrollo de software, desde la fase inicial hasta la fase final. El propósito de este programa es definir las distintas fases intermedias que se requieren para validar el desarrollo de la aplicación, es decir, para garantizar que el software cumpla los requisitos para la aplicación y verificación de los procedimientos de desarrollo: se asegura de que los métodos utilizados son apropiados.

Estos programas se originan en el hecho de que es muy costoso rectificar los errores que se detectan tarde dentro de la fase de implementación. El ciclo de vida permite que los errores se detecten lo antes posible y por lo tanto, permite a los desarrolladores concentrarse en la calidad del software, en los plazos de implementación y en los costos asociados. 

Responsabilidad y etica profesional en la ingeniería del software

Responsabilidad profesional y ética
La ingeniería del software se lleva a cabo dentro de un marco legal y social que limita la libertad de los ingenieros.
Los ISW deben aceptar que su trabajo comprende responsabilidades más amplias que simplemente la aplicación de habilidades técnicas.
Deben comportarse de una forma ética y moral responsable.
No basta con poseer estándares normales de honestidad e integridad.
No debería utilizar su capacidad y sus habilidades para comportarse de forma deshonesta o de forma que deshonre la profesión de la ingeniería del software.
Existen áreas donde los estándares de comportamiento aceptable no están acotados por las leyes, sino por la responsabilidad profesional.
Algunas de éstas son:
Confidencialidad. Respetar la confidencialidad de sus empleadores o clientes, independientemente de que se haya firmado un acuerdo formal de confidencialidad.
Competencia. No debe falsificar su nivel de competencia, ni aceptar conscientemente trabajos que están fuera de su capacidad.
Derechos de propiedad intelectual. Debe ser consciente de las leyes locales que gobiernan el uso de la propiedad intelectual, como las patentes y el copyright. Debe asegurarse de que la propiedad intelectual de los empleadores y clientes está protegida.
Uso inapropiado de las computadoras. No debe emplear sus habilidades técnicas para utilizar de forma inapropiada las computadoras de otras personas. Desde los relativamente triviales (utilizar juegos en la máquina de un empleado, por ejemplo) hasta los extremadamente serios (difusión de virus).
Código de Ética (ACM/IEEE)
Los ingenieros de software deberán comprometerse consigo mismos en convertir el análisis, especificación, diseño, desarrollo, prueba y mantenimiento de software en una profesión respetable y beneficiosa. De acuerdo con su compromiso con la salud, seguridad y bienestar del público, los Ingenieros de Software deberán apegarse a Ocho Principios
Principios del código
PÚBLICO - Los Ingenieros de Software deberán actuar consistentemente con el interés público.
CLIENTE Y EMPLEADOR - Los Ingenieros de Software deberán actuar de una forma determinada que esté en los mejores intereses de su cliente y empleador consistente con el interés público.
PRODUCTO- Los Ingenieros de Software deberán asegurar que sus productos y modificaciones relacionadas logren el más alto estándar profesional posible.
JUICIO - Los Ingenieros de Software deberán mantener integridad e independencia al emitir su juicio profesional.
 GERENCIA - Los gerentes y líderes de Ingeniería de Software deberán suscribirse y promocionar un enfoque ético para la gerencia de desarrollo y mantenimiento de software.
PROFESIÓN - Los Ingenieros de Software deberán fomentar la integridad y reputación de la profesión consistente con el interés público.
COLEGAS - Los Ingenieros de Software deberán ser justos y comprensivos con sus colegas.
INTERÉS PROPIO - Los Ingenieros de Software deberán participar en el aprendizaje de por vida del ejercicio de su profesión y deberán promover un enfoque ético para el ejercicio de la misma.

viernes, 22 de marzo de 2013

¿Cual es el papel de los usuarios en un proyecto de desarrollo de software?


Todos sabemos que cuanto mayor sea la ayuda de los usuarios en un proyecto de desarrollo de software, mayores serán las probabilidades de éxito que tenga el mismo.


No obstante es importante hacer algunas matizaciones:

1) El proyecto no se hace sólo, porque incluso existiendo una gran ayuda por parte de los usuarios, si no se consigue interpretar con precisión lo que quieren y no se dinamiza un feedback continuo de los mismos durante todo el proceso de desarrollo, se incrementarán las posibilidades de que algún requisito funcional no se haya recogido adecuadamente o de que se haya realizado un software con una usabilidad incómoda para los usuarios.

Estas circunstancias son fuente de innumerables problemas en las fases finales del proyecto y provocan retrasos, sobrecostes y grandes dificultades para cerrar el proyecto, además de crear conflictos con el cliente que pueden perjudicar las relaciones futuras con el mismo. Esto hace que sea fundamental el papel que desempeñan tanto el jefe de proyectos, como el equipo de analistas funcionales y analistas programadores.

2) Es importante que entre el grupo usuarios asignados al proyecto haya usuarios que vayan a estar implicados en el futuro uso del sistema de información, es decir, no es suficiente que el equipo de usuarios esté formado por “ideólogos” o “teóricos” que se nutrirán del resultado del trabajo de la herramienta, sino que es fundamental que participen usuarios que después se tengan que poner el mono de trabajo y vayan a trabajar con el software. Es importante conseguir la combinación de ambos tipos de usuarios (tampoco es positivo que en el grupo de usuarios no participen usuarios directores, ya que pueden existir conflictos entre usuarios que éstos deben solucionar y también es recomendable que el software no sólo se diseñe para el corto plazo, sino que sirva para tareas de gestión, planificación, etc… y esta visión la proporcionan principalmente los usuarios directores), por lo que el jefe de proyectos debe poner en conocimiento del cliente esta necesidad, como es lógico explicando los riesgos de que no se aplique esta estrategia.

3) Los analistas están para ayudar y para colaborar con los usuarios en la especificación y diseño de la solución, pero no están para “dar lecciones” a los usuarios y enseñarle cómo deben hacer su trabajo. 

Si los usuarios hacen su trabajo de una determinada manera, aunque no sea la más ortodoxa, siempre tendrá una justificación que sólo se entendería si realmente estuviéramos haciendo su trabajo durante un tiempo y viéramos los problemas con los que se enfrentan cotidianamente. La clave por tanto está en la colaboración y en el diálogo, es decir, se pueden proponer cosas al usuario, se le pueden dar ideas, pero no se le puede dar una vuelta al calcetín de cómo hacen sus tareas, salvo que ellos mismos lo soliciten y procurando en estos casos y en consenso con los usuarios que los cambios sean tranquilos.

4) Es fundamental documentar el proyecto, en primer lugar con la documentación que se especifique en las normativas de desarrollo de la organización para la que se realiza el servicio, con las matizaciones que indique el Director del Proyecto, en segundo lugar con la documentación que establezcan las normativas internas de calidad de tu organización (no requerirá un sobreesfuerzo, ya que en la mayor parte de los casos coincidirá) y a todo lo anterior sumarle toda la documentación de trabajo que sea necesaria para trabajar con los usuarios, que no tienen por qué entender de modelos de datos, de diagramas de casos de uso, etc…, es más, es un error trabajar con los usuarios utilizando dichas herramientas, ya que estas son de utilidad técnica y no hablan el mismo lenguaje de los usuarios. 

Este tipo documentación, por tanto, no tiene por qué tener los formalismos de la técnica y tiene como objetivo que el usuario capte lo que el analista está interpretando y se pueda ir perfilando a partir de esto, tanto requisitos, como casos de uso, interfaces, etc… Es muy importante trabajar todo esto, ya que comenzar demasiado pronto con la construcción, es algo muy arriesgado, ya que los costes de modificar algo en las distintas fases de la construcción pueden ser muy importantes y provocar que se tengan que reconstruir varias veces distintas funcionalidades de la aplicación.

¿Cual es la visión general del proceso de desarrollo de software?


Es proceso es afectado por la creatividad y juicio de las personas  involucradas. En el desarrollo de software hay una serie de desafíos adicionales, relativos esencialmente a la naturaleza del producto obtenido. 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. 
Es actividades requeridas para desarrollar un sistema de software de alta calidad y proporciona el marco de trabajo desde el cual se puede establecer un plan detallado para el desarrollo del software. Actividades: Diseño, validación, evolución, especificación

¿Cuales son los factores de calidad del software?


Reusabilidad:
La necesidad de la reutilización surge de la observación de que los sistemas software a menudo siguen patrones similares; debería ser posible explotar esta similitud y evitar reinventar soluciones a problemas que ya han sido encontradas con anterioridad. Capturando tal patrón, un elemento de software reutilizable se podrá aplicar en muchos desarrollos diferentes.


Reusabilidad – Tipo de factor:
La reusabilidad es un factor de tipo externo, ya que es perceptible por los usuarios o clientes, por ejemplo al momento de utilizar partes de un software en otro diferente. También en el caso de los usuarios que son programadores, utilizar partes de códigos creadas en otros desarrollos para su propio trabajo (librerías).
Reusabilidad – Ejemplo:
  • Un ejemplo de la reusabilidad son las librerías.
  • Las librerías son módulos de códigos o un conjunto de subprogramas que son utilizados para el desarrollo de software.
  • por ejemplo la librería java.awt permite disponer de una cantidad de códigos reutilizables a la hora de crear interfaces gráficas y todos sus componentes dentro de la creación de un proyecto de software.
Reusabilidad – Tipo de factor:
La reusabilidad es un factor de tipo externo, ya que es perceptible por los usuarios o clientes, por ejemplo al momento de utilizar partes de un software en otro diferente. También en el caso de los usuarios que son programadores, utilizar partes de códigos creadas en otros desarrollos para su propio trabajo (librerías).
Reusabilidad – Ejemplo:
  • Un ejemplo de la reusabilidad son las librerías.
  • Las librerías son módulos de códigos o un conjunto de subprogramas que son utilizados para el desarrollo de software.
  • por ejemplo la librería java.awt permite disponer de una cantidad de códigos reutilizables a la hora de crear interfaces gráficas y todos sus componentes dentro de la creación de un proyecto de software.
Legibilidad:
La legibilidad dentro del contexto del desarrollo del software se refiere al modo en que se estructura la información con la que se trabaja, es decir, todo debe estar claramente documentado, espaciado, sin errores, y con una facilidad de uso ágil y de rápido entendimiento. Así se logra una mayor comprensión del proyecto, y las modificaciones pertinentes son más fáciles de realizar.
Legibilidad – Tipo de factor:
  • La legibilidad es un factor de tipo interno, ya que solo es perceptible por los desarrolladores o los profesionales de la computación.
  • al cliente no le importa que el sistema por debajo esté legible, solo le importa que funcione óptimamente.
legibilidad – Métrica:
La Legibilidad está dentro del contexto de las métricas de Calidad.


Seguridad:
Hay dos tipos:
  • La seguridad es un factor de calidad de uso, definido por la ISO 9126 y se refiere a la forma en que los atributos miden la habilidad para prevenir accesos no autorizados, ya sea accidentales o deliberados, tanto a programas como a datos.
  • Es una actividad de calidad del software que se centra en la identificación de riesgos que pueden producir un impacto negativo en el software, se dirige un proceso de análisis, se identifican los riesgos y se clasifican por su importancia y grado de riesgo. Cuando se han identificado los riesgos, se especifican los requisitos del software relacionados con la seguridad.
Seguridad – Tipo de factor:
Según las dos definiciones anteriores, se puede concluir que es un factor de tipo tanto externo como interno, ya que los desarrolladores deben tener en cuenta la seguridad del software al momento de desarrollarlo, pero es a los clientes a los que a la hora de la verdad, exigen un sistema final totalmente confiable y seguro.
Seguridad – Ejemplo:
Un ejemplo de seguridad son las validaciones que existen para la verificación de datos en el desarrollo de un software, tal como la validación de los nombres de usuario y contraseña en el ingreso al sistema, los captcha, tipos de datos, etc.
Seguridad – Métrica:
La seguridad está dentro del contexto de las métricas de calidad.
Ingeniería de software es la aplicación de un enfoque sistemático, disciplinado y cuantificable al desarrollo, operación y mantenimiento de software, y el estudio de estos enfoques, es decir, la aplicación de la ingeniería al software. Es la aplicación de la ingeniería al software, ya que integra matemáticas, ciencias de la computación y prácticas cuyos orígenes se encuentran en la ingeniería.

¿Que es software?


Se conoce como software al equipamiento lógico o soporte lógico de un sistema informático, que comprende el conjunto de los componentes lógicos necesarios que hacen posible la realización de tareas específicas, en contraposición a los componentes físicos que son llamados hardware.
Los componentes lógicos incluyen, entre muchos otros, las aplicaciones informáticas; tales como el procesador de texto, que permite al usuario realizar todas las tareas concernientes a la edición de textos; el llamado software de sistema, tal como el sistema operativo, que básicamente permite al resto de los programas funcionar adecuadamente, facilitando también la interacción entre los componentes físicos y el resto de las aplicaciones, y proporcionando una interfaz con el usuario.