Trabe

Trabe logo

Asís & David

https://trabe-teaching.github.io/wrong-abstractions

Las abstracciones equivocadas

Sobre nosotros

Érase una vez...

...una gran corporación que quería desarrollar un conjunto de frameworks para aumentar la productividad de sus equipos de desarrollo.

Qué "querían"

Qué les dimos


        // Quiero un microservicio que en el endpoint /products
        // devuelve una lista de productos, cuyos datos salen
        // de una API REST de items, que hay que procesar.

        service()
          .use(auth())
          .mount(router()
            .get("/products",
              fetchJson("http://api/items"),
              transform(mapItemToProduct)
            )
          )

      service:
        port: 3000
        auth:
          enabled: true
        log:
          level: DEBUG
          transports:
            - kafka
        tracing:
          threshold: 0.5
      

Tragedia en 5 pasos

  1. Se definen unos requisitos cerrados.
  2. Se entrega un producto que los cumple.
  3. El producto "no vale". Las abstracciones son muy rígidas. Los requisitos estan mal. Todo debe ser más flexible.
  4. Se sugiere una nueva major con abstracciones más simples.
  5. Imposible. "Hay que poner en valor lo que hay". Se extienden las abstracciones para hacerlas "configurables".

Noooooo!


        service()
          .use(auth())
          .mount(router()
            .get("/products",
              fetchJson("http://api/items", {
                onError: async (e,ctx, next) => {
                  ctx.state.data = [];
                  await next();
                }
              })
            )
          )
      

Framework

API + implementación

La abstracción equivocada

¿Hacer algo distinto?

Es decir... los requisitos reales.

No tendría por qué ser así.

La abstracción correcta


      //before
      fetchJson("http://api/items")

      // after
      fetchData(() => fetchClient.json("http://api/items"))
      

        // before
        fetchJson("http://api/items", {
          onError: async (e,ctx, next) => {
            ctx.state.data = []
            await next();
          }
        })

        // after
        fetchData(async () => {
          try {
            return await fetchClient.json("http://api/items");
          } catch {
            return [];
          }
        })
      

Tragedia en 5 7 pasos

  1. Se definen unos requisitos cerrados.
  2. Se entrega un producto que los cumple.
  3. El producto "no vale". Las abstracciones son muy rígidas. Los requisitos estan mal. Todo debe ser más flexible.
  4. Se sugiere una nueva major con abstracciones más simples.
  5. Imposible. "Hay que poner en valor lo que hay". Se extienden las abstracciones para hacerlas "configurables".
  6. Vamos a pivotar. Una "IA" escribe el boilerplate. Necesitamos un framework de piezas sencillas.
  7. Se pide una major con abstracciones más simples, pero "hay que poner en valor lo que hay".

No, no, no, nooooo!

Lecciones aprendidas

La "IA" escribe el boilerplate

Las tecnologías equivocadas

Estar en la cresta de la ola

"IA" pros

"IA" cons (1)

"IA" cons (2)

  • Tecnofascimos.
    • No es opt-in (ni opt-out).
    • Deskilling (en el más amplio sentido).
    • Delegación de responsabilidad.
    • Adicción.
    • Democratización (my ass).
Is This the New ‘Scariest Chart in the World’?

TL;DR

Ética vs negocio

¿Y vosotros qué haríais?

Para reflexionar

¿Preguntas?