martes, 16 de febrero de 2016

Taller #2 Ingeniería de Software

 PRINCIPIOS DEL ANÁLISIS

Todos los métodos de análisis se relacionan a través del siguiente conjunto de principios operativos:
a. La representación y el entendimiento del dominio de información de un problema. Requiere el examen del dominio de la información. Este dominio contiene tres visiones diferentes de los datos y del control: (1) contenido de la información y relaciones, (2) flujo de la información y (3) estructura de la información. El contenido es definido por los atributos necesarios para crearlo. El flujo representa como cambian los datos y el control a medida que se mueven dentro de un sistema. La estructura representa la organización interna de los elementos de datos o de control.

b. La definición de funciones que debe realizar el software. Los modelos se crean para entender de mejor manera la entidad que se va construir como solución a un problema. Para transformar la información el software debe realizar al menos tres funciones genéricas: entrada, procesamiento y salida.

c. La representación del comportamiento del software. La característica estimulo respuesta forma la base del modelo de comportamiento. Un programa de computadora siempre está en un estado, en un modo de comportamiento observable exteriormente (imprimiendo, calculando, etc.).

d. La división de los modelos que representan información, función y comportamiento de manera que se puedan descubrir los detalles por capas, para que las partes puedan entenderse fácilmente y establecer luego las interacciones entre las mismas de manera que se pueda conseguir la función global.

e. El proceso de análisis debería ir desde la información esencial hasta el detalle de la implementación. Una visión esencial de los requisitos del software presenta las funciones a conseguir y la información a procesar sin tener en cuenta los detalles de la implementación. La visión de implementación de los requisitos del software introduce la manifestación en el mundo real de las funciones de procesamiento y las estructuras de la información.
PRINCIPIOS DEL DISEÑO
El principio de segregación de interfaces
Este principio, conocido por ISP (Interface segregation principle), dice que el una clase que implementa una interfaz no debe depender de métodos que no utiliza. Esto como norma general implica que nuestras interfaces deben ser sencillas y tener pocos métodos. Es preferible tener varias interfaces pequeñas, a tener una interfaz grande. Así no obligamos a los clientes a depender de métodos que no necesitan implementar.
El principio de inversión de dependencias
En inglés DIP (Dependency Inversion Principle), que viene a decir que las clases de alto nivel, no deben depender de clases de bajo nivel. Ambos deben depender de abstracciones. Además las abstracciones no deben depender de los detalles, si no que los detalles deben depender de las abstracciones. En definitiva, lo que tenemos que hacer es invertir las dependencias.
Por ejemplo, imaginemos una clase Saludo que tiene un método que imprime un mensaje dependiendo de la hora del día. Si es antes de las 12 de la mañana, escribe "Buenos días". Si es más tarde escribe "Buenas tardes". En este caso el componente de alto nivel es la clase Saludo, mientras que el componente de bajo nivel, es una clase Date. El método Saludar instancia un objeto de la clase Datepara comprobar la hora del día y realizar el saludo que corresponda. En este caso tan simple, la clase Saludo depende de una clase de bajo nivel Date. Esto hace que, entre otras cosas, la clase Saludo sea más difícil de probar.
Si invertimos las dependencias, lo que podemos hacer es pasar un objeto Datecomo parámetro a la hora de instanciar la clase Saludo. Cuándo se llame al método Saludar se utilizará dicho objeto. En este caso estamos inyectando la dependencia a través del constructor de la clase Saludo.
Separa los asuntos
Principio SoC (separation of concerns). Los asuntos, son los diferentes aspectos de la funcionalidad de nuestra aplicación. Por ejemplo la capa de negocio, la capa de datos etc. Un buen ejemplo de separación es el patrón MVC.
PRINCIPIO DE CONSTRUCCION DEL SOFTWARE
Los principios fundamentales de la construcción de software son:
·         Minimizar la Complejidad
·         Anticipar los Cambios
·         Pensar en la Verificación posterior
·         Aplicar Estándares

ü  Minimizar la Complejidad
·         Escribiendo código sencillo y fácil de leer
·         Utilizando estándares
·         Técnicas de codificación
·         Técnicas de aseguramiento de calidad

ü  Anticipar los Cambios
·         El software se ve afectado por los cambios en su entorno y está destinado a cambiar a lo largo del tiempo
·         Aplicación de técnicas específicas

ü  Pensar en la Verificación posterior
·         Construir de forma que los fallos puedan ser encontrados lo antes posible (al codificar, hacer pruebas u operar el sistema)
·         Técnicas:
Ø  Seguir estándares de codificación
Ø  Hacer pruebas unitarias
Ø  Organizar el código para soportar pruebas automatizadas
Ø  Restringir el uso de técnicas complejas

ü  Aplicar Estándares
·         Directamente a la construcción del software:
Ø  Formatos de comunicación (documentos, contenidos).
Ø  Versiones estándares de lenguajes de programación (Java, C++, C#,…).
Ø  Reglas de codificación (nombres de variables comentarios )
Ø  Notaciones de diagramas (UML,…).
Ø  Intercambio entre herramientas (XLM,…).
·         En un proyecto:
Ø  Externos: propuestos por organismos de estandarización (ISO, ANSI, AENOR), consorcios industriales (OMG), asociaciones profesionales (IEEE, ACM).
Ø  Internos: creados por la propia organización.

PRINCIPIOS DE CODIFICACION DEL SOFTWARE
La escritura del código fuente es el principal esfuerzo de construcción de software
·         Aplicar técnicas para crear código fuente comprensible (reglas de asignación de nombres y de formato del código, clases, tipos enumerados, constantes, etiquetadas,…)
·         Manejar condiciones de error (errores previstos e imprevistos, excepciones)
·         Prevenir brechas de seguridad a nivel de código (llenado de buffers, overflow de índices de vectores, …)
·         Uso eficiente de recursos escasos (hilos, bloqueos en bases de datos, …)
·         Organizar el código fuente (sentencias, rutinas, clases, paquetes, …)
·         Documentar el código
PRINCIPIO DE VALIDACION DEL SOFTWARE
La validación también es una evaluación del sistema o de componentes, solo que es en el transcurso o al final del proceso del desarrollo, donde se determina si cumple con lo especificado.
Aspectos en la validación:
·         Construir el sistema correcto.
·         Evaluar la conformidad con la especificación de requisitos.
Principales Principios:
·         Especificación de los requisitos.
·         Prevención de defectos.
·         Tiempo y Esfuerzo.
·         Ciclo de vida del software.
·         Planificación.
·         Procedimientos.
·         Validación del software.
·         Alcance de la validación.
·         Independencia de la validación.
·         Flexibilidad y Responsabilidad.
PRINCIPIO DE PRUEBA DEL SOFTWARE
Las pruebas revelan la presencia de bugs, no la ausencia de ellos
Probar reduce la probabilidad de que existan bugs pero nunca se puede asegurar que no quede ninguno oculto.
Además, cada tipo de pruebas que realicemos (de sistema, de integración, añadir auditorías de código…) son más efectivas para detectar un tipo de bug.
Es imposible probarlo todo
El flujo de control de un sistema software no trivial como los que acostumbramos a utilizar en el día a día contiene miles de decisiones.
Estas decisiones se pueden combinar entre ellas para dar lugar a una infinidad de posibles caminos. De entrada, probar todos los caminos es un problema inabordable.
Y eso si no tenemos en cuenta la prueba de requisitos no funcionales, como el rendimiento de un sistema ante una exigente carga de usuarios, o requisitos específicos de seguridad (por ejemplo, en un sistema bancario) para protegerse de usuarios malintencionados.
Todo esto hace necesaria una estrategia de pruebas (un plan) y priorizar a partir de una gestión de riesgos de calidad y de proyecto, y como reza el siguiente principio…
Cuanto antes se comience a probar…mejor
Corregir un bug con una revisión en la fase de captura de requisitos o en una prueba unitaria tiene un coste mucho menor a lo que costará corregir este bug cuando se detecte en una prueba de sistema, o peor aún, en una prueba de aceptación por el cliente.
En demasiadas ocasiones existe una confianza excesiva en las pruebas de sistema, y todo el plan de pruebas (cuando existe) se reduce a estas. Se confía en que todos los componentes que no se probaron con una estrategia de pruebas unitarias y de integración se puedan entender bien a unos días del hito de entrega (cuando corregir un bug ya es demasiado caro, en lo que se denomina una prueba de integración “big-bang”).
Curiosamente estas malas prácticas se realizan para ahorrar costes, y finalmente el coste de la no calidad cambia las tornas: siempre se acaba pagando en unos costes de mantenimiento excesivos (con caídas de la productividad del 50% según Capers Jones).
La aglomeración de defectos. ¡Los bugs siempre van en pandilla!
Entender esto es muy importante para plantear una buena estrategia de pruebas: los bugs suelen ir en grupo. Se concentran en determinados puntos de un sistema software, no manteniendo una distribución uniforme a lo largo del mismo.
Conclusión: si encuentras un bug en un componente, es muy probable que haya más. Con lo que una posible estrategia sería centrarse en mejorar las pruebas de aquellos componentes para los que se han reportado un número mayor de bugs, para ser más eficaces a la hora de cazarlos en fases tempranas.
La paradoja del pesticida
O la necesidad de ajustar continuamente tu plan de pruebas… porque según este principio un plan de pruebas va perdiendo efectividad conforme se ejecuta sucesivas veces. Con lo que cada vez tenderá a encontrar menos bugs… ¡lo que no significa que no haya! (vuelve a leer el primer principio). Se habla de paradoja del pesticida ya que estos matabichos usualmente sirven para un tipo de bichos, pero una vez no queda ninguno del tipo específico que mata el pesticida… ¡nadie te dice que no haya otros bichos campando a sus anchas!
Las pruebas se deben adaptar a necesidades específicas
Esto viene a enlazar con lo que he comentado antes. Si tu producto se centra en el ámbito de la seguridad deberás adaptar tus casos de prueba para intentar forzar situaciones o posibles escenarios no amistosos. Si quieres probar una intranet donde los servicios más vitales son los de imputación de horas y el de vacaciones, es lógico centrarse en estos servicios y no invertir tiempo en otros componentes infrautilizados.  Además, hay que tener en cuenta que los recursos en los proyectos son siempre escasos, con lo que en el inicio del proyecto hay que preguntarse… qué estrategia debemos seguir para encontrar y corregir lo antes posible los bugs en las funcionalidades de mayor valor para nuestros usuarios.
La falacia de la ausencia de errores
Para terminar, nos encontramos con la satisfacción del usuario y con el hecho de que los usuarios elijan tu software para resolver sus necesidades. Que hayas corregido muchos bugs no significa que finalmente tu software sea un éxito. En ocasiones hay que primar un buen time to market, para luego corregir los problemas de calidad que quedaron por el camino. Y esto si se hace de manera consciente y con una buena estrategia, a priori, no debe ser un problema.
PRINCIPIO DE DESPLIEGUE DEL SOFTWARE
·         Se deben administrar las expectativas que el cliente tiene del software.
·         Se debe ensamblar y probar un paquete de entrega completo.
·         Se debe establecer un régimen de soporte antes de entregar el software.
·         Se debe proporcionar material instructivo apropiado  los usuarios finales.

·         El Software con errores se debe arreglar primero y entregar después.

QUE ES UN EQUIPO DE ALTO RENDIMIENTO?

Los equipos de alto rendimiento se caracterizan por que todos sus miembros se sienten bien integrados, se mantienen enfocados en los objetivos y trabajan de forma casi autónoma, sin que el jefe tenga que decirles exactamente lo que tienen que hacer.

¿CÓMO PODRÍA FORMAR UN EQUIPO DE ALTO RENDIMIENTO EN SU EMPRESA?

 los equipos de alto rendimiento están liderados por personas con una clara visión del futuro de la empresa, capaces de trazar una ruta de acción y crear empatía y energía creativa entre el grupo.


Los líderes de equipos de alto rendimiento tienen un estilo de liderazgo integrador, no autoritario, que se preocupa por entender la manera de trabajar de cada uno de sus miembros y sus necesidades particulares (pues hay personas que trabajan de forma más analítica y otras que se preocupan más por las relaciones interpersonales).
Además de tener un líder con estas características los equipos de alto rendimientos deberían:

1. Establecer metas claras y priorizarlas. Todos los miembros deben entender bien cuáles son las metas, la importancia de cumplirlas y sentir un fuerte compromiso hacia su logro. Mantener al equipo informado del progreso ayuda a mantener el equipo motivado o anuente a reaccionar rápidamente.

2. Estar conformados por personas talentosas con habilidades complementarias. La selección de los miembros del equipo es una de las bases del éxito. Es importante tener a personas con habilidades diversas para poder desarrollar tareas diferentes.

3. Contar con normas y una estructura definida. Las normas sobre cómo debe funcionar el equipo, cuáles son los roles y responsabilidades de cada uno de los miembros ayudará a evitar conflictos.

4. Hablar y escuchar. Es importante mantener una comunicación abierta entre las personas que conforman el equipo. A través de la comunicación, se genera más confianza, sinergia, aparte que se pueden resolver conflictos. Los equipos de alto rendimiento están conformados por personas que no temen hablar de las cosas difíciles, encuentran maneras para hacerlo asertivamente y sin atacar a los demás.

5. Tener autonomía. Para que los equipos de alto rendimiento trabajen de manera casi autónoma, deben sentirse en capacidad de tomar decisiones y fijar la manera en que trabajarán. No sólo deben ser capaces de tomar sus propias decisiones, sino sentirse responsables por las decisiones que toman y asumir el riesgo que ellas conlleven.

6. Reconocer y recompensar los resultados. La mayoría de los equipos de alto rendimiento trabaja por objetivos y al cumplirlos deberían ser reconocidos y recompensados. La compensación no sólo debería ser a nivel individual sino para todo el equipo.

¿POR QUÉ FALLAN MUCHOS EQUIPOS?

1. Algunos directores de equipo tienden a rodearse de colaboradores demasiado parecidos a ellos mismos.
2. a resultas de lo cual, muchos equipos están descompensados, con demasiados componentes coincidiendo en algunas funciones mientras en otras hay carencias importantes.
3. En muchas ocasiones la falta de conocimiento de los perfiles profesionales motiva una asignación incorrecta de tareas y responsabilidades.
 4. Los profesionales que trabajan en equipos descompensados suelen sentir que sus talentos y habilidades personales no son aprovechados al máximo con la consiguiente frustración y desmotivación.
El resultado siempre es el mismo: un grupo de personas que se afana en trabajar y produce unos resultados insuficientes.


La función del directivo es repartir de forma óptima el trabajo que es preciso realizar, en base a las capacidades y habilidades de los miembros del equipo.

No hay comentarios.:

Publicar un comentario