1 of 53

1

Desarrollo Lean: posponer decisiones

Workshop Software Crafters Barcelona 2022 (v1.2)

(@eferro & @islomar)

2 of 53

2

SUPPORTERS

DIVERSITY

PREMIUM

BASIC

#SCBCN22

IX EDITION

3 of 53

3

Isidro López

(@islomar)

https://islomar.es

4 of 53

4

5 of 53

Objetivo del taller

  • Mostrar a través de un ejercicio práctico “basado en hechos reales” un ejemplo de puesta en práctica del principio Lean “defer commitment”.
  • Evolucionar las soluciones técnicas a las necesidades de usuarios manteniendo opciones abiertas y minimizando el desperdicio (enfocándonos en el problema presente y evitando el diseño especulativo).
  • Ver cómo posponer decisiones técnicas hasta el último momento responsable. Esto implica posponer decisiones “irreversibles” (o con alto coste de cambio) e intentar maximizar el número de decisiones reversibles.

5

6 of 53

¿Por qué queremos posponer (algunas) decisiones?

  • Para trabajar menos 😬 (menor coste basal y menos tiempo implementando algo que tal vez no necesitemos)
  • Para tener más información y poder entender mejor el negocio (problema/necesidad a resolver) y la solución más adecuada.
  • Para evitar invertir tiempo y dinero en resolver el problema incorrecto (i.e. para no hacer algo que no aporte valor real en el presente)
  • Para crear soluciones/sistemas más simples (evitar sobre-ingeniería), mínimos y fáciles de cambiar, con baja complejidad accidental y menos funcionalidades.

6

7 of 53

¿Por qué queremos posponer (algunas) decisiones?

  • Para reducir el esfuerzo requerido en rehacer trabajo en caso de necesitarlo
  • El objetivo es tener múltiples opciones reales: reaccionar bien y rápido a lo que venga, sin miedo.
  • Cuanto más pospongamos, menos cargamos la “mochila” y menos cosas innecesarias añadimos (menos desperdicio).
    • Todos sabemos que es más fácil moverse con menos carga en la mochila
  • Una buena arquitectura nos permite posponer decisiones, pero esto no significa que estemos obligados a hacerlo. Sin embargo, ser capaz de posponerlas nos da mucha flexibilidad.

7

8 of 53

¿Qué NO posponemos?

  • El lenguaje de programación (e.g. paradigma OO vs funcional) y el grueso de su ecosistema
  • Trabajar con “excelencia técnica” (aka “agile”, continuous delivery, eXtreme Programming, etc.)

8

9 of 53

¿Cómo posponemos decisiones?

  • De manera consciente y meditada
  • Consideramos que una decisión es “buena” cuando:
    • Nos compromete lo mínimo posible
    • Nos permite posponer otras decisiones
    • Es fácil de cambiar/revertir
    • Resuelve un problema del presente (no del futuro)
    • Es “suficientemente buena” (sin sobre-ingeniería)
  • Priorizamos librerías sobre frameworks

9

10 of 53

¿Cómo posponemos decisiones?

  • Trabajamos de manera muy iterativa
  • Aceptamos que las decisiones tomadas fueron las correctas en el momento y contexto en que se tomaron: no pasa nada si hay que cambiarlas
  • Nos esforzamos por hacer un buen slicing vertical de las funcionalidades (por ejemplo con el “método hamburguesa”), así como slicing técnico para avanzar en pequeños pasos seguros

10

11 of 53

¿Cómo posponemos decisiones?

  • Buscamos la “excelencia técnica” (Clean Code, Simple Design, TDD, Evolutionary Design, etc).
  • Seguimos arquitectura hexagonal y algunos de los principios, prácticas y patrones de DDD (nos desacoplamos de infraestructura/frameworks).

11

12 of 53

Caso real: ChatOps

Objetivo:

  • Facilitar a los desarrolladores la ejecución automática de tareas tediosas, propensas a errores o con dependencias de otros equipos (e.g. de Platform)

Contexto:

  • 200 usuarios en potencia (50-100 entre Ingeniería y Data Science)

12

13 of 53

Caso real: ChatOps

Restricciones:

  • Uso de la aplicación de mensajería Slack
  • ¿Por qué Slack?
    • Ya se cuenta con ella en la empresa
    • Todos los empleados tienen acceso
    • En línea con concepto de Chatbot y ChatOps

13

14 of 53

Introducción al método de la hamburguesa

  • Origen: Gojko Adzic, 2012
  • Problema a resolver:
    • la historia es demasiado grande para ser partida; el equipo sólo ve cómo simplificar a nivel técnico, no de negocio/usuario
  • Objetivo:
    • conseguir evolucionar la solución a un problema
    • generar / visualizar opciones

14

15 of 53

Introducción al método de la hamburguesa

  • Pasos
    • Paso 1: identificar tareas (pasos requeridos para satisfacer una necesidad de usuario)
    • Paso 2: identificar opciones para las tareas
    • Paso 3: combinar resultados
    • Paso 4: recortar las opciones
    • Paso 5: tomar el primer bocado
    • Paso 6: tomar el siguiente bocado… y continuar

15

16 of 53

16

¡Empecemos la práctica!

17 of 53

Caso de uso: creación de repositorio de contenedores

  • La necesidad:
    • Crear un repositorio de contenedores de forma self-service.
    • Inicialmente se requería la intervención de dos equipos y el proceso duraba hasta 2 días (dependencias, bloqueos, errores).
  • Propuesta de solución:
    • Todos los usuarios pueden, mediante Slack, crear un repositorio de contenedores de manera autónoma e inmediata.
    • Si el usuario se equivocara al crear el repositorio, no tendría efectos negativos (e.g. nada se rompe).

17

18 of 53

18

Autenticación

Autorización

Capturar repo name

Creación del repo en cloud

Feedback de la creación

19 of 53

19

Autenticación

Autorización

Capturar repo name

Creación del repo en cloud

Feedback de la creación

Autenticación Slack

Canales Slack

Token usuarios harcodeados

Hardcodeado en código

Fichero Hardcodeado

Slack Command

Conversación Slack

AWS API

20 of 53

20

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

Hardcodeado en código

Fichero hardcodeado

DB Usuarios / Roles

Auth0, Okta, Onelogin

Capturar repo name

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Creación del repo en cloud

AWS cli

AWS API

Backend wrapper AWS API

Generación cambio codigo terraform

Feedback de la creación

Línea texto Slack

Texto enriquecido

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

21 of 53

RECORDATORIO sobre los criterios de selección

  • Nos compromete lo mínimo posible
  • Nos permite posponer otras decisiones
  • Es fácil de cambiar/revertir
  • Resuelve un problema actual (NO futuro)
  • Suficientemente “bueno” (sin sobre-ingeniería, simplicidad, testeado)
  • Que sea pequeño

21

22 of 53

22

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

Hardcodeado en código

Fichero hardcodeado

DB Usuarios / Roles

Auth0, Okta, Onelogin

Capturar repo name

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Creación del repo en cloud

AWS cli

AWS API

Backend wrapper API AWS

Generación cambio codigo terraform

Feedback de la creación

Línea texto Slack

Texto enriquecido

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

23 of 53

Durante los siguientes tres meses el sistema fue evolucionando con nuevos comandos y más usuarios. Ninguno de ellos necesitó cambios muy importantes en la arquitectura o la infraestructura de la aplicación.

23

🗓

24 of 53

24

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

Hardcodeado en código

Fichero hardcodeado

DB Usuarios / Roles

Auth0, Okta, Onelogin

Pasar parámetros

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Ejecutar comando

AWS cli, helm, kubectl

AWS API, k8s API, ...

Backend wrapper API

Servicios externos / No code

Feedback ejecución

Línea texto Slack

Texto enriquecido

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

25 of 53

Caso de uso: asignar rol a usuario de AWS

  • La necesidad:
    • Los miembros del equipo de IT quieren poder asignar fácilmente un rol a un usuario de AWS.
    • Únicamente la gente de IT debe poder ejecutar este nuevo comando.

Este caso de uso evidenciaba la necesidad de sofisticar nuestro sistema de autorización

25

Atención

26 of 53

26

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

???

???

???

???

???

Pasar parámetros

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Ejecutar comando

AWS cli, helm, kubectl

AWS API, k8s API, ...

Backend wrapper API

Servicios externos / No code

Feedback ejecución

Línea texto Slack

Texto enriquecido

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

27 of 53

27

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

Hardcodeado en código

Fichero hardcodeado

DB Usuarios / Roles

Auth0, Okta, Onelogin

Pasar parámetros

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Ejecutar comando

AWS cli, helm, kubectl

AWS API, k8s API, ...

Backend wrapper API

Servicios externos / No code

Feedback ejecución

Línea texto Slack

Texto enriquecido

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

28 of 53

RECORDATORIO sobre los criterios de selección

  • Nos compromete lo mínimo posible
  • Nos permite posponer otras decisiones
  • Es fácil de cambiar/revertir
  • Resuelve un problema actual (NO futuro)
  • Suficientemente “bueno” (sin sobre-ingeniería, simplicidad, testeado)
  • Que sea pequeño

28

29 of 53

Caso de uso: crear y borrar usuarios de AWS

  • La necesidad:
    • Se requiere crear y borrar usuarios de AWS.
    • Estas operaciones sólo las pueden ejecutar los equipos de SRE y IT.

Necesidad de aún mayor sofisticación para nuestro sistema de autorización

29

Atención

30 of 53

30

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

Hardcodeado en código

???

???

???

???

Pasar parámetros

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Ejecutar comando

AWS cli, helm, kubectl

AWS API, k8s API, ...

Backend wrapper API

Servicios externos / No code

Feedback ejecución

Línea texto Slack

Texto enriquecido

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

31 of 53

31

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

Hardcodeado en código

Fichero hardcodeado

DB Usuarios / Roles

Auth0, Okta, Onelogin

Pasar parámetros

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Ejecutar comando

AWS cli, helm, kubectl

AWS API, k8s API, ...

Backend wrapper API

Servicios externos / No code

Feedback ejecución

Línea texto Slack

Texto enriquecido

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

32 of 53

RECORDATORIO sobre los criterios de selección

  • Nos compromete lo mínimo posible
  • Nos permite posponer otras decisiones
  • Es fácil de cambiar/revertir
  • Resuelve un problema actual (NO futuro)
  • Suficientemente “bueno” (sin sobre-ingeniería, simplicidad, testeado)
  • Que sea pequeño

32

33 of 53

Caso de uso: resetear nuestras credenciales AWS

  • La necesidad:
    • Cada persona tiene que resetear sus credenciales al menos cada 60 días.
    • Cada persona lo podía hacer en la consola de AWS, pero lo cierto es que generaba mucho soporte, mucha gente no lo sabía hacer.

  • Propuesta de solución:
    • Todos los usuarios pueden, mediante comando de Slack, resetear sus credenciales.
    • Las credenciales se tienen que enviar de forma segura.

33

34 of 53

34

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

Hardcodeado en código

Fichero hardcodeado

DB Usuarios / Roles

Auth0, Okta, Onelogin

Pasar parámetros

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Ejecutar Reset Own AWS Key

???

???

???

???

???

???

Notificar Credenciales

???

???

???

???

???

???

Feedback ejecución

Línea texto Slack

Texto enriquecido

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

35 of 53

35

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

Hardcodeado en código

Fichero hardcodeado

DB Usuarios / Roles

Auth0, Okta, Onelogin

Pasar parámetros

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Ejecutar Reset Own AWS Key

AWS cli

AWS API

Terraform

Notificar Credenciales

Línea texto Slack

Texto enriquecido

Notificación Slack Privada

email

SMS

Sistema externo (Ej: 1password, S3 temporal)

Feedback ejecución

Línea texto Slack

Texto enriquecido

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

36 of 53

RECORDATORIO sobre los criterios de selección

  • Nos compromete lo mínimo posible
  • Nos permite posponer otras decisiones
  • Es fácil de cambiar/revertir
  • Resuelve un problema actual (NO futuro)
  • Suficientemente “bueno” (sin sobre-ingeniería, simplicidad, testeado)
  • Que sea pequeño

36

37 of 53

Caso de uso: release a Producción de aplicaciones

  • La necesidad:
    • La release a Producción de las aplicaciones (principalmente 3 monolitos que se despliegan a la vez por sus dependencias) es un proceso complejo, lento y propenso a errores: queremos automatizarlo y simplificarlo.
    • Auditoría y búsqueda, persistente en el tiempo y con control de acceso (autorización)
      • Contenido de la traza: comando ejecutado, quién y cuándo lo ejecutó.

Queremos una solución con auditoría, fácil de ejecutar, con feedback para el usuario y con algún tipo de mecanismo que impida que se ejecute por error

37

Atención

38 of 53

38

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

Hardcodeado en código

Fichero hardcodeado

DB Usuarios / Roles

Auth0, Okta, Onelogin

Pasar parámetros

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Mecanismo anti ejecución por error

???

???

???

???

???

???

Ejecutar release

???

???

???

???

???

???

Feedback ejecución

Línea texto Slack

Texto enriquecido

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

Traza auditoría

???

???

???

???

???

???

39 of 53

39

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

Hardcodeado en código

Fichero hardcodeado

DB Usuarios / Roles

Auth0, Okta, Onelogin

Pasar parámetros

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Mecanismo anti ejecución por error

N/A

Token (No persistencia)

Token (persistencia)

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Ejecutar release

gitlab pipeline (api)

Nuevo pipeline

Feedback ejecución

Línea texto Slack

Texto enriquecido

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

Traza auditoría

Canal privado slack

Volumen ficheros

BD

BD + búsqueda

Eventos + BD + búsqueda

SaaS

40 of 53

40

Autenticación

Autenticación Slack

Canales Slack

Token usuarios hardcodeados

Autorización

N/A

Hardcodeado en código

Fichero hardcodeado

DB Usuarios / Roles

Auth0, Okta, Onelogin

Pasar parámetros

Slack command

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Mecanismo anti ejecución por error

N/A

Token (No persistencia)

Token (persistencia)

Conversación Slack

Diálogos dinámicos en Slack

Link a frontend / Webapp

Ejecutar release

gitlab pipeline (api)

Nuevo pipeline

Feedback ejecución

Línea texto Slack

Texto enriquecido (Actualiz. RT)

Notificación Slack privada

email

Diálogos dinámicos en Slack

Feedback en frontend

Traza auditoría

Canal privado slack

Volumen ficheros

BD

BD + búsqueda

Eventos + BD + búsqueda

SaaS

41 of 53

41

Recapitulación final

42 of 53

Finalmente, hace un par de semanas (año y medio después del arranque) hemos conectado el sistema de autorización con nuestro Inventario de Usuarios (por cierto implementado con No-Code).

42

🗓

43 of 53

43

44 of 53

Resumen final (I)

  • El método Hamburguesa sólo es una herramienta (es el dedo, no la luna).
  • Mantener opciones abiertas: forzarnos a pensar varias
  • Priorizar decisiones que:
    • Nos comprometan lo mínimo posible
    • Nos permitan posponer otras decisiones
    • Sean fáciles de cambiar/revertir
    • Resuelvan un problema actual (NO futuro)
    • Sean suficientemente “buenas” (sin sobre-ingeniería, simplicidad, testeado)

44

45 of 53

Resumen final (II)

  • NO se sacrifica la “calidad interna” (testing, legibilidad, diseño simple y evolutivo, refactor “continuo”, etc.)
  • Acompañarlo de arquitectura/diseño que permita posponer decisiones y revertirlas/cambiarlas fácilmente (e.g. arquitectura hexagonal)

45

46 of 53

RECORDATORIO sobre los criterios de selección

  • Nos compromete lo mínimo posible
  • Nos permite posponer otras decisiones
  • Es fácil de cambiar/revertir
  • Resuelve un problema actual (NO futuro)
  • Suficientemente “bueno” (sin sobre-ingeniería, simplicidad, testeado)
  • Que sea pequeño

46

47 of 53

Cuidado:

⚠️ Frameworks que cierran opciones

⚠️ Megaconstrucciones (para problemas futuros)

⚠️ Hype / CV Driven development

47

48 of 53

48

Referencias y recursos

49 of 53

49

50 of 53

50

Referencias (I)

51 of 53

51

Referencias (II)

52 of 53

52

¡GRACIAS!

53 of 53

53