Monday, June 26, 2017

Big Data - Necesidades y roles para su uso


Cuando analizamos un conjunto de datos que representa, por ejemplo al número de niños que se mueren de neumonitis, es posible tener una idea básica de las características que cumplían esos pequeños sólo mirando los datos. Cuando analizamos una cantidad más grande de información, podemos usar Mainframes u otras computadoras para analizar esa data y obtener las características más relevantes. Sin embargo, nuestros datos no suelen ser grandes y no podemos realizar predicciones con la precisión necesaria como para poder tomar una decisión fiable.

¿Qué ocurre si analizamos a los niños que viven y a los que se mueren de neumonitis sobre los datos obtenidos para todo un país? No queda más que resignarse y entender que el procesamiento de consultas sencillas de ese tipo pueden tardar horas y hasta un par de días, y el descubrimiento de sus características relevantes puede tardar fácilmente meses o años. ¿La tecnología actual puede soportar enormes volúmenes de datos?

Big Data


Big Data se puede definir como el almacenamiento de una gran cantidad de datos y tener la capacidad de procesarlos rápidamente. El procesamiento sobre los datos puede usar técnicas de Machine Learning y así obtener las mejores características según el propósito de las búsquedas. Es importante notar que no hay límites sobre las formas que hay para encontrar la información relevante, pero el tiempo de procesamiento no ha sido el esperado. Cuando hablamos de Big Data, la cantidad  de datos a analizar es brutalmente enorme y el tiempo del análisis disminuye a minutos usando principalmente técnicas de distribución de procesamiento.

El analista


Al momento de tocar los datos, el analista es quién hace la magia. Ellos tienen un conjunto de métodos estadísticos para obtener lo que necesitan, pero el descubrimiento toma tiempo y a medida que aumenta la cantidad de datos a usar, ese tiempo crece exponencialmente. Las técnicas a aplicar dependen de la calidad de la información obtenida, de su tipo y de su propósito. Muchas veces se trata de realizar pruebas y cometer muchos errores antes de llegar a buenos resultados.

En muchos casos, los analistas deben estar familiarizados con algún lenguaje de programación y saber realizar consultas a la base de datos, por ejemplo SQL. Así que nos encontramos con una gran limitación sobre quién puede acceder y analizar los datos debido a los requisitos que deben cumplir.

¿Qué podemos hacer cuando cada análisis de prueba toma horas y no hay límites sobre la cantidad de errores a cometer antes de llegar a un resultado aceptable? Sin duda, los analistas pueden volverse viejos antes de llegar a resultados satisfactorios, necesitan de la ayuda de alguien más.

El desarrollador


El analista se apoya de desarrolladores con conocimientos Big Data. Éstos solucionan un gran problema de los analistas o usuarios de grandes volúmenes de  datos, disminuyendo tareas computarizadas que tomaban horas o días, llegando a sólo unos cuantos minutos usando la magia de la distribución de los procesamientos en muchas computadoras.

Entre las características de un desarrollador de Big Data, nos podemos encontrar con personas que deben ser unos apasionados con las tecnologías porque ese mundo se encuentra en constante evolución, usar las mejores tecnologías y técnicas son fundamentales para estar en la cima de la industria.

Por otro lado, la comunidad de desarrolladores está constantemente entregando nuevas actualizaciones o productos (Apache Hadoop, Hive, Spark, etc.) que van a resolver problemas actuales y es frecuente que se enfrenten a problemas donde no hay una solución lista para usar, ellos están recorriendo un camino que no tiene tantos años y tienen mucho por descubrir y desarrollar todavía.

Beneficios


Entre los beneficios que nos trajo el uso de tecnologías Big Data, nos encontramos con las siguientes:
  • Los procesos que antes tomaban horas o días, ahora pueden llegar a unos cuantos minutos. Por ende, los usuarios, analistas, o cualquier persona que necesite resultados sobre una gran base de datos, harán mejor uso de su tiempo.
  • Los resultados sobre una gran cantidad de datos es más precisa y se puede llegar a mejores conclusiones. Incluso, es más fácil saber su comportamiento futuro.
  • Las empresas privadas y estatales pueden tomar mejores decisiones sobre la industria en las que se encuentran o pueden enfocarse en las personas que realmente necesitan y quieren un producto. Cualquier organización que necesite encontrarse en la vanguardia debe aplicar este tipo de técnicas para encontrarse pasos adelantada.
  • Los gobiernos pueden distribuir mejor sus ingresos, impactando y mejorando la calidad de vida de su población.

Lo que viene


Mas allá de hablar del futuro del Big Data, ya vemos que las más grandes compañías hacen uso de sus capacidades y rápidamente se están uniendo otras que encuentran imprescindible utilizar esos conocimientos.

Rápidamente han ido apareciendo nuevas tecnologías para diversos tipo de datos, arquitecturas que hacen el procesamiento más rápido o que sea más fácil de utilizar. Papers con técnicas de minería de datos y actualizaciones que hacen más fácil las implementaciones de esas técnicas.

La velocidad del procesamiento depende mucho de la infraestructura y la cantidad de computadores donde se distribuyen los procesamiento de datos, pero todavía nos hace falta encontrar nuevas técnicas de análisis con algoritmos que exploten el potencial que tiene el Big Data.

Friday, January 6, 2017

GO Continuous Delivery, tu producto estará a la moda

En tiempos donde las exigencias de los mercados cambian y se transforman a una velocidad tan veloz que las empresas que se percatan de un cambio no pueden esperar a que alguien más realize algo mejor. En un mundo donde no hay plazos para entregar una nueva funcionalidad y no existen los clientes, que sin saber bien lo que quieren, que se encuentren pacientes mientras hay otra compañía que los desplaza y los puede dejar fuera de competencia. En escenarios donde los servicios proveídos se apoyan con Software a medida, no hay tiempo, lo requerido debe ser entregado en cualquier momento.

Prácticas Continuous Delivery


Entonces nos encontramos con herramientas y prácticas de entrega continua o Continuous Delivery por sus siglas en inglés, donde su enfoque es entregar en cualquier momento las funcionalidades nuevas o esos productos tan esperados.

A diferencia de las herramientas de integración continua como Jenkins encargado de facilitar y automatizar la unión del trabajo de diferentes desarrolladores, detectando errores e integrando rápidamente, por otro lado se encuentran las soluciónes de entrega continua que buscan asegurar que el producto sea liberado rápidamente y de forma segura en ambientes de producción en cualquier momento. Más que herramientas que faciliten hacer este trabajo, lo importante es familiarizarse también con las prácticas conocidas como "Continuous Delivery".

Es necesario mencionar que las prácticas de entrega continua no pueden funcionar aisladamente sin las de integración continua para lo cual es imprescindible contar con herramientas que automatizen estas tareas. Este post se dedica a hablar sobre la entrega continua utilizando GO Continuous Delivery (GO CD).

GO Continuous Delivery


GO CD es una herramienta Open Source que utiliza el concepto de Pipelines permitiendo dividir el proceso de deploy de un producto Software en varias etapas. Así busca facilitar la detección de problemas, además de la colaboración entre varios equipos encargados de entregar un producto Software de tal forma que hay visibilidad en el flujo de deploy.

Con respecto a la forma de ejecutar los jobs, éstos pueden ejecutar comandos maven, de python, linux o cualquier otra herramienta proveída por la máquina asignada donde que ejecuta las tareas.

Los Agentes


Despues de que el servidor encuentra que hay cambios en algún material, ya sea un repositorio de código fuente o un pipeline que ha finalizado su ejecución, el servidor desencadena uno o varios pipelines. Desde ahí, los pipelines son ejecutados por los agentes, que usualmente son otras máquinas que poseen los recursos para realizar tareas. Por ejemplo, maven, python, o cualquier otra instrucción proveída en un sistema operativo Linux.

Con ayuda de scripts, se le puede indicar al job los comandos que debe realizar para completar su objetivo, haciendo muy manipulable el trabajo asignado, además de facilitar el arreglo de errores. Los scripts poseen la secuencia de comandos para realizar alguna acción, por ejemplo: compilar un código fuente, obtener un artefacto compilado desde algún repositorio, colocarlo en algún lugar de la máquina e inicializarlo, etc.

La forma de desencadenar los pipelines en GO es proveyendo materiales a cada uno. Así, un pipeline se ejecuta al encontrar un cambio en un repositorio de código o incluso, al finalizar uno o varios pipelines.



Abstracción


A continuación se puede ver la subdivión de los pipelines:
- Multiples Pipelines corren en paralelo
- Multiples Stages dentro de un Pipeline corren secuencialmente
- Multiples Jobs dentro de un Stage corren en paralelo
- Multiples Tasks dentro de un Job corren secuencialmente

El diseño de los pipelines necesitan de una estructura consistente tomando ventaja de la abstracción proveída al momento de crear alguno de estos pasos, considerando también que los nombres de los pipeles, stages, etc. correspondan con lo que realmente están haciendo.

Conclusión


Sin duda es una herramienta a considerar si quieres acelerar el tiempo que toma la aplicación para subir a los ambientes de producción u otros. Su abstracción, flexibilidad para correr los pipelines y hacerles un seguimiento, scripts a ejecutar en los agentes, variables de ambiente, plugins, fácil de deployar y otras características más, lo convierten en una aplicación digna para que la consideres cuando quieras acelerar el tiempo que toma tu aplicación para subir a los ambientes de producción o cercanos a éste.

Friday, December 2, 2016

Flyway - Automatizar la migración de bases de datos

Uno de los problemas comunes al habilitar una nueva versión de un producto Software es coordinarla con una base de datos (BD) que contenga  las tablas/colecciones y datos acordes con la versión a utilizar. ¿Qué hacer cuando ya tenemos una base de datos poblada con información que debe mantenerse y además hay que hacer cambios sobre la base de datos para que funcione la nueva versión? Dejando aparte la recomendación de hacer un backup, es imprescindible tener una estrategia automatizable para realizar este proceso.

Flyway


Al rescate puede llegar algo más avanzado que analizar las diferencias entre los scripts, algo así como encontrar las diferencias y probar si todo funciona bien, lo cual es muy propenso a errores.

Es aquí donde nos encontramos con Flyway, una herramienta de migración para base de datos SQL (para casos NoSQL existen otras tecnologías también) de forma versionada. Usando Flyway tenemos archivos versionados, que contienen los scripts, dentro de un directorio donde la estrategia para manejar las versiones depende de cada compañía/producto. Sin embargo, podemos utilizar un alcance simple donde se añade un script para cada nueva versión del producto.



Los nuevos scripts pueden contener nuevas tablas, inserciones en las bases de datos y cualquier otra operación que pueda manejarse por medio de scripts y que entienda la base de datos a utilizar. Mucho cuidado con los delete y cambios en columnas de tablas.

Operaciones


Flyway posee soporte para una gran variedad de bases de datos SQL y en el caso de no existir un soporte, puede ser customizado e integrar lo que se necesite. Las operaciones implementadas son las siguientes:

  • migrate: migra la BD.
  • clean: limpia la BD.
  • info: entregar información de la BD migrada
  • validate: valida que la BD tenga todas las versiones en orden.
  • repair: repara una BD con problemas de migración en sus versiones.

¿Cómo la base de datos conoce la versión de migración?


Tal como lo hacen otras tecnologías similares, en la base de datos se agrega una nueva tabla donde se especifica la versión de scripts migrada. Así evita que un script sea ejecutado más de una vez.

Implementación


Con respecto a cómo implementar esta tecnología, tenemos varias opciones.

- Utilizar la librería como dependencia e implementar las migraciones invocando a los métodos que disponibiliza su API en JAVA.
- Invocarlo como comando. En este caso, la máquina debe tener el comando Flyway disponible.
- Ejecutar el Mojo desde Maven. Éste modo no necesita código y la lista de operaciones pueden customizadas usando el archivo pom.xml. Personalmente, es la opción que más me acomoda.

Existen otras características para Flyway que no vale la pena mencionar por aquí, pero que puedes encontrar en la documentación oficial de Flyway.

Para terminar


Recuerda que el proceso de migración puede resultar un dolor de cabeza en proyectos grandes y existen formas inteligentes para manejar este proceso. No olvides investigar las otras alternativas y decidirte con alguna viable según las necesidades de tu producto.












Sunday, November 20, 2016

¿Y si me convierto en Dios? - Sobre la importancia de distribuir conocimiento

Mi colega lo sabe todo, para cualquier pregunta, duda o error, es imprescindible llegar a él. Entonces este genio resuelve rápidamente tu vida junto a la de tu compañía. Él no puede delegar porque siempre tiene una mejor decisión, no puede faltar porque siempre existe alguien esperando por su ayuda, no hay vacaciones de verdad porque tendrá que revisar su email o pensar en lo que dejó pendiente y no puedes pedirle ayuda porque además está muy ocupado.

Reconócelo, estás en problemas

 Personas con esas características en un ambiente laboral pueden escalar rápidamente porque, hay que reconocerlo, tienen una capacidad de aprendizaje y crítica muy buena en cuanto al área donde se desarrollan. Sin embargo, es normal que en sus vidas se dediquen exclusivamente a su trabajo. Si asumimos que hay personas que viven para trabajar y son felices, podríamos concluir que no es problema, pero ¿Qué ocurre si estas personas quieren moverse a una posición o equipo diferente? ¿Habrá alguien que pueda reemplazarlos? ¿Cuántas personas son necesarias para tomar su puesto vacío?

Por otro lado, los colegas que trabajan con un semi Dios, por darle un nombre, se encuentran con otras interrogantes ¿Cuándo me prestará atención para ayudarme? ¿Qué pasaría si él/ella se va de la compañía?

En definitiva, estás en problemas. Tanto la persona que lo sabe todo como los que trabajan con ellos.

La importancia de distribuir conocimiento

Es importante que el conocimiento se distribuya a través de una organización y en los equipos de trabajo. Así nadie es imprescindible, algunos pueden saber mucho sobre algún tema en específico mientras que varios tienen los conocimientos suficientes para realizar tareas donde no sean expertos.

Un equipo de trabajo tiene que caracterizarse por ser capaz de realizar cualquier tarea de forma independiente dentro de su área de responsabilidades y es fundamental que más de una persona pueda desempañarse haciendo tipo de trabajo.

La importancia de delegar

Delegar una tarea no puede verse como la oportunidad para que otra persona nos reemplace, sino que es la oportunidad para que puedas moverte a otra posición e incluso, para poder irte de la compañía sin el cargo de consciencia acerca del futuro en el trabajo que pretendes dejar.

También es la posibilidad de alivianar la carga sobre las actividades donde tienes  responsabilidad, dándole tiempo a otras que no has podido realizar, buscar algunas nuevas o completar de buena manera las que actualmente estás desarrollando. Si lo necesitas podrás darte ese relajo que tanto has esperado.

Para tus colegas es la abertura a nuevos roles o actividades diferentes, alejándolos a una monotonía.


¿Qué hacer cuando encuentras que estás en ese camino?

Si una de las razones por las que tienes tanta responsabilidad e importancia dentro de la compañía es porque no confías en que alguien más sea capaz de realizar la labor tan bien, entonces es esencial tener un plan de entrenamiento y aprovechar cualquier oportunidad para potencial al equipo.

Mientras exista un margen de error, no dudes en delegar. No puedes tener el control sobre todo porque una de las mejores formas de aprender se encuentran en los errores ¿Acaso tu no has aprendido así?. Guíalos en su camino a realizar esas tareas complicadas, la próxima vez podrán hacerlo sólos.

Pedir ayuda a las personas clave para equilibrar el conocimiento en el equipo también es vital, puedes encontrarte en un equipo multidisciplinario que depende de ti, pero el equipo no se encuentra a tu cargo. Así un plan de entrenamiento puede abarcar varias aristas.

Se responsable con tu desarrollo y con el de los demás

Es imprescindible que las sociedades se desarrollen en conjunto. En los casos donde hay una persona o grupo que sabe demasiado mientras se deja a los demás en la ignorancia, suele ocurrir que no hay posibilidades de encontrarse con una buena distribución de felicidad, inteligencia, análisis crítico, etc. Recuerda aquello cuando tú lo haces todo, puede ser que algún día necesites de otros sabios.

Tuesday, March 3, 2015

Alabanzas al Software

Cualquier cosa que suceda en el mundo, puedes saberlo por las redes sociales, navegando en la Web o leyendo en alguna aplicación. La información fluye en un mar creado por bits que van más rápido que un pestañeo.Piensa en tu madre  y la contactarás, menciona una palabra y te darás cuenta que su significado puede ser representado de muchas formas.

Hay Software para todo, para incrementar los ingresos un negocio hasta para reírse del último video de tú mascota. Las empresas pueden cooperar creciendo juntas mientras comunican e identifican automáticamente cuando una necesita de un servicio, mientras que la otra tiene todo preparado para entregar sus beneficios.

La gente está conectada para siempre con todo. Tus mejores amigos, a miles de kilómetros de distancia, están contigo sabiendo tus últimos pensamientos y contando sus historias locas que han experimentadp. Los compañeros de curso se encuentran allí, en alguna parte, esperando por saber de tus pensamientos, queriendo saber más sobre ti, el tiempo dejó de ser una barrera.

Es posible ser lo que quieras, un ingeniero, un doctor, un filósofo, profesor o desarrollador de Software. Con tan solo decir la palabra recibirás más documentos que en todas las universidades juntas. Compartiendo cursos, tutoriales, leyendo y escribiendo documentos, incluso puedes llegar a ser el profesor. Faltan años para ver toda la información sobre un tema.

El uso del Software da la posibilidad a los seres humanos de no trabajar en cosas que nadie quiere o son muy difíciles de hacer, tales como cálculos brutales o trabajos forzosos, habiendo robots con la suficiente inteligencia artificial para realizar tareas específicas, trabajos repetitivos o apoyando en otras que requieren demasiado tempo para un humano. Sé un buen tipo con estos amigos abstractos y físicos porque ellos fueron creados para ti por unos artesanos locos que aman a sus hijos.

No podemos dejar de lado los video juegos, ¿Cuánto tiempo de ocio has gastado jugando? Hay juegos para muchísimos estilos y diferentes gustos. Un lugar donde existe la posibilidad de ser un héroe, un espía, un guerrero o Mario Bros, esas experiencias no están lejos de ti, puedes experimentar esas sensaciones y hacer cosas fantásticas.

Incluso tus comprar son más fáciles, rápidas y baratas. Todos los productos pueden tener características adicionales usando Software. Puedes estar en tu departamento, cansado por un día difícil, buscar alguna comida gustosa y escogiendo un par de opciones (clics) tendrás allí el regalo del día. Ahorrar tiempo en un mundo rápido no tiene precio.

Esos fueron mis pensamientos sobre lo hermoso y beneficioso que puede ser el Software, algunas veces siendo irónico y exagerado. No olvides leer la contraparte sobre este tema según mi punto de vista.

Tuesday, February 24, 2015

Patrones de Diseño

Los patrones de diseño son recursos usados por desarrolladores y arquitectos con el propósito de resolver un problema común. Mas que poseer un patrón, ellos tienen un contexto común que es usado para compartir conocimientos. Ellos tienen una poderosa herramienta que provee soluciones que también reflejan un contexto sobre un problema de desarrollo.

Saber donde aplicar un patrón de diseño para obtener una solución acorde al problema es difícil, requiere desarrolladores experimentados y un amplio conocimiento para llegar a elegir la solución correcta. Los desarrolladores en el camino a tomar buenas decisiones de diseño se dedican a aprender la intención o motivo para cada patrón, ven ejemplos de implementaciones, leen libros o cualquier actividad para mejorar sus habilidades.

Tipos de Patrones


Sin embargo, hay muchos tipos de patrones de diseño tales como los patrones orientados a objetos (OOP), arquitecturales, patrones para desarrollar en Android, y otros recomendados por compañías como Microsoft para ser usadas en sus sistemas. Los desarrolladores pueden encontrar esas soluciones probadas en diferentes contextos, variando la forma de ser implementados  y comúnmente haciendo una combinación entre éstos.

El Otro Lado


Algunas veces, los patrones de diseño no son la solución necesitada porque se aplicó el patrón incorrecto o simplemente, porque el problema a resolver no requiere uno. Tales prácticas son también conocidas como anti-patrones.
Cuando se implementa un diseño, entonces se busca que el sistema sea más flexible para ciertos tipos de implementaciones. Los desarrolladores tienen que trabajar con las ventajas y desventajas de los patrones seleccionados y los beneficios deben ser mayores, en caso contrario, los desarrolladores podrían odiarte por tus malas decisiones que producen un desarrollo más lento, además de un sistema que aumenta su complejidad rápidamente.

¿Balas de Plata?


Las soluciones proveídas por los patrones son probadas y los buenos desarrolladores tienen una noción sobre lo que sucede en la parte del sistema donde es implementado uno. Ellos saben más rápido cuál es y dónde arreglar un problema, donde hacer un cambio o añadir una nueva funcionalidad. El conocimiento de los patrones es más allá de los sistemas implementados, equipos y compañías, por tanto, es necesario tomar esa ventaja y usarlos.

Sunday, August 24, 2014

Clean Code - Acto social

Cuántas veces como programadores nos hemos sentido percibidos como gente solitaria que está frente a un computador, quizás algunas veces aceptamos eso porque nuestro código es algo que podemos crear solos o buscando recursos desde la Internet. Nada más lejos de la realidad cuando se trabaja en equipo.

El acto de programar


El programador crea o modifica otro código existente, así adapta la funcionalidad que va a implementar. Él piensa en la mejor forma de hacer entendible su código, así alguien más va a reconocer rápidamente lo que hace y sus cambios serán más certeros. El programador no es un ente solitario, el trabaja con código de otras personas. Programar es un acto social. Así es presentado el arte de programar en el libro Clean Code.

Comunicar


El libro, o biblia de la programación para otros, se centra en facilitar la comunicación de la intención del código, con sus funciones, clases, variables, etc., ¿Por qué eso es tan importante? pues porque nada asegura que el mismo programador trabaje en la misma pieza de código, éste puede tener asignadas otras tareas o ya no es parte de la empresa. En el Software, el código es una de las mejores documentaciones que se puede dejar y éste tiene un propósito, una razón para existir, y es mejor comunicarlo fácilmente siendo coherente.

Fundamentos


El libro recomienda como tiene que formarse una clase, las mejores opciones de nombres, variables, tamaño de las funciones, niveles de abstracción, principios de responsabilidad, entre otros. Explica porque lo pequeño es mejor, ayuda a elegir nombres adecuados, la importancia de proporcionarle un formato común al código, el autor hace fuertes críticas de los comentarios de código que explican algo que no puede hacerlo por sí mismo, además de entregar un montón de heurísticas que sirven como guía al momento de codificar.

Recomendaciones


El autor no pasa por alto el diseño. Agregar o cambiar código, por mínimos que sea, tiene un grado de impacto en el diseño del sistema y condiciona su evolución. El autor abarca principios que ayudan a hacer un trabajo de programador profesional, algo serio que proporciona valor y que todos nuestros compañeros de trabajo seguramente agradecerán porque no será un dolor de cabeza leer ese compás de líneas que sigue un ritmo idéntico al que tiene el programador que lo lee. No hay que olvidar que estamos frente a recomendaciones y varios de éstas son discutibles o incluso abiertas a mejoras, aplicables según criterio.


El libro sigue la premisa de que el Software codificado va evolucionando, su complejidad aumenta y a menos que seas el primero en escribir código, siempre vas a tener que entender lo que hace el código existente, y eso toma tiempo. Programar es conversar contigo mismo y con otros desarrolladores, el idioma en común, así como las convenciones y fluidez son fundamentales para lograr una buena comunicación.