Test Driven Development

Como es costumbre voy a empezar esta blog con un video, siempre que veo un nuevo tema me gusta encontrar uno para poder tener una idea de que es lo que se refiere el tema, con que se puede comparar o en que idea me puedo centrar, bueno aquí va:

Fuente: https://www.youtube.com/watch?v=q6z3jFZl8oI

El nombre de este paradigma lo dice todo, Test driven development, hacer que todo tu desarrollo sea movido a base de pruebas, es decir, cada vez que vayas a generar una sección de código debe pasar por un sistema de pruebas, si se pasan toda esta serie de pruebas, el código se adjunta al proyecto completo y si no es así se debe continuar con una revisión del código.

Lo que me hace recordar mucho este tema es a la platica que nos dió uno de los invitados de la clase (wink, wink), el nos platicó acerca de una variable de este paradigma, no recuerdo el nombre al 100% pero recuerdo que se refería a que en cada commit y cada cambio que se hiciera en tu código (cada vez que lo guardes), una serie de pruebas correrían, si se pasan todo seguiría a la normalidad pero si no, todas los cambios se borran, me parece una forma un poco loca de desarrollar pero a la vez pienso que podría evitar muchos problemas estilo domino, por ejemplo si cometes un error en una parte del código y no te das cuenta hasta que corres pruebas después de 30 commits, vas a tener que regresar en todo el código escrito en esos 30 commits para poder darte cuenta en que fue que la regaste.

Ventajas

Desde mi punto de vista las ventajas del TDD son que puedes ir avanzando con firmeza sin tener que preocuparte por errores en el camino, hace que el desarrollo sea más productivo y eficaz, en vez de hacer grandes párrafos de código los cuales son muy propensos a que la cagues en un punto y ni siquiera te des cuenta el TDD te ofrece la capacidad de darte cuenta de esos errores al momento y que los puedas resolver en ese instante.

Desventajas

Sinceramente depende mucho de el tipo de proyecto y el tipo de equipo en el que trabajes, desde mi punto de vista el TDD es uno de los mejores paradigmas de desarrollo pero pues evidentemente todo en esta vida tiene un costo y en el caso del TDD, es generar todas las pruebas necesarias que le aplicaras a tu ya generado código, que por una parte es una buena inversión a futuro pero a la vez es una inversión de tiempo que debes de tener en cuenta en el momento de gestionar tus tiempos e incluirlo en los horarios del proyecto.

Encontré esta repo en github que te ayuda a aprender TDD usando HTML y JavaScript, así que es hora de hacerle fork y probar el TDD más a fondo!

En resumen TDD = increible herramienta para que tu código sea algo así:

Resultado de imagen para tesla roadster"
Fuente: https://crdms.images.consumerreports.org/c_lfill,w_720,q_auto,f_auto/prod/cars/cr/model-years/9120-2020-tesla-roadster

y no sea algo así:

Pueden ver mi trabajo en grupoargon.co

Agile y Objetos

En los últimos años las metodologías ágiles han tenido un boom increíble esto ya que realmente funcionan y mejoran nuestro rendimiento en cualquier actividad de productividad, en nuestro caso como desarrolladores, estas metodologías nos vienen muy bien, ya que para empezar normalmente somos muy desorganizados y como siempre lo hemos mencionado en este blog, normalmente comenzamos por la parte de la programación y dejamos la planeación para el final, algo que en un ambiente de trabajo con una metodología ágil implementada probablemente no pasaría.

fuente: https://www.youtube.com/watch?v=ZZ_vnqvW4DQ

Para las personas que aun no saben que es agile aquí les dejo un video, en resumen habla de que agile no es una metodología en sí si no una base de principios y valores que un equipo debe de seguir para lograr el objetivo de convertirse en un equipo “ágil”, pero bien agile también propone el uso de metodología como scrum o kanban en mi caso les voy a platicar un poquito de kanban ya que es la herramienta con la que he trabajado y la que me parece más eficiente.

fuente: https://www.youtube.com/watch?v=R8dYLbJiTUE

Y bien aquí les dejo otro video sobre kanban para que entendamos como funciona, kanban es un sistema de productividad en el cual generas tareas y las colocas en un “kanban board”, este está dividido en tres partes: pendiente, trabajando y terminado, las tareas se van colocando en estos tres apartados conforme se va trabajando hasta haber logrado terminar cada una de las tareas exitosamente, en mi caso desarrollé un videojuego con la ayuda de kanban, mi equipo y yo hicimos un tablero en Trello donde pusimos todas las tareas necesarias para poder tener un producto tangible, obviamente este proceso no es perfecto, ya que normalmente muchas de las tareas se van modificando, eliminado o agregando nuevas tareas conforme se va progresando en el desarrollo del proyecto pero la idea base de kanban es esta, en equipos pequeños o para tener una bitácora personal de productividad pienso que kanban es una herramienta muy poderosa pero siento que si se escala a equipos muy grandes puede ser un poco caótico, no digo que no se pueda aplicar pero en la parte de la administración de tareas y asignación el ser parte de un equipo muy grande probablemente se vaya a ver afectado el nivel de productividad.

Tablero de trello de proyecto de Argón

Aquí hay un pequeño ejemplo de como trabajamos en mi equipo de desarrollo, podemos ver las distintas secciones de cada una de las tareas, de esta forma podemos escoger lo que queremos hacer en el día y atacar cada tarea individualmente.

Ahora, que tiene que ver todo esto con el diseño orientado a objetos, pues bien, todo lo que hemos hablado de POO, puede ser manejado con una metodología ágil, esta es la ventaja de agile, no es exclusiva para un solo tipo de tarea, si hay un proceso involucrado en una tarea, probablemente se le pueda aplicar una metodología ágil para mejorarla.

En conclusión agile es una herramienta muy poderosa para poner orden a nuestro proceso de desarrollo de software y poder tener la máxima productividad en nuestro día a día.

Pueden ver mi trabajo en grupoargon.co

Revisión de código

Las revisiones de código son una parte fundamental a la hora de desarrollar un proyecto de software, ya que esta practica se encarga de mejorar la calidad y beneficiar de forma positiva al equipo de desarrollo.

Este video me pareció super interesante esta bastante largo (lo vi en velocidad x2) lo recomiendo mucho:

https://www.youtube.com/watch?v=EyL7mqwpZhk

¿Qué debemos revisar?

Esta es una pregunta que nos salta como programadores, porque según nosotros todo esta perfecto cuando estamos escribiendo código, puede que hasta estemos siguiendo al pie de la letra los requerimientos y las clases generadas en base a ellos pero somos humanos y cometemos errores, más de los que deberíamos, entonces tener una segunda opinión sobre nuestro trabajo siempre es una forma muy buena de trabajar.

Tipos de Code Review

Formal Code Review

El FCD es un tipo de forma de revisar código donde normalmente los equipos crean un proceso de desarrollo donde se planea, se prepara, se desarrolla y después se tiene una junta de revisión donde se valoran todos los materiales desarrollados y finalmente se agendan los cambios a tratar.

Lightweight Code Review

Aquí puedo rescatar 3 tipos muy importantes.

Instant Code Review: En este caso una persona esta programando mientras otra esta viendo exactamente lo que esta haciendo, de esta forma se pueden ver los errores de forma fácil y rápida.

Synchronous Code Review: En este caso el programador genera un código y posteriormente pide a otro programador hacer una revisión.

Asynchronous Code Review: El programador termina su desarrollo y deja su trabajo disponible para revisión y este pasa a hacer otras tareas.

Aquí les dejo un video de las mejores prácticas de code review:

https://www.youtube.com/watch?v=EjwD7Pi7J_0

Conclusión

Sinceramente este tema se me hace muy interesante e importante ya que desde mi punto de vista tener un código limpio y escalable es una prioridad en la actualidad y ver que tenemos muchísimas herramientas disponibles para hacer code reviews en tiempo real me parece muy positivo para nosotros, no me imagino como hacían hace muchos años utilizando el modelo de FCR donde a fuerzas tenías que estar en una junta para revisar tu código y tener a tu jefe gritándote por los errores que cometiste, ahora sería lo mismo pero al menos sería un grito en un comentario en tu commit y no en la vida real 😝

Pueden ver mi trabajo en grupoargon.co

Clases a Código

Ya que vimos todo el proceso de pasar de clases a tablas y la forma de representar todas estas clases en UML, viene lo que nos interesa más a todos nosotros: el código. Después de haber pasado por este proceso tan importante de concebir las clases, las relaciones, los atributos y métodos de cada una de nuestras entidades podemos comenzar a generar nuestro código, pero pienso que es importante tener en cuenta incluso antes de presionar las teclas en nuestra computadora es reconocer cual será el alcance de nuestras clases en nuestro esquema de proyecto y elegir si tendremos una forma de hacer un refactor a nuestras clases en algún punto en el futuro.

Aquí comparto un video que ejemplifica como pasaríamos clases representadas en UML a clases de java:

fuente: https://www.youtube.com/watch?v=rtqQeYKHHNg

Como mencioné es de suma importancia tener en cuenta el alcance del proyecto ya que esto va a definir muchos pasos importantes que tendremos que tomar a lo largo de nuestro desarrollo, es por esto que tenemos que tener bien definidas nuestras clases, en este caso las representaré en UML.

Por ejemplo en esta imagen tenemos 2 clases las cuales heredan de documento: libro y email, cosas importantes que tendremos que tomar en cuenta al pasarlas a código sería la encapsulación de los datos.

Esta sería la forma en la que lo convertiríamos en código:

Cosas importantes a destacar es la forma en la que nuestros atributos tienen el acceso definido como privado o público, aspectos muy importantes de la programación orientada a objetos.

Esta sería la forma en la que se implementaría la clase libro, como se puede ver hereda de documento por lo cual tiene todos los métodos y atributos de las súper clase documento.

En conclusión tener todas tus clases en diagramas es una forma que facilita mucho el trabajo al estar codificando todo el trabajo a un lenguaje en específico.

Pueden ver mi trabajo en grupoargon.co

Tablas y no son de multiplicar

Este tema me da un flashback al semestre pasado cuando llevaba clase de bases de datos con la maestra Ana Delia, ya que este tema fue de los primero que vimos y realmente al principio es muy difícil de entender pero conforme te vas relacionando más con el y vas haciendo diferentes ejercicios sobre el tema cada vez vas mejorando y comprendiendo más, al menos eso fue en mí caso, bueno, me doy cuenta que ni siquiera he mencionado a que tema me refiero el tema es: mapeo de objetos a bases de datos.

Para introducirnos a el tema aquí hay un video que explica como se convierten los objetos a diagramas relacionales:

https://www.youtube.com/watch?v=dHQ-I7kr_SY

La forma en la que estuvimos desarrollando estos mapeos en la clase de bases de datos fue por medio de bases relacionales, donde cada una de las entidades tenían sus atributos y se relacionaban con otras entidades distintas.

Tarea de la clase de bases de datos mapeo

La imagen anterior es una de las tareas que nos dejó la maestra Ana para poder entender como se hacían estos mapeos, de forma que ella nos daba un diagrama de clases y nosotros lo convertíamos a algo que se podría pasar a SQL cosas a destacar es la forma en la que cada una de las entidades, que en un diagrama de clases serían las clases en sí, tienen llaves primarias que son atributos únicos con los cuáles se van a caracterizar como únicos y también tienen llaves foráneas que son atributos traídos de otras entidades que se obtienen por medio de una relación, por ejemplo un libro tiene como llave foranea el número de editorial de la entidad editorial ya que hace una referencia dentro de ella.

Por otro lado existe el caso que no quieras que tu base de datos sea realcional y quieres utilizar algo como firebase, bueno en mi caso que he utilizado firebase anteriormente yo creo que sería lo más adecuado que hablara de esta herramienta y como podríamos hacer algo parecido a lo que esta acá arriba 👆🏼, pues firebase lo que hace es guardar tu información en un árbol formado de colecciones y documentos, básicamente un documento es un objeto en sí y una colección es una serie de documentos guardados en un mismo lugar, cada uno de los documentos tiene un ID único.

Aquí va una foto:

Este es uno de mis proyectos de firebase como podemos ver tenemos una colección llamada empleados y en cada uno de los documentos tenemos un ID generado automáticamente por firebase y dentro de ese documento estan los atributos de esa instancia, de esta forma podemos almacenar cuantos objetos queramos en nuestras colecciones.

Es muy diferente la forma en la que lo pasaríamos de un objeto tradicional a firebase que como lo haríamos a una base de datos como sql, ya que firebase trabaja muy diferente y podemos técnicamente guardar el objeto a la base de datos directamente, en vez de estar convirtiendo el objeto a un diagrama de entidad relación.

En conclusión depende mucho de cómo te guste a ti tener guardada tu información y realmente lo que más importa es la forma en la que la vas a recuperar ya que en el caso de usar SQL o alguna base de datos relacional tendrás que utilizar queries, mientras que en la no relacional dependerá del framework.

Pueden ver mi trabajo en grupoargon.co

Chapuzón a UML (UML parte 2)

Ya que sabemos que es UML y como funciona podemos indagar un poquito más y ver hasta donde podemos llegar con esta herramienta tan poderosa.

Podemos dividir el UML en 2 puntos importantes, diagramas estructurales y de comportamiento.

Diagramas estructurales

Diagrama de Clase

Resultado de imagen para diagrama de clase
Un diagrama de clase tiene las diferentes clases que se van a implementar en un programa en este ejemplo tenemos una cuenta, un libro de registros, un grupo de contacto y un contacto, cada uno de ellos tienen atributos y métodos además de que se unen entre sí por medio de relaciones. Obtuve esta imagen en este link:
http://www.sparxsystems.com.ar/resources/tutorial/uml2_classdiagram.html

Diagrama de Objeto

Como mencione en el diagrama de estructurales un diagrama de objeto es cuando convertimos un diagrama de clase a las instancias reales de nuestro software, poniendo en ejemplo la imagen anterior, rellenaríamos nuestro diagrama de clase con una cuenta que podría ser la cuenta “platino”, después tendríamos nuestro libro de registros el cual podría ser del área de Zapopan, el grupo de contacto podría ser una colonia y finalmente el contacto una persona real.

Diagrama de Paquete

Resultado de imagen para uml diagrama de paquetes
Los Diagramas de paquetes son más fácil de visualizar, simplemente es dónde guardamos todas nuestras clases, de esta forma tenemos una mejor organización. Esta imagen la conseguí aquí:
https://proyectosotec162.webcindario.com/diagrama-de-paquetes.html

Diagrama de Despliegue

Resultado de imagen para uml diagrama de despliegue
Este es un diagrama de despliegue como podemos ver aquí es donde involucramos más al hardware y a los actores de nuestro software. La imagen es de aquí: https://diagramasuml.com/despliegue/

Diagramas de comportamiento

Hecho por mi con ayuda de: https://www.geeksforgeeks.org/unified-modeling-language-uml-introduction/

Diagrama de estado

Resultado de imagen para uml diagrama de estado
En mi opinión el más fácil de entender simplemente explica la funcionalidad de un proceso, en nuestro caso de un software, en este ejemplo explica un semáforo, como podemos ver va pasando por 3 distintos estados alto, siga y preventiva esto delimitado por ciertos tiempos. Saqué la imagen de aquí: https://www.abiztar.com.mx/articulos/la-vida-de-un-objeto-diagrama-de-estados.html

Diagrama de casos de uso

Resultado de imagen para diagrama casos de uso
Aquí vemos como se representan los casos de uso vemos como los actores trabajan alrededor de nuestro proyecto, en este caso una maquina de refrescos, hay clientes que compran, proveedores que reabstecen la maquina y recolectores quienes reciben el dinero de la maquina. Link de la imagen: https://sites.google.com/site/cursofpeanalistafuncional/

En conclusión podemos ver todos estos diferentes diagramas nuevos que si se los vamos agregando a nuestra planeación, tendremos un proyecto mejor estructurado y podremos programarlo más fácilmente.

Pueden ver mi trabajo en grupoargon.co

¿Qué es UML? (UML parte 1 )

UML por sus siglas en ingles, unified modeling language, es un lenguaje visual, el cuál tiene como objetivo dar una representación visual de la estructura y comportamiento de un sistema, normalmente de software pero también es aplicable a otros proyectos, desde financieros a arquitectónicos.

Aquí, un vídeo explicando un poco cómo funciona y para que sirve el UML:

Explicación de UML

Como podemos ver en el vídeo, se habla de objetos y clases, que sorpresa, como he mencionado en posts anteriores, los objetos es la forma de vanguardia para crear código, por medio de las clases podemos representar de una forma más acertada que es lo que pasa en nuestro entorno y en nuestro software en sí.

En los diagramas de clases es donde creamos nuestro “plano” para poder generar objetos, por ejemplo tenemos la clase animal, la cual tiene ciertos atributos, en este caso son la edad y el género, así como también tiene un comportamiento representado por métodos, en este caso, un método que te diga si es mamífero, y otro para procrear, a su vez, tenemos otras tres clases que heredan de animal, las cuales tendrán el mismo comportamiento de la clase animal pero se le agregaran otros atributos y otros métodos ya que por ejemplo una zebra puede correr pero un pez no. En este caso un objeto sería una instancia de esta clase, por ejemplo podríamos tener el objeto Donald, el cual es un pato generado a base de la clase pato que hereda de la clase animal, esta instancia tendrá todos los atributos de animal y de pato, así como sus métodos.

Otras características de UML es la visibilidad de métodos y atributos y las relaciones entre clases.

Desde mi punto de vista, UML nos sirve mucho ya que crea estos planos que proveen una vista general de nuestro proyecto y nos ayuda a tener bien cimentado que objetos estarán interactuando en nuestro código, para poder representar lo que queremos que exista dentro de nuestro software.

Pueden ver mi trabajo en grupoargon.co

Patrones de diseño en software

Los patrones de diseño proveen una solución para problemas comunes que nos encontramos a la hora de estar programando, normalmente son utilizados para mostrar relaciones entre clases u objetos, la idea es facilitar y hacer más sencillo la creación de software. Es importante mencionar que los patrones de diseño no son implementaciones si no, ideas.

Vamos a identificar 3 tipos de patrones de diseño importantes: estructurales, creacionales y de comportamiento.

Diseño estructural

Ayudan a crear relaciones entre entidades. Aquí hay algunos de las herramientas que proporciona este patrón de diseño.

Puntos a implementar en clases y objetos por parte del patrón estructural.
fuente: https://sourcemaking.com/design_patterns/structural_patterns

Como podemos ver nos da una forma en la que podemos implementar nuestras clases pero en sí no es una implementación específica.

Diseño creacional

Este tipo de diseño consiste en tener una forma de crear objetos en tu software, por ejemplo existe el singleton que tiene la restricción de crear una sola instancia de una clase o un prototipo que es una instancia creada con anterioridad para que se pueda copiar en cualquier momento.

Diseño de comportamiento

Bien ya vimos el diseño estructural que se encargan de definir las clases, el creacional que se encarga de las instancias, solo nos falta el de comporamiento que se encarga de los métodos básicamente. Aquí hay algunos ejemplos:

Como podemos ver, estas formas de relacionarse entre objetos bien definida nos apoya para tener diferentes formas de obtener recursos útiles en nuestros programas.
fuente: https://sourcemaking.com/design_patterns/behavioral_patterns

Conclusión

Bien después de haber conocido estos diferentes tipos de patrones de diseño, me parece bastante interesante tener una estructura definida de esta forma por que normalmente no nos ponemos a pensar todas las formas en las que podríamos ahorrarnos muchas lineas de código con alguna referencia a algún objeto externo o teniendo un memento de un objeto para no tener que repetir un proceso para volver a un estado, es muy importante conocer estos patrones porque sirven mucho para ayudarnos a trabajar de forma más inteligente.

Pueden ver mi trabajo en grupoargon.co

Lenguajes de Modelado

Siendo sinceros al pensar en lenguaje de modelado lo único que se me viene a la mente es UML, siento que es la herramienta más potente además de que es la más utilizada y la más documentada, a día de hoy como lo hemos mencionado en clase si no estas haciendo programación orientada a objetos entonces ¿estas viviendo debajo de una piedra o algo así?.

Al querer comenzar un proyecto de software tener cimentado un modelo unificado es tener un camino bien definido que te va a ayudar a la hora de la implementación y UML lo hace de una forma muy concreta. UML tiene términos clave que nos ayudan a configurar nuestro proyecto, para empezar tenemos los objetos los cuales son la base de la POO, tenemos las clases, las relaciones, las actividades y las interacciones.

Diagrama de Clase
Fuente: https://www.ionos.com/digitalguide/websites/web-development/uml-unified-modeling-language/

En UML tenemos diferentes diagramas tenemos el diagrama de clase, el cual especifica el nombre, los atributos y los métodos de una clase. También esta el diagrama de componentes, el cual crea una relación entre las clases y los usuarios.

Diagrama de Componentes
fuente: https://www.ionos.com/digitalguide/websites/web-development/uml-unified-modeling-language/

Por ultimo tenemos el diagrama de paquete, el cual encapsula todas las clases que se planean utilizar en un proyecto.

Diagrama de paquete
Fuente: https://www.ionos.com/digitalguide/websites/web-development/uml-unified-modeling-language/

En conclusión podemos ver que los lenguajes de modelado nos dan muchas herramientas de bastante potencia para poder arrancar de forma correcta con un proyecto.

fuentes: https://www.ionos.com/digitalguide/websites/web-development/uml-unified-modeling-language/

Casos de uso

Un caso de uso es la documentación de un posible requisito de un producto de software enfocado a la experiencia de usuario, es el cómo va a interactuar la aplicación con la persona que la este utilizando y viceversa. Los casos de uso proporcionan una vista general de cómo va a ser desarrollado el proyecto y que puntos clave necesita resolver.

https://www.youtube.com/watch?v=orvAkFFWo5o por Universitat Politècnica de València

En pocas palabras un caso de uso es un enunciado de cómo un actor (usuario) va a interactuar con un software.

Los casos de uso tienen muchas ventajas, para empezar, cuando tienes un proyecto en puerta y los clientes quieren explicarte de que va todo lo más probable es que te estén dando hints para poder ir creando tus casos de uso y en base a estos casos poder ir generando la documentación necesaria para comenzar con el proyecto. En lo personal, en proyectos anteriores he obviado esta parte en el proceso de generación de software al estar conversando con clientes, sinceramente es un golpe en las bolas el no tener todo bien establecido desde el principio antes de comenzar a teclear tus primeras lineas de código ( lo que normalmente hacemos cómo ingenieros en software), como mencionaba, si no tienes casos de uso preparados, no puedes crear un contrato en el cual establezcas que es lo que se va a hacer y que límites vas a implementar en todo el proceso, un día tus clientes te pueden estar pidiendo que implementes tetris y al día siguiente te dirán que quieren toda la saga de HALO para mañana y claro esto lo pueden hacer porque nunca implementaste casos de uso en tu proyecto.

Una practica muy buena al generar casos de uso es utilizar una jerga comprensible ya que normalmente los clientes no suelen tener un conocimiento tan amplio del área como nosotros, es decir no le vas a estar hablando a el cliente de clases y métodos cuando ellos apenas saben prender su computadora, lo mejor es tener una junta con ellos y que te expliquen a detalle quienes van a intervenir en el software, quienes lo van a utilizar y cómo, de este modo no habrá forma de tener errores en la parte del negocio, además si queda claro lo que se tiene que hacer desde un principio, si al cliente se le ocurre algo nuevo, se tendrá que implementar de manera paralela ya que el camino inicial ya se decreto desde un inicio.

Fuente: https://imgflip.com/i/28lpqb

En conclusión pienso que los casos de uso son un punto importantísimo a la hora de desarrollar software, no solo por lo importante que es saber que es lo que tienes que hacer en el proyecto si no que también nos sirve a nosotros como desarrolladores cómo un escudo para que no haya reclamos ni mal entendidos con los clientes.

Fuentes: http://www.juntadeandalucia.es/servicios/madeja/contenido/recurso/416

Pueden ver mi trabajo en grupoargon.co

Design a site like this with WordPress.com
Get started