Una solución para cada problema

 

No existe una solución genérica que sea la mejor para todo tipo de situación. Cada escenario, cada situación tiene su propia solución más efectiva.

Hallar esa solución requiere una combinación de conocimiento, análisis y destreza a la hora de identificar los detalles del escenario y cuál de las posibles soluciones se adapta mejor a ese caso.

Para ilustrar esto, vamos a centrarnos en un problema concreto: la inserción registros en una tabla de una base de datos.

 

Definición del escenario

Nuestro objetivo es insertar registros en una tabla de base de datos.

Ante estos requerimientos debemos analizar con más detalle el escenario. Deberíamos plantearnos cuestiones como:

  • ¿De cuántos registros estamos hablando?
  • ¿De cuánto tiempo disponemos para realizar esa inserción?

Es evidente que insertar 1 registro o 50 millones es importante a la hora de definir el escenario.

En el caso de la inserción de un solo registro, el rendimiento (en la mayoría de procesos) no va a ser crítico, ya que la diferencia de ejecución de las diferentes alternativas de inserción posiblemente será imperceptible por el usuario.

Sin embargo, si el número de registros es elevado, una pequeña diferencia de tiempo por registro puede convertirse en una gran diferencia al final del proceso. Si la ventana para la realización de la inserción es corta, elegir la alternativa más lenta podría ser fatal para el proceso o sus procesos dependientes.

Conocimiento de la tecnología y los procesos

Supongamos que nuestra base de datos es Oracle. Esta tecnología tiene dos maneras diferentes de realizar inserciones:

  • La inserción registro a registro
  • La inserción multi-registro (bulk insert)

La inserción registro a registro inserta 1 único registro cada vez que se ejecuta. Su sintaxis en Oracle es:

INSERT INTO tabla (columna_1, columna_2, …) VALUES (valor_1, valor_2, …);

Cada una de estas inserciones se divide en dos tareas. La primera se ocupa de encontrar la posición dentro de la tabla dónde vamos a insertar esa fila. La segunda tarea se ocupa de insertar los datos en esa posición.

Por otra parte, al ejecutar un bulk insert, una sola instrucción insertará un número de registros que puede ser superior a 1.

Las instrucciones que utilizan bulk insert son:

INSERT INTO tabla (columna_1, columna_2, …) SELECT ...
CREATE TABLE tabla AS SELECT ...
SQL*Loader

Ante la necesidad de insertar potencialmente más de una fila, la búsqueda de una ubicación para los registros carece de sentido. Si fuese así, la inserción tendría un alto coste debido a la repetición de la primera tarea de la inserción para cada uno de los registros de la consulta. En este caso, lo que el motor de base de datos lleva a cabo es la inserción de todos los registros implicados, a partir de la última posición de la tabla.

Implicaciones de los dos métodos de inserción

La inserción registro a registro permite aprovechar mejor el espacio ocupado por la tabla, al ocupar espacio libre dentro de ésta (producido por la eliminación de registros de la tabla). Es decir, tenemos una mayor densidad de registros por espacio de disco (throughput). Este mejor aprovechamiento del espacio supone que, en un acceso secuencial a la tabla, el espacio de disco a escanear tiende a ser óptimo. Esto supone un mejor rendimiento en las consultas donde esta tabla sea accedida en modo secuencial. Sin embargo, la operación de inserción añade un sobrecoste debido a la búsqueda de un espacio libre en la tabla en cada instrucción (es decir, para cada registro insertado).

La inserción multi-registro tan solo realiza la acción de añadir filas a la tabla (sin buscar un espacio libre para cada registro insertado). Esto se realiza añadiendo los registros a partir de la última posición en la tabla a la cual podemos acceder mediante un puntero, . Al hacer esto, el sobrecoste de encontrar un espacio libre en la tabla desaparece. Sin embargo, el hecho de añadir registros siempre al final de la tabla significa que está crecerá cada vez que ejecutemos una inserción de este tipo. La consecuencia es que, en el caso de acceder a todos los registros de la tabla en una consulta, estaremos accediendo a una cantidad cada vez mayor de espacio en disco. En este caso, el throughput disminuirá progresivamente en la tabla a medida que vayamos realizando inserciones multi-registro.

Conclusión

Tal y como he comentado al inicio de este artículo, no existe una solución que se comporte siempre de manera óptima en todos los casos.

Es necesario identificar los detalles específicos de cada escenario que decantarán la decisión de utilizar una u otra solución.

El análisis previo al diseño de la solución nos aportará la información que necesitamos para poder elegir el diseño más adecuado en cada caso.

El conocimiento de la tecnología nos permitirá identificar las diferentes alternativas de diseño con sus beneficios e inconvenientes.

Y finalmente, la destreza a la hora de combinar toda la información disponible nos permitirá elegir la mejor solución dentro de toda la gama de grises disponible.

Analytics: Un juego de niños

 

A menudo me encuentro con personas en las empresas que dicen no tener datos suficientes para iniciar un proyecto de Data Analytics para la mejora de la toma de decisiones.

(… Sin comentarios)

Hoy os quiero presentar un caso basado en mi propia experiencia, para ilustrar como hasta los niños son capaces de obtener datos para así analizar sus actos y poder mejorar su rendimiento.

Escenario

El baloncesto, como cualquier otro deporte, nos da la oportunidad de capturar muchos datos. En las ligas profesionales, existe todo un ejército de personas dedicadas a la captura de estos datos, bien a través de tecnología sofisticada (como el posicionamiento de los jugadores y el balón a través de cámaras), bien manualmente (otorgar una asistencia a un jugador depende en cierto modo del criterio de una persona).

Durante un par de años tuve el privilegio de poder ejercer de entrenador asistente en equipos de categorías inferiores. Al asumir ese cargo, brotó en mí una idea: ¿Y si pudiéramos mejorar el rendimiento del equipo a partir del análisis de los datos obtenidos durante los partidos?

Desde el punto de vista de recolección de datos, solamente estaba yo para poder realizar esa tarea. Y lo cierto es que durante los partidos, un entrenador asistente tiene que estar atento a un sinfín de cosas para poder ayudar al entrenador principal. Por tanto, mi gozo en un pozo. Sin embargo, en algunos partidos sí que pude obtener algunos datos. Datos que terminaron convirtiéndose en información muy valiosa.

De los datos a la toma de decisión

La sensación es que el equipo tenía un gran problema: Perdíamos muchos balones. Pero, ¿realmente perdíamos tantos balones? Decidí hacer un estudio en base a los cuatro siguientes partidos.

Los datos que capturé durante esos partidos fueron:

  • Número de posesiones
  • Número de balones perdidos

De esta manera, pude obtener un porcentaje de balones perdidos.

El método de recolección de datos fue realmente «alta tecnología». Utilicé el método clásico de papel, lápiz y palitos.

Hay que tener en cuenta que, dependiendo del ritmo del partido, podíamos oscilar entre 70 y 100 posesiones por partido. Por tanto, el número de pérdidas era susceptible de una gran variabilidad.

Los resultados arrojaron un dato demoledor: El equipo perdía el balón en el 68% de las posesiones.

El trabajo que se hizo con esta información fue doble:

  • A nivel de entrenamientos se tomó la decisión de trabajar tanto la técnica como la táctica para minimizar las pérdidas.
  • A nivel de cada jugador, hubo una concienciación del problema con los balones perdidos, lo cual supuso un aumento de la concentración y la responsabilidad de los jugadores para minimizar ese número (esa fue la toma de decisión que los propios jugadores decidieron llevar a cabo).

Los resultados de los tres próximos partidos fueron demoledores. Por citar los dos más importantes:

  • Las pérdidas se redujeron al 47% de las posesiones.
  • El porcentaje de pérdidas en cada uno de esos tres partidos fue significativamente inferior al porcentaje de pérdidas mínimo de los cuatro partidos de la muestra inicial.

Querer es poder

Si un equipo de baloncesto integrado por niños es capaz de tomar decisiones para cambiar sus procesos a partir de cuatro palitos mal puestos en una hoja de papel, ¿qué puede llegar a hacer una organización en pleno siglo XXI?

Lo más importante a la hora de embarcarse en un proyecto de Data Analytics no es disponer de datos. La experiencia me dice que lo más importante es la actitud. El deseo de obtener datos y poderlos convertir en conocimiento para mejorar la toma de decisiones es lo que permite a las organizaciones avanzar en su camino hacia la toma inteligente de decisiones.

Es por eso que es tan importante que las personas que toman decisiones, los verdaderos sponsors del proyecto, estén convencidas de la necesidad de dar ese paso. Solamente de esta manera podrán generar un cambio en la cultura de la organización para la aceptación de este nuevo modelo de toma de decisiones.

Conclusión

Toda actividad es medible.

La recolección de datos siempre es posible… si hay voluntad para ello.

Cualquier persona de cualquier edad (incluidos niños de un equipo de baloncesto de nivel muy bajo) puede tomar decisiones de manera inteligente a partir de datos que aporten valor.

La existencia de sponsors fuertes convencidos de la necesidad de un cambio en la cultura de las organizaciones es clave para el éxito de los proyectos de Data Analytics.

Customización vs. Mantenibilidad

 

Toda solución analítica tiene como objetivo satisfacer los requerimientos de obtención de información de los usuarios para la toma de decisiones. Sin embargo, este no es el único objetivo a tener en cuenta. Existen otras cuestiones que debemos tener en cuenta y que son tan o más importantes que el mero hecho de satisfacer los requerimientos de los usuarios.

Uno de ellos es la mantenibilidad de la solución tecnológica, tal y como se indica en el artículo «Calidad en un sistema de BI – Un beneficio para todo«. En este artículo se plantea el conflicto entre estos dos objetivos.

 

Satisfacción del usuario

La importancia de satisfacer al usuario va más allá del mero hecho de que la solución tecnológica cumpla con los requerimientos.

Un proyecto que no dé al usuario aquello que necesita, es un proyecto que no será utilizado por el usuario. Y por tanto, un fracaso rotundo. De ahí la importancia de satisfacer los requerimientos de usuario.

No obstante, debemos plantearnos siempre la necesidad real de ese requerimiento si no queremos estar altamente condicionados por los requerimientos. Es decir, el mero hecho de que un usuario indique que algo es importante no significa que realmente lo sea. Una lista de deseos del usuario no es motivo suficiente para hipotecar otros objetivos de un proyecto que pueden ser tan o más importantes que los requerimientos de usuario.

En el caso de una solución analítica genérica, podemos aplicar customizaciones para satisfacer algunos requerimientos de usuario concretos. Pero, ¿cómo afectaría esto al proyecto en el futuro?

Mantenibilidad

Un proyecto tecnológico no se acaba en el momento en que éste se entrega. Después de poner el proyecto a disponibilidad de los usuarios, empieza la fase de mantenimiento.

En esta fase, hay que realizar tareas correctivas y evolutivas que requieren la modificación de la solución tecnológica. Estas modificaciones tienen un coste que se cuantifica en términos de mano de obra y a la postre en un coste económico.

La mantenibilidad indica el grado de facilidad del mantenimiento de una solución. A mayor grado de mantenibilidad, menor coste de mantenimiento. Por tanto, es muy importante mantener un grado de mantenibilidad alto. De esta manera, conseguimos reducir el coste de las tareas de mantenimiento, tanto correctivo como evolutivo. Y debemos tener en cuenta que esta fase acaba siendo la que se dilata más en el tiempo, por muy largo que haya sido el periodo de desarrollo de un proyecto.

Conflicto entre objetivos

La mantenibilidad está reñida con otros objetivos de todo proyecto informático como pueden ser la eficiencia y la satisfacción completa de los requerimientos de usuario.

Un ejemplo clásico de requerimiento de usuario en una solución analítica es el de la construcción de un informe que obtenga una información concreta en el mínimo tiempo posible.

Ante este requerimiento es importante plantearse un par de cuestiones:

  • ¿Es posible reducir el tiempo de ejecución de una consulta concreta creada por una solución analítica genérica? Las consultas creadas a partir de soluciones genéricas suelen no ofrecer el mejor rendimiento posible, ya que una solución a medida estará más ajustada. Por tanto, sí es posible reducir el tiempo de consulta.
  • ¿Cuál es el tiempo máximo que un usuario puede esperar para tener la información que obtiene de la consulta, que le permitirá tomar una decisión con valor para su organización? Esta respuesta la tiene que proporcionar el usuario. Lo que sucede a menudo es que el tiempo máximo que pide el usuario no es para la toma de decisiones sin pérdida de la oportunidad de la información, sino que responde al tiempo máximo que el usuario quiere esperar delante de la pantalla a obtener los resultados.

Ante estas dos cuestiones, debemos valorar qué es más importante: Ofrecer una respuesta rápida al usuario (reduciendo el grado de mantenibilidad de la solución analítica) o mantener un grado de mantenibilidad alto en nuestra solución (aunque ello implique la no satisfacción del usuario).

Mi opinión es que, dentro de lo que sea posible, se debe hacer un esfuerzo por mantener el grado de mantenibilidad de una solución analítica, intentando minimizar las customizaciones. Para ello es muy importante comunicar correctamente los objetivos tanto a los usuarios como a los sponsors del proyecto (para buscar su apoyo en la mediación con los usuarios). De esta manera conseguiremos contener el coste de mantenimiento de la solución analítica, que no deja de ser otro objetivo clave.

Conclusión

La satisfacción de los requerimientos de usuario es uno de los objetivos primordiales en todo proyecto de creación de una solución analítica, aunque no el único.

Mantener un grado de mantenibilidad alto permite reducir los costes en la fase de mantenimiento de un proyecto. Y reducir los costes es un objetivo de vital importancia.

Existen conflictos entre objetivos, como puede ser entre la satisfacción de los requerimientos de usuario y la mantenibilidad de una solución.

La comunicación efectiva de los objetivos a sponsors y usuarios nos permite negociar las posibles situaciones de conflictos entre objetivos.