martes, 30 de agosto de 2016

Novedades en Android Studio

Novedades en Android Studio
En este articulo vamos a conocer las novedades que aparecieron en la ultima versión de Android Studio.

Al momento escribir este articulo estamos en la versión de Android studio 2.1

Este articulo tendrá un enfoque de programador y no de blog de noticias, así que puede ser que no encuentres algunas funcionalidades, pero recuerda que también es cuestión de gustos, puede ser que a ti te resulte importante alguna que yo estoy omitiendo.

GPU Debugger
Esta característica es de gran ayuda para los desarrolladores que han trabajando con Open GL, la depuración era un poco compleja ya que teníamos limitantes y estábamos amarrados a lo que se tenia, hoy ya podemos ver detalles de los Frames y los estados GL. Esa es de las opciones que son apreciadas para quienes han trabajado o trabajan en el desarrollo de videojuegos para Android.

Cloud Test Lab Integration
Esta funcionalidad no es de mis favoritas, en realidad no la he usado mucho y no me llamo mucho la atención pero creo que puede ahorrarnos mucho tiempo si la implementamos.

Esta características lo que hace es que puedes ejecutar tu aplicación en diferentes dispositivos gracias a una nube. El objetivo principal parece que tu escribas tu código y que desde ahí puedes hacer pruebas de forma rápida en la gama de dispositivos disponibles, por lo que se ve la agilidad y velocidad es el fuerte de esta opción

A continuación vienen las opciones mas atractivas para mi.

Instant Run
Esta opción nos permite ver como su nombre lo dicen “Ejecución al instante” esto es algo que da agilidad al proceso de los cambios, ya que con esto podemos estar haciendo cambio en nuestra aplicación y estar viendo como es que se ve este cambio, esta funcionalidad apareció en el BETA y creo que fue la sensación, fue de lo que mas se hablo desde que se empezó a probar, pero finalmente ya la tenemos en una versión estable.

Ahora viene la opción que mas me agrado a mi que es el Emulador.

Emulador
Sobre el emulador de Android creo que podemos decir que ha sufrido un cambio de 360 grados, no hablo de diseño hablo de funcionalidad y mejoras, pocas cosas cambian tanto para bien y sin que nos demos cuenta se han logrado buenos avances.

El emulador tiene la novedad de que funciona al menos 3 veces mas rápido que la versión anterior, yo aun no estoy seguro si son 3 o más, otros blog mencionan que son 4 o mas veces lo rápido del nuevo.

Por ahora te comento que a mi me ha funcionado al menos al doble de velocidad.

La velocidad a la que se refiere no es solamente a la velocidad de “abrir” el emulador, también cuando cargas una aplicación por que hiciste un cambio y quieres probar se nota una diferencia mayor, ahí si puedo decirte que se nota 3 o mas veces la velocidad, de hecho el cambio es tan rápido que ahora aparece un mensaje que en android conocemos como “Toast” en donde te dice que ya se cargo la nueva app con los cambios aplicados.

Por otro lado la parte de diseño también se mejora, por ejemplo si tu tomas la esquina del emulador y la estiras puedes ver como el emulador crece sin ningún problema y puedes tener la pantalla mas grande, también si quieres regresarlo a su tamaño o hacerlo mas pequeño solo tienes que tomar la esquina como lo haces en cualquier aplicación de tu computadora y hacer mas pequeña la ventana.

Por ultimo hablo del cambio mas evidente, el menú del emulador ahora creció en opciones y es mucho mas amigable, ese lo puedes ver al abrir el emulador.

En resumen:
Parece que google esta pendiente de los comentarios el StackOverFlow y en otras comunidades ya que los cambios son muchos que los desarrolladores pedían en el día a día de la programación de aplicaciones, parece que vamos por gran camino en el mundo del desarrollo y android, ahora solo nos queda esperar mas actualizaciones ya que siempre que sale una versión se vienen un grupo de actualizaciones para solucionar en su mayoría pequeños fallos.

Te agradezco tu tiempo y cuéntame que te pareció el articulo.

viernes, 26 de agosto de 2016

Diseño UI y UX

Te has preguntado ...
¿cómo es que realizan las grandes empresas las interfaces de sus aplicaciones o sus sistemas? Aparte de tener un equipo muy grande de ingenieros, diseñadores y muchas personas más, ellos se apegan a un concepto muy particular de "simpleza", para poder tener un producto completamente usable e intuitivo, donde sabes qué hacer sin tener que pasar horas aprendiendo a cómo usar el sistema, lo que las empresas tienen en cuenta al momento de desarrollar una aplicación es saber cuál es su finalidad, para qué se va a desarrollar y qué es lo que en realidad hará el sistema y de ahí agregar otros elementos al mismo.

Ya que las funciones preliminares están listas, realizan varios diseños pensados en los elementos ya definidos y eligen uno que sea simple, fácil de usar y que cubra la necesidad por la que fue desarrollado, todo esto nos lleva a pensar, "esto es muy fácil en concepto" sí, pero al momento de la práctica ¿por qué no sale bien?.

Uno de los problemas más comunes al momento de desarrollar un sistema es que nos abocamos a empezar a escribir código sin detenernos a pensar qué cosas tendrá el sistema y la mayoría de las veces la parte gráfica o la interfaz de usuario la dejamos en el olvido y decimos "no se ve tan chido, pero funciona", este es un pensamiento erróneo, por que cada parte del sistema desde el Backend hasta el Frontend debe estar bien pensado, pensar en cada elemento que vayamos a agregar, animaciones, sombras, etc. ... seguir con este pensamiento, usualmente conduce a interfaces saturadas de elementos, convirtiendo la experiencia del usuario al momento de usar el sistema en un completo desastre, por eso hoy conocerás qué es el Diseño UI y UX

Comenzamos definiendo que son cada uno :)
Diseño de Interfaces (UI o User Interface):
A grandes rasgos lo podemos definir como la interfaz de usuario la cual permite tener el control de un sitio o aplicación, pero esto va un poco mas a fondo, desde como se conciben las interfaces cuando están en papel hasta que se les asigna un color y un espacio en la interfaz.


Experiencia de Usuario ( UX o User Experience):
Se refiere al grado de satisfacción que tiene un usuario al usar un sitio o aplicación la cual viene de la mano con una mejora constante de usabilidad y accesibilidad, el punto de todo esto es que al usuario le agrade estar en nuestro sitio, pero ¿cómo desarrollo mi sistema basado en esto?, es simple, al momento de hablar de UX, nos referimos a qué, cuándo, dónde y cómo una persona accede a nuestra plataforma, y no le tiene que costar al usuario mucho de su tiempo.



¿Por qué utilizarlos?
Como lo mencione al principio tenemos que apegarnos a un concepto de simpleza al momento de pensar en la interfaz de usuario, saber a quien irá dirigido y cuál es la finalidad o qué necesidad vendrá a satisfacer, son piezas medulares al momento de desarrollar un sistema.

Siempre es bueno comparar nuestro sistema o aplicación con otras(hablo de aplicaciones de grandes empresas), y pensar qué tiene de diferente mi aplicación o que la hace especial, qué la distingue del resto, porque esto ayudará a que las personas la reconozcan, a que digan:

(Ejemplo)

Oye tú también usas la aplicación de músicaCF, ya viste que puedes componer canciones y publicarlas

Cosas de este tipo van marcando a las personas, y si desarrollas aplicaciones donde las personas se sientan parte de la misma, habrás creado algo muy especial :3 y la satisfacción es incomparable.

Como atar Usuarios?
A parte de todo lo bonito que puede tener tu plataforma o aplicación tienes que tener en cuenta que las primeras impresiones son las mas importantes al momento de que un usuario ingrese a la plataforma, la satisfacción a la hora de navegar por tu plataforma puede ser una de las razones por la cual ese usuario regresará, o no, a usarla y no solo se trata de que esa persona lo use si no que pueda recomendar tu aplicación. El contenido es muy importante ya que es otra de las razones por la cual la gente estará dentro de tu aplicación, el contenido debe de ser breve, fácil de entender y con imágenes o vídeos esto llama la atención de las personas.

Es momento de Aplicarlo :3
En lo personal de muy pocas aplicaciones he dicho:

Esto está muy bien pensado, cada detalle, cada elemento está ahí por una razón, no se necesita más :) esto es genial :)

Ahora entienden cuan importante es el UI y UX, esta en todo solo hay que saber aplicarlo ;)

Intenta hacer esta dinámica

Sí tienes proyectos personales, trata de aplicar los conceptos que hoy aprendiste y aunque no los apliques al 100% sé que los tendrás en mente :)

Intenta ver tu interfaz y descubre dónde un usuario puede perderse, dónde puede confundirse o preguntarse por qué está eso ahí.

Intenta encontrar qué es lo más importante que quieres que haga el usuario, en CódigoFacilito es que tengan los cursos al alcance, checa nuestro landing para que veas un ejemplo de cómo nosotros aplicamos este concepto. Una vez que identificas qué es lo principal, resáltalo, no solo haciéndolo más vistoso, si no quitando todo a su alrededor.

Antoine de Saint-Exupery lo resume en una sola frase: "Perfection is Achieved Not When There Is Nothing More to Add, But When There Is Nothing Left to Take Away". La perfección no se alcanza cuando no hay nada más que agregar, se alcanza cuando no hay nada más que quitar.

lunes, 22 de agosto de 2016

Lenguajes modernos y por qué aprender.

 Este post apareció inicialmente en el blog de Chiapas Ignite, comunidad de desarrolladores en Chiapas**

En la reunión anterior, comentaba que estamos viviendo una época en la que recibimos una nueva generación de lenguajes de programación. Los lenguajes de programación son muy nuevos cuando no pasan de los 10 años, basta con pensar que Ruby cumplirá este año 21 años y se inició hace 23; Python tiene ya 25 años.

Ruby, Python y contemporáneos, representaron una nueva forma de diseñar lenguajes de programación, fue un momento en el que la preocupación fue la productividad, era lógico pensando que, considerando los precios actuales, el costo de hardware es barato pero el de un programador no. Esta generación de lenguajes sacrificó parte del performance en pro de crear lenguajes amigables, que más allá de ser fáciles, son productivos, lo que significa que puedes desarrollar x tarea en pocas líneas de código, o poco tiempo.

El límite de estos lenguajes
La generación de lenguajes productivos y dinámicos no está para nada mal, hay que recordar que las tecnologías de desarrollo son herramientas, algunas son buenas para algunos casos, y otras para otros. Por ejemplo, si necesitas desarrollar un MVP para mostrar tu idea, definitivamente un lenguaje dinámico es la mejor herramienta, de hecho, la mayoría de las aplicaciones (90% del internet probablemente) funciona perfectamente bien con las pequeñas limitaciones de los lenguajes dinámicos, así que no nos volemos las cabezas y pensemos que es la muerte de ningún lenguaje, siguen siendo excelentes opciones para muchas tareas.

El asterisco de estos lenguajes es que en la actualidad, la mayoría de las aplicaciones se comunican en tiempo real, los usuarios esperan tiempo de respuesta inmediatos y algunas aplicaciones reciben visitas con números de 6 dígitos. En estos casos, el tiempo de ejecución es crítico, normalmente cada milisegundo, cada porcentaje del CPU y cada MB de la RAM cuentan.

Los lenguajes evolucionan, y aunque la generación anterior sigue siendo muy buena y muy útil, hay nuevos desafíos que se busca resolver.

La nueva generación
Los lenguajes de nueva generación están diseñados para mantener la expresividad de la generación pasada (dentro de lo posible) y además ofrecer el performance necesario para los desafíos modernos. Estas son las características que en mi opinión tienen los lenguajes modernos:

Concurrencia, los lenguajes dinámicos e interpretados, no suelen tener buena fama en este apartado; los lenguajes modernos están diseñados para funcionar concurrentemente utilizando hilos o procesos.
Paralelismo: Al buen entendedor pocas palabras: 
Compilan a lenguaje máquina o byte code. La generación anterior es de lenguajes, normalmente, interpretados.
Recolectores de basura más eficientes o de plano utilizan otras formas de manejar la memoria sin que el usuario tenga que hacerlo.
Manejo óptimo de la memoria, este caso es particularmente notorio en versiones iniciales de Ruby que se comían la memoria de la misma forma que Google Chrome :3
Particularmente la concurrencia es muy útil en situaciones de tiempo real, varios lenguajes anteriores manejan concurrencia, los lenguajes basados en la JVM son un buen ejemplo, sin embargo, los lenguajes modernos hacen que manejar múltiples ejecuciones de tu código sea más fácil, (cough... Go... cough).

Que sean compilados optimiza el performance y además hace que el deploying de aplicaciones sea más fácil, no tienes que instalar nada en el servidor (a menos que el código corra en una máquina virtual), solo subes el binario y listo.

¿Quiénes son?
4 ejemplos de lenguajes nuevos que pueden cumplir alguna o varias de las características mencionadas antes son:

Go - (Curso Go)
Swift - (Curso Swift)
Rust - (Más información)
Elixir - (Más información)
Aprende alguno de ellos, en serio, mi opinión es que lo que significó para muchos aprender Ruby, javaScript o Python hace 5 o 10 años, lo es para nosotros aprender uno de estos lenguajes.

¿No sabes con cuál de ellos empezar? Crea un hola mundo con alguno de ellos (o una estructura de datos o un algoritmo de ordenación, son súper buenos para probar lenguajes), y decide por ti mismo cuál te gusta más. De hecho, ni siquiera necesitas instalar nada para iniciar con estos lenguajes, varios de ellos tienen versiones para programar alguna que otra línea de código en el navegador, y si no, puedes usar CodePicnic.

Pero en serio, no dejes pasar el tiempo.
Final
¿Sigues aquí? Pensé que habíamos dicho que no dejaras pasar el tiempo >.< !! Jaja, ok... antes de irte, no olvides dejar un comentario en el box de discusión en la parte de abajo del artículo.

Nos ayudas infinitamente compartiendo el post. Así que no lo dudes, da click en compartir.

sábado, 20 de agosto de 2016

¿Es difícil aprender a programar?

¿Es difícil aprender a programar?... deja te doy mi respuesta en un minuto, primero quiero que pienses, ¿qué responderías si te pregunto si es difícil jugar fútbol? Seguramente dirías que no.

¿Es difícil jugar fútbol?
La respuesta que muchos dirán, casi sin pensarlo, es no. Sin embargo, no creo que sea la respuesta correcta, la respuesta a la pregunta ¿es difícil jugar fútbol? sería, Depende de dónde vayas a jugarlo. Cambiemos la pregunta ¿es difícil jugar fútbol en el Real Madrid? Sí, mucho. ¿Es difícil jugar fútbol profesional? Sí. ¿Es difícil jugar fútbol en el parque de mi casa? No.

Esa es exactamente la misma respuesta para la pregunta de si es difícil programar, depende para qué quieras programar. ¿Es difícil programar en Google? Sí. ¿Es difícil trabajar profesionalmente como programador? Sí. ¿Es difícil escribir programas básicos para mí? No, pero tampoco es tan fácil como jugar fútbol.

Aprender a programar y a aprender a jugar fútbol, en la práctica, son cosas completamente distintas, en el concepto son iguales. La única diferencia es que jugar fútbol tiene una curva de aprendizaje más amigable, esto quiere decir que con un par de días de patear el balón, y entender las reglas básicas... ya estás listo para jugar; en el caso de la programación, antes de poder jugar necesitas aprender uno que otro concepto, como un ciclo, una variable, una condicional, y sobre todo, necesitas aprender a combinar estos conceptos, que por sí solos son simples, en soluciones más complejas, que es casi como transformar toques con el pie sobre una pelota, en regates, tiros al ángulo, centros, paredes, triangulación y más.

¿Qué tan difícil es programar?
Resulta ser, que contrario a lo que muchos podrán pensar, las computadoras son extremadamente tontas, sin embargo, también resulta ser que son buenísimas para seguir órdenes. ¿Alguna vez conociste a alguien que era muy responsable para las tareas, siempre llevaba lapicera completa, los libros, los cuadernos, todo en orden... pero no era muy bueno si lo ponías a ser creativo, a innovar, a hacer cosas que no se le habían enseñado, o no las había dicho el profeso? Esas son las computadoras.

Las computadoras siguen cada paso que uno les indica, la complejidad en programar está en que no puedes predecir cada paso que va a suceder, cada interacción del usuario con la computadora es distinta, seleccionan cosas distintas, tienen nombres distintos, correos distintos, etc., etc. La complejidad de programar está en diseñar, lógicamente, un manual de pasos que la computadora pueda seguir, para solucionar un problema, porque como dije antes, la computadora no es creativa, pero sabe seguir órdenes. ¿Qué tan bueno eres para indicarle a alguien qué hacer?

Para ser concretos, mi opinión es que programar cosas muy sencillas (sin conocimientos previos) puede tomarte unos 15 días, tienes que entender los conceptos, es una manera de pensar distinta, entonces hay que acostumbrarse. Esos primeros problemas sencillos son clave, si logras entender qué pasa, ya estás del otro lado.

Programar soluciones reales, es decir, poder hacer programas que de verdad puedan ayudarte en el trabajo o mejorar tu carrera, te puede llevar un par de meses de aprendizaje y práctica.

Por otro lado, programar para vender, es decir, venderle soluciones con software a otras personas, te puede tomar a partir de 6 meses de práctica intensa, y claro estamos hablando de soluciones sencillas.

Tener el nivel para poder buscar un empleo como programador, puede tomarte, mínimo un año.

Programar es una habilidad que mejora practicando, si practicas mucho, mejorarás más rápido, si no, irás más lento. Es difícil dar cifras de cuándo estarás en qué punto.

Pa ke quiero saber eso, jaja saludos.
¿Por qué deberías aprender a programar?. En el peor de los casos, las computadoras (y por computadoras quiero decir celulares, laptops, PCs, dispositivos inteligentes, smartwaches, SmartTVs etc) han demostrado poder contribuir o mejorar cualquier industria donde se les coloque; en el mejor de los casos, las computadoras han revolucionado por completo alguna industria:

Netflix cambió el entretenimiento con software (si no me creen, pregúntenle a Blockbuster)
Google mató las enciclopedias
Uber cambió la forma en que nos transportamos
Amazon cambió la forma en que compramos
PayPal la forma en que pagamos
Todas estas empresas, utilizaron tecnología para cambiar lo que creíamos estaba bien definido y establecido. Tal vez me lees y eres doctora, agricultor, estudiante, súper héroe, maestra, o lo que sea; es muy probable que el siguiente gran cambio en tu entorno de trabajo, esté empujado por computadoras, desde que un programa te reemplace (por ejemplo si trabajas en un Call Center, o eres chofer), hasta que la computadora facilite y optimice tu trabajo.

Suena feo decir que un programa te reemplace, las películas lo hacen ver horrible, en la realidad no es tan feo, hay trabajos inhumanos que ninguna persona debería hacer, y son esos los que, primeramente, serán reemplazados por computadoras.

La pregunta es, ¿cómo formas parte de la siguiente revolución en tu entorno de trabajo? ¿Serás quien cambie las cosas? ¿Serás quien apoye el cambio? ¿Serás quien quede obsoleto? ¿Serás quien se niegue al cambio?

Entender cómo funciona una computadora, como sigue órdenes, qué puede hacer por ti, es clave en que definas ¿Cómo pueden las computadoras mejorar mi trabajo?

Cómo pudiera mejorar mi trabajo con software
Si yo te preguntara, ¿Cómo crees que un programa o una app cambiaría o revolucionaría tu entorno de trabajo?, ¿qué contestarías? Tómate un minuto y piensa, cómo será la revolución de tu trabajo con software, y por qué el software tiene tanto éxito revolucionando cosas...

A ver... en primer lugar, ¿qué hacen las computadoras? Desde niño quise ser programador... y me tomó años entender qué era programar, mi papá es programador, y fue dificilísimo para mí entender qué hacía mi papá en su trabajo, pensar, ¿cómo puede una computadora hacer tanto? Desde mostrarme las películas que piensa que me gustarán, aunque no las haya visto, hasta buscar en el internet en micro segundos para darme respuestas. Adjunto imagen de tú y yo tratando de entender cómo las computadoras pueden hacer tantas cosas distintas:


Aprender a programar, es aprender a entender cómo funciona el software que está cambiando tu vida. ¿Cómo le hacen para saber dónde mostrar los pokemones? ¿Cómo saben si estoy cerca o lejos de una pokeparada? ¿Cómo saben que mi calle se ve así? ¿Cómo saben que hay agua para mostrarme pokemones de agua? Sin tanta precisión, un programador experimentado podría darte una idea de la respuesta a dichas preguntas.

Si quieres ser parte del progreso de tu industria, o tú mismo cambiar las cosas en tu profesión, probablemente entender qué puede hacer un programa por ti, te ayude... en otras palabras, Aprende a programar.

Qué tanto necesito saber y cuánto me va a costar
Depende de dónde quieras programar, igual que depende dónde quieras jugar fútbol. Pensemos en Messi o en Cristiano Ronaldo, ¿te imaginas la cantidad de horas que han entrenado en su vida? ¿Qué porcentaje de toda su vida la habrán vivido con una pelota en los pies, o en el gimnasio, o estudiando partidos? La preparación que los jugadores top ponen, es enorme, muy difícil de imaginar... si quieres programar en Google, en Amazon, en Facebook... eso te toca, horas y horas de código, ¿la recompensa? Más de 100,000 dólares anuales en salario, comida gratis, espacios de trabajo inspiradores, desafíos grandes, lavandería gratis, toboganes en el trabajo, etc. etc.


¿Crees que cualquier persona puede ser Messi, poniendo las horas adecuadas de trabajo? Mi respuesta es que no, llegar al nivel más alto de una profesión requiere de mucho esfuerzo... llegar a ser los top de los top, la crema y nata, los mejores de los mejores... usualmente requiere de talento.

Hay gente a la que se le da más fácil aprender a jugar fútbol, o las matemáticas, algunos son rápidos desde niños, otros son buenos leyendo, otros son buenos dibujando... otros programando, o mejor diseño, otros desarrollan el pensamiento lógico más rápido.

Hasta hoy, si me preguntan, ser un programador de esos que ganan miles de pesos en las empresas más importantes del mundo, requiere de mucha práctica... y de algo de talento. No te desanimes, no todos tenemos que llegar ahí para ser exitosos... además, mi trabajo del día a día, y el de muchas personas, es quitar esa barrera y dejar que cualquiera (con la actitud y la disposición adecuada) pueda ser un programador profesional.

Programar es una de las habilidades en las que más trabajo se ha empleado para que puedas aprender, ¿por qué? Porque hay mucha demanda de programadores, todos quieren un programador, desde tu tío el que tiene una micro empresa exitosa, hasta las multinacionales, las startups, las empresas de vídeo juegos y los proyectos personales que se hacen por diversión.

Conseguir un trabajo como programador requiere de mucha dedicación, y se puede, casi para cualquiera. Revisa nuestra sección de artículos, donde tenemos varios posts que hablan sobre cómo mejorar programando.

Aprender a programar para entender una computadora, se puede para todos, no necesitas invertirle años, con un par de meses y las horas de práctica adecuadas, tienes suficiente. Conseguir un empleo como programador también es posible, si es lo que quieres o es lo que te gusta.

Conclusión
Programar es muy importante para ti, sobre todo si eres joven. Como puedes leer en Forbes TODAS las compañías, ya son compañías de software
Programar no es solo para los programadores, es para cualquiera.
Programar te enseña a pensar en los problemas como una serie de pasos, eso te ayuda en la solución de cualquier problema, no solo los de software.
Mucha gente piensa que eventualmente todos los niños llevarán clases de programación, ¿debe ser por algo, no? Empieza ya.
Puedes aprender a programar desde tu casa, solo necesitas una computadora e internet. Nada más.
Hace 1 año tenía problemas de los que hoy me río. A todos nos pasa, si hoy te cuesta mucho lo básico, es normal, continúa... en un año probablemente te rías de estos problemas.

lunes, 8 de agosto de 2016

¿SQL vs NoSQL?

¿SQL o NoSQL? Una pregunta muy recurrente cuando nos encontramos iniciando en el maravillo mundo de las bases de datos, es muy probable que si ya haz tenido un encuentro con este mundo haya sido a través de las base de datos relacionales. Pero ¿qué ese exactamente una Base de datos relacionases? ¿Por qué existe bases de datos No relacionales? y ¿Por qué son tan populares hoy en día?
Dentro del mundo de bases de datos nos topamos con dos grandes vertientes, las bases de datos relacionases y las no relacionales. Las primeras son las bases de datos que todo el mundo conoce, si vas a almacenar datos de tu aplicación en automático pensamos en tablas, columnas, tuplas, relaciones y algunos gestores como MySql. Las bases de datos relacionases tiene como principal características almacenar los datos agrupados por contexto en algo llamado tablas, cada tabla debe de tener una o más relaciones con otras, las relaciones nos permitirán conectar todos los datos entre si.
Dependiente del problema en el que nos encontremos podemos aplicar diferentes niveles de normalización. La normalización nos permite a nosotros como arquitectos de la base de datos (los que vamos a modelar nuestra base de datos) eliminar la redundancia de datos que pueda existir, proteger la integridad de datos y claro permitir su fácil mantenimiento.
Existen 5 niveles de normalización y claro no todos son aplicables a todos los problemas. Cuando nos encontremos diseñando nuestra base de datos siempre debemos de pensar en el costo computacional que conllevará obtener los datos de regreso, eso implica que nuestro nivel de abstracción debe de ser muy bueno, no es lo mismo crear una tabla nueva y agregar una relación más a tener una tabla que se relacione con ella misma y realizar una consulta recursiva,
La forma con la que nosotros podemos trabajar con los datos que almacenamos en nuestra base de datos es mediante un lenguaje de consultas, si nos encontramos trabajando con bases de datos relacionases el lenguaje por excelencia es SQL (Structured Query Language). SQL nos permite trabajar con las relaciones entre tablas, es decir combinar tablas de una forma muy fácil gracias a su base de teoría de conjuntos (Joins).
Las base de datos relacionases sin dudas es un mundo muy complejo e interesante.
Existen diferentes manejadores de bases de datos que utilizan le lenguaje SQL, dentro de los más populares por mencionar algunos encontamos a :
  • Mysql
  • PostgresSql
  • Oracle
  • Microsoft Sql
  • Sqlite
Es muy probable que ya hayamos trabajado con alguno de ellos.

NoSQL

Ok, con esta pequeña introducción de base de datos relacionases pasemos a las no relacionases o mejor conocidas como NoSql o Not only Sql, ya teniendo en cuenta su contraparte será más fácil de explicar que son estas “nuevas” bases de datos.
Las bases de datos no relacionases o no Sql como su nombre lo indica son bases de datos que no se rigen por tener los datos relacionados entre si, esto conlleva a que no exista una normalización en si y claro que no se utilice la teoría de conjuntos tan fuertemente como lo haríamos en las relacionales.
Partiendo que existen poco más de 150 bases de datos NoSql y que cada una tiene su forma de trabajar con datos, es un poco complicado explicar todas sus características, sin embargo dentro de este mundo tenemos similitudes, podemos agrupar ellas.
Almacenamiento de datos.
  • Orientado a Documentos (MongoDB, CouchDB , ToroDB, RaptorDB etc …)
  • Orientado a Columnas ( Cassandra, Hadoop, MonetDB etc…)
  • Almacenamiento Clave Valor (Redis, RocksDB, BoltDB etc.. )
  • Almacenamiento de Grafos (Neo4j, TITAN, WhiteDB etc… )
Lenguaje de consultas.
Bien ya nos damos una idea de como estas base de datos manejan los datos, pero ¿cómo puedo realizar las consultas si ahora no tengo a SQL? bien la respuesta es simple, para la mayoría de los casos utilizaremos Java Script, ese lenguaje de programación que se encuentra del lado del cliente ( a veces en el servidor) es el que nos permitirá realizar las consultas para la obtención de datos.
Datos semi estructurados.
Otra de las características de las bases de datos no relacionases es que a diferencias de las relacionases estas no requieren un schema para trabajar, es decir no se requiere una “plantilla” en la cual los datos sepan en que parte deben de almacenarse, con que tipo de valor y bajo que condiciones deben de almacenarse.
Dentro de una registro a otro pueden existir atributos completamente diferentes, atributos que pueden o no existir en otros registros. Hablemos con un ejemplo, supongamos que tengo tengo la necesidad de almacenar prospectos de mi tienda en linea, los datos que me interesan son los de contacto, sabemos que pueden ser muchos, múltiples correos, números telefónicos, páginas web, direcciones, sabemos de igual forma que no todos nuestros prospectos pueden tener números telefónicos o pueden tener más de uno. Soluciones:
En base de datos relacionases tendríamos que realizar un universo de medios de contactos, y dependiendo del nivel de normalización pudiéramos tener diferentes tablas para cada tipo de medio de contacto, una relación uno a muchos y claro un super tipo.
Cuando nos encontremos con este tipo de base de datos debemos de olvidarnos de gran parte de la planificación que tendremos al momento de maquetar esta.
En base de datos no relaciones es algo más sencillo, pongamos el ejemplo con MongoDB, basta con crear un documento donde se almacenen los medios de contactos y si tienen o no muchos medios de contactos se almacenan, si no, simplemente no, Algo así:
{
 'direcciones' : []
 'telefonos': [
  { número: 12341234, ext: 123 },
  { número: 55566777, ext: 456 },
  { número: 55566777, },
 ]
 'correos' : [
  {'test@test_dos.com'}
 ]
}
*Dejo el arreglo de direcciones para comprender más el ejemplo.
vemos que los teléfonos pueden o no tener extensión, cosa que en las bases de datos relacionases pudiéramos tener campos nulos. pueden o no existir correos al igual que direcciones, si contiene esta bien, si no las contiene de igual forma esta bien.
Si te interesa aprender bases de datos no relacionales ahora tenemos un curso de MongoDB completamente gratis en Código Facilito, Curso Mongo
Cuando nos encontremos con este tipo de base de datos debemos de olvidarnos de gran parte de la planificación que tendremos al momento de maquetar esta.
Optimización de consultas.
Las ventajas de utilizar NoSql es que nos permiten obtener datos con un costo computacional mucho menor que utilizando Sql, como ustedes pueden ver en el ejemplo los datos se encuentran en el mismo documento y no existen atributos que no contengan un valor, si no que todos los datos que están allí tienen una función, además que el equipo de computo que necesitemos para nuestro servidor puede no contener especificaciones de hardware tan altas.
Real time.
La mayoría de este tipo de base de datos nos permiten trabajar con los datos en tiempo real y eso claro esta más que genial.
Un comercial más, tenemos un taller de tiempo real con Redis y la arquitectura PUBSUB Aquí por si te interesa, Taller redis.

¿Cuándo debo de utilizar una base de datos Sql o Cuándo uno NoSql?

Bien ahora viene la pregunta obligada.
Me centraré en la capacidad que tienen ambos tipos de base de datos para poder adaptarse a los cambios ya que la consideró la parte más importante a la hora de tomar una decisión.
Ambos tipos de bases de datos nos permiten realizar escalabilidad, así que por ese tema están bien.
Para lo que no sepan la escalabilidad es el termino que usamos cuando necesitamos hacer que nuestra base de datos tenga el mismo o un mejor rendimiento cuando existan ciertos problemas en el entorno, el mayor problema que existe es la generación de datos de una forma muy rápida, algo que quizás no hayamos contemplado al iniciar el proyecto. La escalabilidad podemos dividirla en dos grandes vertientes,
Horizontal y Vertical, siendo la primera el ingreso de software al equipo de computo para que este mantenga o mejore el performance ante estos problemas, por otro lado la escalabilidad vertical se trata de ingresar nuevos equipos de computo a la red para que se distribuya la información y cada equipo trabaje en cosas más especificas.
Por otro lado tenemos que nuestros proyectos pueden crecer muy rápidamente lo que implica poder realizar cambios constante, en ambos casos es posible realizar modificaciones en producción.
Si bien una base de datos relacional bien normalizada nos permite realizar modificaciones muy fácil al momento de insertar nuevos datos, en muchas ocaciones las obtención de datos es su lado débil, la comprensión se vuelve más difícil y los joins que debemos de realizar son complicados de manejar, realizar joins a una tabla con miles de registros es un grabe problemas de performance que no se debe tomar a la ligera,.
Por otro lado las base de datos no relaciones como ya hemos visto nos permiten almacenar datos si y solo si los necesitaremos, los cambios son más sencillos de realizar, el problema aquí es que no podemos almacenar todos nuestros datos en una sola colección (grafo, tupla, diccionario) y al no tener relaciones entre ellas debemos de ingeniárnosla para obtener los datos, es decir debemos de crear nuestros propios joins.
Y el punto más importante, si estamos generando datos debemos tener en cuenta si los datos los necesitamos almacenarlos de una forma estructurada. Si es así no hay forma, siempre usaremos Sql en caso contrario NoSql. Quizás necesitemos un par de reportes, una par de gráficas tener muy separados los datos o quizás no.
Es importante tener esto muy en cuenta antes de comenzar el proyecto.
Por ultimo considero el real time como un punto de suma importancia, no en todos los proyectos son necesarios, pero si fuera el caso, podemos apoyarnos en alguna base de datos NoSql.

miércoles, 3 de agosto de 2016

TurboLinks. The new big thing

Turbolinks es una herramienta que ha estado en Ruby on Rails desde la versión 4, en mis palabras es una librería de javaScript para acelerar tu aplicación; en palabras del repositorio en GIthub, Turbolinks hace que dirigirse a un link en tu aplicación web sea más rápido. En lugar de dejar que el navegador recompile el CSS y javaScript de tu sitio en cada cambio de página, Turbolinks mantiene la página actual funcionando y reemplaza solo las partes del cuerpo de la página necesarias.
Básicamente, cuando tienes Turbolinks en tu aplicación, al darle click a un link, la librería intercepta la petición, y la convierte en AJAX, de manera asíncrona solicita al servidor las partes a actualizar de tu sitio web, y sustituye lo que sea necesario.
Turbolink solo actualiza los tags body y el tag title del encabezado, de modo que no solicita de nuevo los assets de tu sitio, haciendo que la transición entre páginas sea más rápida (porque no cargas esos assets), además, como el repositorio lo menciona, evita que el navegador tenga que recompilar las hojas de estilos y los scripts de javaScript.
La intención de la librería es darte las ventajas de una SPA(Single Page Application), sin la complejidad de construir una, recordemos que una SPA (que puedes construir con Angular, Backbone, etc), significa que tienes que mantener dos partes de la plataforma, la lógica del servidor (que solo sirve datos) y la funcionalidad del sitio en javaScript; Turbolinks busca darte los mismos beneficios sin que tengas que mantener dos partes.
Integrar Turbolinks es transparente para tu aplicación, es decir, una app de Ruby on Rails con Turbolinks y sin Turbolinks se programa igual, las vistas son iguales, los controladores son iguales, todo es igual... excepto por los eventos en el navegador (más de esto a continuación), haciendo el proceso transparente, Turbolinks se asegura de que no tengas que adaptar tu plataforma web para darle el feeling de una SPA.
La plataforma de CódigoFacilito, como habrás notado, muestra un mensaje de "Cargando..." cada vez que clickeas un link, si recargáramos toda la página en cada link, sería imposible mostrarte el mensaje de que la página se está cargando, sin embargo, como estamos usando Turbolinks, sin hacer cambios podemos ofrecer ese pequeño UX (además del incremento en la velocidad al moverte entre links). Esto es lo único que agregamos para mostrar el mensaje de precargado:
$(document).on "page:fetch", ->
 $(".loading-alert").fadeIn()
$(document).on "page:change", ->
 $(".loading-alert").fadeOut()
Además de claro añadir el div que contiene el precargado:
.loading-alert.white-text.blue.large-padding.text-center.z-depth-3
 %i.mdi-action-cached.spin
 Cargando...
.absolute.full-width
 .progress#progress{style:"margin-top:0px;z-index:999;display:none;"}
  .indeterminate.red
Y listo... Turbolinks for the win.

Los problemas de Turbolinks

El principal problema de TurboLinks, es que la ejecución del código de javaScript es persistente entre peticiones, es decir, cuando cambias de link, el código sigue como estaba, las variables declaradas siguen como están, los intervalos creados siguen ejecutándose, es decir, todo continúa.
Plus, la página nunca recarga, solo cambia las partes necesarias... ¿eso es problema? Lo es para tus eventos. Es común que todo lo que necesitemos ejecutar al inicializar la página lo coloquemos en la ejecución del evento "load" de la página:
window.addEventListener("load",function(){
  // Aquí la inicialización porque nos aseguramos de que el sitio ya ha cargado
});
Alternativamente podemos poner el script al final de la página para obtener el mismo resultado... ¿el problema? El problema es que el navegador no vuelve a disparar el eventoload no importa que hayas cambiado la página, porque pues no la ha recargado. Eso significa que tu script está roto. La pregunta es ¿cómo ejecuto código cada que cambio la página?
Par de alternativas, primero, podemos utilizar la gema de kossnocorpjquery.turbolinks, esta es mi recomendación para solucionar posibles problemas con el binding de eventos de librerías o frameworks externos, si por ejemplo estás usando Bootstrap, Materialize o similares, no dudes en agregar la gema a tu Gemfile:
gem 'jquery-turbolinks'
E instalarla
bundle install
Segunda recomendación, utiliza los eventos que TurboLinks dispara cuando recarga el sitio junto con los que normalmente usas. Un ejemplo de esto es el precargado, nota como esperamos al evento page:fetch (hicieron click en un link y TurboLinks fue por la página) ypage:change (se cargó una página nueva con TurboLinks), en otras palabras esto:
$(document).ready ()->
  # Aquí ya cargó el sitio en aplicaciones tradicionales
Se convierte en esto:
$(document).on "ready page:load page:restore", ()->
  # Se dispara la primera vez que carga la página, al cambiar de sitio y cuando regresas a una página anterior
Problemas resueltos.

TurboLinks 5 y Aplicaciones híbridas

Hace poco más de un mes, DHH anunciaba en twitter que TurboLinks 5 estaba en fase beta y podíamos iniciar a usarlo:
TurboLinks 5 es una idea que en lo personal me parece revolucionara, tanto como para DHH quien cree que es como cuando liberó Ruby on Rails:

Looking back at the body of work, that level of productivity w/ Turbolinks + Majestic Monolith, it feels like a 2004 “secret weapon” again.
That same sensation as when Rails was released that we were doing something substantially different from the norm to get outsized results.
¿Qué hay de especial en TurboLinks 5? TurboLinks se me hizo siempre una idea interesante, me gustan las SPA's, me gusta que la página no recargue, me gusta ese dinamismo... pero desarrollar Angular, Backbone, etc. no se sentía ágil para mí, desarrollar dos veces una lógica muy similar, debugear una SPA no es tan transparente como una aplicación web tradicional... TurboLinks quitó esos dolores y trajo un feeling similar, bien... pero ahora es mucho más que eso.

Apps híbridas

¿Recuerdan que TurboLinks solicita una parte de tu sitio y nada más? ¿Recuerdan que trae del servidor solo la parte importante que necesita? Qué pasaría si esa parte importante la colocamos en un WebView e instanciamos uno por cada Link.... eso ya lo hicieron:
TurboLinks 5 vino acompañado de un SDK para Android y para iOs, además, usando Electron y TurboLinks 5, el equipo de Basecamp construyó aplicaciones para Mac y Windows.
Las aplicaciones móviles que se acompañan de TurboLinks "son nativas" en el sentido de que necesitas abrir AndroidStudio o xCode, necesitas integrar el SDK y definir qué hará TurboLinks cuando alguien clickee un link. Además claro puedes responder a notificaciones, enviarlas y más... por todo lo demás, es HTML, CSS y JS. Es como Phonegap pero sin tener las vistas (HTML) en el proyecto de la app, las vistas se mandan desde el servidor, no están en el dispositivo.
El SDK te permite definir si abrirás un nuevo Intent (hablando en palabras Android), si solo instanciaras un nuevo WebView o qué pasará cuando un usuario trata de moverse en tu app. Así que básicamente:

¿Quieres saber más?

Te recomiendo ampliamente el curso de Backend 2016, vamos a crear una red social con Ruby on Rails, vamos a ver varias cosas de TurboLinks y para otro curso quisiera crear apps para la red social utilizando lo que aquí te conté. ¿Suena muy interesante no? Es genial... Rails es perfecto para las startups porque te permite hacer esta clase de cosas, ser súper productivo con equipos pequeños de trabajo, hoy puedes tener apps "nativas" para Mac, Windows, iOs, Android y crear una sola base de código en Ruby on Rails.

PD: Rails 5 tiene otras cosas muy interesantes además de TurboLinks, tiene ActionCable para crear aplicaciones en tiempo real y también lo enseñaremos en el curso de Backend 2016.