H. Semana 9 - HazelMartinez/Portafolio- GitHub Wiki

17/09/2019


Calidad en el software


Calidad en el proceso. Calidad en el producto.

QA, QC, Testing

QA:

Aseguramiento de la calidad Asegurar que el proceso de desarrollo o de mantenimiento es adecuado y con objetivo de garantizar que se cumplan los objetivos del producto. Aplicar calidad (Auditoria)

QC:

Control de calidad Evaluar el producto que se está desarrollando,

Testing

Actividades para el control de calidad. Evaluar si el producto se esta elaborando en el proceso. Ejecuto pruebas para encontrar defectos.

El problema de no hacer pruebas es que mi producto se ve afectado. QA y QC son esenciales para encontrar calidad en el software.

Sí solo tengo QA me puedo afectar. Que es calidad:ISO da características si esta desacuerdo es porque cumple con ellas.

Requerimiento funcional

Algo que pueda realizar el producto que hacemos.

Requerimiento no funcional

Archivos de calidad, atributos de calidad. Describe como debe de hacerlo.

ISO

Se divide en metricas extremas, internas, modelo calidad, calidad de las métricas.

Enfocado en el producto no en el proceso.

El modelo define atributos internos y externos de calidad (atributos estáticos).

Los atributos externos relacionados a como el software se comporta ante ciertas circunstancias.

External and internal quality

Atributos relacionados con funcionalidad. Confiabilidad, usabilidad, eficiencia, mantenibilidad, portabilidad. Confiabilidad = Como el software mantiene cierto comportamiento aun sin condiciones adecuadas. Usabilidad = Que tan difícil es entender un sistema. Eficiencia = Cuantos recursos utiliza y si sucede de forma adecuada. Portabilidad = Como el sistema se traslada de ambiente (linux a windows).

¿Cuando me doy cuenta que se cumplen las características?

Por los atributos, serie de métricas.

Mantenibilidad = Se debe seguir dando mantenimiento.

Un nuevo sistema: Fácil de controlar. Los colaboradores conocen el código. Pero con el tiempo el sistema tendrá: Muchos issues. Falsas estimaciones. El software se vuelve complejo, los cambios son riesgosos y lentos.

Podemos evitar que se vuelva un monstruo con la mantenibilidad

El softwar empieza a apestar.

Testing:

Intenta a identificar errores. A veces se deja de ultimo. Si no pruebo el código se puede volver más caro. Invertir ahora en testing para ahorrar dolores de cabeza más adelante. Gente perezosa encuentra ayuda en Test - Driven Design. Codificar las pruebas y luego establecer el código que quiero elaborar.

Pruebas de caja negra:

No vemos lo que hay dentro ante un conjunto de entradas me da un conjunto de salida.

¿Si no se lo que hay dentro como lo pruebo?

Pruebas de caja blanca:

Aunque no se como está conectado me dan pruebas.

Encontramos la cantidad justa de casos de prueba que me brinden. La mayor cantidad de errores posibles.

Testing de caja blanca:

"Abrimos e inspeccionamos". Casos de prueba para ver que falla en la caja negra. Intento probar el código al menos una vez.

La prueba compleja alta se hace casi imposible. Existen pruebas de instalación, funcionalidad, seguridad.

Existen diferentes niveles para esas pruebas. Pruebas unitarias, Pruebas de integración, Pruebas del sistema. A veces la línea entre ellas puede ser borrosa.

Pruebas unitarias son las pruebas de caja blanca.

Unit test

Una pieza de código que asegura que sirven bien. Si la prueba unitaria falla. Debe revisar.

Una buena prueba unitaria debe ser automatizada y repetible. Debe ser fácil de implementar y ejecutar fácil como darle clic a un botón.

Unit collection de frameworks podría ser cppUnit.

Mantenibilidad

Software apesta. Hay olores que muestra que se desgasta el software. Ej. Rigidez : Dificultad que tiene un software para implementar cambios.

Fragilidad : Tiende a dañarse con solo un cambio.

Inmovilidad : Parte de un sistema podría ser reutilizado pero puede ser riesgoso y complicado.

Viscosidad : Hacer las cosas correctas es más dificil.

-Sentirse mejor hackeando codificando.

Complejidad ineccesaria : Contiene elementos que no son necesarios.

Repetición ineccesaria : Montón de código que se puede centralizar en un solo lugar.

Opacidad: El código es dificil de entender y no expresa su intención real.

¿Cómo evitar que nuestro diseño huela? Hay principios y bases para hacerlo.


19/09/2019


Técnicas de diseño de algoritmos

En los años 50's y 60´s los cinetificos estudian como los algoritmos geneticos se asocian con la ingeniería.

Son algoritmos de búsqueda heuristicos y adptativos. Heuristicos : Tienen resultados distintos aún con las mismas entradas. Ej: Selección natural, ordenamiento genetico, mutaciones. Utiliza el factor de las busquedas random para optimizar problemas. OJO no es completamente random, mezcla el factor random mas el analisis de generacion historica. El algoritmo simula el proceso de selección natural. Usa herencia, selección, mutación.

¿Que necesito? Encontrar una representación genetica para el dominio de selección. Evaluar el dominio de la soluciones para encontrar la solucion.

Función Fitness: De cual de todos son verdaderas soluciones. (solo algunas serviran).

Conceptos: Células contienen -> cromosomas -> conjunto -> de ADN -> Genotipo:Colecciones de genes ->Reproducción: Combinación de genes de los padres.

Mutación : Errores durante la reproducción.

Fitness: Que tanto puede reproducirse antes de morir. Los más aptos son los que se reproducen.

¿Como funciona? Inicia con una población random.

-Creamos individuos sin necesidad de combinar otros. -A cada genereación hay que calcular el fitness. -Muchos individuos son seleccionados por la población. De cada generación selecciona mejores individuos. -Los individuos seleccionados los reproduzco y obtengo nuevos individuos.

¿Cuando termina?

  1. Le doy un limite.
  2. Ejecutar un algoritmo genetico y no hay cambio en la sotras iteracciones.
  3. Correr el algoritmo infinitamente hasta encontrar un individuo con ciertas características que son solicitadas.

En un algoritmo genetico puede que no se encuentre una solución.

Más definiciones

-Individuo : Una posible solución. -Población : Un grupo de individuos (dentro de una población tengo generaciones). -Espacio de busqueda: Posibles soluciones que puedo evaluar. -Chromosoma : El identificador de un individuo. -Rasgo: Aspecto asociado a un individuo. -Genoma: Colección de cromosomas de un individuo.

Representación de soluciones

-> Arreglos de bits.

-> Representaciones de tamaño fijo.

-> Se puede representar la solución a un problema como un arreglo de 16 bits.

Algoritmo de la mochila

Vectores de Bit

-> Se pueden representar como banderas (valores booleanos).

-> No se desperdicia espacio.

-> En algunos lenguajes no existe el bit entonces se utiliza bytes.

-> Eficiencia de recursos.

-> Salvar espacio para enviar datos.

-> Se usa para encriptación o presión.

Función fitness

-Medir la calidad de todas las posibles soluciones.

-Medir cuales soluciones tienen la posibilidad de sobrevivir o reproducirse.

La población inicial se genera totalmente Random

-> Población aumenta si no se eliminan individuos.

-> Se pueden definir sectores donde intentaré seguir soluciones.

-> Puede ser pesado por que depende de cuanta memoria se esté utilizando.

-> Se selecciona parte de esa generación.


Reproducción

-> Mediante el cruce, la mutación, selección.

-> Se selecciona un par de padres (tomando en cuenta el fitness).

->Calcular la mutación (probabilidad baja)

-> inversión (todavía más baja)

-> Mutación seleccionar un bit random y le agregamos un 1. Determinar si aun indivudo en especifico le aplico mutación. Determinar cuantos individuos fijos le voy a aplicar mutación.

-> Inversión: Seleccionar una cadena de bits y aplicarles complemento.