Blog
Ingeniería de sistemas de negocio
Lo que aprendemos construyendo y operando sistemas reales — bugs incluidos. Sin teoría de manual: cada nota sale de un sistema en producción.
Decir que no a un feature (con una alternativa)
A veces un pedido es razonable del lado del negocio y destructivo para el modelo. El instinto es explicar por qué está mal. Funciona mejor separar el pedido de la solución.
Presupuesto, pedido y factura no son el mismo documento
El modelo tentador es un documento con un estado que avanza: presupuesto, después pedido, después factura. Colapsa en cuanto el negocio hace algo normal.
"¿Cuánto stock hay?" es una pregunta con varias respuestas
Disponible para vender, físicamente presente o comprometido con alguien: divergen todo el tiempo, y tratarlos como un solo número es como un vendedor vende algo que salió del depósito ayer.
Revertir no es borrar
Revertir un pago no es borrar un pago. Esa distinción es la mayor parte de lo que separa un sistema de negocio de una app CRUD — y "el undo lo agregamos después" casi nunca es cierto.
Un pago se imputa, no se asigna
El primer modelo natural es un pago con una foreign key a una factura. Sobrevive hasta que el primer cliente paga un número redondo que cubre dos facturas y parte de una tercera.
El cheque es una máquina de estados
La mayoría de los sistemas modela un cheque como una fila con un campo de estado. Funciona hasta que alguien necesita revertir un estado — y ahí descubrís que el modelo nunca fue el campo.
Veinte minutos mirando a alguien usar el sistema
Lo de mayor valor que hice por un producto que mantengo no fue técnico: fue mirar a alguien usarlo veinte minutos sin decir nada. Lo que encontrás nunca está en un ticket.
Una tabla que ve todas las empresas, a propósito
En un sistema donde cada tabla está acotada a una empresa, la tabla de membresías no puede estarlo. No es una fuga: es la funcionalidad. Las excepciones documentadas de la regla de aislamiento.
El precio no es un número: es una decisión registrada
El campo se llama "precio" y guarda un decimal. Esa es la simplificación que hace imposible explicar un presupuesto tres meses después.
¿Quién se queda con el último centavo?
Todos saben que el dinero no va en float. Pocos sistemas decidieron qué pasa con el último centavo — que es de donde salen las discusiones reales.
La cuenta corriente es un libro mayor, no un número
Un saldo no debería ser un número que mantenés: debería ser un número que podés reproducir. El modelo de libro mayor, y por qué el saldo guardado es solo un cache.
Estimar cambios en código que toca dinero
El código suele ser un día. Lo que lo rodea — entender el comportamiento actual, fijarlo con tests, validar con el negocio, la ventana de deploy — es la estimación.
Cómo explicarle deuda técnica a un cliente no técnico
La conversación más difícil no es el precio: es pedir dos semanas para cambiar algo que el cliente nunca va a ver. Explicada como riesgo con número, deja de ser un pedido de fe.
Las facturas no se borran
Un usuario pide borrar una factura. La respuesta correcta es que no se puede — y entender por qué enseña casi todo lo que distingue al software contable.
El filtro multi-tenant es una red, no un piso
El filtro de tenant de Hibernate es una red de seguridad. Tratarlo como el mecanismo principal es la receta para que una empresa vea datos de otra.
El pago que se perdió con el lock puesto
Un SELECT ... FOR UPDATE funcionando perfecto, y aun así se perdió un pago. El problema no era el lock: era el nivel de aislamiento.