Este documento presenta un resumen de las diferentes soluciones al problema de crear una red social simple utilizando las metodologías Ágiles de Londres, Chicago y Buenos Aires. Se describen los enfoques de diseño y pruebas de cada solución, y se analizan sus ventajas y desventajas frente a cambios y extensibilidad. La solución de Buenos Aires utiliza un enfoque middle-out y TDD, resultando en un modelo más simple con menos clases, líneas de código y casos sin probar.
2. Jazmin Alvarez Vico
➢ Programadora, docente y estudiante de Ciencias de la
Computación en FCEyN de la UBA.
➢ Feminista. Parte de @MujeresDelDC.
➢ Ayudante en las materias de Ingeniería de Software I y
Didáctica de la Computación.
➢ Docente de tecnología en el Bachillerato Popular para
adultes Chilavert.
➢ La pueden seguir en tw: @Jazz_vico y ig: @jaz.vico
3. ➢ Socio Fundador de 10Pines
➢ Socio Fundador de FAST
➢ Profesor de FCEyN UBA
➢ Director Adjunto del Depto. de
Computación de FCEyN UBA
...
➢ Sobre todo, programador apasionado
Hernán Wilkinson
9. Episodios
Episodios de Buenos Aires vs. …
Aún faltan varios donde veremos
persistencia y otras cosas
https://alagorra.10pines.com
10. El nombre “Buenos Aires” es solo por una cuestión
de marketing
No podemos arrojarnos el hecho de que “todo
Buenos Aires” programe de la forma que
mostraremos
Words of Caution
11. El objetivo no es generar una nueva “grieta” sino
hacer una análisis crítico de las distintas técnicas
para sacar conclusiones y mejorar nuestra forma
de desarrollar
Words of Caution
13. ➢ Registrar un nuevo usuario
➢ Loguearse
➢ Crear “posts” (publicaciones)
○ Palabras “inapropiadas” como elephant, ice cream y orange
➢ Obtener los posts de un usuario (timeline)
➢ Seguir a otro usuario
➢ Obtener los posts propios y de los que sigo (wall)
➢ Obtener todos los usuarios
➢ Obtener los usuarios seguidos por uno en particular
Descripción del Problema
21. ➢ Proceso Outside-In
➢ Diseño orientado al problema computable, no al
negocio
➢ Organización del proyecto en base al problema
computable
➢ Uso de DTOs para comunicación entre “capas”
➢ Uso de ids en vez de objetos
➢ Se expone la password a objetos externos
Conclusiones - Diseño
22. ➢ Tests de APIs de caja blanca
○ Opinión de Hernán: Solo los podes hacer así si ya
sabes cómo vas a hacer la implementación
➢ Hay casos sin testear
○ Usuario con username vacío
○ Se puede usar followers y followees que no
existen
○ Podés seguirte a vos mismo
○ etc.
Conclusiones - Tests
23. ➢ 11 minutos en escribir el primer test
○ Clases: UserAPI, UserService, RegistrationData,
User, UserBuilder
○ 4 Mocks con varias configuraciones
➢ 4 minutos para hacerlo pasar
➢ 5 clases para registrar un usuario
Algunos Números...
27. ➢ Proceso Inside-out
➢ Clases que representan Casos de usos
➢ Una clase por API
➢ UseCaseContext, APIContext → Objetos globales
➢ DTOs para comunicación entre “capas”
○ CreateUserRequest igual a User
➢ Uso de variables de instancia públicas
➢ Clases sin/poco comportamiento (estructuras de
datos)
Conclusiones - Diseño
28. ➢ Se expone la password a objetos externos, que además
es público
➢ Se puede postear con palabra inapropiadas
➢ Hay casos sin testear
○ Usuario con username vacío
○ Si follower o followee no existe, lo relaciona con
null
○ Podés seguirte a vos mismo
○ etc.
Conclusiones - Diseño/Tests
29. ➢ La primera vez que corre tests, son 2 tests juntos y
pasan de entrada (Episodio 6 - 14:15)
➢ 5 clases para crear usuario
○ CreateUser, CreateUserRequest,
UseCasaeContext, Repository, User
Algunos Números...
31. ➢ Empezar haciendo TDD del modelo del negocio
➢ Seguir estrategia “Middle-Out”
➢ Dejar Interfaces para el final siguiendo la idea de
tecnología perfecta
Cómo es el proceso
37. ➢ Se escriben “test funcionales”
(también llamados “sociales”)
➢ No se simulan objetos del sistema
➢ Solo se simula (priorizando stubs) objetos fuera
del sistema, no controlables por los tests. Ej:
○ LocalDateTime.now()
○ UUID.random().toString()
○ Base de datos/Servicios externos/etc.
Cómo es el proceso
38. ➢ Empezar por el Modelo del Negocio
➢ Usar una metáfora para tener una “vista
concreta” del negocio
➢ Heurísticas de Diseño:
○ Usar Objetos Completos
○ User Objetos Válidos
○ Favorecer el uso de Objetos Inmutables
○ No usar null/nil
○ Modelar la solución de manera sistémica
○ Reificar la arquitectura del sistema en el mismo sistema (subsistemas)
Diseño
41. ➢ Primer test:
○ Tiempo en escribir el test: 2 min.
○ Tiempo en hacer pasar el test: 30 seg.
○ Cantidad de clases de modelo: 1
➢ Segundo test:
○ Tiempo en escribir el test: 50 seg.
○ Tiempo en hacer pasar el test: 15 seg.
○ Cantidad de clases de modelo: 1
➢ etc ...
Hechos
50. ➢ Cambio: Que el usuario tenga conozca un homePage
○ El homePage es una url que no se valida
➢ Extensión: Poder dar “like” a una publicación
○ Puede ser cualquier usuario, no solo followees
Cambios y Extensiones entre London y Buenos Aires
63. COMENTARIO: En London los tests de Aceptación no pasaban aunque sí pasasen
los tests de programador, indicativo de que hay casos sin testear en los tests de
programador
Diferencias en el código fuente en cada paso
76. ➢ Pudimos resolver el mismo problema con:
○ menos clases
○ menos líneas de código
○ más tests
○ más cobertura
○ más casos de error cubiertos
Conclusiones
77. ➢ Pudimos cambiar y ampliar la solución con:
○ cambios más chicos
○ menos clases modificadas
○ menos diferencias a nivel código
Conclusiones
80. ➢ Concentrarnos primero en modelar el
negocio y después en la tecnología
➢ Por seguir un proceso middle-out usando TDD
➢ Seguir buenas heurísticas de diseño
Por qué y Recomendaciones
81. ➢ Minimizar el uso de mocks(*) ya que:
○ generan test de caja blanca
○ son tests frágiles
○ terminan generando inseguridad frente al cambio (más en
leng. dinámicamente tipados)
➢ No empezar el desarrollo por las interfaces:
○ porque se prioriza la tecnología en vez del negocio
○ lleva más tiempo escribir los test y hacerlos pasar
(*) Mocks != Test Doubles
Recomendaciones