Desarrollo de sistemas tolerantes a fallasSoftware Guru
¿Cuánto cuesta a una organización cuando un sistema falla? ¿Cuál es el impacto de que todo un sistema esté fuera de operación por una falla inesperada? ¿Hay manera de crear sistemas que continúen funcionando aún cuando, por ejemplo, un proceso o sub-sistema muere o no está disponible? ¿Crees que todo esto se puede arreglar con un bloque “try-catch” bien colocado?
En esta sesión platicaré sobre la importancia de crear sistemas robustos y tolerantes a fallas, explicando las propiedades básicas que un sistema debe cumplir para continuar funcionando aún en la presencia de errores inesperados. Presentaré también varios patrones de diseño con el código correspondiente para que comiences a introducir robustez y tolerancia a fallas a los sistemas con que trabajas.
Semblanza del conferencista:
Agustín Ramos es un profesional de desarrollo de software con más de 12 años de experiencia en la industria. Impulsor de la metáfora del artesano como un modelo de cómo debe ser nuestra profesión. Gusta de refactorizar diseños, código, ideas y equipos de desarrollo por igual. Actualmente su principal interés se enfoca en resolver los retos que presenta el desarrollo de sistemas altamente distribuidos y escalables.
Cursos gratis de programación en Java.Excepciones. Orientado a Grado, DAM y DAW. Otros cursos disponibles para Android, Swift, Base de datos, javascript, servicios y procesos...
Desarrollo de sistemas tolerantes a fallasSoftware Guru
¿Cuánto cuesta a una organización cuando un sistema falla? ¿Cuál es el impacto de que todo un sistema esté fuera de operación por una falla inesperada? ¿Hay manera de crear sistemas que continúen funcionando aún cuando, por ejemplo, un proceso o sub-sistema muere o no está disponible? ¿Crees que todo esto se puede arreglar con un bloque “try-catch” bien colocado?
En esta sesión platicaré sobre la importancia de crear sistemas robustos y tolerantes a fallas, explicando las propiedades básicas que un sistema debe cumplir para continuar funcionando aún en la presencia de errores inesperados. Presentaré también varios patrones de diseño con el código correspondiente para que comiences a introducir robustez y tolerancia a fallas a los sistemas con que trabajas.
Semblanza del conferencista:
Agustín Ramos es un profesional de desarrollo de software con más de 12 años de experiencia en la industria. Impulsor de la metáfora del artesano como un modelo de cómo debe ser nuestra profesión. Gusta de refactorizar diseños, código, ideas y equipos de desarrollo por igual. Actualmente su principal interés se enfoca en resolver los retos que presenta el desarrollo de sistemas altamente distribuidos y escalables.
Cursos gratis de programación en Java.Excepciones. Orientado a Grado, DAM y DAW. Otros cursos disponibles para Android, Swift, Base de datos, javascript, servicios y procesos...
Cursos gratis de programación en Java. JUnit. Orientado a Grado, DAM y DAW. Otros cursos disponibles para Android, Swift, Base de datos, javascript, servicios y procesos...
Ponencia ofrecida por Oier Blasco en DroidconMAD2013. Sinopsis: La programación reactiva es un paradigma de programación que se centra en los flujos de datos. La presentación trata de cómo podemos usar la programación reactiva para simplificar la programación de tareas asíncronas en android (principalmente las aplicaciones que consumen datos de servicios remotos). Para ello comenzaremos la presentación con una introducción sobre los motivos y los fundamentos de la programación reactiva y como los implementa RxJava (El port open-source hecho por Netflix de la Rx extensions de microsoft). El la segunda para parte de la presentación veremos algunos ejemplos concreto de cómo podemos aplicar estos principios a problemas cotidianos en android.
Esta presentación nos muestra qué es la programación reactiva, en qué consiste, qué nos permite hacer y por qué está tan de moda. Además, podemos ver el uso concreto de esta programación utilizando RxJava.
Autor: Juan Pablo González de Gracia.
Slides de la cuarta clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. Operadores
Slides de la quinta clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. if, while, for, enhanced for.
2. break y continue
3. Exceptions
4. Assertions
En muchas ocasiones los agentes realizan, o tratan de realizar, funcionalidades complejas que pueden llegar a implicar tareas simultáneas forzando a implementar agentes multihilo, lo que puede causar problemas. JADE proporciona un sistema de comportamientos (behaviours) que ayudan al usuario a construir sistemas multiagente y reutilizar código.
Cursos gratis de programación en Java. JUnit. Orientado a Grado, DAM y DAW. Otros cursos disponibles para Android, Swift, Base de datos, javascript, servicios y procesos...
Ponencia ofrecida por Oier Blasco en DroidconMAD2013. Sinopsis: La programación reactiva es un paradigma de programación que se centra en los flujos de datos. La presentación trata de cómo podemos usar la programación reactiva para simplificar la programación de tareas asíncronas en android (principalmente las aplicaciones que consumen datos de servicios remotos). Para ello comenzaremos la presentación con una introducción sobre los motivos y los fundamentos de la programación reactiva y como los implementa RxJava (El port open-source hecho por Netflix de la Rx extensions de microsoft). El la segunda para parte de la presentación veremos algunos ejemplos concreto de cómo podemos aplicar estos principios a problemas cotidianos en android.
Esta presentación nos muestra qué es la programación reactiva, en qué consiste, qué nos permite hacer y por qué está tan de moda. Además, podemos ver el uso concreto de esta programación utilizando RxJava.
Autor: Juan Pablo González de Gracia.
Slides de la cuarta clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. Operadores
Slides de la quinta clase del curso de Java SCJP dictado en la Universidad Nacional de Centro de La Provincia de Buenos Aires.
Contenido:
1. if, while, for, enhanced for.
2. break y continue
3. Exceptions
4. Assertions
En muchas ocasiones los agentes realizan, o tratan de realizar, funcionalidades complejas que pueden llegar a implicar tareas simultáneas forzando a implementar agentes multihilo, lo que puede causar problemas. JADE proporciona un sistema de comportamientos (behaviours) que ayudan al usuario a construir sistemas multiagente y reutilizar código.
PARADIGMAS FP Y OOP USANDO TÉCNICAS AVANZADAS DE PROGRAMACIÓN ASÍNCRONAVíctor Bolinches
02/03/2017
Charla Universidad Politécnica de Valencia - https://www.upv.es/
Asingnatura : Auditoria, Calidad y Gestion de Sistemas de Información (ACG)
Máster Universitario en Ingeniería Informática - https://www.upv.es/titulaciones/MUIINF/
Exploring Elixir Codebases with ArcheometerAgustin Ramos
Legacy code is a liability, or so they say. Nevertheless legacy code is at least a part of most software projects. If you work on a system with legacy code, you better have a nice map that clearly marks where the dragons roam. On the other hand, as software developers, most of us switch between projects every once in a while and many times we arrive at humongous codebases. How to deal effectively and efficiently with so much code? The usual mantra is “read the code!”, but it’s not easy at all to quickly understand tens (or even hundreds) of thousands of lines of code.
What if we could obtain metadata that describes a software system from another perspective instead of just raw code? And better yet, what if this data was queryable? This is the goal of Archeometer: to gather different kinds of useful information about the system and make it available for your exploration.
Think of Archeometer as a device you can use to get an understanding of the overall design and quality of an Elixir based system, a lab in which you can interactively tune parameters and adjust zoom levels to get a pretty good grasp of a perhaps huge and not so pretty code base, an oracle for answering questions like: which are the core modules of the system? which are the parts of the system most difficult to understand? which are the ones I must be most careful dealing with? which parts are nice, safe and green?
2. Así que ya te decidiste a hacer pruebas
automatizadas...
Unitarias
De integración
De aceptación / funcionales
De desempeño
Solo tengo algo que decir...
2 / 37
7. ¿Qué dificultades te has encontrado al
implementar pruebas?
Toma su tiempo
Requiere el uso de varios frameworks y técnicas
Aumenta la cantidad de código a escribir *
Hace que el 'build' sea más lento
etc, etc...
7 / 37
8. ¿Y qué pasa si no automatizas pruebas?
Para probar una función/método:
Tengo que levantar toda la aplicación/ambiente
Tengo que seguir el flujo que me lleva a la llamada a mi función/método
Depende de las configuraciones de mi máquina
Ahora imagina... lo mismo para todas
las funciones del sistema
8 / 37
11. Ejemplo 2
¿Cuántos casos de prueba se necesitan para probar ésta función?
functionpartition(items,left,right){
varpivot=items[Math.floor((right+left)/2)],
i =left,
j =right;
while(i<=j){
while(items[i]<pivot){i++;}
while(items[j]>pivot){j—;}
if(i<=j){
swap(items,i,j);
i++;
j--;
}
}
returni;
}
Javascript Quicksort
11 / 37
12. Ejemplo 2
¿Cuántos tipos de prueba se necesitan para probar ésta función?
functionpartition(items,left,right){
varpivot=items[Math.floor((right+left)/2)],
i =left,
j =right;
while(i<=j){
while(items[i]<pivot){i++;}
while(items[j]>pivot){j—;}
if(i<=j){
swap(items,i,j);
i++;
j--;
}
}
returni;
}
12 / 37
13. Ejemplo 2
¿Cuántos tipos de prueba se necesitan para probar ésta función?
Valores en rangos esperados
Valores no esperados (Indices fuera de rango, nulos)
Condiciones de frontera (arreglo vacío, arreglo de tamaño máximo)
Valores que ejerciten las distintas rutas de ejecución
13 / 37
14. Ejemplo 2
¿Cuántos rutas de ejecución tiene ésta función?
functionpartition(items,left,right){
varpivot=items[Math.floor((right+left)/2)],
i =left,
j =right;
while(i<=j){
while(items[i]<pivot){i++;}
while(items[j]>pivot){j—;}
if(i<=j){
swap(items,i,j);
i++;
j--;
}
}
returni;
}
14 / 37
15. Complejidad Ciclomática
Métrica.
Thomas J. McCabe, 1976
Mide el número de rutas de ejecución linealmente independientes dentro
de un programa.
Aproximador
2^N - 1
N es el número de bifurcaciones en el código (bloques if, where, for, etc.)
15 / 37
16. Ejemplo 2
¿Cuántos rutas de ejecución tiene ésta función?
functionpartition(items,left,right){
varpivot=items[Math.floor((right+left)/2)],
i =left,
j =right;
* while(i<=j){
* while(items[i]<pivot){i++;}
* while(items[j]>pivot){j—;}
* if(i<=j){
swap(items,i,j);
i++;
j--;
}
}
returni;
}
2^4 = 16
Necesitas 16 distintos casos de prueba, solo para saber que pasaste por todas
las rutas de ejecución posibles
16 / 37
23. Pairwise Testing
Idea central:
Es una técnica de generación de casos de prueba que se basa en la
observación de que la mayoría de los defectos (~90%) son
causados por interacciones de a lo más dos factores de prueba.
Con ésta técnica se generan todas las posibles combinaciones de
dos valores distintos para cada factor de prueba y por tanto, las
suites de pruebas son mucho más pequeñas que las generadas de
manera exhaustiva y aún así son muy efectivas para encontrar
defectos.
23 / 37
24. Ejemplo
Tienes que probar un componente web que debe correr en distintos
navegadores (Chrome y Firefox), distintos sistemas operativos (OSX, Linux,
Windows) y con diferentes capacidades de memoria de video (500Mb y 1Gb).
¿Cuántas posibles configuraciones tienes que probar?
Con pairwise testing son 6
Browser OS Video Memory
Chrome Windows 500Mb
Chrome Linux 1Gb
Chrome OSX 1Gb
Firefox Windows 1Gb
Firefox Linux 500Mb
Firefox OSX 500Mb
24 / 37
25. Pairwise testing vs Exhaustive testing
Pairwise Testing in the Real World
25 / 37
27. Property Based Testing
Es una técnica complementaria a unit testing.
La idea es especificar un conjunto de propiedades que siempre se deben
cumplir (invariantes).
El framework (QuickCheck) genera un conjunto de ejemplos 'aleatorios'
contra los cuales probar si la propiedad se cumple o no.
Si encuentra un ejemplo que invalida la propiedad, trata de reducirlo a su
mínima expresión.
27 / 37
28. Quick Check - Ejemplo 1
Vamos a verificar si una función que implementa el reverso de una cadena
cumple ciertas propiedades.
Propiedad 1: El reverso del reverso de una cadena, es la misma cadena.
ghci>quickCheck(s->reverse(reverses)==s)
+++OK,passed100tests.
Propiedad 2: El reverso de una cadena, tiene la misma longitud que la cadena
original.
ghci>quickCheck(s->length(reverses)==lengths)
+++OK,passed100tests.
Propiedad 3: El reverso de una cadena palíndroma, es la misma cadena.
ghci>quickCheck(s->isPalindromes==>reverses==s)
+++OK,passed100tests.
28 / 37
29. Quick Check - Ejemplo 2
La siguiente máquina de estados acepta todas las cadenas cuyo número de 0
es par.
La función 'decide' decide si el autómata acepta la cadena o no. Ejemplos:
decide"00100"==True
decide"00110"==False
29 / 37
30. Quick Check - Ejemplo 2
Propiedad 1: decidedebe regresar solo Trueo False.
ghci>quickCheck(s->decides`elem`[True,False])
+++OK,passed100tests.
Propiedad 2: decidesólo acepta cadenas con un númpero par de 0's.
ghci>quickCheck(s->isEvenZeross==decides)
+++OK,passed100tests.
Y... ¿si quiero probar 10,000 casos?
ghci>letdeepCheckp=quickCheckWith(stdArgs{maxSuccess=10000})p
ghci>deepCheck(s->isEvenZeroess==decides)
+++OK,passed10000tests.
30 / 37
31. ¿Y Java apá ?
Mira mijo...
Hay varios frameworks
Ninguno me gusta
Pero da un vistazo a
Junit Theories
Quickcheck
Y si eres más atrevido, prueba ScalaCheck
31 / 37
35. Resúmen
Hacer pruebas es difícil
Si no las haces... tabla
Si no las automatizas... tabla
Hacer buenas pruebas es aún más difícil
Si no estudias y te aplicas... tabla
¡pero no hay de otra!
Salvo vivir en la incertidumbre...
35 / 37
36. Más información
Property Based Testing (video by @jessitron)
Pairwise testing (community website)
Combinatorial Software Testing (article)
Better than unit tests (article)
Practical Combinatorial Testing (NIST Report)
36 / 37