Construyendo con propósito: Análisis de datos a gran escala con Node.js

https://www.linkedin.com/in/martinsz//blog/construyendo-con-proposito-nodejs-analisis-datos/

En Abrimos.info no construimos software para presumir. Hacemos preguntas incómodas. Y a veces, cuando encontramos que no existe una respuesta, construimos la herramienta que la hace posible.

📊 ¿Por qué no podemos ver los contratos públicos con más claridad? 🧭 ¿Esta persona ha sido funcionaria pública antes? 💸 ¿Y si la gente pudiera rastrear presupuestos en tiempo real?

Así es como construimos. Con curiosidad, con frustración, y con la necesidad de entender qué está moldeando nuestras vidas. Sí, con código. Pero primero, con propósito.

Este artículo cuenta la historia de una de esas preguntas incómodas que se convirtió en un sistema real: ¿podemos detectar riesgos de corrupción automáticamente en millones de contratos públicos?

El desafío: 2 millones de contratos y una pregunta

A principios de 2023 me enfrenté a un reto específico para Abrimos.info: construir un sistema de evaluación de contratos públicos. La fuente de datos contenía 2 millones de contratos en formato JSON, siguiendo el esquema OCDS Record (Open Contracting Data Standard).

Si has trabajado con este estándar, sabrás que estos documentos representan todos los procesos de compra pública de un país y tienen una estructura compleja: arrays de objetos anidados que, aunque sigan el mismo esquema, siempre presentan problemas de consistencia.

Ya había construido sistemas similares antes, pero esta vez quería algo diferente. No quería crear otro evaluador que solo funcionara para un país específico. Junto con Fernando Matzdorf, decidimos hacer un sistema configurable que pudiera adaptarse a diferentes contextos.

Así nació flagfetti

Diseñamos flagfetti, nuestro evaluador de banderas rojas, como un sistema configurable vía YAML. La idea era simple pero poderosa: definir las reglas de evaluación (las "banderas rojas" que indican posibles riesgos de corrupción) en archivos de configuración, separadas del código que las ejecuta.

Para cada uno de los dos millones de documentos, el sistema debe:

  1. Leer el contrato en formato original
  2. Parsear el JSON (este paso resultó ser crítico, como veremos)
  3. Descubrir qué reglas aplican según el tipo de contrato
  4. Obtener los valores específicos del documento para cada regla
  5. Aplicar los módulos de evaluación correspondientes
  6. Recolectar los resultados
  7. Generar el documento de evaluación final

Para un sistema así, la performance no es un lujo, es una necesidad.

La elección técnica: ¿Por qué Node.js?

En Abrimos.info somos uno de los pocos equipos que construyen pipelines de análisis de datos en Node.js. Este intérprete de JavaScript que corre en el servidor (no confundir con Java) no es la opción obvia cuando la mayoría usa Python para ciencia de datos.

La verdad es simple: nos queda cómodo el lenguaje. No es que nos dé miedo Python, simplemente nos gusta JavaScript y conocemos bien su ecosistema.

Pero cuando corrimos la primera versión del sistema de flagfetti sobre los 2 millones de contratos, nos encontramos con un problema: el proceso tardó más de 12 horas en completarse.

El cuello de botella: parsear JSON

El problema estaba en Node.js versión 18, que tiene un parser nativo de JSON que es, francamente, bastante lento. Cuando tu pipeline tiene que parsear millones de documentos JSON complejos, esa lentitud se multiplica exponencialmente.

La solución llegó cuando cambiamos a simdjson, una librería que usa código en C optimizado para parsear JSON a velocidades increíbles. El resultado fue dramático: aceleramos el proceso unas 10 veces.

Con varias optimizaciones adicionales, logramos reducir el tiempo de ejecución total a menos de 15 minutos.

Por qué la velocidad importa (más allá de lo obvio)

En producción, este proceso corre una vez a la semana. Podrías pensar: "¿Qué más da que tarde 12 horas o 15 minutos si solo se ejecuta una vez por semana?"

Pero la velocidad nos dio algo mucho más valioso que ahorros energéticos: la capacidad de iterar.

Al poder correr el proceso decenas de veces por día durante el desarrollo, pudimos:

  • Refinar el sistema probando diferentes enfoques rápidamente
  • Ajustar las reglas de detección con ciclos de retroalimentación inmediatos
  • Participar en hackatones donde el tiempo es crítico, aportando mucho valor con poco esfuerzo
  • Responder a nuevas preguntas de nuestros usuarios sin hacerlos esperar

La velocidad se convirtió en una herramienta de aprendizaje.

Del experimento a la infraestructura

Hoy, flagfetti ya no es un experimento. Es parte de TeseoETL, nuestra oferta de procesamiento de datos, y lo hemos implementado para analizar procesos de contratación en más de 7 países.

Cada implementación nos enseñó algo nuevo:

  • Diferentes países tienen diferentes patrones de riesgo
  • Las reglas deben ser culturalmente sensibles
  • La configurabilidad no es opcional, es esencial

Este caso ilustra algo que creemos profundamente en Abrimos.info: las mejores herramientas cívicas nacen de preguntas reales, se construyen con decisiones técnicas pragmáticas, y se refinan con uso real en contextos diversos.

De la pregunta a la acción

Empezamos con una pregunta: ¿podemos detectar riesgos de corrupción automáticamente?

Esa pregunta nos llevó a construir flagfetti. La necesidad de velocidad nos llevó a optimizar Node.js de formas poco convencionales. Y la voluntad de servir a múltiples contextos nos llevó a crear una arquitectura configurable.

Todo esto es posible porque empezamos con propósito, no con tecnología.

La velocidad técnica no es solo eficiencia computacional. Es la capacidad de aprender más rápido, de servir mejor, y de hacer más preguntas incómodas.


Si te interesa hablar sobre performance en JavaScript, procesamiento de datos, o necesitas implementar un proyecto de ETL, escríbeme o contacta a Abrimos.info.

Código abierto: Puedes revisar el repositorio de flagfetti aquí: https://github.com/Abrimos-info/flagfetti-ecuador-ocds/