R, rPython y ggplot2. Un poco de trabajo en equipo

Me llamo Jesús Armand y desde hace unos meses formo parte del equipo de Frogtek como científico de datos. Desde mi llegada, la compañía ha comenzado a utilizar nuevas herramientas en su día a día. Es por ello que a partir de ahora intentaré escribir sobre trucos, pequeños tutoriales o problemas con los que nos encontremos.

Cuando se trabaja con datos, a veces nos encontramos con la necesidad de ejecutar distintos códigos o comandos en diferentes herramientas. Por ejemplo, podemos estar trabajando con una base de datos en MySQL para extraer cierta información que queremos filtrar con algún método implementado en Python y ese resultado representarlo en un gráfico utilizando el paquete ggplot2. Resulta engorroso el proceso de crear, guardar y volver a abrir un fichero en las distintas etapas del proceso.

Es por ello que R a veces nos ayuda a simplificar todas estas tareas y a hacerlas más sencillas. Por ejemplo, con el paquete RMySQL podemos conectarnos de forma rápida con nuestra base de datos y realizar las consultas directamente desde la consola de R y guardar los resultados para, posteriormente, trabajar con el paquete rPython, creado por Carlos Gil Bellosta. En él podremos llamar fácilmente a las funciones desarrolladas en código Python y, finalmente, con las variables almacenadas en nuestro workspace en R, representar gráficamente la información que deseábamos en un principio con ggplot2.

Hoy nos centraremos en un pequeño ejemplo para interactuar con estos dos últimos paquetes: rPython y ggplot2.

El ejemplo va a consistir en, dado un vector con 83 valores, utilizar el método MADe para la detección y eliminación de valores extremos implementado en Python y representar el resultado en un histograma con el paquete ggplot2. El fichero datos-ejemplo- tiene los datos que necesitaremos. Os animo a que implementéis vosotros el código en Python.

Si no tenemos instalados en R los paquetes que necesitamos, ejecutaremos:

install.packages("rPython") 
install.packages("ggplot2")

Los paquetes en R se cargan de la siguiente forma:

library("rPython")
library("ggplot2")

El primer paso será indicar a R con qué fichero .py vamos a trabajar. Para ello ejecutaremos el comando:

python.load("statistical_formulas.py" )

donde el atributo es el nombre del fichero que contiene nuestra función (o funciones).

La función que hemos definido necesita de una sola variable con datos en la llamada. En este caso será el vector X:

python.call("remove_outliers_MADe_method", X)

donde el primer argumento es el nombre la función/método que tenemos en nuestro código y el segundo atributo es nuestro vector.

El resultado de la ejecución de esta llamada lo almacenaremos en la variable resultado.

Finalmente, sólo nos quedará invocar la función gplot() en ggplot2 para representar gráficamente un histograma:

qplot(resultado, geom="histogram")

Como habéis visto, el procedimiento es muy sencillo. Ahora, os animo a que implementéis vosotros mismos el algoritmo MADe para comparar el resultado.

Publicado en data mining, python, R | Etiquetado , , | Deja un comentario

Cómo evitar abrir más de una Activity desde un botón

  • ¿Harto de que se pueda pulsar un botón de tu aplicación repetidas veces antes de que se cree la nueva Activity?
  • ¿Harto de tratar de evitar este comportamiento deshabilitando el botón nada más ser pulsado, y que aun así se lancen Activity sin talento?
  • ¿Harto de consultar StackOverflow y la Internet entera para no encontrar una solución que funcione de verdad?

Nosotros también lo estábamos. Concretamente, habíamos estado experimentando este problema durante años. Ahora tenemos la solución.

Como nunca hemos sido unos expertos programadores, y teníamos muchas prisas por sacar mucho trabajo adelante, nos fiábamos del “método Google” para iniciar una nueva Activity:

Intent intent = new Intent(this, NuevaActivity.class);
this.startActivity(intent);

Y aun así… daba igual que la nueva, como la vieja Activity procesaran mucha información, o poca, que marcásemos la nueva Activity como singleTop, que invocásemos al setEnabled(false); del objeto View que llamaba al startActivity(). También hemos de decir que nuestros usuarios son expertos en pulsar varios botones al mismo tiempo, o que les tiemble el dedo y hagan varias pulsaciones muy rápidas sobre el mismo botón, o que debido a la lentitud del hardware chino se desesperen a la hora de completar una tarea y sigan pulsando el mismo botón hasta el infinito y más allá.
Abrir dos o más instancias de una Activity en nuestra aplicación era muy sencillo, hasta que se nos ocurrió convertir la variable de tipo Intent en un field de nuestra clase de tipo Activity padre. Y cada vez que queremos invocar al startActivity(intent);, lo hacemos sólo si el field intent es == null.
Hay que tener cuidado si la Activity padre es una pantalla principal desde la que se pueden iniciar distintas Activity, por que si todos los new Intent() los asociamos con el field que comentaba antes, al querer iniciar la segunda vez la Activity, como intent != null, la aplicación no haría nada. Es decisión del lector de esta entrada saber cuándo hacer que el field intent sea igual a null de nuevo. ¿Quizás en el onResume()? ¿O mejor en el onActivityResult()? ¿Qué tal crear una clase de tipo Activity con este truco y que todas las actividades de la aplicación hereden de esta clase?

A nosotros nos funciona a la perfección, ¿y a ti?

Cualquier mejora a este truco, queja, grito, etc. es más que bienvenida.

Publicado en android, eficiencia, programación | 2 comentarios

Procesos de selección (actualización)

A mediados de diciembre lanzábamos en Frogtek un proceso de selección de dos ingenieros con experiencia y un becario de formación como programador, a finales de enero a esas ofertas uníamos la de la beca de formación como científico de datos. En total cuatro personas para reforzar nuestro equipo de desarrollo y empezar a edificar nuestro equipo de datos.

Ya hemos llegado a un acuerdo con dos personas que se incorporarán como ingenieros al grupo en los próximos días, siguen, sin embargo disponibles las becas de formación. Os recordamos los detalles:

BECA – PROGRAMADOR JUNIOR:

Ofrecemos para la oficina de Huesca, en Walqa, una beca de formación de un año, con altas posibilidades de incorporación a su finalización, el comienzo de la beca sería inmediato.

Requisitos exigidos:

  • Estudiante de los últimos tres años o de postgrado o a falta del proyecto fin de carrera de las universidades de Zaragoza o San Jorge.
  • Programador con buena base de programación, con conocimientos de programación orientada a objetos.
  • Con potencial, motivado y con ganas de aprender.
  • Alto nivel de inglés.
  • Inteligencia, curiosidad, meticulosidad y atención a los detalles.
  • Ganas de trabajar en una start-up y poca aversión al riesgo.
  • Facilidad para la comunicación y el trabajo en equipo.

Se valorará conocimientos o interés en alguna/s de las siguientes áreas:

  • Conocimientos en tecnologías web HTML, JavaScript, CSS, jQuery.
  • Conocimientos de Java y/o Android.
  • Conocimientos de Cloud Computing, en especial Google App Engine.
  • Conocimientos en Big Data y bases de datos.
  • Conocimientos de metodologías ágiles y programación extrema.
  • Haber realizado un Erasmus.
Tareas:
  • Integración en el ciclo de vida de desarrollo de producto de Frogtek junto con el resto del equipo
  • Desarrollo de nuevas funcionalidades y soporte técnico para validación de hipótesis de negocio (filosofía lean startup)
  • Programación XP: TDD, revisión de código, pair-programming, integración continua…

Se ofrece:

  • Beca del IAF/Walqa
  • Involucrarse en un proyecto social.
  • Grandes posibilidades de desarrollo, aprenderás Android, Cloud Computing, Big Data y programación extrema entre otras muchas cosas.
  • Formar parte de una empresa joven usando las metodologías y tecnologías de desarrollo más avanzadas.
  • Horario flexible, posibilidad de realizar parte en teletrabajo y buen ambiente.
  • Experiencia internacional y multicultural
  • Posibilidades reales de incorporación como empleado al finalizar la beca en función de la valía y la disponibilidad de la empresa.
**********************************

BECA  DE FORMACIÓN COMO CIENTÍFICO DE DATOS:

Ofrecemos para la oficina de Huesca, en Walqa, una beca de formación de un año, con altas posibilidades de incorporación a su finalización, el comienzo de la beca sería inmediato.

Requisitos exigidos:

  • Estudiante de los últimos tres años o de postgrado o a falta del proyecto fin de carrera de las universidades de Zaragoza o San Jorge.
  • Licenciado o grado (o cursando) en Empresariales o Económicas, Matemáticas, Estadística, Ingeniero…
  • Amante de la tecnología.
  • Amante de los datos y de las matemáticas.
  • Conocedor del mundo de la empresa (inventarios, demanda-oferta, elasticidades, gestión de costos y precios, márgenes, categorización de productos…)
  • Con potencial, motivado y con ganas de aprender.
  • Alto nivel de inglés.
  • Inteligencia, curiosidad, meticulosidad y atención a los detalles.
  • Proactividad y autonomía.
  • Ganas de trabajar en una start-up y poca aversión al riesgo.
  • Facilidad para la comunicación y el trabajo en equipo.
  • Disponibilidad para viajar y hacer estancias en otros países.

Se valorará positivamente conocimientos o interés en alguna/s de las siguientes áreas:

  • Herramientas estadísticas (SPSS, programación en R…)
  • Herramientas de procesado matemático (MATLAB, Mathematica…)
  • Dominio avanzado de Excel
  • Conocimientos en Big Data y bases de datos (mySQL)
  • Herramientas de BI (QlikView)
  • Conocimiento de algoritmos matemáticos de aplicación a la empresa

Tareas:

  • Ayudarnos a entender mejor a nuestros tenderos
    • Cuánto venden y cuánto ganan por mes y qué márgenes manejan
    • Cuáles son sus principales suministradores y categorías de productos
  • Ayudarnos a mejorar nuestra proposición de valor al tendero
    • Motor de comparación de precios entre proveedores
    • Motor de recomendación de productos y precios
    • Mejora de algoritmos de predicción de ventas y adivinación de precios
  • Trabajar con el equipo de BI de México para crear y mejorar informes de mercado para fabricantes y tiendas
    • Incluyendo alertas para tiendas en peligro
    • Mecanismos para evitar el sobre e infra estocaje

Se ofrece:

  • Beca del IAF/Walqa, cantidad de la beca a convenir
  • Involucrarse en un proyecto social.
  • Enormes posibilidades de desarrollo, al ser mentorizado por profesores de la Universidad de Zaragoza y expertos mundiales en el tema.
  • Formar parte de un proyecto puntero a nivel mundial que está recibiendo los más altos reconocimientos (menciones en el MITpremios de Vodafone en el NewYork Times…)
  • Horario flexible, posibilidad de realizar parte en teletrabajo y buen ambiente.
  • Experiencia internacional y multicultural en un equipo de alto rendimiento liderado por graduados de universidades como Columbia y Harvard.
  • Altas posibilidades de incorporación como empleado al finalizar la beca en función de la valía y la disponibilidad de la empresa.
  • Formación en el que va a ser uno de los perfiles más demandados en el futuro, el científico de datos.
Interesados mandar correo a guillermo arroba frogtek punto org, incluir si se opta la beca de datos o a la de programación.
Publicado en miscelánea | Deja un comentario

Beca de formación como Científico de Datos

Como ya sabéis los que nos leéis periódicamente en este blog, Frogtek empezó siendo una empresa con un producto basado en Android, producto que se vende a tenderos en países emergentes y del tercer mundo, para que éstos lleven la contabilidad y operen de forma más eficiente pero que además se usa para recabar datos de todo lo que se compra y se vende en estos mercados, datos que se procesan, elaboran y venden a grandes empresas fabricantes de productos. Es decir, Frogtek es, en el fondo, una empresa de big data que está dando sus primeros pasos en el mundo de los datos en 2013.

En enero de 2013 hemos registrado cerca de 550,000 ventas en nuestra red, número que crece mes a mes y que en el último año hemos multiplicado por diez. Disponemos de una base de datos con todos los productos, nivel de inventario, costos, precios, compras y ventas de todas las tiendas de nuestra red. Se trata de datos de enorme valor para todas las entidades que participan en la cadena de distribución de productos en estos países, datos que se actualizan en tiempo real y que pueden revolucionar el funcionamiento de fabricantes, distribuidores y pequeñas tiendas.

En México ya estamos trabajando con algunas de las grandes marcas del mercado por todos conocidas para poner en valor la información que estamos atesorando. Para ello nuestro departamento de tecnología ha desplegado en los últimos meses una herramienta  de BI (Business Inteligence) como QlikView sobre nuestra principal base de datos.

Además contamos con la impagable ayuda del departamento de Contabilidad y Finanzas de la Universidad de Zaragoza con quienes hemos empezado a trabajar en 2012 generando algoritmos que usando nuestros datos ayuden al tendero en su vida diaria, por ejemplo aconsejándole sobre cuánta cantidad comprar de cada producto o adivinando el precio de los productos que inventaría para que no tenga que introducirlo manualmente.

Necesitamos reforzar nuestro conocimiento de los datos y necesitamos dedicar más tiempo y esfuerzo a bucear en ellos, es por esto que queremos crear un perfil distinto en nuestro departamento de tecnología y producto en Huesca: el del científico de datos.

Ofrecemos una beca de formación de un año, dentro del equipo de tecnología y producto de Frogtek y mentorizado por el profesor Carlos Serrano de la Universidad de Zaragoza. Los detalles:

*******************************

BECA  DE FORMACIÓN COMO CIENTÍFICO DE DATOS:

Ofrecemos para la oficina de Huesca, en Walqa, una beca de formación de un año, con altas posibilidades de incorporación a su finalización, el comienzo de la beca sería inmediato.

Requisitos exigidos:

  • Estudiante de los últimos tres años o de postgrado o a falta del proyecto fin de carrera de las universidades de Zaragoza o San Jorge.
  • Licenciado o grado (o cursando) en Empresariales o Económicas, Matemáticas, Estadística, Ingeniero…
  • Amante de la tecnología.
  • Amante de los datos y de las matemáticas.
  • Conocedor del mundo de la empresa (inventarios, demanda-oferta, elasticidades, gestión de costos y precios, márgenes, categorización de productos…)
  • Con potencial, motivado y con ganas de aprender.
  • Alto nivel de inglés.
  • Inteligencia, curiosidad, meticulosidad y atención a los detalles.
  • Proactividad y autonomía.
  • Ganas de trabajar en una start-up y poca aversión al riesgo.
  • Facilidad para la comunicación y el trabajo en equipo.
  • Disponibilidad para viajar y hacer estancias en otros países.

Se valorará positivamente conocimientos o interés en alguna/s de las siguientes áreas:

  • Herramientas estadísticas (SPSS, programación en R…)
  • Herramientas de procesado matemático (MATLAB, Mathematica…)
  • Dominio avanzado de Excel
  • Conocimientos en Big Data y bases de datos (mySQL)
  • Herramientas de BI (QlikView)
  • Conocimiento de algoritmos matemáticos de aplicación a la empresa

Tareas:

  • Ayudarnos a entender mejor a nuestros tenderos
    • Cuánto venden y cuánto ganan por mes y qué márgenes manejan
    • Cuáles son sus principales suministradores y categorías de productos
  • Ayudarnos a mejorar nuestra proposición de valor al tendero
    • Motor de comparación de precios entre proveedores
    • Motor de recomendación de productos y precios
    • Mejora de algoritmos de predicción de ventas y adivinación de precios
  • Trabajar con el equipo de BI de México para crear y mejorar informes de mercado para fabricantes y tiendas
    • Incluyendo alertas para tiendas en peligro
    • Mecanismos para evitar el sobre e infra estocaje

Se ofrece:

  • Beca del IAF/Walqa, cantidad de la beca a convenir
  • Involucrarse en un proyecto social.
  • Enormes posibilidades de desarrollo, al ser mentorizado por profesores de la Universidad de Zaragoza y expertos mundiales en el tema.
  • Formar parte de un proyecto puntero a nivel mundial que está recibiendo los más altos reconocimientos (menciones en el MIT, premios de Vodafone en el NewYork Times…)
  • Horario flexible, posibilidad de realizar parte en teletrabajo y buen ambiente.
  • Experiencia internacional y multicultural en un equipo de alto rendimiento liderado por graduados de universidades como Columbia y Harvard.
  • Altas posibilidades de incorporación como empleado al finalizar la beca en función de la valía y la disponibilidad de la empresa.
  • Formación en el que va a ser uno de los perfiles más demandados en el futuro, el científico de datos.

Interesados enviad CV actualizado a guillermo arroba frogtek punto org

Publicado en miscelánea | Deja un comentario

Google Translator Toolkit para aplicaciones Android

Supongamos que tienes una aplicación Android con cientos de líneas en el strings.xml (o en cualquier otro recurso) y quieres traducirla a un idioma del cual no tienes ni idea. Buscas a un nativo que te haga la traducción y le pasas tu archivo que tiene líneas con esta pinta:

<string name=”customer_has_debt”>¿Estás seguro de eliminar al cliente %1$s ? Este cliente tiene una deuda de %2$s y también se eliminará</string>

Tu traductor no sabe de Android, le parecen raros los “%1$s” y decide pulírselos. También se confunde y borra un “<”.

¿Quién se encarga de revisar que no se ha roto nada? ¿Y si pudiéramos ahorrarle trabajo al traductor y permitirle trabajar con un archivo “pre-traducido” (por google translate)? ¿Y añadir un glosario para traducir automáticamente términos técnicos del negocio?

Todo eso y algo más nos lo da Google dentro de su Translate Toolkit. Es algo que existe desde hace mucho tiempo pero a nosotros nos costó encontrarlo así que lo queríamos compartir.

Publicado en android | Deja un comentario

Observer para compilar automáticamente cada vez que guardas

Los que hayan usado el ndk, me comprenderan. La cuestión es que cada vez que quieres hacer un cambio tienes que compilar la librería. A veces resulta muy pesado, ya que después de esto tienes que limpiar y construir tu proyecto Android que usa dicha librería. Un proceso la mar de ligero si tu proyecto es mínimamente grande.

Tras llevar un tiempo trabajando con esto pensé que sería interesante tener un observer que escuche y que compile el proyecto cada vez que guarde. Ya sólo me tendré que preocupar de hacer los pasos pertinentes en Eclipse para construir el apk con la librería recién compilada.

Para hacer esto elegí python, ya que es un lenguaje realmente potente y fácil de ejecutar desde la consola. Tras buscan un poco opté por usar WatchDog, que es una librería que observa cambios en un fichero. Solo hay que escuchar y cuando se realice la acción de grabar lanzar la compilación. Se ha programado para que escuche cambios en un directorio entero, puedes cambiar para limitar al fichero con el que estés trabajando.

Os dejo el código en github. Es muy sencillo de usar y muy potente.

La mejora más inmediata que se me ocurre es poder mostrar visualmente si la compilación ha ido bien o mal.

Comentarios? Sugerencias?

Publicado en miscelánea, ndk, python | Etiquetado , , , | Deja un comentario

Se buscan ingenieros

En las próximas semanas, aparte de disfrutar de los turrones, queremos incorporar en Frogtek dos tres nuevos ingenieros, uno dos con cierta experiencia y otro interesado en obtenerla mediante una beca de formación, todos con la idea de integrarse y reforzar el equipo de desarrollo de producto de Huesca. Éstas son las ofertas:

EMPLEADO – INGENIERO PROGRAMADOR:

Ofrecemos para la oficina de Huesca, en Walqa, un dos puestos de ingeniero programador, incorporación inmediata.

Requisitos exigidos:

  • Programador con buena base de programación, con conocimientos de programación orientada a objetos y experiencia profesional en el campo de los dispositivos móviles.
  • Con potencial, motivado y con ganas de aprender.
  • Alto nivel de inglés.
  • Inteligencia, curiosidad, proactividad, meticulosidad y atención a los detalles.
  • Ganas de trabajar en una start-up y poca aversión al riesgo.
  • Facilidad para la comunicación y el trabajo en equipo.

Se valorará conocimientos y experiencia en alguna/s de las siguientes áreas:

  • Tecnologías web, HTML, JavaScript, Jquery, Django, CSS.
  • Conocimientos de Java y/o Android.
  • Conocimientos de  C++ y Linux, programación de drivers.
  • Conocimientos de Cloud Computing, en especial Google App Engine (Python) o Amazon WS.
  • Conocimientos de metodologías ágiles y programación extrema: Scrum, TDD.
  • Experiencia en entornos que hayan aplicado Contabilidad de la Innovación.
  • Conocimientos de Business Intelligence: QlikView.
  • Experiencia con bases de datos relacionales (MySQL) y no relacionales (Google Big Table).
  • Experiencia en BigData.
  • Conocimientos como administrador de sistemas en entornos de integración continua: JENKINS, MAVEN…
  • Experiencia en Usabilidad de dispositivos móviles.
  • Experiencia internacional.

Tareas:

  • Integración en el ciclo de vida de desarrollo de producto de Frogtek junto con el resto del equipo
  • Desarrollo de nuevas funcionalidades y soporte técnico para validación de hipótesis de negocio (filosofía lean startup)
  • Programación XP: TDD, revisión de código, pair-programming, integración continua…

Se ofrece:

  • Sueldo a negociar.
  • Interesante paquete de acciones.
  • Involucrarse en un proyecto social.
  • Grandes posibilidades de aprendizaje y desarrollo avanzado.
  • Formar parte de una empresa joven usando las metodologías y tecnologías de desarrollo más avanzadas.
  • Horario flexible, posibilidad de realizar parte en teletrabajo y buen ambiente.
  • Experiencia internacional y multicultural

*******************************

*******************************

BECA – PROGRAMADOR JUNIOR:

Ofrecemos para la oficina de Huesca, en Walqa, una beca de formación de un año, con altas posibilidades de incorporación a su finalización, el comienzo de la beca sería inmediato.

Requisitos exigidos:

  • Estudiante de los últimos tres años o de postgrado o a falta del proyecto fin de carrera de las universidades de Zaragoza o San Jorge.
  • Programador con buena base de programación, con conocimientos de programación orientada a objetos.
  • Con potencial, motivado y con ganas de aprender.
  • Alto nivel de inglés.
  • Inteligencia, curiosidad, meticulosidad y atención a los detalles.
  • Ganas de trabajar en una start-up y poca aversión al riesgo.
  • Facilidad para la comunicación y el trabajo en equipo.

Se valorará conocimientos o interés en alguna/s de las siguientes áreas:

  • Conocimientos en tecnologías web HTML, JavaScript, CSS, jQuery.
  • Conocimientos de Java y/o Android.
  • Conocimientos de Cloud Computing, en especial Google App Engine.
  • Conocimientos en Big Data y bases de datos.
  • Conocimientos de metodologías ágiles y programación extrema.
  • Haber realizado un Erasmus.
Tareas:
  • Integración en el ciclo de vida de desarrollo de producto de Frogtek junto con el resto del equipo
  • Desarrollo de nuevas funcionalidades y soporte técnico para validación de hipótesis de negocio (filosofía lean startup)
  • Programación XP: TDD, revisión de código, pair-programming, integración continua…

Se ofrece:

  • Beca del IAF/Walqa 810€/mes
  • Involucrarse en un proyecto social.
  • Grandes posibilidades de desarrollo.
  • Formar parte de una empresa joven usando las metodologías y tecnologías de desarrollo más avanzadas.
  • Horario flexible, posibilidad de realizar parte en teletrabajo y buen ambiente.
  • Experiencia internacional y multicultural
  • Posibilidades reales de incorporación como empleado al finalizar la beca en función de la valía y la disponibilidad de la empresa.

Para más información o para enviar CV y participar en el proceso de selección enviad un correo electrónico a guillermo arroba frogtek punto org.

¡¡Gracias!!

Publicado en miscelánea | 2 comentarios

Charla de Ángel Medinilla en Walqa: el biopic

El pasado lunes día 12 de noviembre tuvimos el honor de recibir a Ángel Medinilla (@angel_m) en el parque tecnológico Walqa (aprovechando su décimo aniversario) para que diera una charla sobre Agile en la empresa. Para el que no lo conozca, Ángel es un coach y consultor agile que lleva ya un tiempo recorriéndose el mundo asesorando a empresas sobre agilismo y contando su experiencia al respecto.

Como no me gustan mucho las notas de prensa en las que se fusila todo lo que dice el conferenciante, voy a escribir acerca de qué reflexiones he inferido tras asistir a su charla. Lo cual nos lleva al siguiente disclaimer…

DISCLAIMER: los siguientes puntos no están firmados por el propio Medinilla, son solo reflexiones obtenidas por mi parte. Al igual que con los biopics (películas basadas en la vida de alguien famoso), cualquier parecido con la realidad puede no ser cierto :D

  • Las empresas de hoy en día son hijas de las cadenas de montaje y nietas del ejército de Roma. Estamos trabajando en compañías herederas de las ideas de Taylor y Ford (muchas de ellas incluso tienen residuos de las primeras grandes empresas: los ejércitos) y con ello, arrastrando conceptos empresariales basados en paradigmas del pasado, que pueden funcionar para una cadena de montaje, pero no para compañías basadas en el conocimiento. Suele circular por internet una anécdota graciosa: “¿Por qué los reactores de los cohetes de la NASA tienen la anchura de dos culos de caballo?… Pues bien, todo se debe a que los reactores han de ser trasladados hasta Cabo Cañaveral por tren, el ancho de las vías del tren se tomó en función del tamaño de los coches, y el coche en función del tamaño de la carretera, que es un legado del imperio romano, el cual quiso que la carretera tuviese el tamaño de dos caballos, para así permitir la circulación de carros.” Basándonos en esta anécdota, se me ocurre un paralelismo igual de gracioso: ¿Por qué algunos desarrolladores de software van a trabajar con traje y fichan nada más entrar?
  • No hay que ser esclavos de los estándares. Principalmente porque los estándares deberían revisarse continuamente. Siguiendo la filosofía lean, deberíamos usar estándares para asegurarnos de que todos estamos haciendo lo mismo. Intentar algo más complejo que eso solo va a conseguir que tengamos un sistema anquilosado difícil de renovar.
  • Muchos managers son sargentos chusqueros y deberían ser entrenadores. Donde las empresas basadas en los paradigmas de Taylor y Ford necesitaban de un supervisor que controlara la productividad de sus trabajadores, las empresas del conocimiento de hoy en día necesitan de líderes que sepan motivar y potenciar las capacidades de un equipo. Lo que llamaríamos en inglés un enabler, alguien que pueda conseguir que su equipo dé lo mejor de sí mismo.
  • Mejor que intentar ser agile es entender por qué queremos ser agile. Al igual que en el ejemplo del cargo cult, el hecho de poner post-its en la oficina para indicar las tareas (al estilo de las oficinas con sala de relax con el guitar hero porque Google la tiene) no va a hacer que nuestra empresa mejore. Tenemos que entender qué motivaciones tiene agile para poder comprender por qué queremos usar agile (¡o incluso si realmente queremos usarlo!)
  • Agile no es un paracaídas ni la pluma de Dumbo. No nos engañemos: la mera implantación de Agile no va a conseguir que hagamos software de calidad, ni que ingresemos más dinero, o que nuestros competidores vayan a la ruina. Es simplemente una metodología de desarrollo de proyectos mucho más orientada al cambio y a la mejora continua. Podemos migrar una empresa a agile, pero esto no va a  otorgarnos capacidad de mejora, entrega o adaptación. Estas capacidades son los requisitos para el camino Agile, no las recompensas.
  • Tenemos que ser escépticos respecto a Agile. Las metodologías ágiles representan un camino, una serie de filosofías que pueden ser de utilidad para las empresas. Pero no tiene por qué ser buenas para TU empresa. Como decía Henrik Kniberg, Scrum es una herramienta, puedes usarla como te plazca. Cada empresa es un mundo y como tal, es muy difícil que Agile te dé una solución personalizada. Eso sí, si modificas Scrum a tu antojo, luego no vayas diciendo por ahí que Scrum no te ha funcionado :D

Slides de la charla en http://www.slideshare.net/proyectalis/agilidad-empresarial

Publicado en agile, metodología | Etiquetado , , , , | 3 comentarios

¿Para qué sirve ser ágil en una start-up?

Mucho agile, mucho agile… pero si te descuidas puedes acabar en una empresa en la que lo único agile es el motor y para de contar, más cuando el equipo de producción, como en nuestro caso, está aislado del resto o directamente, como pasa en las consultoras, no hay resto. Ésta es un poco la conclusión que he obtenido tras leer los libros “Lean Start-up Method” de Eric Ries, “The four steps to the epiphany” de Steve Blank y después de conocer un poco el mundillo éste del agilismo en España… y por experiencia propia, por qué no decirlo.

Supongo que en parte es porque el mundo del software ibérico está principalmente orientado a programar para terceros y en ese caso ser ágil es “tan fácil” (y tan difícil) como pegarte unos años hasta que haces scrum, tdd y demás como Dios manda y conseguir que el cliente acuda a las reuniones y se involucre en el proceso de cada sprint. Pero la realidad es que detrás de los métodos ágiles hay mucho más y es algo de lo que no se oye hablar demasiado. Hace mucho que no acudo a ninguna AOS, ni CAS (siempre me coinciden con algo que no puedo dejar para otro momento), pero la primera CAS a la que acudí (2010) me encantó, sabíamos tan poco de métodos ágiles que cada charla era un nuevo mundo de conocimientos y posibilidades. Desde entonces si no yo, siempre alguien de Frogtek ha acudido a estos eventos y trasladado lo que allí ha aprendido. Últimamente, sin embargo, me empezó a sorprender que si bien toda la comunidad está muy interesada en ser técnicamente ágiles, no parece haber tanta ebullición, o al menos yo no la he detectado, una capa por encima de eso. Está bien tener un método de producción iterativo-incremental, está bien ofrecer al cliente (que muchas veces no es el usuario final, desgraciadamente) un proceso súper adaptable a sus cambios de humor y requisitos… pero estaría mejor dotarnos de los procesos, que tiene que haberlos, para utilizar este gran método para crear el producto que el usuario final necesita. Para ello no basta con que el equipo de desarrollo sea ágil, hay que aprovechar esa agilidad para que los equipos de marketing y ventas (o el product owner, o los encargados de desarrollo de cliente, o quien sea) puedan, a su vez, realizar sus propios experimentos, implementar sus propias métricas y tener sus propios objetivos iterativos e incrementales que nada tengan que ver con el desarrollo y sí con el negocio. Por eso, echo de menos, conceptos que Ries maneja en su libro como “indicadores vanidosos”, “indicadores accionables”, “análisis de cohortes”, “contabilidad de la innovación“… conceptos sin los que scrum, tdd, los sprints y todo lo demás no sirven más que para tener un proceso de desarrollo flexible y adaptable… lo cual no tiene porqué evitar que se acabe construyendo de forma eficiente y completamente flexiblemente un producto totalmente inútil. Supongo que, en España, el principal problema es precisamente que no existen muchas start-ups y hay, sin embargo, demasiadas factorías de software… y en una factoría de software es difícil vislumbrar nada más allá de lo técnico (por no hablar ya de meter baza) y suficiente se tiene con lidiar con el cliente.

Frogtek no es una software factory pero también hemos sufrido en parte ese problema. Tras varios años de trabajo teníamos un equipo de tecnología muy “agile” y muy “kaizen” que implementaba las “ocurrencias” de la empresa de manera eficiente y puntual. Ocurrencias, dicho en el mejor de los sentidos y con todo el cariño, que trataban de ser lo más meditadas posible y que suponíamos beneficiosas para los tenderos y que, lo fueran o no permanecían en el producto sine die. El problema de esta aproximación es que no es todo lo científica que debería ya se basa en asunciones que habría que comprobar, pero que rara vez se comprueban, por falta de tiempo y de proceso principalmente. No basta con implementar User Stories por muy bien definidas que estén, el cementerio está lleno de productos técnicamente impecables. Para solucionar esto en Frogtek vamos a utilizar una capa más de abstracción, basada en Épicas, que iría sobre los sprints de User Stories. Una Épica no es más que un objetivo del product owner para un sprint determinado. Algo así como el objetivo estratégico de alto nivel de mejorar el indicador X de la empresa en un x% (p.e. “hay que conseguir que el 80% de los tenderos levanten su inventario en menos de 2 horas”). Muchas veces, este tipo de mejoras no es cuestión de una sola User Story es, más bien y por limitarlo al producto, un conjunto de historias (“el producto debe adivinar los precios”, “el producto debe adivinar los costes”, “el producto debe proponer los productos más comunes”, “el interfaz debe cambiar así o asá”…) que se pueden desarrollar durante un sprint (de forma ágil, claro), la diferencia con nuestra aproximación pasada es que terminado el sprint el trabajo del product owner no ha hecho más que empezar y a la vez que se empieza a pensar en el sprint siguiente, tiene que echarle un ojo al indicador asociado a la Épica del sprint pasado con el objeto de aprender si los cambios en el producto están teniendo el efecto deseado en el comportamiento real de los usuarios o, por el contrario, no han servido para nada y se necesitan más cambios (volver a iterar).

 

El trabajo del product owner se complica, ya que como se ve en el dibujo el contenido del sprint N empieza a analizar incluso antes de que empiece el sprint N-1.  La secuencia es la siguiente:

  1. Recoger indicadores.
  2. Analizar indicadores y Épicas en evaluación para decidir los objetivos (creando nuevas o modificando Épicas).
  3. Desglosar las Épicas en historias de usuario.
  4. Preparar la historias de usuario (mock-ups, pruebas de usabilidad con clientes, más mock-ups…).
  5. Estimar historias de usuario.
  6. Ejecutar el sprint (incluyendo pruebas, instalación en friendly users, etc).
  7. Instalar nueva versión en usuarios.
  8. Vuelta a 1.

Normalmente los indicadores a recoger y analizar necesitan un tiempo hasta que se generan, al menos en nuestro caso, así que no será extraño que las Épicas que se evalúen en un momento dado se hayan implementado hace dos, tres o más sprints. Por lo tanto el PO, no sólo tiene que estar pendiente del sprint actual sino que tiene que pensar en las Épicas (objetivos estratégicos del producto) que querrá definir para el sprint siguiente, mientras que monitoriza meticulosamente los indicadores asociados a las Épicas que están ahora mismo en evaluación y que pueden seguir así por uno o varios sprints. Porque una Épica, como una User Story, tiene un ciclo de vida ¡e incluso su propia tabla! (se proponen, se discuten, se diseñan, se implementan, se evalúan y si están bien se archivan, muy propio para una tabla de kanban) pero a diferencia de una User Story la evaluación no depende de factores meramente técnicos, si no que es función del valor que aporte al usuario final (si está bien definida y si se monitoriza usando datos reales). El paralelismo con las User Stories también tiene otras ventajas, se puede medir el throughput en Épicas de un equipo, es decir, la velocidad de la empresa para poner hipótesis a prueba y aprender de la realidad, concepto directamente relacionado con las posibilidades de la empresa de sobrevivir.

Al final como en muchos aspectos de la vida, se pueden extraer unas cuantas enseñanzas muy interesantes: No llega más lejos la empresa que hace más User Stories, sino la que hace User Stories como consecuencia del aprendizaje validado de otras User Stories. Es importante tener un framework de gestión del trabajo ágil, pero más importante es integrar en el proceso de producción herramientas de medida como Google Analytics o Flurry que permitan obtener información sobre la utilización de las distintas funciones y que permitan discriminar entre distintos grupos de usuarios con distintas versiones para poder relacionar causas y efectos usando el análisis de cohortes (¿a los usuarios de la versión x+1 les ha ido mejor que los de la version x?). Así que ahí estamos en Frogtek, peleándonos, como buenos novatos, con Analytics y con nuestras propias métricas, discutiendo las métricas que debemos aplicar a las Épicas y tratando de encajar su ciclo de vida con el de definición e implementación de los sprints. Este post, más que una realidad, es una declaración de intenciones acerca de lo que queremos hacer para conseguir ser una “agile data-driven company” para lo cual es necesario ser ágil pero, visto lo visto, no suficiente.

Publicado en agile, eficiencia, metodología, miscelánea, scrum | Etiquetado , , , | 1 comentario

Cuenta atrás en Android

Si alguna vez nos hemos visto en la situación de tener que realizar una cuenta atrás en nuestra aplicación Android (muy útil para juegos, para indicar el tiempo restante) seguramente habremos hecho uso de la clase típica para estas cosas en Java: TimerTask (java.util.TimerTask)

private TimerTask getTimerTask() {
	return new TimerTask() {
		@Override
		public void run() {
			// Aquí hacemos todo
			} catch (Exception e) {
				e.printStackTrace();
				schedule(NOW);
			}
		}
	};
}

Deberíamos modificar bastante esa clase para que llevara una cuenta regresiva de los segundos que quedan, así como hacer un schedule cada segundo de la task.
En vez de esto, resulta mucho más elegante utilizar una clase que provee Android llamada CountDownTimer. Tan fácil como hacer lo siguiente:

timer = new CountDownTimer(secondsUntilFinished, 1000) {
	public void onTick(long millisUntilFinished) {
              // Do something every second
	}
 
	@Override
	public void onFinish() {
              // Do something when finished
	}
}.start();
Publicado en android, programación | Etiquetado , , | Deja un comentario