Saltar al contenido
Esteban Padilla
Volver a los proyectos

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.

Siguiente caso Un backend, varias marcas, ninguna fuga entre ellas