domingo, 9 de agosto de 2015

La importancia del código limpio y estructurado

Es posible que en otra ocasión ya haya hablado un poco por encima, pero me parece algo tan importante como para dedicar una entrada exclusiva a soltarlo y quedarme agusto.

¿Tan difícil es hacer un código limpio y estructurado?


¿A qué viene todo esto?  Recientemente siguiendo un curso de CodigoFacilito de desarrollo de una aplicación web la gran mayoría del código está en app.js.  Salvo cosas que realmente no pueden estar como las vistas y poco más.

Cierto es, que la aplicación no es nada del otro mundo y no llega a 200 líneas de código, sin embargo, para ser un tutorial, creo que con más motivo se debería estructurar y comentar inline, por no mencionar que la mejor forma de empezar es con buenas prácticas.

Todo esto vino en su día, a que hubo problemas con el módulo de cloudinary y al empezar a depurar donde estaba (lo que sirve en un vídeo puede no servir varias semanas después siendo el mismo código) me desanimé mucho al no saber bien por donde meterle mano y teniendo otras cosas que hacer pues... lo dejé de lado.

¿Por qué es tan difícil hacerlo?  Mi opinión, es que los seres humanos somos por naturaleza vagos, perezosos y excesivamente optimistas.

Cuando nos topamos con un proyecto, especialmente si no es muy grande, en el momento en que estamos trabajando en él sabemos el motivo del código y creemos que añadir comentarios o crear una estructura más legible es innecesario, a eso se le une esa cierta pereza, una mala creencia de que podemos pensar que escribir comentarios es perder el tiempo, un tiempo que podríamos estar utilizando en que la aplicación progrese y como no, tendemos a pensar que todo va a ir bien, que la aplicación va a funcionar de primeras y no vamos a tener que depurarla.  Realmente no es que creamos que va a funcionar de primeras, sino que esperamos a que así sea para no afrontar la realidad, o que no falle y luego el proyecto pase a otras manos y sea otra persona la que se coma el marrón.  Tristemente es así, hay personas que esperan que funcione y luego el que venga detrás se come el marrón, eso sí, una gran cantidad de ocasiones el que viene detrás es nuestro yo del futuro y nos va a odiar por ello.

Estructurar código


Os voy a poner un ejemplo, tenemos por un lado el código original de CodigoFacilito en su GitHub https://github.com/codigofacilito/primera_pagina_node y luego mi versión https://github.com/ShinFDuran/codigofacilito-Node.  Realmente, salvo algunos retoques la funcionalidad es la misma.

Sin embargo además de los archivos normales de la versión del tutorial, en mi versión hay otras carpetas:
- controllers: Contienen la gestión de las vistas
- docs: Documentos de los diferentes commits realizados
- models: Modelos de la base de datos
- routes: Gestión de las rutas de la aplicación

En lugar de tenerlo todo en un archivo, hemos separado las capas de vistas, enrutamiento, control y modelamiento de la base de datos.  Es decir, en lugar de tener un archivo con 200 líneas de código, tenemos una serie de archivos con una función muy específica y delimitada.  A partir de ahí podemos ir testeando y probar los diferentes módulos, lo que inicialmente nos permite una mayor facilidad para localizar el error, pero en el futuro nos permitirá que si queremos cambiar un desterminado aspecto, cambiar únicamente esos archivos, dejando intactos el resto.

Estructurar el código, nos permite además de tener un código más legible una modularidad y poder reutilizar bloques mucho más fácilmente.

Comentarios


Quizás algo que sí es criticable en los proyectos que estoy realizando es la excesiva cantidad de comentarios.  Muchos comentarios inline y muchos archivos con información de los commits.  ¿Es necesario tanto comentario?  Pues la verdad es que no.

A mi modo de verlo, esta gran cantidad de comentarios tiene el fin de facilitar mi autoaprendizaje, el colocar esos comentarios como notas o recordatorios me permite que cuando estoy viendo el código refresco esos conocimientos, que a veces con echar un vistazo a los documentos de los commits entre en contexto y recuerde lo que hice y por qué.

El otro motivo, es facilitar a quienes vean mi código lo que es cada cosa, aun cuando su nivel de conocimiento no sea muy amplio.  Una vez tenga soltura y a fin de reducir tiempos o excesivos comentarios, veo importante establecer algunos delimitadores entre secciones, pero la idea es comentar lo que necesite ser comentado.

Por ejemplo, una función que se use a modo de helper, indicar cuál es su objetivo, parámetros o que devuelve, siempre y cuando no sea algo muy evidente.   En su momento leí/vi, que un buen código es aquel que no necesita ser comentado, con esto se refería, a que es importante que sea un código claro en cuanto a que las variables deben expresar lo que contienen y las funciones la acción que realizan, una buena elección de nombres puede reducir enormemente la necesidad de comentarios.

Código limpio


Una de las cosas que más me mosquean de JavaScript es que es un código terriblemente feo, en tanto que es muy fácil liarlo de una forma que no se entienda nada, entre parámetros, funciones, callback y otras cosas, se crea un infierno de callbacks y anidamientos que es horrible.

En el futuro, uno de los puntos que tendré que profundizar es en el concepto de las promises para mitigar el "Callback Hell" y preprocesadores como TypeScript o CoffeeScript para mitigar un poco la falta de visibilidad del código.

La clave, es que hay que intentar crear un código limpio, que sea fácil de leer y se vea claramente los ámbitos a fin de disminuir la posibilidad de errores.
Coste/beneficio
Esta es una parte muy importante, porque se entiende a malinterpretar.  Seamos realistas, el crear un código estructurado, limpio y comentado requiere más tiempo, pero no es ya tanto el tiempo físico en si, sino el tiempo necesario para tomarlo como un hábito.

La inversión inicial de tiempo en algunos casos puede ser considerable y a eso hay que sumarle el tiempo dedicado a escribir los comentarios.  Pero a mi modo de ver, ese tiempo es ridículo en comparación al tiempo que nos podemos ahorrar en el futuro ya sea más o menos inmediato.

El tener un código modular, reutilizable, claro y fácil de testear supone un enorme ahorro de tiempo (y por lo tanto dinero) no ya sólo a medio o largo plazo, sino también a corto plazo.   Especialmente en el caso de las empresas, toda empresa que tenga un proyecto a medio-largo plazo debería fomentar esto, porque ayuda a reducir costes posteriores a la vez que lo hace menos dependiente de los trabajadores.  Los programadores van y vienen, pero los programas de la empresa siguen ahí y tendrán que irse adaptando según las necesidades y por diferentes formas.

La inversión inicial de tiempo quedará rentabilizada con creces en la mayoría de las ocasiones; el mayor problema a mi modo de verlo es concienciar a los programadores que debemos tener una visión más a medio-largo plazo y unos hábitos más productivos.  No solo para nuestro yo futuro, sino para otros trabajadores de la empresa.

Conclusión final


Más allá de todo lo dicho, de los beneficios y ahorros que conlleva adoptar unos hábitos y técnicas, hay algo un poco más rebuscado.

Digamos que es el factor psicológico o anímico, cuando hay un problema que tenemos que solucionar, ya sea un fallo o algunos cambios si vemos un código largo, confuso o mal estructurado, podemos perfectamente entrar en un estado en el que nos desanimemos ante la mala perspectiva que tenemos.

Horas perdidas sólo en ver qué se supone que hacen determinadas funciones o módulos, el intentar descifrar lo que contienen unas variables y estar continuamente usando la opción de buscar para localizar las líneas de código donde están las funciones que hay que modificar.  Todo eso produce desánimo y junto a la pérdida de tiempo una bajada en la productividad enorme y una sensación de que avanza poco.

Por contra, un código limpio, en el que de un vistazo podamos saber lo que hace cada cosa, además del ahorro de tiempo en si nos pone en una situación opuesta, en la que nos apetece tocar el código, que hay una sensación positiva de que trabajo va a ser productivo y que va a avanzar rápido.

Ese punto psicológico lo considero muy importante y por eso creo que es necesario crear un código con el que nos guste trabajar, con el que nos sintamos código y que en lugar de maldecir a quien lo creó nos impulse a mejorarlo o aportar nuestro granito de arena.  En definitiva, estar en una situación en la que nos apetezca trabajar porque nos gusta lo que estamos haciendo.

martes, 4 de agosto de 2015

Técnica de estudio: Repetición espaciada

En la informática en general y en el desarrollo web en particular, no basta con saber algo e irlo aplicando hasta conseguir una cierta maestría, es necesario estar continuamente aprendiendo a utilizar nuevos programas, metodologías, workflows,...

Sin embargo, tan importante es el proponernos y dedicar tiempo a aprender, como la forma en la que aprender.

La repetición contínua

 

Digamos que es la repetición más habitual o que más hemos utilizado en nuestra época de estudiante, se trata de coger un concepto y machacarlo una y otra vez hasta que lo sepamos, o creamos saberlo, ya que al cabo de un tiempo nos damos cuenta que no lo sabíamos tanto.

Este es uno de los errores típicos del falso aprendizaje ya que tendremos a creer que cuando en una sesión comprendemos una idea, ya la entendemos y la "sabemos".  El machacar una idea o concepto  hasta que nos sentimos cómos y creemos que lo sabemos es denominado como "overlearning" es una de las llamadas "Ilusiones de la competencia" en la que creemos que aprendemos cuando no es así.

El proceso del cerebro


Para entender mejor las bases de esta técnica voy a explicar un poco el proceso del cerebro.  Para afianzar y mantener una idea, concepto o dato en la memoria a largo plazo necesitamos crear una estructura o camino físico entre las dendritas de las neuronas.  Sí, nuestras ideas, recuerdos y demás no son algo abstracto, sino algo físico basado en la interconexión de neuronas.

Ahora bien, en nuestro caso para que realmente se produzca esa interconexión es necesario por un lado comprender bien la idea o concepto que queremos aprender, esto ayuda y mucho, pero... es que también es necesario dejar a nuestro cerebro que cree esas interconexiones, pero el momento en que estas se crean es cuando dormimos.

El sueño es muy imporante en el aprendizaje, porque es cuando el cerebro empieza a coger todos los sucesos del día, los pone en orden y los almacena generando esas interconexiones; si dedicamos una sesión muy larga de estudio sólo lo "escribe" una vez en el cerebro.

De hecho, en su día una de mis formas de aprender era la siguiente:  Supongamos que quiero aprender a usar Bootstrap, recurro a libros o tutoriales, pero en lugar de hacerlo uno tras otro me miro la estructura del tutorial y la misma sección (layout por ejemplo) y me estudio el de todos antes de pasar al siguiente punto.  Si bien tiene la ventaja de que al ver la misma idea en diferentes fuentes pueden complementarse, al veerlos muy seguidos aunque en ese momento me da la impresión de dominar ese aspecto, al cabo de un tiempo veo que he ido olvidando partes.

La repetición espaciada

 

En el caso anterior, ahora como lo hago, si tengo 3 tutoriales me leo la sección que quiero aprender un día, esa misma sección de otro tutorial no la veo hasta el día seguiente, y la misma sección del tercer tutorial no la veo hasta pasado un día más.  De esta forma, se deja asentar los conocimientos un día y reforzarlos o ampliarlos en los sucesivos días.

En ese concepto se basa la repetición espaciada.  En lugar de muchas sesiones de estudio un mismo día, irlas separando, cada vez más a lo largo del tiempo.  Por ejemplo, insistir en un concepto 3 días seguidos, luego día sí, día no, luego cada 3 días, una vez por semana... Al cabo de un tiempo, esa idea, concepto o dato estará firmemente arraigada a nuestro cerebro.

De hecho, tengo pendiente aprender a usar una aplicación llamada Anki para este propósito tal y como se explica en este artículo:  Tips For Mastering A Programming Language Using Spaced Repetition

Por lo demás, os animo a mejorar vuestro sistema de aprendizaje con esta y otras técnicas de estudio

lunes, 27 de julio de 2015

Proyecto Jade-Bootstrap 1: Introducción

Cuando se aprende, especialmente de forma autodidacta es muy fácil perder el rumbo, especialmente si lo que estamos aprendiendo forma parte de un campo muy amplio.  El ¿Merece la pena empezar esto? Es algo muy recurrente, especialmente cuando todavía no se han cerrado otros proyectos o campos, ya que tenemos un tiempo limitado y mucho que aprender.

La tendendencia a dejar las cosas sin acabar

 

Nuestra mente es muy puñetera y uno de los aspectos más problemáticos es que ante la dificultad tiende a buscar otras tareas más placenteras, es lo que se conoce como procrastinación en alguna de sus variantes.

Cuando estamos aprendiendo algo nuevo, especialmente si nos encontramos con algún punto problemático o no nos gusta mucho, tendemos a querer cambiar y buscar otros tareas o estudios que a priori pueden parecer más placenteras.  Los pretextos son variados, pero por lo general acabamos conociendo poco de mucho, algo que en la práctica no es nada recomendable.

¿A qué viene esto?  Pues que en cierta forma esta sensación es la que me ha surgido con este proyecto, ya que tengo abiertos otros 2 similares, el curso de MiriadaX (al que me faltan 2 prácticas por entregar) y el tutorial de codigofacilito (con el que tengo un problema con la API de subir imágenes).  ¿Merece la pena este cambio aunque sea temporal?  Eso me he estado planteando, y si lo estoy haciendo es porque la respuesta es sí.  Ambos proyectos usan Bootstrap y si bien en el caso de MiriadaX ha sido por voluntad propia, creo que este proyecto me servirá para asentar las bases de Express.js a la vez que crear una base de Bootstrap que puede servirme para acelerar y mejorar el proceso de creación tanto del front en los proyectos mencionados como en otros futuros.

¿En qué consiste Jade-Bootstrap?

 

En la actualidad muchos esfuerzos van dedicados a modularizar el desarrollo y a reutilizar el trabajo realizado, iniciativas como los web components o los frameworks son una buena muestra de ello.

La idea de este proyecto es justamente esa, crear una pequeña librería de componentes usando Bootstrap y Jade, de forma que en futuros proyectos pueda reutilizar buena parte del código utilizado aquí, consiguiendo por un lado estructurar los diferentes componentes de forma fácil y con un estilo más propio.

Pero... ¿Por qué usar Jade?  Me gusta la sintaxis limpia y su uso de la indentación como forma de anidar etiquetas, es muy del estilo de Python ¿Y porque Node.js?  Si bien con programas como Prepros podría haber prescindido del backend y limitarme a usar Jade de forma que Prepros se encargara de convertirlo a HTML pero por un lado quería familiarizarme más con Node y Express y por otro quería dejar abierta la posibilidad de creación de componentes de forma dinámica.  Por ejemplo, si queremos crear una tabla determinada tendríamos la estructura base y a partir de ahí habría que modificarla, sin embargo, si introducimos un formulario que nos pida filas, columnas u otros datos podemos crear una lógica para generar esa determinada estructura.

Notas adicionales del proyecto

 

El código del proyecto lo tenéis en mi Github, más concretamente en https://github.com/ShinFDuran/Jade-Bootstrap.  Mi idea es que en cada commit añadir una funcionalidad y salvo en casos muy simples añadir un documento en la carpeta docs donde explicar un poco en más detalle el commit.

Cada cierto tiempo o número de commits, postearé aquí realizando un resumen de los cambios acompañado de algunas opiniones, problemas o ideas que me han ido surgiendo.

domingo, 26 de julio de 2015

¿Qué es un ORM?

Bajo las siglas ORM se oculta las palabras Object-relational mapping, lo que viene a ser intentar un modelo de un objeto que se pueda traducir a una base relacional, aunque actualmente también sirve para bases no relacionales.  Aunque antes de entrar en detalle, una pequeña introducción.

¿Cómo se hacía antes?


Anteriormente... y cuando digo anteriormente, digo hasta hace 1-3 años o incluso actualmente, ya sabéis que la informática y el desarrollo web cambia en muy poco tiempo, se partía de una base de datos determinada como MySQL, PostgreSQL, SQLite,... en función de la base de datos teníamos unas consultas u otras ya que tienen pequeñas diferencias.

El método que se seguía era generar un string con la consulta (este estaba formado por una parte fija y otra variable aunque el resultado final era un string) después "lanzarlo" a la base de datos y ahí controlar si había un error o si lo que nos devolvía era un resultado vacío o no.

Posteriormente, ese resultado debía ser procesado.  Como podéis ver todo esto era un proceso tedioso y no muy eficiente en cuanto al tiempo a decidarle.

¿En qué se diferencia ahora?


Mientras que anteriormente el proceso era más pesado y requería conocimientos de base de datos y dependía tanto del lenguaje de programación como de la base de datos, los ORM lo que pretenden es crear una capa intermedia que nos abstraiga de la base de datos y sea más compatible y fácil de usar.

Ahora, en función del módulo de ORM que usemos Sequelize o Mongoose en Node.js (JavaScript), Eloquent en Laravel (PHP), el ORM de Django (Python), u otros tantos tienen una forma de crear un modelo con una serie de atributos.  Se crea una única vez y tiene una forma muy similar a lo que sería un objeto en ese lenguaje.  Ese modelo servirá para las bases de datos que sean compatibles con el ORM y en lugar de conocer cómo hacer las sentencias hay que conocer los diferentes métodos que nos ofrece.

Dicho de otra forma, permite crearnos una estructura de objetos y métodos fácilmente entendibles abstrayéndonos de las bases de datos a la vez que las hace más portables.

¿Entonces?

 

En la medida de lo posible, salvo que queramos apurar y sea necesario podemos desentendernos totalmente de las bases de datos y su sistema de consultas, al menos en pequeños proyectos, en otros más grandes donde haya que tener en cuenta la eficiencia si es importante saberlo, la elección de índices y estructura de objetos en MongoDB puede cambiar brutalmente la eficiencia si se manejan muchos datos, pero por lo general para esos casos suele ya haber un especialista que se encargue.

En todo caso, lo mejor que podemos hacer, es empezar a utilizarlo lo antes posible.  Pero como ya he dicho dependerá del lenguaje y framework que estéis usando.  Quienes no estén usando uno, mucho están tardando, es como el front-end que no usa un preprocesador para CSS es algo que no tiene sentido si quieres ser bueno y productivo en tu trabajo.

lunes, 20 de julio de 2015

Re-presentación

Como ya comenté hace poco, retomo el desarrollo web y este blog de paso.

No voy a entrar en detalles que ya expuse en su día con más o menos profundidad, por un lado que me llamo Francisco Durán Navarro y que podréis verme en diferentes redes o con ese nombre o con el nick ShinFDuran.  ¿Motivo? El nombre completo es muy largo, quien me haya escrito un correo lo entiende, FDuran está ocupado así que decidí usar ShinFDuran.  ¿Qué es "Shin"? "Shin" es una palabra japonesa que significa "Nuevo", sí... no es muy original... pero me gusta.

Me he propuesto de postear al menos 3 veces por semana, para intentar no dejar esto de lado, lo considero una buena herramienta para obligarme a poner algunas de mis ideas en orden, investigar un poco y que los demás me conozcan y vean mis intereses e inquietudes.

¿De qué voy a hablar?

  • Proyectos en los que estoy trabajando
  • Temas de interés relacionados con el Front-end: Task managers, preprocesadores, performance, cross-browsing,...
  • Temas de interés generales relacionados sobre otros campos, mayormente back-end: Estructura REST, Laravel, Vagrant,...
  • Temas actuales, que aunque no queramos profundizar sí nos vendría bien saber al menos que es: React.js, Material Design, ECMAScript 2015, Go,...
  • Libros/tutoriales recomendados
  • Webs de recursos
  • MOOCs interesantes
  • Salud, productividad,..
Nada más que escribir, veremos a ver si consigo mantener este reto, igualmente, que quiera poner al menos 3 no significa que sean sólo 3, no hay límite superior en cuanto a número de artículos.  Por cierto, sobra decir que considero este mi primer artículo de la semana XD