domingo, 3 de septiembre de 2017

Rust, un lenguaje de programación de sistemas

Desde junio de 2017 tuve la oportunidad de contactar a la comunidad de Rust en la Ciudad de México.
Coincidió en el momento donde me tomé un pequeño tiempo para entender lenguajes como Haskell y Erlang.
Rust es un lenguaje para programación de sistemas, tipo de programación que normalmente se hace en lenguaje C/C++ y haciendo llamadas al núcleo (kernel) del sistema operativo.
A diferencia de C/C++, permite al programador a enfocarse a los problemas de la programación de sistemas y evita que se pierdan en temas como el manejo de apuntadores, memoria,

La sintaxis de Rust es similar a C/C++, pero introduce nuevas características para que el programador pueda ir controlando el tiempo de vida de las variables y también definir tipos de datos.
Rust tiene en su diseño todo lo necesario para el manejo de memoria, concurrencia.

Rust no tiene un recolector de basura (garbage collector) y controla el manejo de la memoria a través de un concepto que se llama préstamo (borrowing)
Rust también utiliza un sistema de tipos (inspirado en el lenguaje Haskell) y utiliza el concepto de tratos (traits) y maneja inferencia de tipos.
Soporta conceptos de programación funcional tales como closures
Para la programación concurrente, permite identificar muchos de los posibles errores a través del compilador, y que le llama fearless concurrency

Para tener mayor detalle del lenguaje, la página Web de Rust contiene bastante documentación y tutoriales

domingo, 25 de junio de 2017

Programar y TI no se trata de hipsters

Curiosamente, en estas últimas semanas me he topado con el concepto de que hay plataformas y lenguajes hipsters.  Al principio pensé que era mas en términos de broma y analogía, pero muchos si lo toman en serio.
Lo primero es que programar no se trata de poses ni tiene que ver con la "cultura contemporanea"
La simple idea de programación y TI hipster me lleva solo a entender que la gente que dice eso, sólo están tratando de hacer como que programan y como que entienden y lo hace para su "startup" y se llena de muchos términos técnicos que no entienden y ni siquiera saben su orígen; pero que a muchos de ellos no les lleva a algún camino a largo plazo.
Programar no es de millenials, ni de hipsters, ni de ninis, ni todas las definiciones que son tan usadas en las "redes sociales".  Como que cualquier actividad humana y que se hace con el espíritu de crear, el hecho de programar es poner el ingenio de la persona para resolver un problema o mostrar un concepto o manipular información.
Los lenguajes de programación, que los que se auto nombran hipsters de TI, creen que son el resultado de una revolución para el cambio. No es por ahí, obedece mas a  una evolución mas que una revolución. Y por esto me dedico en esta entrada, a recordar como hemos llegado a esto.
Cada generación cree que tiene un lenguaje de programación que de a verdad va a solucionar los problemas. En su momento, los que vivieron la aparición de Pascal así vieron reflejado el requerimiento de poder pensar de manera modular sus soluciones. Y llego C y muchos vieron que la necesidad de tener un lenguaje con un mínimo de sintaxis, alto desempeño y portable, y fue la respuestas para la programación de sistemas. Por varios años así fue, en revistas como Dr. Dobbs o Byte (cuando era una referencia digna de respetar), todos planteaban soluciones a diversos problemas. Solo que en esos tiempos, no se decían hippies o algo así.
Vino después la ola de programación orientada a objetos, resultando en un C++ que de repente complicaba la sintaxis, mientras otros lenguajes como Smalltalk, Eiffel, Modula, Objective C llegaron a implantar el enfoque de manera elegante. Un resultado que conozco como la cumbre de ese enfoque, es la plataforma de NeXT que hoy ni esos llamados hipsters tienen en la mente, pero cuyas ideas las usan prácticamente todo el día en sus dispositivos inteligentes.
La capacidad de los sistemas operativos para ayudar que los lenguajes de programación tuvieran la capacidad de cargar de manera dinámica bibliotecas de código fuente, abrió la pauta para tener módulos de software cambiantes y donde el polimorfismo se podía explotar al máximo. De ahí salieron las DLL ( en 16 o 32 bits y que son  segmentos de código ejecutable) o los .so en plataformas UNIX.
No basto esto, por que el modelo cliente-servidor ya ofrecía la promesa de dividir el procesamiento del código fuente de aplicaciones en por lo menos en dos computadoras. Al principio empezó con Llamadas a Procedimientos Remotos (RPC) y que aprovechó la empresa Sun Microsystems que hasta su eslogan era "la red es la computadora".  Sin embargo, el mundo de los programadores orientados a objetos también quizo tener su enfoque de objetos distribuidos, y nació CORBA y DCOM; que hoy pocos se han de acordar, salvo los que los usaron en la práctica.
En ese momento, era ya complicado el hacer labores de programación en lenguajes como C++. Y llegó en ese momento un lenguaje orientado a objetos que seguía la corriente de C pero mas simple en sintaxis que los primeros esfuerzos. Me refiero a Java, si aquel cuya versión alfa podía ser utilizado en 1995 y que de manera acelerada fue adoptado por una generación "joven" (si, en esos tiempos teníamos 25 a 35 años de edad los que empezamos dicha adopción) y en un abrir y cerrar de ojos, Java se utilizó para implantar con éxito lo que no se pudo con los antecesores. Mientras la gran parte de la comunidad de programadores estabamos ciegos en pensar todo con Java, afortunadamente lenguajes como Python o Ruby estaban dando pasos hacia lo que viene.
Java aún sigue siendo uno de los más utilizados y que se enseñan en las Universidades. Al mismo tiempo, apareció un lenguaje cuya estabilidad dependía de la carrera por conquistar a los usuarios de Internet, me refiero a Javascript, y que por varios años no fue pensado como opción y del lado de Java o C# se prefería realizar la manipulación dinámica del HTML y engordar un poco más al servidor, de ahí marcos de trabajo como Struts hasta llegar al frankestein llamado JavaServerFaces.
Con el fin de la carrera de los navegadores, JavaScript se vio beneficiado y tuvo estabilidad, al mismo tiempo que la implantación de HTML5 se hizo viable. Pero el estado era un modelo de arquitectura de servidor con componentes complicados (si, JEE me refiero a ti y a tus EJBs de entidad).
Aún, los primeros intentos de aplicaciones móviles, estaban con este enfoque, aún recuerdo Java MicroEditon y sus midlets, y donde el poder de procesamiento de los dispositivos móviles era nada, frente a lo que hoy tenemos.
Aunque Java se puso a dieta, gracias a los esfuerzos de la comunidad de Spring, el lenguaje se volvía cada vez menos intuitivo, presionado también por que C# lo supero. Java 5 tomo el concepto de Generalidad, anotaciones, pero ya no era lo mismo que en 1995.
Llegó la era de XML como formato para lograr la interoperabilidad y como cualquier tecnología, tuvo sus abusos. Los "hipsters" de esos tiempos no avanzaban si no podían abrir una etiqueta (es broma). Se conjunto con SOA (mal entendido como WebServices)
Mientras, Ruby on Rails mostró una buena lección a la comunidad Java (que algunos no la entendieron del todo bien y crearon Grails) y se mostró que un enfoque ligero es más poderoso que el estándar de J2EE. Agregar que Java cayó en las manos de Oracle.
Llega 2011, y con ello ya suena el término de computación en la nube y las aplicaciones móviles cambien el enfoque ante la aparición de plataformas como iOS, Blackberry (RIP) y Android. Quedan obsoletos los planteamientos de plataformas de Java (y me refiero al Application Development Framework de Oracle), mientras que en un giro inesperado, Microsoft si reacciona y empieza a adoptar los principios de programación que la comunidad está fuertemente impulsando.
Al mismo tiempo que los métodos ágiles son cada vez utilizados (y a veces mal utilizados) para enfocarse a tener soluciones de valor, le tecnología de hardware ayuda a que el software aproveche el poder de virtualización de procesamiento, almacenamiento y redes. El concepto de cliente-servidor, se puede llevar al máximo, y de hecho esa relación cliente-servidor, se vuelve par-a-par (P2P y no hablo de Napster). Pequeños componentes de código fuente se pueden asignar a una unidad (virtualizada) de procesamiento y con mínimos recursos, de hecho se generan imágenes mínimas o contenedores. Es lo que se le llama microservicios (algunos dicen que es la evolución de SOA, pero no es cierto).
Agregado que hoy tenemos lenguajes con un enfoque menos complicado que Java o C#. Muchos de ellos influenciados por lenguajes funcionales (Haskell por ejemplo) ; o lenguajes como Go o Rust. Mientras tanto, Java 8 y superior siguen estando cada vez más complicados.
¿Y hoy dicen que usar microservicios, nube,  agilidad, lenguajes no tan conocidos es hipster?  Es una equivocación.
En el JavaOne del año 2001, Sun Microsystems anuncia JXTA, una plataforma P2P.

Hace dos años, platicando con un amigo, le decía que si haciamos una revisióna lo que definió el equipo de Bill Joy, este modelo sirve tanto para microservicios e IoT.  Ni siquiera existía el concepto de hipster.
En conclusión, creo demuestro que decir que TI o programación es hipster, solo es una muestra de que la persona que lo dice le falta un poco de preparación y de experiencia (como dice Stallone, te hace falta mas box), y solo muestra que está ignorando el pasado.  Si el lector de esta entrada, después de controlar el enojo que le estoy haciendo pasar,  le recomiendo vaya a consultar libros de texto de Tannenbaum (como el de arquitectura de computadores, sistemas operativos, ambientes distribuidos) o libros de C, UNIX de los grandes, entre otros, donde desde ahí se hablan de muchas ideas que por fortuna la tecnología hoy ya nos habilita.
Y si eres alguien que han querido impresionar con el termino hipster en TI, por favor, usa algo de lo que aquí expreso y trata de argumentar contra esa falacia. Hoy en día lo que necesitamos es que los que estamos en el ámbito de TI seamos serios y al mismo tiempo creativos y alejarnos de poses.

martes, 14 de marzo de 2017

Aprovisionando ambientes AWS con Ansible



En recientes fechas se nos encomendó la misión de optimizar costos y el uso de recursos de Amazon Web Services utilizados para el despliegue y operación de aplicaciones de uno de los clientes principales de InnBit.

Esta reestructura fue vista como una oportunidad para implementar mejoras en la forma de trabajo con AWS que habíamos estado teniendo. Un punto muy particular es el aprovisionamiento de ambientes que implica lanzar una nueva instancia de EC2, actualizar paquetes, instalar dependencias, configurar el ambiente y desplegar la aplicación para dejar todo listo para que esté disponible para su uso.

Todos los pasos descritos con anterioridad son repetitivos y son propensos a ser automatizados por lo que se decidió incluir la herramienta Ansible para facilitar las tareas de aprovisionamiento y despliegue así como reducir posibles errores y el tiempo que se empleaba para poner a punto las aplicaciones.

Ansible


Ansible es una herramienta de código abierto escrita en python para la automatización y orquestación de tareas 

A diferencia de otras soluciones similares, no requiere la instalación de agentes remotos pues su funcionamiento es mediante la ejecución remota de comandos mediante mecanismos como ssh o Windows Remote Managment.

Los comandos son definidos en archivos de texto en formato YAML y permite realizar ejecuciones de comandos repetibles y distribuidas en varios nodos.

Caso de uso


Durante 2016 se desarrollaron aplicaciones que estuvieron en producción casi todo el año. Cuando concluyó este, dichas aplicaciones también terminaron su ciclo debido al fin por el cual fueron construidas. Aún así el cliente solicitó que se mantuvieran activas para fines demostrativos. 

Por ciertas razones, en su momento se reservó una instancia EC2 con las siguientes características
  • Red Hat Enterprise Linux 
  • Reservada hasta el 20 Junio de 2017
  • t2.medium


De acuerdo a los datos de uso y pruebas, se estima que esta instancia sería capaz de manejar de 3 a 4 aplicaciones con baja demanda. De este modo se determinó que la instancia RHEL sería aprovechada para hospedar las aplicaciones con propósito demostrativo.

Para facilitar la configuración y puesta en marcha de varias aplicaciones en un mismo servidor se decidió generar imágenes docker con cada una de las aplicaciones. Estas imágenes serían almacenadas en el registro de contenedores de EC2 (EC2 Container Registry, ECS) donde estarían disponibles para la ejecución de contenedores.

Otro beneficio de utilizar docker es el redireccionamiento de bitácoras. Anteriormente, para revisar una bitácora era necesario ingresar al servidor y explorar los archivos mediante comandos de Linux para procesamiento de texto. Conforme se incrementa el número de servidores y la incorporación de servidores surge la necesidad de concentrar las bitácoras en un solo punto de modo que la detección de errores y solución de problemas sea más ágil.

Docker ofrece un controlador que permite captar la bitácoras generadas por las aplicaciones dentro de los contenedores y enviarlas al servicio CloudWatch el cual incorpora una funcionalidad para concentrar bitácoras y explorarlas.

Todo el proceso desde la instalación de dependencias hasta la ejecución de las aplicaciones en forma de contenedores fue definido mediante un proyecto Ansible quedando el panorama como se muestra en la imágen.




Proyecto Ansible

Para intentar mantener ordenado y simple el proyecto, se ha organizado de la siguiente manera.

Inventario y Archivos de recursos

El inventario es el archivo de nombre hosts, el cual contiene un grupo de servidores con la ubicación de la instancia RHEL en Amazon.

En la carpeta resources/yum se guardan definiciones de repositorios para instalar los paquetes nginx y docker de acuerdo a la documentación de ambos productos. La idea es que estos archivos sean copiados, utilizando Ansible, a la instancia remota en la ubicación adecuada.

En la carpeta resources/env se guardan archivos con las variables de ambiente requeridas por las aplicaciones. En este punto se pretende nuevamente copiar estos archivos de configuración al servidor y leerlos mediante docker al momento de lanzar los contenedores.

Playbooks

Los playbooks son archivos en formato YAML donde se definen todos los comandos que serán ejecutados en el servidor.

Se separaron las tareas de instalación y configuración de acuerdo al paquete y/o aplicación para mantener compactos los archivos.

nginx.playbook.yml. Instalación típica de NGINX para RHEL, en este caso se utilizó ansible para copiar el archivo ./resources/yum/nginx.repo con la ubicación de paquetes actualizados para la instalación.




awscli.playbook.yml. Instalación de la linea de comandos de AWS. Este se utilizará para la interacción con EC2 Container Registry.


docker.playbook.yml. Instalación y configuración de Docker de acuerdo a la documentación oficial. De igual modo que el anterior, se actualizó la definición de repositorios mediante el archivo ./resources/yum/docker.repo que es copiado al servidor para posteriormente realizar las tareas de actualización de paquetes. Al final se genera el grupo docker y se define al usuario ec2-user como miembro de modo que pueda ejecutar comandos docker sin permisos de super usuario.



cop13.playbook.yml. Ejecución de contenedor docker a partir de una imagen alojada en EC2 Container Registry. Esta imágen contiene una aplicación Ruby on Rails que será ejecutada en el puerto 3000 del contenedor. Mediante ansible, además de lanzar el contenedor, también se establece la correspondencia de puertos (3000:3000), el archivo con las variables de entorno requeridas y el redireccionamiento de bitácoras a CloudWatch.


igf.playbook.yml. Ejecución de un segundo contenedor docker a partir de otra imagen alojada en ECR. La ejecución del contenedor es similar al anterior con pequeñas diferencias como la imagen que se toma, el puerto del servidor que se redirecciona al contenedor (3100:3000), las variables de entorno y el destino de bitácoras dentro de CloudWatch.


rhel-demo-server.playbook.yml. Este archivo incluye referencias ordenadas a los demás archivos de modo que permite mantener la secuencia lógica con las cuales se van a ejecutar las instrucciones.

Conclusiones


Al final los archivos de ansible permitieron la puesta en marcha de las aplicaciones partiendo de una instancia nueva de EC2. Como ventaja estos archivos permiten la replicación automatizada de este ambiente en nuevas y diferentes instancias.

Estos scripts también son propensos de ser incluidos en un conducto de entrega y despliegue contínuo, pero será tema de otra entrada del blog.

domingo, 15 de enero de 2017

Innbit en 2017

Pues ya estamos en el 2017, para muchos temido por las condiciones políticas, económicas y sociales.
Pero no hay que parar el trabajo y seguir contribuyendo en una mejora continua en el día a día de las organizaciones.

En 2016, Innbit tuvo experiencias muy gratas utilizando Lego Serious Play en conjunto con enfoques como Design Thinking, Arquitectura Empresarial, Administración de proyectos e Innovación.
En el uso de arquitectura empresarial y TOGAF hemos ido más allá de lo teórico y hemos podido aterrizar para definir métodos para incorporar computación en la nube, aplicaciones móviles, ciencia de datos; pero con un principio fundamental; que cualquier adopción de estas tecnologías siempre estén alineadas al negocio.
En el tema del desarrollo de soluciones móviles el modelo que nos ha servido es el uso de marcos de trabajo híbridos, tales como Ionic y backends basados en AWS, Bluemix con Ruby on Rails o Node.js. Nuestros tiempos de entrega han mejorado y han permitido cumplir con los requerimientos de negocio de nuestros clientes.
En el contexto de computación cognitiva hemos implementado aplicaciones con los APIs de IBM Watson para poder clasificar el conocimiento de expertos en un dominio del conocimiento.
Hemos logrado certificaciones en nubes como AWS, Bluemix y Azure.
En el tema de Internet of Things, hemos utilizado Arduino y Raspberry Pi para un control inteligente del medio ambiente, captación de información e integración con diversos gadgets.

En 2017 nuestro objetivo es continuar con la misión de utilizar tecnologías de información innovadoras con el fin de crear soluciones para obtener ventaja competitiva.
¿ Cómo es que vamos a cumplir este objetivo?
Primero, hemos definido cinco tipos de productos que ayudan desde el momento que la organización quiere adoptar la innovación como el motor para cambiar su modelo de negocio hasta poder operar y posicionar una solución innovadora.
Estamos trabajando en formalizar los métodos para la adopción de tecnologías de nube, aplicaciones móviles, ciencia de datos y API Web; bajo un enfoque de arquitectura empresarial.
Buscamos la aplicación en industrias del sector financiero,  salud, diversión y servicios de consumo, para cubrir las necesidades de automatización de la cadena de valor.
Seguimos adoptando los estándares del OpenGroup y sumaremos a TOGAF, Archimate; el estándar de IT4IT, con la finalidad de apoyar a las áreas de Tecnología de Información en implantar una cadena de valor que les permita adoptar el modelo de servicios y apoyándose de tecnología para proveer tecnología.

Nuestra ruta del 2017 es:

  • Enero. Lanzamiento de la nueva imagen de nuestro sitio Web con enfoque a explicar nuestros servicios
  • Febrero. Impartición de diversos talleres de habilitación en metodologías de PMP, TOGAF, IT4IT, IoT combinado con Lego Serious Play. Aún hay lugares disponibles
  • Marzo. Publicación de nuestros métodos de transformación tecnológica utilizando el enfoque arquitectura empresarial.
  • Abril. Publicación de aplicaciones móviles de Innbit en iTunes y PlayStore
  • Mayo. Evento de innovación en nuestras instalaciones con el objetivo de identificar proyectos de emprendimiento
  • Junio y Julio. Eventos tipo hackaton para desarrollo de soluciones basadas en nube, aplicaciones móviles, ciencia de datos, IoT
  • Agosto. Lanzamiento de nuestro cuarto de innovación, un lugar donde demostraremos la combinación de IoT, nube, ciencia de datos, redes sociales 
  • Septiembre. Segundo evento de innovación en nuestras instalaciones
  • Octubre. Lanzamiento de reclutamiento para la primera generación de becarios Innbit
  • Noviembre.  Lanzamiento de productos de innovación de Innbit

En la historia de Innbit nos hemos dado cuenta que nuestro modelo de innovación consiste en tomar necesidades o problemas que aparecen en las organizaciones que quieren utilizar la tecnología de información para solventar problemas de negocio pero dando un enfoque hacia el resultado. Esto nos ha llevado a combinar conceptos que al principio parecían dispares.
Tenemos en este 2017 en seguir ese enfoque de innovación pero hacia llegar ya a los sectores de la industria mexicana y explorar nuevos modelos de negocio. Parte del desafío es que en México logremos generar una industria para ofrecer trabajo a los mexicanos y disminuir la dependencia de la inversión extranjera.

viernes, 30 de diciembre de 2016

La odisea de certificarse en Bluemix


Pues para rematar un año que la he pasado de nube en nube, me propuse como última batalla épica del año completar una certificación relacionada con la plataforma PaaS de IBM conocida con el nombre de Bluemix.

Bluemix es un servicio que proporciona una plataforma para el despliegue de aplicaciones construidas en diferentes tecnologías (Java, Node.js, Ruby, Go, etc). 

Además cuenta con un amplio catálogo de servicios administrados que pueden ser facilmente vinculados a las aplicaciones. De estos servicios se pueden mencionar bases de datos, almacenamiento de objetos, cómputo cognitivo, monitoreo, repositorios de código, despliegue contínuo, contenedores docker, mensajería, entre muchos otros. 

Bluemix está pensada en ser una oferta de servicios de nube a nivel plataforma (PaaS), es decir facilita la puesta en marcha de aplicaciones y consumo de servicios sin la necesidad de entrar en lios a nivel de infraestructura. Además se basa en proyectos conocidos en la comunidad de desarrollo como Cloud Foundry y Docker además de utilizar un enfoque de microservicios accesibles via REST / HTTP.

Durante algunos proyectos en el año y un pequeño acercamiento con gente de IBM se tuvo la oportunidad ganar experiencia en esta plataforma y dado que parece una navaja suiza que ofrece todo lo necesario a un desarrollador que quiere enfocarse en la construcción de la solución decidí completar alguna certificación en esta plataforma tratando de narrar el proceso de la forma más pseudo-épica posible (dados mis vagos conocimientos Homerísticos).

Saliendo de Ítaca

El punto de partida fue encontrar algún examen dentro de la oferta de IBM relacionado con los temas de Bluemix lo que me llevó al examen C5050-285 - IBM Cloud Platform Application Development v1.

Los objetivos del examen son algo extensos pero se pueden resumir en:

  • Organizaciones, Espacios, Usuarios, Dominios y demás lios de acceso a la plataforma
  • Generalidades de la plataforma CloudFoundry y el despliegue de aplicaciones
  • Servicios de datos ofrecidos, haciendo énfasis en Cloudant
  • Servicio de contenedores basado en Docker
  • Servicio de mensajería basado en Apache Kafka
  • Generalidades de Alchemy API
  • Servicios de DevOps como son el repositorio de código, delivery pipeline,  track and plan
Una vez fijado el objetivo y viendo que había mucho que estudiar comenzó mi búsqueda de material.


Consultando al oráculo

Dado que en el momento de embarcarme en esta empresa no tenía educación más o menos formal de temas de Bluemix, más allá de desplegar aplicaciones y habilitar algunos servicios, decidí buscar algún curso en línea que sirviera de inducción a los variados temas y me diera mejores armas para afrontar el examen. 

Mi punto de partida fue el curso de udemy IBM Bluemix Application Development & Certification, el cual abarca casi la totalidad de los temas además de incluir demostraciones, trivias y examenes muestra. 

Me tomó alrededor de dos meses completar los temas dedicándole de 2 a 3 horas regularmente, e incluso al finalizar el curso tuve que regresar a repasar los temas iniciales. Varios de las demostraciones me sirvieron de práctica al recrearlas paso a paso y los examenes muestra finales me sirvieron mucho de calentamiento.

Una vez que completé el curso leei la guía de estudio publicada por IBM, la cual es un muy buen resumen de todos los temas. Además al final de la misma contiene unos códigos de descuento para la evaluación preeliminar y el exámen.

Dentro de los recursos de estudio ofrecidos por IBM también se cuenta con un documento con preguntas muestra disponible de manera gratuita. 

Un último recurso que ocupé fue el examen muestra en linea, disponible en el portal de Pearson Vue, con el titulo A5050-285 Assessment: IBM Cloud Platform Application Development v1. Esta evaluación consiste en 48 preguntas y al final da un reporte similar al del examen real.


Gorgonas, sirenas y otros mounstuos

Además del estudio de la teoría sin duda fue fundamental la práctica que tuve tanto en las peticiones para clientes como en pequeños ejercicios de auto estudio que podrían ser resumidas en lo siguiente.

Debido a proyectos
  • Despliegue de una aplicación node.js
    • Vinculada a servicios Watson
    • Vinculada a una base de datos Cloudant
    • Almacenada en el repositorio JazzHub
    • Desplegada mediante Delivery Pipeline
  • Despliegue de una aplicación web ruby on rails
    • Vinculada a una base de datos Postgresql
    • Vinculada a un contenedor de ObjectStorage
    • Configurada en alta disponibilidad con un balanceador de carga
    • Vinculada a una instancia de Redis
    • Desplegada con un buildpack específico
  • Despliegue de un worker ruby on rails
    • Vinculada a una base de datos Postgresl
    • Vinculada a una instancia de Redis
    • Desplegada con un buildpack específico
Ejercicio de autoestudio
  • Instalar Docker localmente y realizar los tutoriales básicos 
  • Construcción una imagen Docker y publicación en Bluemix
  • Prueba de concepto de publicación y consumo de mensajes en Message Hub (Kafka)
  • Recordar conceptos de Scrum y experimentar como encajan en Track and Plan
  • Leer teoría de las aplicaciones de 12 Factores

Conquistando Troya

El día pactado para el examen fue el 29 de diciembre del 2016 y la cita fue en el centro de certificación de casa (aprovechando que solo hay que subir un piso). 

El examen contiene 48 preguntas a realizar en 90 minutos con un mínimo de 32 aciertos para acreditarlo (66%). Había preguntas de casi todos los temas, aunque las más recurrentes tenían que ver con temas de despliegue en CloudFoundry, autoescalamiento, monitoreo y Cloudant. 

La mayoría de las preguntas eran distintas a las realizadas en los examenes de prueba pero en su mayoría temas que se habían estudiado. Muchas preguntas planteaban situaciones prácticas que requerían un poco de razonamiento detenido y algunas más solo teniendo experiencia práctica era posible responder.

Al final el examen me pareció un buen reto y un poco más duro de lo que esperaba pero el estudio y la práctica me permitieron acreditarlo exitosamente al final. Además, más allá del resultado, me quedo con una visión más amplia de esta propuesta de IBM y mucho conocimiento nuevo en temas como Docker, Kafka y Cloud en general.




Cerrando 2016 y esperando 2017

Llego fin de 2016, y se reinicia una vez más el ciclo y empiezan los propósitos de año nuevo.
En Innbit creemos firmemente que para lograr un cambio o una innovación; el factor principal son las personas.
Hemos recorrido en este 2016 un camino interesante, donde internamente estamos buscando modelos de negocio en los cuales no estamos buscando clientes, si no socios y queremos trabajar para hacer un mundo mejor pero al mismo tiempo los que colaboremos obtengamos un beneficio económico y que sirva para dar viabilidad a nuestro modelo de vida.
Innbit es una empresa y con una misión enfocada a que se logre innovación a través de tecnología pero tratando de no recurrir a los modelos tradicionales de negocio y gestión.
En 2017, nuestro foco será seguir fortaleciendo nuestras habilidades técnicas para ofrecer una solución tecnológica de valor pero impulsando ante todo las personas.
El valor de Innbit t es su equipo de trabajo; con una ética de trabajo para hacer el trabajo bien.

Queremos ser nosotros mismos ejemplo de una empresa que de manera sana desafié los paradigmas tradicionales y cultura de gestión de negocio ; y ayudar a otros grupos de trabajo a recorrer este mismo desafío. Curiosamente, en este momento de Innbit estamos en la fase donde lo tradicional y nuevo están chocando pero confío que van a poder convivir y mostrar ambos enfoques su razón de ser.

El año 2017 parece ser un momento donde hay grupos de personas que quieren cada vez cerrar y seguir atados a conceptos tan arcaicos como nación, religión, fronteras y va a existir una presión fuerte que obligue a muchos a tomar una actitud de ver por el bien personal y no el común.
Navegar contra la corriente es difícil pero es el momento de luchar por que empecemos a lograr un cambio, donde la gente deje de pensar que llevar una empresa es gritar, amenazar, castigar, correr.
México necesita hoy mas que nunca que se despierte el espíritu que siempre ha tenido pero que ha sido contenido por crisis económicas y sociales y obligan a que la única opción es hacer lo que todos los demás.
Perdamos miedo a no hacer una idea; aprendamos a darle la seriedad para darle una vialidad económica y a colaborar como personas para ayudar a contribuir a la riqueza de nuestra nación.
Tenemos que luchar contra el día a día, gente violenta en el tráfico, maleantes sin control, un gobierno con políticas para seguir alineando a los ciudadanos para que no piensen ni tengan crecimiento económico y social, una parte del Mundo que quiere dividir en lugar de colaborar.

Tengo muchos sentimientos encontrados sobre lo que fue 2016 y lo que depara en 2017 y 2018. De repente temores relacionados con la inercia de los humanos y su "natural" manera de ir con la corriente y no querer cambiar; miedo de volverme a enfrentarme a la maldad humana que de repente es común día a día al momento de ir a trabajar o por vivir en una ciudad o que tanto caos de repente te trunque todo. O que la situación económica orille a los típicos recortes y ser juzgado por las frías finanzas.
Pero también alimento la esperanza de seguir adelante, por que también me he encontrado con ejemplos de personas o grupos que quieren hacer su trabajo bien.
Me queda decir Feliz Año 2017, como millones de humanos están haciendo en estas épocas; pero más allá es desear que continúen en esta Vida con la meta a lograr felicidad, a cumplir sueños, seguir aprendiendo de sus seres queridos y tener mucha paciencia de los humanos por que la verdad no sabemos lo que hacemos.

Le pido que no pierdan la fe ; aunque el bosque de repente se vea complicado, lo que he aprendido en mis 45 años de vida es que cuando actúas bien tarde o temprano tendrás una sorpresa que va a sumar a tu Felicidad




lunes, 31 de octubre de 2016

La importancia de seguir soñando

ALL THIS IS A DREAM. Still examine it by a few experiments. Nothing is too wonderful to be true, if it be consistent with the laws of nature - Michael Faraday

Vivimos en un mundo donde por un lado se nos exhorta a soñar desde pequeños, abordar pensamientos que lleguen a nuestra cabeza, tener una mente creativa, despierta, cuestionar todo a nuestro alrededor, apasionarnos, contemplar, pensar fuera de la caja, atrevernos a ir por más y no conformarnos hasta llegar a una conclusión. Por otro lado en un mundo muy práctico donde todo lo no funcional tiende a desecharse, todo se espera de forma inmediata, tenemos miedo al cambio, queremos soluciones confiables, con un resultado predecible, donde si tu pensamiento parece que no lleva a nada útil es mejor dejar de invertir tiempo en él, donde se espera una aceptación y en gran parte resignación a un estado actual. Soñar se liga a un tipo de gente, un tipo de profesión, generalmente involucrada al arte o ciencia, gente que se sacrifica por ese sueño, visto como una causa perdida, con un empleo mal pagado y pocas oportunidades, dejando a otros profesionistas tareas prácticas, repetitivas y funcionales.

Soñar se ve como un defecto y una virtud, se condena a la gente que pasa su tiempo soñando, por no aceptar su realidad presente y actuar conforme a lo más lógico o inmediato, pero al mismo tiempo se enaltece al que nunca se rindió hasta conseguir su sueño, podría decirse que todo el juicio recae en si conseguiste tu objetivo.

La ingeniería es un ejemplo perfecto donde podemos ver esta dualidad de pensamiento convivir todo el tiempo. Debido a su naturaleza tanto creativa, como práctica.
 
El objetivo de la ingeniería es dar soluciones, ya sea mediante un programa, un circuito, una máquina o un sistema, lo que se requiere es resolver un problema. El modelo económico en el que vivimos nos obliga a que dichas soluciones sean inmediatas, pero al mismo tiempo "perfectas", es decir seguras, robustas, probadas, funcionales, vendibles. Lo que lleva a que el ingeniero en el mayor de los casos tome un papel de implementador, ya que entre mayor creación de soluciones propias, existirá mayor tiempo de desarrollo y mayor riesgo de errores durante el despliegue de la solución. Siempre existe cierto código o circuito que se tiene que realizar a la medida para armar dichas soluciones, pero es lógico implementar soluciones ya hechas debido al nulo valor agregado que implica crearlas desde cero todo el tiempo.

Innovar, crear algo de valor e implementarlo, es difícil, es tardado, es fracasar todas las veces, hasta que lo logras, es un proceso de investigación y desarrollo bastante tardado que en el mejor de los casos llega a una solución imperfecta. Por lo que la inversión en estos proyectos es poco común y donde se ha vuelto un lujo el poder participar. Sin embargo es un proceso necesario, que si es llevado de buena forma puede ser redituable.

Es lógico que una empresa dedicada a la innovación requiere un flujo de productos rápido, vivimos en un mundo capitalista con inversión privada y debemos dar respuestas a dicha inversión. Por lo que existen ciertas herramientas que nos ayudan a crear productos nuevos de forma más ágil y confiable que esperar a que nos llegue inspiración. Como el caso de Design Thinking y la implementación de metodologías como lean startup para la creación de nuevos productos. Sin embardo, estas herramientas no nos ayudan a eliminar problemas referentes al estado de la solución, como su susceptibilidad a fallas o diseños poco perfeccionados, problemas que solo serán eliminados al ir puliendo el producto con el tiempo. Es decir, una empresa dedicada a crear, jamas tendrá un producto tan pulido como una empresa dedicada a la implementación y competir con estas empresas generará que tengas una solución más cara, más tardada y más susceptible a fallas.

Debido a estos desafíos es necesario que las empresas en estas ramas tengan distintas fuentes de ingresos. Cuando el cliente tiene un problema especifico que se desea solucionar, se debe evitar crear soluciones nuevas por lo mencionado previamente, es mejor impartir procesos que ayuden a crear innovación, examinar el problema y enfocar la solución en cambiar la estrategia, perspectiva y la forma en la que se atacaba el problema, buscar los problemas raíz, crear soluciones con sistemas ya desarrollados, enfocándonos en su lógica, intercomunicación y arquitectura. En el caso de crear soluciones propias es necesario tener un ciclo, donde existan productos maduros para su implementación y a la par se debe tener un equipo encargado en crear nuevos productos, los cuales pasaran por una serie de pruebas antes de volverse productos maduros y puedan ser implementados.

Los ciclos de creación de soluciones o productos nuevos puede seguir la metodología lean startup y herramientas como Business Model Canvas, lo que nos genera visibilidad en el estado del producto, necesidad que cubre, mercado que ataca, costo de producción  y flexibilidad para cambiar y crear una solución con la mayor posibilidad de éxito en el mercado a través de sus iteraciones.

Estas metodologías son utilizadas en empresas como Samsung para crear sus productos nuevos y aseguran una innovación y liberación de productos constante y hasta cierto punto de forma segura (como el caso del Galaxy Note 7). Sin embargo este proceso de innovación tiene una limitante en lo que puede lograr. Este proceso necesita saber cual es tu objetivo, que es lo que deseas solucionar y que herramientas y soluciones utilizaras para ello, es decir es el resultado de la implementación de sistemas y bloques de solución ya hechos, con un problema que sabes que puede ser resuelto.

Uno de los principales problemas que existen con la gente creativa es cuando les preguntan por la funcionalidad de su proyecto. ¿cómo se puede utilizar lo que estas realizando? ¿cuanto cuesta? ¿Que planeas lograr con eso? Una respuesta muy habitual es "no se" lo cual es considerado como algo malo, algo que genera demasiado riesgo invertir, que no ha sido investigado, ni validado. Lo cual es cierto, pero realmente no es una respuesta incorrecta. Muchas veces cuando no se tiene un problema tan especifico a solucionar o todavía no existen herramientas y productos que faciliten su creación quiere decir que es una linea de investigación bastante nueva, que todavía no esta lo suficientemente entendida para saber como aplicarla, con preguntas realmente valiosas que generan un verdadero avance en nuestra sociedad. Los experimentos de Faraday nunca tuvieron la intención de convertirse en la base para las telecomunicaciones modernas, simplemente vio un patrón entre la luz, electricidad y magnetismo. Einstein nunca pensó en vender sistemas de navegación a la gente, su objetivo era resolver huecos que tenia la ley de gravedad tradicional. Cuando un pensamiento llega a tu cabeza y tienes la capacidad de crear o de entender algo, la satisfacción de entenderlo es tu único móvil y eso puede ser difícil de entender si se piensa ganar dinero a través de la innovación, pero son las ideas que más innovación generan a largo plazo.

Implementar soluciones no es menos importante que crear. Para poder implementar se debe perfeccionar, se debe tener soluciones confiables. Podemos ver todo el conocimiento por descubrir como una cueva oscura, soñar y crear es ir iluminando la cueva, perfeccionar es mantener el fuego. Sin iluminar más partes de la cueva nos quedaremos con un espacio limitado y no existirá ningún progreso, pero si solo se dedica a iluminar, se perderá todo lo explorado previamente. De igual forma si solo nos dedicamos a soñar y crear estaremos limitados por la propia fiabilidad de nuestras herramientas, lo que conlleva irónicamente a un avance más lento.

Una empresa de innovación se encuentra en la mitad del espectro, debido a la competencia no puede centrarse en implementar una única solución, pero puede implementar soluciones rápidas, robustas, con productos y soluciones ya creadas que generen un flujo continuo de capital. No puede darse el lujo de frenarse en investigaciones que no lleguen a soluciones aplicables a corto plazo, debe crear  soluciones nuevas producto de desarrollo continuo. Pero en forma paralela a estos dos frentes, debe darse la oportunidad de soñar, de crear sin ninguna objetivo, ni justificación aparente más que por pasión. Lo que puede llevar a algo tangible y aplicable o solo al desarrollo creativo de la persona.

Soñar y crear no es especifico para científicos, artistas, ni ingenieros, el proceso creativo es natural en el ser humano y debe ser explotado por todos, existen pocas sensaciones comparables a lograr comprender algo, lo cual he sentido desde crear la arquitectura de un proyecto en mi cabeza, armar un circuito y verlo funcionando por primera vez, entender un concepto físico, poder aplicarlo aunque solo sea teóricamente o escuchar una pieza de música, contemplar una pintura u observar una obra de teatro y entender y sentir su mensaje. Cualquier persona tiene que permitirse soñar, preguntarse cosas y situaciones sin una respuesta inmediata o aparente, dejarse maravillar, llegar a su barrera de conocimiento y percepción y decir "no se" "no lo entiendo" y sentirse bien en no saberlo, no sentirse insignificantes, si no maravillarse con todo lo que puede ser logrado, todo lo que su mente puede llegar a crear, a comprender y contemplar, simplemente al dejar su mente llevarse, sin ninguna atadura, ni objetivo alguno. Al igual que soñar no depende de ciertas profesiones, todos realizamos arte, ciencia o ingeniería en nuestra vida cotidiana y no debemos sentirnos abrumados o incapaces de hacerlo, para mi la ciencia es un método para buscar la verdad, el arte una forma de expresar y darle un sentido particular a algún objeto, proceso o concepto, la ingeniería una forma de resolver problemas, eso no nos hace artistas, científicos o ingenieros, pero nos permite a todos soñar, comprender y crear.

Soñar te inspira a entrar a lo desconocido, a crear, a descubrir, a un proceso que conlleva mucho tiempo, experimentación, fracasos, soluciones imperfectas, caminos sin salida, soluciones inútiles o teóricas. Pero también nos lleva a maravillarnos, a ponernos la piel china al ver posibilidades hasta ese momento ocultas, armar un rompecabezas mental que de pronto tiene lógica. Es dejarte llevar por tu musa y observar lo que tiene que decirte, a veces con un objetivo claro, a veces simplemente para asombrarnos. Soñar es trascender de lo funcional e inmediato, es ser un espectador que poco a poco ve un panorama completo. Es investigar, entender, expresar, contemplar y maravillarse. Es superarnos, nos lleva a materializar pensamientos, construir paso a paso todo lo que será, entender concepto por concepto todo lo que es. Soñar nos impulsa, nos da un motivo como seres humanos, un legado, nos hace conectarnos con algo mas grande, es la ultima forma de unir tu individualidad, tu pensamiento único, con lo universal, la verdad, con el cosmos.