Reemplazar dos SaaS sin que nadie los extrañe
El portal interno de operaciones de una consultora de servicios digitales, para horas, tareas y auditorías de sitios web.
- Rol
- Ingeniero principal; lo asumí antes del lanzamiento
- Tiempo
- 8 meses
- Stack
- Next.js · Postgres · Prisma
- Equipo
- Un desarrollador anterior puso la primera base
Problema
Un equipo en crecimiento repartía el día entre un registro de horas de terceros y un gestor de tareas de terceros, y sus auditorías de sitios se quedaban cortas con los sitios grandes.
Restricciones
- Todo el equipo se muda a la vez, y su historial tiene que venir con él.
- Nadie puede perder una hora registrada en la mudanza.
- Las auditorías tienen que caber en las máquinas que ya las corren.
Decisiones
- Migré el historial de horas con un importador que por defecto solo simula, solo inserta, es idempotente, se verifica por persona y mes y rechaza una descarga parcial, porque un historial importado a medias es peor que ninguno.
- Atribuí y congelé las horas al escribirlas en vez de recalcularlas después, con una regla en la base de datos que permite un solo cronómetro corriendo por persona.
- Tomé bloqueos de fila de todo el proyecto en un orden fijo cuando se mueven tareas, así mover tareas al mismo tiempo no puede crear ciclos ni bloqueos mutuos.
- Partí cada auditoría en tareas hijas, un Lighthouse por máquina y una segunda ronda para lo que quedó pendiente, y los sitios grandes terminan.
- Pasé las lecturas de Server Actions a handlers GET al descubrir que las Server Actions corren una a la vez, e hice los cronómetros optimistas para que la pantalla nunca espere.
Resultado
Todo el equipo dejó las dos herramientas, y las auditorías ahora cubren el doble de páginas por sitio.
- 200 → 400 páginas por auditoría
- Unos 3.600 commits en 8 meses
Créditos
El primer tramo del proyecto (la base original, una migración de framework y la primera herramienta de auditoría) fue trabajo de un desarrollador anterior.