Buenas prácticas sobre DevOps

Buenas prácticas sobre DevOps

En nuestro artículo anterior, “Puntos clave sobre DevOps” conversamos sobre qué es DevOps y cómo puede ayudarte a optimizar elementos clave en tu empresa, como acortar tiempos de lanzamiento, acelerar la realización de nuevos productos y servicios y reducir costos. En este artículo conoceremos más sobre unas buenas prácticas para empezar a implementar esto a la brevedad posible.

Haciendo un breve repaso, DevOps se refiere a las palabras ‘Desarrollo’ y ‘Operaciones’, se trata de una disciplina que, a pesar de ser relativamente reciente, ha permitido que muchas empresas y organizaciones puedan replantear sus procesos por otros más eficientes y ágiles, logrando aumentar su competitividad y eficiencia.

Buenas prácticas sobre DevOps
A ciencia cierta, existen incontables beneficios sobre la implementación de esta metodología, teniendo en cuenta que esta no implica una mejora en lo que respecta la tecnología o productividad en sí misma, sino que permite agilizar el nivel de comunicación y colaboración entre los departamentos para óptimas ejecuciones de operaciones, tiempo y calidad de entrega.

Adoptar este nuevo proceso no ocurre de la noche a la mañana, y los resultados esperados podrían verse afectados negativamente si la empresa realiza una implementación ineficaz.

En Huenei usamos esta metodología para aumentar la efectividad de nuestros equipos de desarrollo de software, así como en mejorar la calidad de las constantes entregas en Software a Medida, Aplicaciones Móviles, involucrándola en los procesos de Testing & QA y UX/UI. Por lo que recomendamos seguir estas prácticas:

1 – Proceso continuo de integración (PCI)
Este proceso se sustenta fuertemente en las metodologías ágiles, su principio es el de reducir los tiempos de implementación y despliegue (deployment), logrando en dividir en más partes un proyecto, realizando entregas paulatinas.

¿En qué podrían ayudar? Como el equipo de desarrolladores constantemente revisa los cambios en el código del repositorio, pueden detectar más rápidamente cualquier tipo de falla e incluso, mejorar constantemente la ejecución de la operación. Son estos hallazgos tempranos en el ciclo de vida del software los que ayudarán al departamento de desarrollo a resolver problemas casi en el acto (e incluso, prevenirlos).

2 – Entrega continua
Podría decirse que este paso acompaña al anterior, ya que, al comenzar con el desarrollo, la construcción, las pruebas unitarias, el análisis de código estático y las pruebas de seguridad del análisis estático en el PCI, promueve una automatización de pruebas funcionales, de integración, de rendimiento y de seguridad, junto con la administración y la implementación de la configuración.

Como estas últimas son áreas críticas para la automatización y, en un contexto de DevOps, son esenciales, es un tipo de práctica que aumenta la cantidad de pruebas y verificaciones en las distintas etapas en ciclos manuales y automatizados del código.

Además de permitir a un equipo el construir, testear y lanzar la base de código de una forma rápida y con mayor frecuencia, que al dividirlo en ciclos de menor tamaño y duración, acelera los procesos de las organizaciones, permitiendo que puedan realizar más lanzamientos, reducir despliegues manuales y disminuir los riesgos de fallas en producción.

3 – Gestión en la comunicación
Elemento clave en la gestión DevOps, ya que tiene como foco el mantener informada a todas las partes interesadas relacionadas con el desarrollo, la operación y la implementación, teniendo en cuenta de que estamos integrando las tareas de distintos departamentos. Por ende, la comunicación es imprescindible y se vuelve un elemento fundamental para una total adopción, manteniendo a todos en la misma página para involucrarlos en todo el proceso, estar al día con la organización y evitar dudas entre ellas o los productos finales.

Para aplicar la estrategia correctamente, es vital mantener a todos los equipos y miembros al tanto, de esa forma se garantiza que los líderes de la organización (desde los departamentos de ventas, producción y gerencia) se puedan involucrar en los proceso y guíen al equipo de desarrollo a realizar los cambios exitosos, desde sus perspectivas y conocimientos.

4 – Automatización de pruebas
En el desarrollo de software, la realización de pruebas periódicas es imprescindible para crear código de calidad, lo cual es algo vital para implementarlo en una gestión de DevOps, no solo porque se ahorra tiempo al realizar rápidamente tareas tediosas y lentas, sino porque permite identificar rápidamente fallas tempranas en los procesos previos al despliegue.

Este es en sí el núcleo de la agilidad y la innovación, ya que el tiempo adicional que tendrán los miembros del equipo puede ser invertido en tareas de mayor valor agregado o en monitorear los resultados de los nuevos procesos, identificando fallas y oportunidades de mejora.

5 – Monitoreo continuo
Como todo cambio cultural y de procesos de trabajo, este requiere un monitoreo cercano y continuo para prever e identificar que todas las acciones se estén realizando correctamente y que el desempeño es el esperado.

La entrega continua de los comentarios de todos los miembros de la organización en tiempo real es vital para la organización; desde el equipo de producción que ejecutar la aplicación hasta el cliente final en la etapa de lanzamiento oficial. De esta manera, logramos que el desarrollador pueda beneficiarse de todos los comentarios valiosos sobre la experiencia del usuario final en el proceso y a su vez, modificar el código para cumplir con las expectativas del usuario final.

Conclusiones
Con un entorno empresarial en constante evolución y un panorama tecnológico en continua mejora y crecimiento, las organizaciones deben buscar mantenerse a la vanguardia, con DevOps pueden aumentar la velocidad y la calidad de las implementaciones de software al mejorar la comunicación y la colaboración entre las partes interesadas.

En sí, estas buenas prácticas permiten crear una guía clara para orientar a cualquier compañía, de cualquier tamaño e industria, a sumergirse en el cambio cultural necesario, logrando aumentar la productividad y eficiencia a través de entregas de alta calidad, sumando transparencia a sus procesos y colaboración abierta a través de equipos de desarrollo y operaciones.

Si querés conocer más sobre nuestros procesos, te invitamos a visitar nuestra página sobre Software Development.

Frameworks y librerías aceleradas por Hardware con FPGAs

Frameworks y librerías aceleradas por Hardware con FPGAs

Introducción
En los artículos anteriores, hablamos sobre la Aceleración por Hardware con FPGAs, los Conceptos clave tras la Aceleración que proveen y las Aplicaciones de la Aceleración por Hardware. En esta última entrega de la serie, nos enfocaremos en Librerías y Frameworks acelerados por Hardware con FPGAs, lo que implica cero cambios en el código de una aplicación. Haremos un repaso por distintas alternativas disponibles, para aplicaciones de Machine y Deep Learning, Procesamiento de Imágenes y Video, así como también de Bases de Datos.

Opciones para el desarrollo con FPGAs
Históricamente, el trabajo con FPGAs siempre estuvo asociado a la necesidad de un desarrollador de Hardware, principalmente Ingenieros Electrónicos, y la utilización de herramientas y Lenguajes de Descripción de Hardware (HDL del inglés), como lo son VHDL y Verilog (del tipo concurrentes en lugar de secuenciales), muy distintas a las utilizadas en el ámbito de desarrollo de Software. En los últimos años, apareció un nuevo tipo de aplicación, aceleración en los centros de datos, que apunta a disminuir la brecha entre los dominios del Hardware y el Software, para los casos de algoritmos computacionalmente demandantes, con procesamiento de grandes volúmenes de datos.

Aplicando niveles de abstracción, reemplazando los HDL típicos por un subset de C/C++ combinado con OpenCL, se llevó el desarrollo a un ambiente más familiar para un desarrollador de Software. Así, se proveen bloques básicos (primitivas), para aplicaciones Matemáticas, Estadísticas, de Álgebra Lineal y Procesamiento de Señales Digitales (DSP del inglés). No obstante, esta alternativa sigue precisando un conocimiento profundo del Hardware involucrado, para lograr aceleraciones significativas y mayor performance.

En segundo lugar, existen librerías aceleradas de dominios específicos, para soluciones de Finanzas, Bases de Datos, procesamiento de Imagen y Video, Compresión de Datos, Seguridad, etc. Las mismas son del tipo plug-and-play y pueden ser invocadas directamente con una API desde nuestras aplicaciones, escritas en C/C++ o Python, requiriendo el reemplazo de librerías “comunes” por versiones aceleradas.

Finalmente, describiremos las principales en este artículo, existen librerías y frameworks de código abierto, que fueron aceleradas por terceros. Esto nos permite, generalmente ejecutando una o varias instancias Docker (on-premise o en la nube), acelerar aplicaciones del Machine Learning, procesamiento de Imágenes y Bases de datos, entre otras, sin necesidad de cambiar el código de nuestra aplicación.

Machine Learning
Sin dudas, uno de los avances tecnológicos más disruptivos de los últimos años ha sido Machine Learning. La aceleración por hardware aporta muchos beneficios, por el alto nivel de paralelismo y el enorme número de operaciones matriciales necesarias. Los mismos se aprecian tanto en la fase de entrenamiento del modelo (reduciendo tiempos de días a horas o minutos), como en la fase de inferencia, posibilitando aplicaciones en tiempo real.

A continuación un pequeño listado de las opciones aceleradas disponibles:
 
tensor flor logo
TensorFlow es una plataforma para construir y entrenar redes neuronales, usando grafos. Creada por Google, es uno de los frameworks líderes en Deep Learning.
 

Keras es una API de alto nivel para redes neuronales escrita en Python. Funciona solo ó como interfaz de frameworks como TensorFlow (con quien suele usarse) o Theano. Fue desarrollado para facilitar un proceso de experimentación rápida, brinda una curva de aprendizaje muy suave.
 

PyTorch es una librería Python diseñada para realizar cálculos numéricos vía programación de tensores. Centrado principalmente en el desarrollo de redes neuronales.
 

Framework de Deep Learning destacado por su escalabilidad, modularidad y procesamiento de datos de alta velocidad.
 

Scikit-learn es una librería para matemáticas, ciencias e ingeniería. Incluye módulos para estadísticas, optimización, integrales, álgebra lineal, procesamiento de señales e imágenes, y mucho más. Depende de Numpy, para la manipulación rápida de matrices N-dimensionales.
 

XGBoost (Extreme Gradient Boosting), es una de las librerías de ML más utilizadas, muy eficiente, flexible y portátil.
 

Spark MLlib es la librería de ML de Apache Spark, con algoritmos escalados y paralelizados, aprovechando la potencia de Spark. Incluye los algoritmos de ML más comunes: Clasificación, Regresión, Clustering, Filtros Colaborativos, Reducción de Dimensiones, Árboles de Decisión y Recomendación. Puede procesar por lotes y por streaming. También permite construir, evaluar y ajustar Pipelines de ML.
 
Procesamiento de Imagen y Video
El Procesamiento de Imagen y Video es otra de las áreas más beneficiadas de la aceleración por hardware, posibilitando trabajar en tiempo real en tareas como transcodificación de video, transmisión en vivo y procesamiento de imágenes. Combinado con Deep Learning, es muy utilizado en aplicaciones como diagnósticos médicos, reconocimiento facial, vehículos autónomos, tiendas inteligentes, etc.


La librería para Visión por Computador y Procesamiento de Imagen y Video más importante es OpenCV, de código abierto, con más de 2500 funciones disponibles. Existe una versión acelerada de sus principales métodos, sumando más versión tras versión.


Para el Procesamiento de Video, en tareas como Transcodificación, Encoding, Decoding y filtrado, FFmpeg es de las herramienta más utilizada. Existen plugins acelerados, para por ejemplo la decodificación y codificación de H.264 y otros formatos. Además, soporta el desarrollo de plugins acelerados propios.

Bases de datos y analíticas
Las Bases de datos y Analíticas reciben cargas de trabajo cada vez más complejas, debido principalmente a los avances en Machine Learning, lo que obliga a una evolución del Centro de Datos. La aceleración por Hardware aporta soluciones al cómputo (por ejemplo con motores de bases de datos que funcionan, por lo menos, desde 3 veces más rápidos) y al almacenamiento (vía discos SSD que incorporan FPGAs entre sus circuitos, con acceso directo al tratamiento de los datos). Algunas de las Bases de Datos aceleradas, o en vías de estarlo, principalmente Open Source tanto SQL como NoSQL, son PostgreSQL, Mysql, Cassandra y MongoDb.

En estos casos, generalmente lo que se acelera son los algoritmos de bajo nivel más complejos, como la compresión de los datos, la compactación, aspectos relacionados al networking, el storage y la integración con el medio de almacenamiento. Las aceleraciones reportadas se encuentran en el orden de 3 a 10 veces más rápidas, que comparadas a mejoras de hasta 1500 veces en algoritmos de ML pueden parecer poco, pero son muy importantes por la reducción de los costos asociados al centro de datos.

Conclusiones
A lo largo de esta serie de 4 artículos, conocimos que es una FPGA a nivel dispositivo, como es que se logra la aceleración, cuando estamos en presencia de un posible caso qué les saque provecho (algoritmos computacionalmente complejos, con grandes volúmenes de datos). Casos generales de su aplicación y soluciones particulares, listas para usar sin cambios de código.
¿Cómo puede Huenei ayudar a tu negocio con Aceleración por Hardware con FPGAs?


Infraestructura: Definición, adquisición y puesta en marcha (Cloud & On-promise).


Consultoría: Asesoría y despliegue de frameworks disponibles, para obtener aceleración sin cambios en el código.


Desarrollo: Adaptación de software existente mediante el uso de librerías aceleradas, para aumentar su rendimiento.

Mejores prácticas en Microservicios

Mejores prácticas en Microservicios

La arquitectura de microservicios, o simplemente microservicios, es un método distintivo de desarrollo móvil y de sistemas de software que trata de enfocarse en construir módulos de una sola función con interfaces y operaciones bien definidas, es por eso que se considera una tendencia que podría beneficiar a muchas empresa ya que se orienta a brindar servicios y está compuesta de elementos acoplados libremente que tienen contextos delimitados.

El término de “acoplado libremente” significa que se puede actualizar los servicios de forma independiente, esta actualización no requiere cambiar ningún otro servicio. De hecho, si tienes un montón de servicios pequeños y especializados pero para realizar un cambio en ellos debes actualizarlos juntos, entonces no puede llamarse arquitectura de microservicios, ya que no se encuentran acoplados de manera flexible.

En otras palabras, son un patrón arquitectónico granular que separa partes de una aplicación en pequeños servicios independientes, además, en el desarrollo móvil y de software es un estilo arquitectónico que estructura una aplicación como una colección de servicios que se soporta y comprueba constantemente, débilmente acoplado y desplegable independientemente.

Además de ser organizado en torno a las capacidades empresariales y de sus múltiples beneficios, se cree que el 90% de todas las aplicaciones nuevas contarán con una arquitectura de microservicios para mejorar la capacidad de diseñar, depurar, actualizar y aprovechar el código de terceros.

Este pronóstico no es del todo sorprendente, ya que esta arquitectura es ventajosa por su entrega continua, escalabilidad, sencillo mantenimiento, disminución de riesgos y mayor productividad a través de la automatización.
Sin embargo, estos beneficios solo se pueden aprovechar si el estilo arquitectónico se adopta adecuadamente con las herramientas y elementos correctos. Sin más que agregar, analicemos cuáles son las mejores prácticas:

1) Crea un almacén de datos separado para cada microservicio
Primero que nada, no uses el mismo almacén de datos para el backend cuando quieras implementarla o realizar la transición a este tipo de arquitectura.
Para ello, permite que el equipo de cada microservicio elija la base de datos que mejor se adapte al servicio y que pueda ser almacenada en un único espacio de datos, esto permite la escritura de diferentes equipos y que estos, puedan compartir estructuras de bases de datos, reduciendo así la duplicación de trabajo.

Mantener los datos separados puede hacer que la administración de datos sea más complicada, porque los sistemas de almacenamiento separados pueden tener errores o ralentizarse en los momentos de sincronización, volviéndose inconsistentes y limitando la escalabilidad.

2) Mantén el código en un nivel de madurez similar
Esta práctica recomienda mantener todo el código a un nivel similar de madurez y estabilidad, es decir, si necesita agregar o reescribir parte del código en este tipo de arquitectura implementada que funciona bien, el mejor enfoque suele ser crear un nuevo microservicio para el código nuevo o modificado, dejando el microservicio existente en su lugar.

De esta forma, puedes implementar y probar de forma repetida el nuevo código hasta que esté libre de errores y sea lo más eficiente posible, sin riesgo de fallas o degradación del rendimiento en el microservicio existente, este proceso se conoce como el principio de infraestructura inmutable.
Permitiendo así, luego de verificar que este nuevo microservicio es tan estable como el original, fusionarlos nuevamente si realmente realizan una sola función en conjunto, o si hay otras eficiencias al combinarlos.

3) Hacer una compilación separada para cada microservicio
Esta es una de las mejores prácticas recomendadas al momento de diseñar una arquitectura este tipo para el desarrollo móvil o de software, ya que insta la realización de una compilación por separado para cada microservicio, de modo que puedas extraer archivos de componentes del repositorio en los niveles de revisión apropiados para él.

Esto a veces conduce a la situación en la que varios de este tipo extraen un conjunto similar de archivos, pero a diferentes niveles de revisión, eso puede hacer que sea más difícil limpiar la base de código retirando versiones antiguas de archivos (porque debes verificar con más cuidado que ya no se está utilizando una revisión), pero eso es una compensación aceptable por lo fácil que es agregar nuevos archivos a medida que construyes nuevos microservicios.

4) Implementar en contenedores
La implementación de microservicios en contenedores es importante porque significa que solo necesitas una herramienta para implementarlo todo.
Mientras el microservicio esté en un contenedor, la herramienta sabe cómo implementarlo, sin importar cuál sea el contenedor.

5) Tratar a los servidores como miembros intercambiables
Esta práctica recomienda tratar a los servidores, particularmente aquellos que ejecutan código orientado al cliente, como miembros intercambiables de un grupo.
Es decir, todos realizan las mismas funciones, por lo que no necesitas preocuparse por ellos individualmente, tu única preocupación es que existan suficientes para producir la cantidad de trabajo que necesitas, y puede usar la escala automática para ajustar los números hacia arriba y hacia abajo.
De esa manera, si uno deja de funcionar, se reemplaza automáticamente por otro.

6) Usa ‘defensa en profundidad’ para priorizar servicios clave
Luego de identificar cuáles son tus servicios más sensibles, aplicas varias capas de seguridad diferentes para que un atacante potencial que pueda explotar una de sus capas de seguridad todavía tenga que encontrar una manera de vencer a todas sus otras defensas en tus servicios críticos.
En general, esto es más fácil decirlo que hacerlo, pero hay varios recursos disponibles, la buena noticia es que este tipo de arquitecturas facilitan la adopción de esta estrategia de una manera muy granular y estratégica, al enfocar sus esfuerzos y recursos de seguridad en microservicios específicos, aumentando la diversificación de las capas de seguridad que deseas adoptar en cada uno de ellos.

7) Usa actualizaciones de seguridad automáticas
Cada vez que se actualiza una parte de tu sistema, debes asegurarse de detectar cualquier problema lo suficientemente pronto y con el mayor detalle posible.
Para ello, implementa esta práctica para asegurarte de que tu plataforma sea principalmente “atómica”, es decir, todo debe estar envuelto en contenedores para que probar tu aplicación con una biblioteca actualizada o una versión de idioma sea solo una cuestión de envolver un contenedor diferente a su alrededor, así, si la operación falla, revertir todo será bastante fácil y, lo más importante, puede automatizarse.

Conclusiones
A diferencia de la arquitectura de monolito, diseñar e implementar microservicios de manera correcta puede llegar a ser algo desafiante y difícil, pero dado que brinda una solución descentralizada para diferentes problemas para el desarrollo móvil y desarrollo de software, definir el conjunto de mejores prácticas no solo es importante sino también crucial.

Así, no solo se crea un sistema sólido a prueba de balas sino también, se previenen un montón de desastres que podrían ser altamente contraproducentes.
En sí, como un microservicio es capaz de englobar la capacidad comercial central y al mismo tiempo, adherirse a los principios y objetivos de diseño fundamentales, este se convierte en un verdadero activo digital, no únicamente para el desarrollo móvil y de software sino porque también es idóneo para aportar valor a la empresa, pudiéndose usar con éxito en múltiples contextos y procesos, tanto transaccionales como comunicacionales.

Conocé más sobre nuestros procesos de Desarrollo Móvil en nuestra sección.

Guía para elaborar un User Story Mapping

Guía para elaborar un User Story Mapping

El User Story Mapping es un ejercicio visual que realizan a menudo los gerentes de producto y sus equipos de desarrollo de aplicaciones o desarrollo web para definir el trabajo que creará la experiencia de usuario más agradable, óptima y ágil.
En otras palabras, es un método de diseño de producto ágil y poderoso que sirve para crear un producto centrado en el usuario, es decir, son la ayuda visual para construir un entendimiento compartido entre los miembros de un proyecto de desarrollo web o de aplicaciones, para conocer cómo elaborar un proceso de diseño exitoso.

Este tipo de método se utiliza para mejorar la comprensión de los equipos de sus clientes y para priorizar el trabajo de todos los equipos de desarrollo, donde estos crean un esquema dinámico de las interacciones de un usuario representativo con el producto, evaluando qué pasos tienen el mayor beneficio para el usuario y priorizando lo que se debe construir a continuación.
En este caso, este proceso siempre comienza con la comprensión de un problema y al mismo tiempo, conociendo los objetivos del usuario, permitiendo dibujar de forma central los pasos que este usuario recorrerá para lograr sus objetivos y de esa manera, narrar un flujo narrativo natural del viaje del usuario para explorar toda la actividad del usuario fácilmente.

¿Todavía tenés dudas sobre este tema? Visitá nuestro artículo anterior “¿Qué es el User Story Mapping?”.

Elementos básicos de un User Story Mapping
Para conocer cómo elaborar un User Story Mapping, es importante saber cuáles son los elementos estructurales que organizan este tipo de diseño, es por eso que en Huenei IT Services primero te presentamos sus nombres y de esa manera, podrás comprender mejor cada uno de los pasos.

A continuación, los elementos básicos de este tipo de diseño, que, al organizarse en dos dimensiones, la vertical denota prioridad, mientras que la horizontal representa los pasos que un usuario toma para realizar acciones en el sistema, también conocido como viaje del usuario o Buyer’s journey en inglés, permiten una lectura sencilla y clara de la estructura general:

1) Columna vertebral (backbone)
En inglés la encontrarás como “Backbone” y esta es la base del mapa, consiste en épicas o temas que describen las actividades generales del usuario en el sistema, como por ejemplo “Buscar Productos”, en este caso, las epopeyas se organizan en un orden horizontal, ya que representan los pasos que toma un usuario mientras interactúa con el producto, que es básicamente una simple visualización del viaje del usuario.

Para entender mejor los conceptos de épicas y epopeyas dentro de esta estructura, es importante saber que la épica representa la Historia de Usuario de tamaño tan grande como para ser capaz de albergar varias historias y la epopeya se refiere a cuando se mantienen varias épicas en sí.

2) Historias de los Usuarios
También conocido como “Stories” y a diferencia de una estructura plana de backlog, las historias de los usuarios están organizadas en dimensiones verticales y horizontales.
En este caso, se agrupan en las épicas correspondientes, que describen tareas más específicas que un usuario puede requerir. Si una épica describe una fase de búsqueda, puede incluir historias como búsqueda básica, productos de filtrado, búsqueda avanzada, etc. Cuando las historias se priorizan verticalmente, se pueden dividir en lanzamientos.

3) Usuarios
Se refiere a las personas ficticias que usarán el producto, es decir, realizarán los pasos descritos en las historias de los usuarios.
Este elemento es proporcionado por especialistas de UX o por el departamento de marketing y servirán como base para el mapa, ya que al no saber quiénes son los usuarios, será imposible comprender las epopeyas del producto y, por lo tanto, perderá todo el punto del mapeo de historias.
Al tener personas de usuario o hablar con el personal de UX, puedes definir quiénes son las personas que realizarán ciertas acciones en el sistema.

Guía para elaborar un User Story Mapping
Elaborar un User Story Mapping será tan variado y diferente de acuerdo al tamaño de tu equipo, el alcance y la duración de un proyecto y la fase de madurez del producto.
Sin embargo, este es un proceso que se debe realizar, en especial cuando se esperan resultados óptimos de principio a fin, y para ello, el mejor momento para comenzar a elaborarlo es cuando has reunido todos los requisitos del producto y has definido el equipo para el proyecto, ya sabiendo qué es la columna vertebral, las historias de los usuarios y los usuarios, es más fácil realizar estos pasos.

Paso 1: Fija los objetivos del proyecto
Primero que nada, concéntrate en los clientes potenciales de tu negocio y resume qué objetivos pueden lograr estos clientes a través del uso de tu producto, escribe cada uno de los objetivos y organízalos en el orden lógico, puedes utilizar pegatinas o realizarlo en un tablero.

Paso 2: Crea el mapa del viaje
Después de recopilar los objetivos, contabiliza el viaje del usuario hasta lograr el objetivo, identifica los pasos y evita los errores siguiendo fielmente el flujo narrativo, para organizarlo de forma más cercana a la realidad, coloca los pasos en la segunda línea, paso a paso.

Paso 3: Encuentra soluciones
A través de este proceso, creas “historias de usuario”, inicialmente, puedes usar la siguiente plantilla: Como usuario – Quiero Este Objetivo – Así que el paso es este.
Haz una lluvia de ideas con su equipo para recopilar la mayoría de las soluciones posibles y poner todas las historias de los usuarios en los pasos relacionados.

Paso 4: Organiza las tareas según su prioridad
Si el equipo de lluvia de ideas tuvo éxito, entonces el mapa de la historia debería estar lleno de grandes ideas, sin embargo, estas historias no se pueden ejecutar en el mismo momento así que en este paso, determinas los diferentes niveles de prioridad.
Identifica el comportamiento más común o la solución básica al problema, así, organizas las historias de los usuarios por prioridad y colocas la más importante en la parte superior de la columna.
Discutir las prioridades con el cliente es crucial, así que asegúrate de mantenerte conectado con tus socios.

Paso 5: Determina la estructura de lanzamiento
Para ello, indica inicialmente la parte de trabajo más pequeña del producto, el producto mínimo viable, intenta completar el recorrido del usuario comenzando con las tareas más comunes o más fáciles de desarrollar.
En esta parte, solo concéntrate en completar al menos un viaje de usuario, después de eso, organiza el resto del trabajo acumulado en piezas tangibles dibujando líneas horizontales entre las tareas.
Si agrega estimaciones a las historias de los usuarios, puede planificar y programar todo el proceso de desarrollo versión por versión.

Todos los pasos de esta guía para elaborar un User Story Mapping son importantes, en especial esta última representa una de las piezas de información más importantes en todo el proceso, porque no solo representa una fase crucial del mapa sino también porque te ayudará a calcular el tiempo y los costos de entrega.

Conclusiones
Lo más importante es siempre tener en mente la experiencia del usuario final, ya que su nivel de satisfacción y adopción son clave en el éxito del desarrollo, así como en el cumplimiento de los objetivos del negocio.

Si necesitas conocer más sobre User Story Mapping, te recomendamos que visites nuestra página de servicios UX/UI Design Services.

Aplicaciones de la aceleración por Hardware con FPGAs

Aplicaciones de la aceleración por Hardware con FPGAs

Previamente conocimos los beneficios sobre la Aceleración por Hardware con FPGAs, así como diversos Conceptos clave tras la aceleración con FPGA que ofrecen a las compañías y equipos que los implementen. En este artículo, conoceremos las aplicaciones que típicamente se benefician al emplear esta tecnología.

En primer lugar, se realizará una comparación entre computación distribuida y heterogénea, destacando el lugar que las FPGAs han conseguido en los centros de datos. Luego, presentaremos las aplicaciones más difundidas de la Aceleración con FPGAs, entre ellas, Machine Learning, Procesamiento de Imágenes y Video, Bases de Datos, entre otras.

Computación Distribuida Vs. Heterogénea
En los últimos 10 años, hemos sido testigo de un crecimiento exponencial en la generación de datos, esto en parte gracias al surgimiento y popularidad de aparatos electrónicos, como los teléfonos celulares, dispositivos del tipo Internet de las Cosas (IoT), dispositivos wearables (relojes inteligentes), y muchos otros más.
Al mismo tiempo, el consumo de contenido de mayor calidad por parte de los usuarios ha ido en aumento, siendo un ejemplo claro el caso de la televisión y/o los servicios de streaming, quienes han aumentado paulatinamente la calidad del contenido, lo que se traduce a una mayor demanda de datos.

Este crecimiento en la generación/consumo de datos trajo la aparición de nuevas aplicaciones computacionalmente demandantes, capaces tanto de aprovecharlos como de ayudar en su procesamiento. Sin embargo, surge entonces la problemática con los tiempos de ejecución necesarios para su procesamiento, afectando directamente la experiencia del usuario haciendo impráctica la solución. Esto plantea la interrogante: ¿cómo podemos disminuir los tiempos de ejecución para hacer más viable las soluciones planteadas?

Una de las soluciones planteadas consiste en usar la Computación Distribuida; en esta se interconectan más de una computadora en red para distribuir la carga de trabajo. Bajo este modelo, la aceleración teórica máxima a obtener es igual a la cantidad de máquinas agregadas en el procesamiento de datos. Si bien es una solución viable, ofrece la problemática de que se deben considerar los tiempos involucrados en realizar la distribución y transmisión de datos por la red.

Por ejemplo, si queremos disminuir el tiempo de procesamiento de datos a la tercera parte, tendríamos que configurar hasta cuatro computadoras, lo cual dispararía los costos de consumo de energía y el espacio físico a ocupar.
Otra alternativa, es emplear Computación Heterogénea. Esta, además de utilizar procesadores (CPUs) para las tareas de propósito general, buscan mejorar el rendimiento de un mismo equipo agregando capacidades de procesamiento especializadas para realizar tareas particulares.

Es en este punto donde se emplean las tarjetas gráficas de propósito general (GPGPUs) o de lógica programable (FPGAs), siendo una de las principales diferencias que las primeras poseen una arquitectura fija, mientras que las segundos son totalmente adaptables a cualquier carga de trabajo, además de consumir menos (debido entre a otras cosas a la posibilidad de generar el Hardware exacto que se utilizara).

A diferencia de la Computación Distribuida, en la Computación Heterogénea la aceleración dependerá del tipo de aplicación y la arquitectura que se desarrolle. Por ejemplo, en el caso de las bases de datos, la aceleración puede tener una menor frecuencia que la que tendría un caso de inferencia de Machine Learning (la cual puede acelerarse por cientos de veces); otro ejemplo sería el caso de la aceleración de algoritmos financieros, donde la tasa de aceleración se da por miles. Adicionalmente, en lugar de agregar computadoras, simplemente se agregan placas en slots PCIe, ahorrando recursos, espacio de almacenamiento y consumo energético, traduciéndose en un menor Coste Total de Propiedad (TCO de sus siglas en inglés).

Las tarjetas aceleradoras basadas en FPGA se han convertido en un excelente complemento para los centros de datos, estando disponibles tanto on-premise (servidores propios) como en servicios en la nube de Amazon, Azure y Nimbix, entre otros.

Aplicaciones que se benefician de la aceleración por Hardware con FPGAs
En principio, cualquier aplicación que involucre algoritmos complejos con grandes volúmenes de datos, donde el tiempo de procesamiento sea lo suficientemente largo para mitigar los accesos a la tarjeta, es candidata a aceleración. Además, debe tratarse de un proceso que pueda realizarse a través de paralelización. Entre las soluciones típicas para FPGA, que responden a estas características, encontramos:


Una de las técnicas más disruptivas de los últimos años ha sido Machine Learning (ML). La aceleración por hardware puede aportar muchos beneficios, debido al alto nivel de paralelismo y el enorme número de operaciones matriciales necesarias. Estos pueden apreciarse tanto en la fase de entrenamiento del modelo (reduciendo este tiempo de días a horas o minutos), como en la fase de inferencia, posibilitando aplicaciones en tiempo real (detección de fraude, reconocimiento real-time en video, reconocimiento de voz, etc.)


El Procesamiento de Imágenes y Video es una de las áreas más beneficiadas por la aceleración, posibilitando trabajar en tiempo real en tareas como transcodificación de video, transmisión en vivo y procesamiento de imágenes. Se utiliza en aplicaciones como diagnósticos médicos, reconocimiento facial, vehículos autónomos, tiendas inteligentes, realidad aumentada, etc.


Las Bases de datos y Analíticas reciben cargas de trabajo cada vez más complejas debido a los avances en ML, lo que obliga a una evolución del centro de datos.
La aceleración por hardware aporta soluciones a la computación (por ejemplo, con aceleradores que, sin tocar código, aceleran PostgreSQL entre 5-50X o Apache Spark hasta 30x) y al almacenamiento (vía discos SSD inteligentes con FPGA).


La gran cantidad de datos a procesar, precisa de Sistemas de almacenamiento más rápidos y eficientes. Moviendo el procesamiento de la información (compresión, encriptación, indexado) lo más cerca posible de donde residen los datos, se reducen cuellos de botella, liberando al procesador y reduciendo los requerimientos de energía del sistema.


Algo similar ocurre con la Aceleración de redes, donde se mueve el procesamiento de la información (compresión, encriptación, filtrado, inspección de paquetes, conmutación y enrutamiento virtual) a donde los datos ingresan o salen del sistema.


La Computación de Alto Rendimiento (HPC), es la práctica de agregar más poder de cómputo, de tal manera de entregar un rendimiento muy superior al de una PC convencional, para resolver grandes problemas de la ciencia y la ingeniería. Incluye desde la secuenciación del Genoma Humano hasta el modelado del clima.


En el caso de las Tecnología Financiera, el tiempo es clave para reducir riesgos, tomar decisiones comerciales informadas y proveer servicios financieros diferenciados. Se pueden acelerar procesos tales como el modelado, negociación, evaluación, gestión de riesgos, entre otros.


Con la aceleración por Hardware se pueden ofrecer Herramientas y Servicios que procesen la información en tiempo real, ayudando a la automatización de diseños, obteniendo tiempos de desarrollo más cortos.

Conclusiones
Haciendo una breve comparación entre los modelos, en la Computación Distribuida se interconectan más de una computadora en red y se distribuye la carga de trabajo entre todas ellas. Este modelo, utilizado por ejemplo por Apache Spark, es altamente escalable, pero tiene como desventaja el consumo y el espacio físico ocupado, los cuales se incrementarán proporcionalmente.

En lo que respecta a la Computación Heterogénea, se mejora el rendimiento de un mismo equipo, mediante el agregado de hardware (por ejemplo, vía tarjetas gráficas como GPGPUs o FPGAs), sumándole capacidades de procesamiento especializadas. Esto posibilita obtener tasas de aceleración que dependen del tipo de aplicación, pero que pueden estar, en algunos casos, entre 1-10X (por ejemplo, al usar Bases de Datos) hasta cientos o miles de veces al utilizar Machine Learning.

A través de un análisis de rentimiento (profiling) y de validad la factibilidad de paralelizar los distintos procesos y soluciones podemos determinar si la Aceleración de Hardware por FPGA es la solución ideal para tu compañía, principalmente si esta trabaja con algoritmos complejos y grandes volúmenes de datos.

De esta forma, tu negocio podrá mejorar la experiencia del usuario al ofrecer una experiencia más rápida y fluida gracias a reducir los tiempos de ejecución de procesos; adicionalmente, y gracias a la reducción del TCO de sus soluciones, se optimizaría el control del presupuesto.