¿Cómo construimos un asistente de reuniones inteligente que ahorra cientos de horas cada mes a nuestra compañía?

Programar una reunión puede ser muy trabajoso. Al menos eso es lo que, diariamente, sentimos nosotros y muchos de nuestros colegas.

No sólo involucra encontrar el momento en donde cada uno de los participantes esté disponible. También implica poder encontrar una sala para este momento particular. Esto se transformó en un desafío creciente en una organización en rápida expansión como XING.

En nuestra opinión, las herramientas existentes como Outlook no cumplen esta tarea en forma satisfactoria. Por suerte, la XING Hackweek se realizó recientemente. En este artículo, compartimos qué es lo que estuvimos construyendo durante esa semana y como nuestro algoritmo de programación de reuniones trabaja detrás de escena.

¿Qué es una Hackweek?

“En XING, queremos dar a nuestros empleados la libertad de desarrollar ideas sin limitaciones y explorar nuevos territorios y tecnologías. Es por eso que establecimos Hackweeks trimestrales donde desarrolladores, jefes de producto, y UX dejan de lado su trabajo cotidiano por cinco días para dedicar sus habilidades al servicio de proyectos creativos”.

Nuestro concepto

Queríamos una solución única para la programación de reuniones sin desperdiciar horas en lograr conciliar las agendas de los participantes con las salas disponibles.
Nuestra nueva herramienta, el Meeting Assistant, debería configurarse con las limitaciones y los participantes para que se logre las mejores combinaciones tiempo/lugar donde todos estén disponibles.

Ordena de forma inteligente estas sugerencias y, por consiguiente, asegura que siempre se vean las mejores opciones para la reunión a programar:

  • La sugerencia de sala más próxima (en distancia) evitando que usted tenga que desplazarse por todo el edificio.

Finalmente, el Meetings Assistant le permite a usted hacer una reserva directamente, como lo hace habitualmente, para crear invitaciones desde otras herramientas.

¿Cuál es el impacto en el negocio esperado?

Es difícil de estimar, pero lo intentaremos: Estimamos que uno de cada cuatro empleados de XING agenda reuniones en forma regular. Asumiremos que tres reuniones por semana lo que conlleva 10 minutos por reunión a programar. Pensamos que el asistente reduce el tiempo de programación al menos a un 50%. Basados en aproximadamente 1500 empleados, Podemos hacer un cálculo conservador:

(.25*1.500) empleados*3 reuniones *4.34 semanas de trabajo mensuales*10 min*50%= aprox. 400 horas de trabajo ahorradas cada mes = ~ 400 working-hours saved every month ?

Este es un buen aspecto, pero pensamos que el valor real es la sonrisa de nuestros colegas que pueden programar reuniones al instante.

La interfaz de usuario

El frente de la UI (interfaz de usuario) fue construida de acuerdo a un borrador y basado en Bootstrap 4 + jQuery. Tenía que realizar tres tares esenciales para el usuario:

  1. Ingresar a los participantes y a sus limitaciones de tiempo.
  2. Elegir una sugerencia
  3. Enviar la invitación a la reunión.

Veamos cómo se ve el flujo de trabajo:

Ingresar a los participantes y a sus limitaciones de tiempos

Get-A-Room Meeting Assistant — 1er Paso

Lo primero que los usuarios tienen que hacer es ingresar es quiénes son y dónde están ubicados. Esta información se guarda en el almacenamiento del buscador local. Como veremos más adelante, el algoritmo usa la información de la ubicación para ordenar las salas de reuniones mientras que el nombre del usuario se usa para incluir la reserva de reunión en su agenda e invitar a los participantes.

El paso siguiente es ingresar a todos los participantes. Afortunadamente, proveemos a nuestros usuarios con un auto llenado de todos los nombres de los colegas vía nuestro LDAP API interno.

Además, los usuarios tienen que especificar la duración de la reunión y si necesitarán una sala reunión, en qué lugares y pisos para buscarlas, y si la sala tiene que tener asientos y hardware de video conferencia. Luego los horarios de trabajo pueden definirse y bloquear horas de almuerzo. El usuario también puede cambiar el período de búsqueda predeterminado de 14 días.

Una vez que todo está listo, el usuario puede activar la búsqueda.

Tenemos algunas coincidencias, elija una sugerencia

Get-A-Room Meeting Assistant — 2do Paso

Se presentan los espacios de tiempo disponibles a los usuarios. Por ej., una lista de combinaciones de tiempos/lugares agrupadas por su horario de inicio. Los usuarios pueden seleccionar un tiempo y cambiar la sala predeterminada, por ej., si prefieren una sala más grande que está más lejos.

La selección de una combinación de tiempo/lugar actualiza la vista de la línea de tiempo de abajo. Esto brinda valor adicional a los usuarios ya que podrán ver si los otros participantes tienen otras reuniones cerca de las sugeridas, dándoles la oportunidad de tratar de encontrar otro espacio de tiempo que sea menos estresante para los asistentes.

Envío de la invitación a una reunión

Get-A-Room Meeting Assistant — 3er Paso

Ahora, los usuarios podrán ingresar un título de la reunión junto con una clave y una descripción detallada para la invitación. Clickeando “Book me a meeting!” guarda la reunión en la agenda del usuario e invita a todos los participantes. ¡Hecho!

El algoritmo detrás de los escenarios

¿Qué es lo que pasa en el fondo? El problema de la planificación horaria es conocido en la informática, y hay varios conceptos teóricos e implementaciones prácticas para esto. Como el tiempo era limitado, decidimos adoptar un enfoque naive que probablemente no es el ideal en lo referido al consumo de memoria y eficiencia, pero que sí funcionó bastante bien. Veamos cómo trabaja:

Crear una timeline

Decidimos comenzar con una representación de objeto interno llamado timeline (linea de tiempo). Una timeline representa todo el tiempo en que queremos poder buscar un momento de reunión.

El timeline está separado en muchos intervalos pequeños llamados ticks, el tamaño de estos intervalos se llama resolution. El asistente de reuniones trabaja con una resolution predeterminada de 5 minutos y un período de búsqueda de 14 días. Entonces, por cada 5 minutos en el período de búsqueda de 14 días, hay una variedad de elementos en esta timeline que retiene el estado para estos intervalos de 5 minutos, los ticks. Los posibles estados son libre, ocupado, tentativo y fuera de la oficina. Para simplificar, el período de búsqueda en este ejemplo es dos días y la resolución una hora.

Agregar horas no laborables como “ocupada”

El próximo paso es bloquear las horas no laborables en nuestro timeline para asegurarnos de no recibir ninguna sugerencia de reunión fuera del horario laboral:

Agregar tiempos ocupados para todos los participantes

Ahora es tiempo de asegurarnos que sabemos de la disponibilidad de todos los participantes para todo el período de búsqueda. Obtenemos esta información vía el Microsoft Exchange SOAP API de nuestra organización. El algoritmo revisa la disponibilidad de todos los participantes y las combina en una única timeline:

Esto resulta en un único timeline que respeta los horarios de cada participante. Los espacios libres en el timeline son oportunidades para reunirse.

Superposición de salas disponibles

Ahora podemos identificar fácilmente cuándo cada uno está disponible, pero todavía no tenemos una sala. El próximo paso es la revisión de todas las salas de reunión que coinciden con nuestros criterios de búsqueda. Aquí, crearemos una copia del timeline de arriba y agregaremos las reuniones existentes para una sala en particular como períodos de tiempo ocupado.

El resultado es un timeline que muestra las disponibilidades de los participantes y las salas para cada una de ellas.

Identificar candidatos

Lo siguiente, es buscar en los timelines los espacios libres que cubran como mínimo la duración de nuestra reunión.

Luego, guardamos estos candidatos en una lista que queda sujeta a algo de procesamiento posterior:

Ordenamiento de sugerencias

Aplicamos algo de procesamiento posterior para proveer el mejor valor basado en los datos recolectados por el algoritmo:

  1. Agrupamiento de las sugerencias de tiempo/lugar por hora de comienzo
  2. Ordenamiento de los valores de tiempo en forma ascendente
  3. Clasificación de sugerencias similares:
    Dada la resolución de 5 minutos, vemos sugerencias que se superponen, ej. para comenzar a las 11.00, 11.05, 11.10.etc. Esas sugerencias tienen poca relevancia para nuestros usuarios, es por eso que las ordenamos hacia el final de la lista y dejamos la primera en su posición original.
  4. Ordenamiento de las sugerencias de sala por distancia al escritorio del usuario.

Entregamos hasta 18 sugerencias al usuario, pero solo las primeras 6 son mostradas por defecto.

¿Qué sigue?

En nuestro próximo Hackweek, quisiéramos continuar trabajando en el asistente con los comentarios positivos y las ideas que hemos recibido. Esto está primero en la lista de cosas por hacer:

  • Posibilitar hacer participantes opcionales
  • Agregar listas internas de correo para evitar tener que tipear a todos los participantes en forma manual
  • Soporte para programar reuniones recurrentes:
  • La programación de reuniones recurrentes es el próximo gran engorro que requiere una solución simple. Actualmente es difícil agendar una reunión con una sala que esté disponible para cada recurrencia.  Es por eso que necesitará buscar manualmente una sala alternativa para cada reunión cuando la original no está disponible. Queremos que el asistente agilice este proceso.