Construyo plataformas educativas desde la interfaz hasta los datos y la operación.
Construyo aplicaciones, servicios, procesos e integraciones desde la interfaz hasta los datos y la operación. Esa práctica me permite decidir la arquitectura conociendo sus consecuencias en cada una de esas capas.
Que una persona lo construya entero no significa que se pueda construir de cualquier manera.
Trabajar de un extremo al otro da una ventaja: se ve el efecto de cada decisión en el lado contrario. También da la tentación de saltarse los límites, y ahí es donde hay que tener disciplina.
Los límites se respetan aunque no haya nadie enfrente
Cuando el mismo desarrollador hace la interfaz y el servicio, es fácil colar lógica de negocio en la pantalla porque va más rápido. Va más rápido hoy y lo paga el siguiente que necesite esa regla en otro sitio.
El modelo de datos suele ser la decisión más cara de revertir
La interfaz y el servicio pueden sustituirse sin migrar todo el histórico, aunque el esfuerzo depende de su alcance y de los contratos existentes. Cambiar el modelo de datos suele exigir migraciones, compatibilidad, reconciliación y validación sobre información acumulada; por eso acostumbra a ser la decisión menos reversible. El plazo solo puede estimarse después de medir esos factores.
Lo que se ve también se prueba
Pruebo también la interfaz: los recorridos, los permisos y los estados de carga, vacío y error. Una revisión visual puntual no detecta por sí sola las regresiones que puede introducir el siguiente cambio.
Elegir la herramienta que el equipo puede mantener
La tecnología más adecuada sobre el papel es la peor decisión si el equipo que se queda no la conoce y no hay presupuesto para que la aprenda.
Dónde se concentra la complejidad
Casi siempre aparece lo mismo: un proceso importante que no vive en ningún sistema.
Se gestiona entre correos y hojas de cálculo, o entre dos aplicaciones que no se hablan, o dentro de algo heredado que ya nadie toca. Funciona hasta que crece el volumen o se marcha quien lo llevaba.
01
La plataforma no llega y la hoja de cálculo tampoco
Un proceso se gestiona a mano entre correos y ficheros compartidos porque ningún sistema lo cubre. Funciona hasta que crece el volumen o se va la persona que lo llevaba.
02
Dos sistemas tienen que entenderse
Cada uno guarda una parte de la verdad y no se ha definido cuál manda sobre cada dato. Las discrepancias aparecen en el peor momento.
03
Hay que sacar los datos de donde están
La información existe pero vive dentro de una aplicación que no la deja salir de forma consultable, así que nadie puede analizarla.
04
El proyecto necesita a alguien que cubra todo
No hay equipo para separar frontal, servicio, datos y despliegue, y hace falta alguien que responda del conjunto sin dejar huecos entre capas.
05
La aplicación heredada ya no se puede tocar
Funciona, pero cualquier cambio rompe otra cosa. Hay que decidir si se estabiliza, se reescribe por partes o se sustituye.
06
Una prueba de concepto tiene que llegar a producción
Lo que se hizo para demostrar una idea ahora debe funcionar en producción, con seguridad, errores controlados y alguien que lo opere.
Qué miro y qué queda por escrito
Qué construyo fuera de la plataforma de aprendizaje.
Cuando la necesidad no cabe dentro del LMS, o no debe estar dentro, esto es lo que se acaba construyendo.
Aplicaciones de gestión a medida
Herramientas internas para procesos que ningún producto cubre: seguimiento, coordinación, revisión, aprobación. Con sus roles, sus estados y su registro de quién hizo qué.
Interfaz de gestión
Roles y permisos
Estados y flujos
Registro de actividad
Informes propios
Servicios y API entre sistemas
Servicios con contrato explícito, versión declarada y comportamiento definido cuando el otro extremo falla o tarda. Con autenticación y límites de uso donde hacen falta.
Contrato versionado
Autenticación
Reintentos y límites
Comportamiento ante fallo
Documentación de uso
Procesos automáticos y trabajos en cola
Lo que debe ocurrir sin que nadie lo lance: sincronizaciones, cálculos, envíos, cierres. Con estado visible, reintentos y capacidad para reanudar la ejecución desde el punto en que se interrumpió.
Ejecución programada
Colas y reintentos
Estado visible
Reanudación
Avisos ante fallo
Modelos de datos y extracciones
Estructuras pensadas para preguntar, no solo para guardar, con extracciones periódicas hacia donde se analiza y trazabilidad hasta el registro de origen.
Modelo consultable
Extracción periódica
Histórico y versiones
Trazabilidad
Calidad del dato
Interfaces de uso diario
Pantallas que usa gente que no eligió usarlas, así que tienen que ser rápidas, entendibles y accesibles. Con los estados de carga, error y vacío resueltos, que es donde se nota el oficio.
Accesibilidad
Estados de carga y error
Rendimiento percibido
Uso con teclado
Diseño coherente
Recuperación de aplicaciones heredadas
Entender qué hace algo que ya nadie toca, cubrirlo con pruebas antes de cambiarlo y sustituirlo por partes sin parar el servicio que presta.
Comprensión del código
Pruebas antes de tocar
Sustitución por partes
Con el menor impacto sobre el servicio
Responsabilidades concretas
Respondo del sistema entero, incluidos los huecos entre capas.
La interfaz, el servicio, el modelo de datos y el despliegue. Los fallos más difíciles de resolver no viven dentro de una capa: viven en el espacio que queda entre dos, donde nadie se siente responsable.
01
Diseñar el sistema completo
Qué hace el frontal, qué el servicio, qué la base de datos y qué queda fuera. Los fallos cuya responsabilidad queda sin asignar se cuelan en los huecos entre capas.
02
Construir los dos lados
Interfaz utilizable y accesible por delante, servicios y procesos por detrás, con la misma exigencia de calidad en ambas capas, algo que no siempre ocurre.
03
Modelar los datos para consultarlos
Pensar el modelo desde el principio para que alguien pueda hacerle preguntas después, en lugar de descubrir a los dos años que la información está pero no se puede extraer.
04
Definir los contratos con otros sistemas
Qué se expone, con qué versión, qué ocurre cuando el otro extremo no responde y quién se entera. Una integración sin contrato es una avería aplazada.
05
Llevarlo a producción y dejarlo operable
Despliegue repetible, errores que se ven, capacidad de volver atrás y suficiente información para diagnosticar sin adivinar.
06
Dejar el relevo preparado
Documentación, pruebas y decisiones explicadas para que el equipo que se queda pueda seguir sin depender de quien lo escribió.
Cómo trabajo
Del problema real a algo puesto en producción que el equipo puede operar sin mí.
Empiezo por lo que más riesgo tiene, porque dejar lo incierto para el final es la manera habitual de descubrir tarde que el diseño no servía.
01
Entender el proceso, no la petición
Lo que se pide suele ser una solución ya imaginada. Vuelvo al problema antes de aceptar la forma en que llega.
02
Decidir los límites
Qué hace cada capa, qué guarda cada sistema y por dónde se hablan. Antes de escribir código.
03
Empezar por lo que entraña más riesgo
Primero lo que puede invalidar el diseño. Dejar lo incierto para el final es la forma habitual de descubrir tarde que no funcionaba.
04
Probar donde duele
Las reglas de negocio y los recorridos completos, no solo las funciones fáciles de probar. Y comprobar que las pruebas fallan cuando deben.
05
Poner en producción y quedarse
El trabajo no termina con la entrega, sino cuando el sistema funciona con personas que lo usan y el equipo puede operarlo sin mí.
Recorrido profesional
Más de 22 años programando en los dos lados, eligiendo la herramienta por el problema y por quién la mantendrá.
Más de 22 años programando, con PHP, Python, Node y JavaScript como herramientas habituales según el problema.
Trabajo en los dos lados: interfaces que usa gente cada día y servicios, procesos y modelos de datos por detrás.
Aplicaciones propias con colas de trabajo, eventos, trazas y pruebas, diseñadas para recuperar el estado y reanudar la ejecución después de un fallo.
Integraciones con sistemas de gestión comercial, de personal, de pago y de catálogo, con contratos explícitos entre ellos.
Puesta en producción en infraestructura de nube con entrega continua, observabilidad y capacidad de revertir.
Blog
En el blog escribo sobre construir y mantener software que dura.
Sobre cuándo conviene una aplicación propia y cuándo no, cómo se define un contrato entre sistemas que aguante el cambio, y qué hacer con el código heredado que funciona pero que nadie se atreve a tocar.