Archivo
Ejemplo de arquitectura escalable
La gente de Octivi, a través de su arquitecto Antoni Orfin, nos hablan de cómo han conseguido servir mil millones de peticiones a la semana con una arquitectura relativamente sencilla basada en HAProxy, PHP, Redis y MySQL para un servicio de e-commerce.
El artículo está muy bien explicado, detallando la situación inicial, el por qué de cada decisión y el papel de cada componente. Muy interesante el hecho de que Redis sea quien realmente provee de datos al aplicativo, mientras MySQL es tan solo una capa de persistencia.
The architecture of StackOverflow
El siguiente es un vídeo donde los chicos de StackOverflow nos explican cuál es su arquitectura y cómo funciona.
Es mucho más sencilla de lo que esperaría para un sitio así, razón de más para compartirlo.
http://www.dev-metal.com/architecture-stackoverflow/
Configuration Management: Puppet
De entre las tareas más tediosas de la puesta en servicio se encuentran la actualización y configuración de los diferentes entornos. Estas tareas requieren la preparación de equipos con mucha experiencia y conocimiento tanto de los entornos técnicos como de lo entornos organizativos en que nos movemos. Pero una vez materializado ese conocimiento son tareas repetitivas y largas, y por lo tanto, muy propensas a error. Además de documentar y actualizar muy bien la situación de los entornos, es imprescindible automatizar estas tareas. No ya solo para evitar errores, sino también para escalar e igualar cuando el conjunto de entornos sea muy numeroso.
Para esta finalidad existen muchas soluciones. De las más conocidas en el mundo Open Source:
Todas son soluciones y basadas en código abierto (licencias Apache y GPL según cada caso), pero con una versión o servicio más completo de pago (modelo Freemium). Las más extendidas son las dos primeras, en especial Puppet que es la que tiene una comunidad más extensa, y por lo tanto una cobertura con módulos de sistemas y entornos mayor.
Puppet tiene un lenguaje de configuración propio basado en Ruby (aunque también permite el uso de Ruby directamente). La primera particularidad es que Puppet recibe una configuración de entorno final o definitiva y se encarga de decidir qué pasos tomar para llegar a ella; nosotros no definimos los pasos, sino el objetivo. Esto nos permite aplicar la misma configuración a entornos con configuraciones distintas, Puppet se encargará de igualar los diferentes entornos. Estas configuraciones son lo que Puppet llama Manifiest y se materializan en ficheros .pp.
Los ficheros .pp contienen descripciones de recursos. Cada recurso es una estructura con tipo, título y atributos que describe el estado final de un cierto elemento de configuración del entorno donde se aplica el manifiesto. Los recursos tienen una tipología propia y una estructura en clases para abarcar el conjunto de elementos o aspectos configurables en un entorno (servicios, ficheros, parametrizaciones del sistema…). Estas tipologías pueden extenderse con módulos específicos para cada elemento de software configurable (la lista se encuentra aquí). Los atributos son los valores que describen la configuración de dicho recurso. El título es el atributo que identifica al recurso de entre los de su clase (en el ejemplo: el path del fichero o el nombre del servicio). El siguientes es un ejemplo de manifiesto para la configuración de un Apache:
class apache { package { apache: ensure => installed } file { "httpd.conf": mode => 644, owner => root, group => root, path => "/etc/apache2/httpd.conf", source => "puppet://modules/files/httpd.conf", } service { apache2: ensure => true, enable => true, subscribe => [File["httpd.conf"], Package[apache]], } }
En el manifiesto anterior el estado final de configuración es aquél en el que se ha instalado el paquete de Apache, se ha copiado el fichero de configuración del repositorio de Puppet (se puede utilizar cualquier otra localización) y se ha habilitado el servicio. Nótese que el atributo, en este caso metaatributo, subscribe
indica que el recurso servicio va a ser informado de los cambios que se produzcan en los otros dos recursos; de esta manera se puede establecer orden o dependencia entre ellos. Los manifiestos pueden gestionar variables, variables de entorno, así como hacer uso de estructuras de control o de dependencia u orden.
Puppet puede instalarse con una estructura de agente y maestro, donde el maestro o maestros gestionan la configuración de los agentes, que están en los entornos configurables y que toman (pull) los cambios de los maestros. O bien, como un maestro independiente, que gestiona de manera autónoma el entorno en que se encuentra. Las consultas y aplicaciones de configuraciones se hacen mediante el comando puppet
del símbolo del sistema, aunque la versión Enterprise tiene una UI que facilita estas operaciones.
En las referencias incluyo el enlace a la documentación de Puppet (bastante completa en mi opinión), por si quieres conocer más acerca de él.
Referencias
Comparativa en Wikipedia
Review en InfoWorld
Introducción a Puppet en Puppet Labs
La foto ha sido tomada de aquí, bajo licencia CC
Esta entrada de Juan Francisco Adame Lorite está publicada bajo una licencia Creative Commons Atribución-CompartirIgual 3.0 Unported.
Tiempo y zonas horarias en aplicaciones
Siempre me he encontrado con la duda de qué estándar de tiempo utilizar en mis aplicaciones o si debo hacer uso de manera explícita del uso horario o no. Así que he decidido analizar el asunto.
Empecemos distinguiendo los estándar de tiempo de las zonas horarias:
- Los estándar de tiempos son los convenios establecidos para la medición de duración de tiempos o el establecimiento puntual de eventos en el tiempo. Es muy importante saber para qué vamos a utilizar o para qué necesitamos la medición de tiempos en cuestión. No es lo mismo que queramos definir momentos concretos en el tiempo, bien pasado o futuro; o medir duración de tiempo entre momentos específicos. Para cada caso nos convendrá un estándar u otro.
- Los husos o zonas horarias o tiempos civiles son los tiempos definidos de manera legal en un territorio. Toman como referencia un estándar de tiempo (hoy en día UTC) y difieren de este un tiempo definido según el meridiano de la región. Pueden adoptar o no, cambios por horario de verano.
A continuación veamos los tipos de estándar de tiempo:
- Estándares de tiempo basados en la rotación de la Tierra. Son aquellos en los que la posición astronómica de la Tierra y su medición indican cada momento puntual de tiempo o la duración del mismo.
- GMT (Greenwich Mean Team). Fue el primero en establecerse. Se sincroniza con la hora medida en el Real Observatorio de Greenwich (a las afueras de Londres) que coincide con el meridiano 0 o de Greenwich. Se calcula mediante la duración media del día medida entre dos pasos del Sol por el meridiano. Fue sustituido por UTC desde 1972. Por cierto, las Islas Británicas solo coinciden con GMT durante el invierno.
- UT (Universal Time). Definido con posterioridad a GMT, pero con su misma filosofía. Su medición, sin embargo, se basa en el posicionamiento diurno de las estrellas y no del Sol, lo que lo hace más exacto. Existen varios UT: UT0, UT1, UT1R y UT2. UT0 es la versión que más se ciñe a la definición de UT. UT1, es el más usado y en el que se basa UTC, incluye sobre UT0 las variaciones debidas al movimiento del eje de rotación de la Tierra. UT1R incluye las variaciones debidas a las mareas. UT2 es un suavizado periódico de UT1.
- Estándares de tiempo construidos. Son aquellos que se sincronizan mediante eventos de duración definida:
- TAI (International Atomic Time). Estándar de tiempo desde 1972 para la definición del segundo. Se creó para evitar las derivas de tiempos y las irregularidades propias de la rotación y traslación de la Tierra. El tiempo TAI se calcula mediante la sincronización de cerca de relojes atómicos en todo el mundo. Difiere de UTC en un número definido de segundos (los segundos intercalares añadidos o restados hasta la fecha desde su establecimiento).
- UTC (Coordinated Universal Time). Es el estándar de tiempo más utilizado. Está basado en el TAI pero con una diferencia de segundos definida y conocida. Estos segundos son los segundos intercalares añadidos o restados (hasta la fecha siempre se han añadido) para evitar que la hora UTC no difiera de la hora UT1 de Greenwich más de 0,9 segundos.
- GPST (GPS Time). Utilizado por el sistema de posicionamiento GPS. Está retrasado sobre TAI de manera constante 19 segundos. El mensaje de posicionamiento GPS incluye el número de segundos intercalares con UTC, para que las unidades GPS puedan calcular la hora UTC.
- Estándares de tiempo basados en el movimiento de planetas. Son aquellos en los que la posición y el movimiento de los plantas indican cada momento puntual de tiempo o la duración del mismo. El más utilizado era el Tiempo de Efemérides, calculado a partir de la traslación de la Tierra alrededor del Sol, ya en desuso debido a que no tenía en cuenta las tesis relativistas del tiempo. Hoy en día existen otros que sí tienen en cuenta estos factores, como el Terrestrial Time que sustituyó al Tiempo de Efemérides.
Conclusiones
De manera general, podemos decir que el estándar de tiempo más apropiado a utilizar es UTC para el almacenamiento de información temporal. Formateando o capturando la información para adaptarla a la zona horaria del usuario en el momento de su procesado. Todos las zonas horarias están referenciadas a este estándar y la conversión hacia o desde estas es inmediata.
Sin embargo cuando queramos calcular duraciones de tiempo a futuro con precisión, no podremos utilizar UTC, ni cualquier otro sistema basado o sincronizado en cálculos astronómicos; puesto que no podemos conocer las variaciones de tiempo o segundos intercalares que se aplicarán a futuro a un estándar de tiempo. En ese caso es preferible utilizar TAI. Esta observación no aplica para el procesado de fechas: el evento en cuestión seguirá ocurriendo en dicho momento con independencia de las variaciones.
El almacenamiento y cálculo de tiempos y fechas con zonas horarias aplicadas no puede considerarse una buena práctica. En primer lugar, las zonas horarias con cambio de horario en verano no son causales (un evento posterior a otro puede aparecer como anterior si entre medias se produce el cambio de horario de otoño, el retraso de una hora), lo que dificulta el cálculo de duraciones de tiempo.En segundo lugar, dificulta la internacionalización de soluciones o la compartición de diferentes ámbitos regionales en una solución (aplicación usada en países con diferentes zonas horarias o usuarios que viajan entre zonas horarias); sobre todo si no se ha tenido en cuenta en el diseño inicial de la solución. El argumento de la mejora de rendimiento no suele ser válido para defender esta posibilidad tampoco, puesto que los cálculos para el cambio de zonas horarias de tiempos son inmediatos (por lo general, suma de un número entero de horas).
Hasta Windows 2000 los sistemas Windows almacenaban la hora local referenciada a la zona horaria establecida en el equipo o usuario. Desde Windows 2000 y en los sistemas UNIX-like, se almacena UTC (aunque se formatee a la zona horaria del usuario cuando se muestra).
Referencias
La foto está sacada de aquí.
Time Standard en Wikipedia
GMT vs UTC
Esta entrada de Juan Francisco Adame Lorite está publicada bajo una licencia Creative Commons Atribución-CompartirIgual 3.0 Unported.
Consejos y buenas prácticas del logging de aplicaciones
Hemos ido asumiendo con el tiempo que aspectos como la seguridad y las pruebas deben de tenerse en cuenta durante todo el ciclo de vida del proyecto, desde sus orígenes hasta su finalización. Que no son requisitos no funcionales deseables o secundarios, si no que son prioritarios como parte de la estructura fundamental del aplicativo (hace no tanto eran funcionalidades o mecanismos que se diseñaban e implementaban a la finalización del proyecto como un añadido, si se hacían). Sin embargo la traza de aplicación, aún habiendo hecho méritos, no ha recibido en muchos casos la misma consideración ;-P.
En esta entrada no creo que os descubra nada nuevo a los que tengáis experiencia en el desarrollo. La idea es hacer un ejercicio de síntesis y revisión para resumir lo que, en mi opinión, son las mejores o las buenas prácticas del log de aplicación. Por supuesto, las aportaciones, observaciones, matizaciones y críticas son bienvenidas; os invito a que os unáis a este ejercicio.
El log o traza de aplicación es el procesado y almacenamiento de información relativa a la ejecución de una aplicación. Contiene datos de entidades, cambios de estado y componentes software involucradas en dicha ejecución. Su principal funcionalidad es facilitar el seguimiento o análisis de la ejecución de la aplicación:
- Analizar el comportamiento de la aplicación durante la fase de desarrollo y depuración (pruebas de caja blanca)
- Analizar los bugs o errores de ejecución detectados, sus causas y consecuencias
- Servir de registro de auditoría cuando la información contenida y el modo en que se ha procesado cumpla los criterios requeridos
- Medir el rendimiento o carga de los sistemas o aplicaciones
- Revertir el estado del aplicativo siguiendo en orden inverso el log
Aunque depende de las circunstancias en las que nos encontremos, el segundo de los usos suele ser el más relevante. Un buen log desarrollado correctamente en el código y mantenido o configurado en explotación es una garantía de respuesta rápida para análisis de errores; que incluso podrían hacerse sin necesidad de parar el aplicativo, reconfigurarlo o aplicarle ningún cambio.
La traza de aplicación suele formarse por un conjunto de eventos que se almacenan secuencialmente, por lo general en el orden en que suceden, de manera persistente o recuperable. Se pueden almacenar en ficheros, en BBDD, en componentes distribuidos a tal efecto… Se pueden habilitar mecanismos de rotación o historificación de estos logs, se pueden utilizar por monitores para lanzar alertas, se pueden integrar y fusionar para hacer análisis más exhaustivos… Lo relevante es que la información registrada y la forma en que se gestiona sea útil.
Existen numerosas soluciones y propuestas software, tanto libres como propietarias, más o menos estandarizadas, más sencillas o más completas, de mil tipos y formas. Lo importante es buscar aquella se ajusta a nuestras necesidades y entornos, para olvidarnos de la implementación del mecanismo por completo; y ceñirnos a los dos aspectos más importantes:
- El contenido de cada registro o evento, principal preocupación del desarrollador
- El modo en que se procesa, persiste y gestiona, principal preocupación de la explotación del sistema o aplicativo
El coste de implementación del logging se encuentra en el ir, mientras se desarrolla, dejando traza en los diferentes puntos del código. Esta actividad debe hacerse durante el desarrollo, siguiendo patrones, criterios y procedimientos preestablecidos. De esta manera los desarrolladores tendrán criterios comunes y la traza será coherente entre las diferentes partes del código.
La traza y la documentación del código pueden tener puntos en común en cuanto a su filosofía, objetivos y modo de aplicación, pero existe una diferencia importante entre ambos: mientras la documentación del código se adentra en el por qué se hace algo de esa manera, la traza debe cubrir el qué se hace. Por poner un ejemplo, en un bucle la documentación del código debería indicar por qué los límites o condiciones de salida son tales y la traza registrar durante la ejecución en qué punto se cumplió dicha condición de salida.
La información registrada en la traza debe ser relevante y completa. Se pueden considerar los siguientes aspectos a la hora de decidir qué información incluir:
- Qué:
- Qué evento o acción ha ocurrido.
- Qué entidades han estado involucradas.
- Si hay un cambio de estado, ¿cuál era el anterior? ¿cuál es el nuevo estado?.
- Dónde:
- En qué punto del código ha ocurrido: componente, clase, fichero de código, método o bloque de ejecución, línea de código… Cuanto más detallada sea esta información mejor para localizar el lugar del posible error o por donde ha pasado la ejecución, por un lado; pero más puede afectar el logging al rendimiento (se podría requerir información de debug) y a la concrección de la información de la traza, por otro.
- Cuándo:
- Registrando el momento temporal, bien absoluto o bien relativo al comienzo de ejecución o cualquier otro evento.
- Generando una traza secuencial o causal, en la que los eventos que ocurren antes en el tiempo o que ocasionan otros, aparezcan antes.
- En qué contexto:
- Registrando estados o variables: propios de la ejecución (parámetros), de personalización o específicos de usuario, referentes a la sesión o transacción en ejecución…
- Indicando hebras, transacciones o peticiones relacionadas cuando estemos en entornos concurrentes.
Para que la información de la traza sea más detallada en momento de análisis y más manejable durante la explotación de la misma, se establecen niveles de filtrado. De tal manera que solo se muestra o almacenan aquellos eventos con un nivel mayor o igual al del nivel de traza establecido. Las librerías de logging permiten filtrar los eventos por otros criterios como son la clase o contexto del evento, también.
Los niveles más comunes son DEBUG, INFO, WARNING y ERROR. La clasificación de los diferentes eventos en cada nivel es parte del ejercicio de análisis, y deben orientarse a que la traza sea legible y útil en los diferentes contextos del aplicativo, desde el desarrollo hasta la explotación.
Este puede ser un ejemplo de semántica de niveles de logging:
- DEBUG, para información de muy bajo nivel solo útil para el debug de la aplicación, tanto en el desarrollo como en el análisis de incidencias
- Llamadas a funciones y procedimientos y otros componentes, con parámetros y respuestas
- Flujos de ejecución
- Desarrollo de algoritmos y procedimientos que permitan identificar y seguir su ejecución en desarrollo
- INFO, información de más alto nivel que permita hacer un seguimiento de la ejecución normal
- Paradas y arranques de servicios y sistemas
- Parámetros críticos o relevantes de configuración
- Comienzo y fin de transacciones y operaciones completas
- Cambios de estado de operaciones
- WARN, información de situaciones, que aún sin ser de error, si son anómalas o no previstas, aunque el aplicativo tiene alternativas para solventarlas
- Parámetros no definidos, y cuyo valor se toma por defecto
- Situaciones anómalas, pero que son resueltas por el aplicativo, dejando la operación en un estado correcto
- Funcionalidades no primordiales o imprescindibles, que no pueden resolverse, pero que dejan la operación en un estado correcto
- ERROR, información de situaciones que son de error y que impiden la ejecución correcta de una operación o transacción, pero sin afectar a otras operaciones o transacciones (error aislado o contenido)
- No se pudo realizar una operación o transacción, pero no afecta a otras
- Peticiones o consultas erróneas (almacenando los parámetros de entrada)
- Funcionalidades generales del aplicativo, que aún afectando al funcionamiento general del aplicativo, no se consideran primordiales o imprescindibles
- FATAL, información de situaciones de error que afectan al funcionamiento general del aplicativo (errores no aislados o contenidos en alcance)
- Parámetros no definidos o configuraciones erróneas
- Falta de conexión o comunicación con otros componentes
- Errores de ejecución que pueden afectar a operaciones o transacciones independientes, o que afectan al funcionamiento general de la aplicación
Tanto el contenido y forma de cada evento de log, como la semántica de los niveles son parte del diseño del aplicativo. Estos criterios deben definirse y ser comunicados al equipo de desarrollo para que se apliquen de manera homogénea y coherente en todo el desarrollo. Si estos criterios son consensuados con el equipo se puede sacar mucho provecho de la experiencia de los desarrolladores.
Otras recomendaciones a tener en cuenta son:
- Registrar los eventos de manera atómica, que toda la información referente a un evento se almacene en un registro o línea.
- Orientar el formato de la información mostrada a poder ser usado de manera informatizada o automática con herramientas específicas.
- En lo referente a excepciones:
- Mostrar siempre la traza completa de la excepción con su mensaje y todo el stacktrace.
- Si la excepción es capturada, tratada y luego lanzada de nuevo (bien la misma u otra) no dejar traza de la excepción hasta que se capture y se trate en última instancia. De esta manera cada excepción solo se mostrará una vez. Si no lo hacemos así y registramos cada captura y relanzamiento aparacerá en la traza varias veces y no sabremos si es la misma o son varias. (Antipatrón catch-log-throw).
- Hacer uso de la propiedad de excepción causante o interna cuando capturemos y relancemos la excepción. En Java es el método getCause(), en .NET la propiedad InnerException.
- Hacer uso de mecanismos de MDC/NDC (información de contexto) para entornos de múltiples hebras o ámbitos de transacción. Esta información nos puede permitir filtrar o concretar la información de log en contexto de negocio específicos como pueden ser clientes, usuarios, productos…
- Implementar el método toString() de todas las clases de negocio o POJOs para facilitar su traceado.
- Hay que tener en cuenta las diferencias y zonas horarias a la hora de trabajar con logs de varias máquinas o componentes.
- El logging no puede tener efectos laterales, no puede modificar el estado de ningún parámetro, variable o procedimiento. Solo muestra información. Debe ser ligero, el propio logging no puede requerir de procesamientos largos o costosos.
- Las llamadas a métodos, componentes y componentes distribuidos externos, deberían registrarse tras la llamada incluyendo los parámetros de entrada y la respuesta, así como clase/componente y método, a nivel de DEBUG. Y a nivel de ERROR y FATAL cuando ocurra un error en la llamada (si fuese una excepción se debe tracear parámetros de entrada y excepción)
Un saludo,
Juan Francisco Adame Lorite
Los pequeños detalles sí importan
He descubierto hace poco un blog muy sencillo y minimalista referente a los interfaces de usuario y a ejemplos de detalles de calidad que se pueden encontrar en muchos sitios y software. Se llama Little Big Details.
Cada entrada hace referencia a un ejemplo de característica o funcionalidad de UI, a modo de pildorilla, que muestra una especial calidad o cuidado en su diseño y ejecución y que nos puede servir de ejemplo para cuando nos toque diseñar uno.
Una buena idea y muy práctica.
Consejos de uso de Powerpoint, con mucho humor
Me llegó hace poco un video de que NO hacer en presentaciones que me gustó bastante.
El ponente es todo un crack, además de meterse en el bolsillo al auditorio desde el primer momento y ser muy instructivo, es divertidísimo.
Business Model Canvas para Google Docs en español
El Business Model Canvas o Canvas de Osterwalder es una herramienta para el análisis de modelos de negocio de nuevas iniciativas. Está teniendo mucha repercusión entre los emprendedores y se toma como modelo en muchas actividades o cursos de creación de empresas o negocios. Puedes encontrar más información en su entrada de la wikipedia.
En mi opinión es una herramienta muy práctica para hacer brainstorming de manera completa de toda una idea o modelo de negocio, evitando dejar flecos e intentando llegar y completar todos los posibles aspectos o detalles del modelo. Me parece especialmente útil a la hora de trabajar en equipo para elaborar estos modelos.
Encontré hace poco una entrada de David Bland en el que compartía el Business Model Canvas como documento de Google Doc. Algo que es muy práctico porque permite compartirlo y editarlo en grupo de manera colaborativa.
He traducido el documento de David (todo el mérito es suyo) para tener una versión del Business Model Canvas en castellano, aquí. Si quieres editarlo, puedes hacerlo creando una nueva copia.
El documento original de Business Model Generation se encuentra bajo licencia de Creative Commons con reconocimiento de la autoría y derivación bajo las mismas condiciones de licencia.
Un saludo,
Esta entrada de Juan Francisco Adame Lorite está bajo una licencia Creative Commons Atribución-CompartirIgual 3.0 Unported.
Coursera, formación de universidades americanas gratuita
Coursera es una iniciativa para llevar la educación de algunas universidades americanas de manera libre al público general. El motto del proyecto puedes leerlo aquí.
La idea es permitir el acceso público a recursos como son las clases (lectures) y, en parte, la tutoría y los trabajos de evaluación de algunas asignaturas de universidades como Michigan, Berkeley o Stanford. Las asignaturas actualmente disponibles o que se están impartiendo, así como las futuras las puedes encontrar en su página. Por lo general, son materias técnicas relacionadas con el mundo de la computación, pero también existen otras como Anatomía, Teoría de Juegos o Arquitectura Ecológica. Cada una tiene sus propios tiempos y plazos, si tienes interés en alguna asignatura comprueba dichos plazos para estar pendiente.
Llevo desde marzo cursando una de las asignaturas y puedo hablar desde dentro de qué me parece la iniciativa. Las asignaturas se van dividiendo en semanas, hasta un total de 8 a 10 semanas que estimo que durará cada una. Cada semana se publica el temario para dicho periodo:
- Temas que se van a tocar durante esa semana, que suelen ser 2 o 3 capítulos de la bibliografía de referencia del curso.
- Lectures o videos de las clases impartidos por el profesor. Cada capítulo del temario suelen ser 4 o 5 vídeos de 8 a 15 minutos de duración en inglés. Creo que se esfuerzan por ser entendidos porque no me parece un nivel de inglés muy complicado. Aún así tienen también disponibles para descarga los subtítulos de los vídeos.
- Transparencias que se utilizan durante las lectures.
El ver los vídeos con las transparencias y buscar alguna referencia de algún concepto en Internet puede llevar en torno a 2 o 3 horas por semana. La verdad es que los profesores se esfuerzan por ser didácticos y que el temario sea accesible. Le dan un enfoque muy práctico orientado a resultados sin dejar a un lado la teoría, pero sin sobrevalorarla. Aún así, sí que se requiere un nivel básico de matemáticas de nivel universitario para seguir algunos de los aspectos que se tocan. El temario abordado en el curso por ahora es muy parecido al del libro de referencia de la asignatura impartida por ambos profesores en la universidad, por lo que entiendo que habrá diferencias de temario y alcance, pero que no tienen que ser muy grandes respecto a la asignatura presencial.
A continuación existen dos pruebas de evaluación del temario tocado cada semana:
- Test de preguntas, relacionadas con el temario de la semana. No se orientan a demostraciones o disertaciones teóricas, si no a la aplicación práctica de los conceptos explicados. Suelen ser la aplicación de fórmulas y conceptos a ejemplos muy sencillos y concretos. Son 4 o 5 preguntas por test y tienes 5 opciones para aprobarlo. Se graba aquella en la que has obtenido mayor puntuación. No suele llevar más de 30 minutos o una hora resolverlo.
- Ejercicio de desarrollo. Se plantea la resolución mediante desarrollo de un ejemplo o problema relacionado con el temario de la semana. Dan un código base de ejemplo ya funcional y te piden que modifiques o implementes el método de alguna clase en especial; para no perder el tiempo en aspectos del desarrollo fuera del objetivo de aplicación específico. El mismo desarrollo evalúa la eficiencia de nuestro código para resolver el problema y se puntúa conforme a unos criterios. El código podemos subirlo todas las veces que queramos para evaluar y se guarda la puntación máxima que obtengamos. Según las prácticas, me ha llevado de 5 a 10 horas de trabajo.
Existen dos fechas límites: una primera para que la actividad, sea test o problema puntúe al 100%; y otra segunda o deadline, en la que lo entregado puntúa al 50%. Si no llegamos a entregar una actividad en ambos plazos, no se nos dará el curso como completado. El primer límite son 3 o 4 semanas desde la publicación del temario y el segundo en torno a 6 u 8.
Junto con todas estas herramientas, también hay unos buenos foros con mucha participación. Los profesores y encargados del proyecto no dan a basto para atender todas las dudas. Pero no es necesario, el número de personas apuntadas es muy grande y hay un ambiente colaborativo muy sano y generoso. Cualquier duda que pongas será resuelta pon un compañero en muy poco tiempo, incluso las soluciones a tests y ejercicios.
Una dedicación semanal de 5 a 10 horas, puede ser suficiente para llevar de manera holgada la asignatura.
En definitiva, la iniciativa me ha parecido muy buena y creo que está funcionando muy bien, para ser la primera vez y para ser el número de inscritos tan grande. Permite formarte en temas específicos de muy alto nivel de forma guiada y con recursos de mucha calidad, de manera totalmente gratuita. A lo largo de este tiempo se han unido a la iniciativa nuevas universidades y asignaturas, por lo que parece que tendrá continuidad.
Un saludo,
Esta entrada de Juan Francisco Adame Lorite está bajo una licencia Creative Commons Atribución-CompartirIgual 3.0 Unported.
Feedback y canales de comunicación en interfaces de usuario (UI)
Leía y veía esta entrada hace poco en Genbeta:dev y me pareció muy recomendable.
En relación con lo que hablábamos en la entrada anterior la exposición de Bret es muy buena. Comienza ganándose al público con golpes de efecto: los prototipos que presenta son muy llamativos y representativos de lo que quiere mostrar, nos enseña un buen conjunto de ellos y están enfocados al auditorio para el que habla, que seguro que son desarrolladores en su mayoría.
Una vez tiene el público ganado, desarrolla toda su exposición de manera lineal, como si fuese una historia, explicando cuál es el motivo y motor de su trabajo hasta llegar al concepto del principio (principle) que, según él, mueve toda iniciativa creadora o emprendedora. Este es el punto álgido de la exposición en el que con un entusiasmo contagioso y una credibilidad envidiable cierra su exposición. Lo que trata tiene sustancia y cuerpo (no es humo) y además, en mi opinión, lo presenta muy bien. Si tuviera que sacar un pero, el tiempo, se me antoja un poco larga; pero posiblemente le pidieron intervenir durante una hora.
De lo que trata Bret es de los tiempos de respuesta o feedback de los interfaces de usuario. Se centra en los entornos de desarrollo, pero es extrapolable a otros ámbitos. Si aplicamos la Teoría de la Comunicación Humana, en toda comunicación existe un emisor (el usuario), un receptor (el sistema), un mensaje (qué quiere hacer el usuario), un canal y un código (ambos representados en el interfaz de usuario). El primer axioma de Paul Watzlawick dice «Es imposible no comunicar», pero esto no es siempre es verdad cuando el receptor es una máquina («¿esto se ha quedado colgado?», «¿cuánto falta para que acabe?»). El hilo conductor que mantiene toda conversación es la retroalimentación del receptor al emisor. Los interfaces de usuario llevan trabajando las últimas décadas en este sentido: el relojito de espera de los entornos Windows se creó para indicar al usuario que el equipo estaba realizando una tarea y que no estaba colgado, la barra de estado y de progreso se crearon a continuación para indicar el estado de realización de dicha tarea y hoy en día existen opciones que dan información más completa del estado de la máquina y sus tareas a su interlocutor, como cuadros de diálogo que aventuran una tiempo de finalización.
Volviendo al punto de vista del desarrollo es muy común estar resolviendo problemas en los que, o bien porque su solución es muy compleja o porque la plataforma utilizada no es lo suficientemente eficiente, el retorno que recibimos no llega a tiempo o no nos da suficiente información. Los tiempos de compilación son muy grandes, como para probar cada pequeño cambio; o el despliegue de la solución y el camino a seguir para replicar la situación que queremos comprobar es muy largo. Esto ocasiona que el desarrollador no tenga retorno por parte del sistema del trabajo que está haciendo y reduzca mucho su productividad, puesto que la vuelta atrás en caso de error puede venir muy tarde.
Existen soluciones como hacer un buen diseño en profundidad, pero el trabajo del desarrollador sigue siendo principalmente creativo y un diseño no puede cubrirlo todo. Otras alternativas más adecuadas y elegantes son el uso de pruebas unitarias de restrinjan el alcance y ámbito a probar al punto de desarrollo en que nos encontramos. Su ejecución es mucho más sencilla y rápida que el despliegue y ejecución de toda la solución y nos pueden estar dando feedback incluso en segundo plano mientras desarrollamos. Pero el desarrollo de estas pruebas unitarias, de los conjuntos de datos para lanzarlas y de los mockup necesarios para emular las situaciones a probar requieren un tiempo de desarrollo para nada despreciable y muchas veces análogo al de la solución en ciernes. Es en este punto donde se centra la solución propuesta por Bret, que sea la plataforma la que provea de mecanismos rápidos para la definición en el propio código del alcance de la prueba unitaria y para establecer la condiciones de entorno de la prueba (parámetros de entrada, estado del aplicativo y respuesta esperada). Una idea que mejoraría muchísimo la productividad de los entornos de desarrollo.
Un saludo,
Esta entrada de Juan Francisco Adame Lorite está bajo una licencia Creative Commons Atribución-CompartirIgual 3.0 Unported.