jueves, 30 de enero de 2014

¿Cómo migrar una aplicación de Firefox OS a Android con Netbeans?

Este es un tutorial para desarrolladores Web que han comenzado sus andares en el desarrollo de aplicaciones móviles haciendo su primera app para Firefox OS y ahora quieren dar el salto a Android, sin necesidad de programar en Java, ni utilizar Eclipse.

Atención: Esto es un borrador, de modo que aún está en proceso de organización y escritura. Por favor, deja cualquier sugerencia en la sección de comentarios. 

El proceso en resumen


  1. Instalar Node.js
  2. Instalar Cordova
  3. Instalar Git
  4. Instalar SDK de Android
  5. Configurar Netbeans
  6. Crear proyecto HTML5 con Cordova
  7. Importar código de aplicación de Firefox OS existente
  8. Ejecutar aplicación en Android

El proceso en detalle










































martes, 21 de enero de 2014

¿Cómo responder a la pregunta de "Cuánto vas a tardar"?

Cartas para estimar la complejidad
Utilizando la técnica de Planning Pocker
Es inevitable. Te lo van a preguntar; y no importa cuanta información te falte: quien te pregunte "¿Cuánto vas a tardar?" querrá una contestación inmediata y no aceptará otra respuesta que una cifra. El asunto entonces es cómo responder rápidamente y con cierto criterio.

Negocia, calcula y argumenta


Para decir cuánto vas a tardar no vale mirar al cielo, esperar la inspiración divina y dar una cifra. Si dices un número sin más criterio que la "inspiración" o la "intuición", no podrás justificarlo cuando te rebatan la cifra diciendo que es muy grande.

Y lo harán, tarde o temprano.

Quien te pregunta cuánto vas a tardar, espera que le digas el menor número posible porque es tu cliente y quiere tenerlo cuanto antes y pagar poco, porque es tu jefe y quiere que termines pronto para asignarte a otras tareas, porque es un comercial y quiere que el producto sea "barato" para venderlo mejor...

El asunto es que debes asumir que en algún momento alguien dirá o pensará que te has pasado de lo que esperaba, cuando dices cuánto vas a tardar. De modo que, para darle credibilidad a tu respuesta y evitar o cambiar el criterio de tu interlocutor, deberías justificar el dato basándote en una estimación consensuada con tu interlocutor.

¿Cómo estimar rápidamente cuánto vamos a tardar?


Partamos del hecho de que estamos hablando de estimaciones rápidas, en momentos previos a la existencia del proyecto. De modo que queda absolutamente descartado cualquier método de estimación paramétrica como Puntos de Función, COCOMO, Puntos de Casos de Uso o, incluso, estimaciones más ágiles, como las basadas en Puntos de Historias de Usuario; primero, porque no se ha analizado suficientemente el problema como para descomponerlo al nivel que éstos métodos requieren y, segundo, porque no hay tiempo para hacerlo.

De modo que, para no adivinar, ni intentar aplicar unas métricas imposibles, una buena opción es hacer una estimación por analogía, haciendo una lista de los requisitos que se nos piden y asignándoles una complejidad a cada uno que, finalmente, traduciremos a un valor en horas.

Entonces, el proceso para estimar por analogía cuánto tardaríamos en hacer un desarrollo, podría ser el siguiente:

  1. Hacer una lista de los requisitos que nos han planteado.
  2. Buscar el requisito más simple que encontremos y calificarlo con la complejidad que estimemos.
  3. Seleccionar el siguiente requisito no calificado y asignarle una complejidad, teniendo en cuenta las calificaciones asignadas a los requisitos previamente analizados.
  4. Repetir el paso 3, hasta que no queden requisitos por calificar.
  5. Asignar un valor en horas a cada requisito, según su complejidad para pasar de un valor cualitativo de complejidad a uno cuantitativo de su duración.
  6. Sumar el total de horas teniendo en cuenta todos los requisitos.

Dicho así parece simple y, al mismo tiempo indefinido. ¿Qué complejidad asigno a un requisito? ¿Qué pasa si no tengo experiencia previa? ¿Qué cantidad de horas asigno a requisitos de determinada complejidad?

¿Cómo calificar la complejidad de un requisito?


Para simplificar la calificación, siempre partiremos del principio de que es más fácil calificar la complejidad de algo simple y conocido, que de algo complejo y desconocido

Por ese motivo, cuando se comienza a estimar, se parte buscando lo que parece el requisito más simple, intentando recordar si ya hemos hecho alguna vez algo parecido y cuán complejo fue; para asignar entonces a dicho requisito la misma complejidad que la de nuestras experiencias pasadas. Ahora, si no encontramos ninguna experiencia parecida, tendremos que descomponer este primer requisito (y solo este) hasta el punto de entender cómo podríamos desarrollarlo y, una vez entendido, estaremos en condiciones de definir la complejidad del mismo.

Una vez calificado el requisito más simple con un grado de complejidad, el resto se calificaría basándose en la experiencia y comparándolo con el requisito ya calificado sin necesidad de comprender a fondo las interioridades del mismo. Para ello, bastaría con responder a las preguntas:

  1. ¿Ya he hecho antes algo parecido? ¿Cuán complejo fue?
  2. ¿Este requisito es igual, más complejo o mucho más complejo que los anteriores?

Al final del proceso de calificación se obtiene una lista de requisitos cuya complejidad de implementación está justificada en nuestra experiencia y en el análisis realizado. Por supuesto, no es una estimación inmutable y, seguramente las estimaciones cambien, si repetimos el proceso varias veces o consultamos con otra persona. Sin embargo, es probable que estos cambios sean puntuales y con poca variación, sin grandes saltos, en sentido general.

¿Cómo cuantificar en horas la duración la complejidad?


Después de la cualificación, necesitamos cuantificar la complejidad para obtener un resultado en horas y poder responder a la pregunta de cuánto vamos a tardar para hacer determinado desarrollo.

Cuantificar a partir de datos previos


Lo ideal sería contar con estadísticas de proyectos anteriores. Tener una base de datos donde hemos ido guardando por cada proyecto realizado, la lista de requisitos, su complejidad estimada y su duración real.

Con estos datos, podríamos hacer una estimación del proyecto actual con unas cifras cercanas a nuestro desempeño medio y dar una estimación difícil de cuestionar porque, simplemente, negar las estadísticas sería poco razonable.

Cuantificar a partir de una duración "negociada"


Si no tenemos estadísticas que faciliten una cuantificación completa de todos los niveles de complejidad, podríamos, una vez más, apoyar la estimación en la adaptación del principio antes mencionado: es más fácil estimar la duración de algo simple y conocido, que de algo complejo y desconocido.

De modo que, partiremos asignando una duración en horas a la funcionalidad más simple del proyecto y negociaremos esa duración con quien nos ha pedido la estimación. 

Una vez consensuada la duración del requisito más simple, asignaremos duraciones proporcionales a cada complejidad.

Una convención generalmente aceptada es que a medida que aumenta la complejidad, la duración suele aumentar en una proporción mayor, debido a que mientras más complejo es lo que se estima, más imprecisa será la estimación y, por tanto, deberá admitirse un mayor margen de error.

Por ejemplo, algo simple, podría ser el doble de largo que algo muy simple y no, solamente, un poco más largo. De hecho, es frecuente considerar que, a medida que aumenta la complejidad, el tiempo estimado se duplique.

Algo a tener en cuenta es que el punto donde se asigna la primera estimación es clave pues, una vez nuestro interlocutor haya aceptado la estimación inicial, el resto se justificará en el propio sistema de estimación de la complejidad y la duración donde cada valor estará ligado al resto. 

Es decir, que el tiempo que tendrás que negociar será el de la funcionalidad más simple, en la que ambas partes podrán argumentar y justificar sus cifras y, una vez hecho, el resto de las estimaciones será una consecuencia coherente con esa estimación inicial y, por tanto, el resultado final será difícil de cuestionar pues estará basado en un valor consensuado.

Un ejemplo práctico


Supongamos que alguien nos pregunta cuánto tardaríamos en hacer una pequeña aplicación móvil para generar una alarma en caso de una emergencia. La idea es que el usuario pueda indicar un teléfono y que, en caso de emergencia, baste con abrir la aplicación para que ésta recupere el teléfono guardado y le envíe a dicho número un SMS con el texto "SOS" y un enlace a un mapa con la posición del usuario.

Lo primero sería listar las funcionalidades del sistema:


  1. Guardar teléfono de contacto para emergencias.
  2. Enviar SMS con mensaje y enlace a mapa con posición del usuario.

Sin embargo, la segunda funcionalidad, podríamos descomponerla en dos más simples y más fáciles de estimar: obtener posición del usuario y enviar SMS con un texto predeterminado. De modo que la lista de funcionalidades podría quedar así:

  1. Guardar teléfono de contacto para emergencias.
  2. Obtener posición del usuario.
  3. Enviar SMS.

Luego tendríamos que estimar la complejidad de cada una. Debido a que tenemos poca experiencia en desarrollos móviles (solo hemos hecho cosas básicas) estimamos que:


  1. Guardar teléfono de contacto para emergencias es "muy simple" pues ya hemos hecho antes otras aplicaciones de gestión de datos y guardar un solo dato en local es una tarea bastante sencilla. 
  2. Obtener posición del usuario es "muy complejo" porque -por lo que sabemos- hay que lidiar con distintos niveles de precisión en la localización, temas de batería y no lo hemos hecho nunca.
  3. Enviar SMS es algo "simple" pues, aunque no lo hemos hecho nunca, hemos leído algo sobre las APIs implicadas en las comunicaciones por SMS y parecen bastante fáciles de usar.

No obstante, nuestro potencial cliente nos dice que lo de la posición no debería ser "muy complejo" pues ya le hicieron anteriormente una aplicación con localización integrada y los desarrolladores le comentaron que era menos complejo de lo que parecía. De modo que, con la promesa de ponernos en contacto con esos desarrolladores para que os ayuden con las dudas que puedan surgir, acordamos bajar la complejidad del segundo punto de "muy complejo" a "complejo", quedando la complejidad por requisito así:

  1. Guardar teléfono de contacto para emergencias: "Muy simple" (XS). 
  2. Obtener posición del usuario: "Complejo" (L).
  3. Enviar SMS: "Simple" (S).

(Con el tiempo verás que es cómodo utilizar el sistema de tallas XS, S, M, L, XL y XXL para definir cualitativamente la complejidad de los requisitos.)

Ahora toca estimar cuánto tardaremos en implementar el requisito más simple: el número 1.

Dada nuestra experiencia, decimos que implementar la interfaz, guardar el dato y hacer las pruebas pertinentes, nos tomaría algo más de medio día de trabajo (5 horas, aproximadamente); pero nuestro cliente -siempre inconforme- protesta porque le parece excesivo 5 horas para algo "tan elemental"; así que nos enzarzamos en un debate sobre la calidad del software, la documentación que no ve el usuario final, las pruebas unitarias, los test exploratorios... y después de estirar y encoger las propuestas, quedamos en que 4 horas para el requisito 1 estarían bien.

Así que solo nos falta trasladar la duración en horas a cada requisito restante, partiendo de que cada requisito podría tomar el doble de tiempo que otro con una complejidad inferior. Es decir, si tuviéramos un requisito por cada complejidad, la duración de cada uno sería:


  1. Muy simple (XS): 4 h.
  2. Simple (S): 8 h.
  3. Medio (M): 16 h.
  4. Complejo (L): 32 h.
  5. Muy complejo (XL): 64 h.
  6. Muy muy complejo (XXL): 128 h.

Lo que en nuestro caso, significaría una duración en horas por requisito de:


  1. Guardar teléfono de contacto para emergencias: "Muy simple" (XS), 4 h.
  2. Obtener posición del usuario: "Complejo" (L), 32 h.
  3. Enviar SMS: "Simple" (S), 16 h.

Lo que en total, nos daría una duración de 52 horas o 6 días y medio, ideales; es decir, 6 días y medio si trabajáramos 8 horas exclusivamente en el proyecto.

No obstante, para ser realistas, de las 8 horas diarias, es muy probable que perdamos 1 o 2 horas en comunicaciones (e-mails, llamadas telefónicas), o interrupciones varias (consultas, incidencias con otros productos, etc.). De modo que, siendo objetivos,  aunque el tiempo de desarrollo serían 52 horas, el tiempo para entregar el producto sería de casi 9 días.

Un par de aclaraciones útiles


Las estimaciones de requisitos muy complejos son malas


Volvamos a la lista de tiempos por complejidad enunciada para el ejemplo anterior y fijémonos cómo, a pesar de que el requisito más simple dura solo 4 horas, el más complejo puede parecer excesivamente extenso.

  1. Muy simple (XS): 4 h.
  2. Simple (S): 8 h.
  3. Medio (M): 16 h.
  4. Complejo (L): 32 h.
  5. Muy complejo (XL): 64 h.
  6. Muy muy complejo (XXL): 128 h.

Ese contraste es, justamente, lo que nos ayudará a hacer estimaciones más realistas pues, a medida que aumentemos la complejidad de un requisito, estamos diciendo que sabemos poco de él y que, por tanto tenemos menos idea de cuánto va a durar su desarrollo y, por ende, que estamos siendo imprecisos.

De modo que, si tienes un requisito estimado como "muy muy complejo", es sinónimo de que deberías descomponer ese requisito en otros menos complejos que puedas entender mejor y, por tanto, estimar mejor.

Demasiadas estimaciones de requisitos muy simples son malas


Esto podría parecer una contradicción con la afirmación anterior, pero no lo es. Es mejor tener requisitos con estimaciones de complejidad pequeña, que estimaciones de complejidad muy grande porque significa que seremos más precisos a la hora estimar la duración de los mismos.

Sin embargo, no es frecuente que tengamos información tan detallada como para comprender a fondo todos los requisitos y evaluarlos con complejidades simples. De hecho, es muy frecuente que cuando estemos generando estimaciones, subestimemos la complejidad de las mismas y generemos estimaciones a la baja.

Por eso, si tienes muchas estimaciones de requisitos muy simples, deberías reevaluarlas con detención intentando ver posibles riesgos que podrías estar pasando por alto.

Conclusiones


Lamentablemente, en muchas ocasiones que nos piden estimar cuánto vamos a tardar en un desarrollo, no disponemos de la información ni el tiempo suficiente como para aplicar un método de estimación que tenga en cuenta la mayor cantidad de variables posibles y, en su lugar, debemos apoyarnos en la experiencia y unos principios simples que nos permitan hacer unas estimaciones que, si no son tan precisas, al menos sean justificables; porque, sin olvidar que cualquier estimación de tiempo en una fase temprana y con poca información de base puede tener una desviación grande del resultado final, siempre será mejor una estimación argumentada que una "corazonada".

martes, 14 de enero de 2014

¿Dónde publicar mi primera aplicación móvil hecha con HTML5?

Aplicación ejecutándose en BlackBerry 10, Tizen 2.2 y Firefox OS 1.2

Es un echo que las tecnologías Web ya no son solo para hacer "páginas Web". Los principales sistemas operativos móviles soportan, de una forma u otra, aplicaciones basadas en HTML, CSS y JavaScript; sin embargo, crear una aplicación móvil con estas tecnologías puede variar mucho de un sistema a otro. Por eso, si eres un desarrollador Web que quiere publicar su primera aplicación móvil, podrías comenzar por el sistema que te lo ponga más fácil para enfrentarte, después, a los más populares pero más complejos.

HTML5 embebido


Aunque cada vez sea más frecuente ver apliaciones móviles desarrolladas con HTML5, los sistemas operativos móviles más populares (iOS y Android) no soportan la creación de aplicaciones con esta tecnología, por lo que es necesario crear una aplicación con la tecnología específica de la plataforma para encapsular nuestro código "Web".

De modo que, para crear una aplicación para iOS o Android, utilizando HTML, CSS y JavaScript, primero habrá que crear una aplicación utilizando Objective C, en iOS o Java, en Andrid para embeber en ésta, nuestra aplicación HTML5. Por ese motivo, ni Android ni iOS son buenas elecciones para generar nuestra primera aplicación móvil, si todo lo que conocemos es HTML, CSS y JavaScript.

HTML5 nativo


Al contrario de los sistemas más populares ya mencionados, los SO móviles que han ido apareciendo más recientemente incorporan las tecnologías Web como herramientas naturales para la creación de aplicaciones, soportando el acceso directo al hardware del dispositivo desde APIs de JavaScript. Sin embargo hay diferencias marcadas entre uno y otro a la hora de generar la aplicación final.

Windows Phone y BlackBerry 10 son los que siguen a los significativamente más pupulares iOS y Android; mientras Tizen y Firefox OS son los nuevos contendientes que pretenden encontrar un hueco en el mercado y, para ello, intentan atraer a los desarrolladores poniendo a su disposición las mejores herramientas que pueden. De modo que, si eres un desarrollador Web, podrás crear aplicaciones móviles con tecnologías conocidas, de forma mucho más natural con cualquiera de estos sistemas.

Ahora, cada plataforma tiene más o menos requisitos para generar las aplicaciones que pueden representar una barrera para un desarrollador Web, adaptado a la libertad de utilizar cualquier editor, con cualquier navegador, en cualquier sistema:


Sin embargo Firefox OS, es el único sistema de estos que es absolutamente fiel a la filosofía Web: para generar una aplicación móvil para Firefox OS no es necesaria ninguna SDK, ni ningún sistema operativo en particular, ni ningún editor específico. De modo que, para cualquier desarrollador Web que quiera generar su primera aplicación móvil, el sistema con la menor barrera de entrada es Firefox OS.

Por dónde empezar


Claro está que Firefox OS no es el SO móvil más popular: a penas está comenzando y aún es bastante raro ver móviles con dicho sistema. Sin embargo, aquí no hemos pretendido escoger el sistema más popular para publicar aplicaciones, sino el que haga más fácil la tarea de generar una aplicación móvil con HTML5 a un programador Web que está empezando en el desarrollo móvil y eso, en Firefox OS, es tan fácil como compactar nuestro proyecto Web en un .zip que tiene un fichero de texto con una estructura muy simple y fácil de generar.

Si en este punto te ha parecido que va a ser fácil no te quedes en la suposición y compruébalo siguiendo alguno de estos tutoriales:


Y si quieres más, entonces el centro de referencia está en https://marketplace.firefox.com/developers/, donde encontraras toda la documentación que puedas necesitar.