<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Alejo Villores</title>
    <description>The latest articles on DEV Community by Alejo Villores (@alejovillores).</description>
    <link>https://dev.to/alejovillores</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F550020%2Fc5676945-011a-47c1-bf0e-3cd3ccb5a101.jpg</url>
      <title>DEV Community: Alejo Villores</title>
      <link>https://dev.to/alejovillores</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alejovillores"/>
    <language>en</language>
    <item>
      <title>Microservicios, lo que aprendí.</title>
      <dc:creator>Alejo Villores</dc:creator>
      <pubDate>Tue, 27 Dec 2022 13:45:07 +0000</pubDate>
      <link>https://dev.to/alejovillores/microservicios-lo-que-aprendi-1828</link>
      <guid>https://dev.to/alejovillores/microservicios-lo-que-aprendi-1828</guid>
      <description>&lt;h3&gt;
  
  
  Introducción
&lt;/h3&gt;

&lt;p&gt;Estos últimos cuatro meses, encaramos un proyecto bastante grande a como veníamos trabajando en los últimos 4 años de facultad. La consigna principal era simular un ambiente de trabajo para un junior/trainee, es decir, uno llega y se encuentra con miles de cosas por aprender y aplicar en poco tiempo.&lt;/p&gt;

&lt;p&gt;El proyecto constaba de realizar una aplicación mobile utilizando una arquitectura de microservicios, ésta debía estar implementada en al menos dos lenguajes de programación diferentes y utilizando dos tipos de bases de datos distintas. Sumado a esto, debíamos desarrollar un panel de administradores web.&lt;/p&gt;

&lt;p&gt;En el equipo eramos 5 personas, todos sin experiencia previa de ese nivel. Estas son las cosas que observe y aprendi, por afuera de lo desarrollado.&lt;/p&gt;

&lt;h4&gt;
  
  
  Compromiso de equipo
&lt;/h4&gt;

&lt;p&gt;Comenzamos proponiendo en un Notions diferentes convenciones que íbamos a utilizar para poder estar todos alineados, en las primeras semanas preparamos los repositorios y propusimos utilizar los Boards que permite GitHub utilizando las diferentes Historias de Usuarios como Issues.&lt;/p&gt;

&lt;p&gt;La principal observación que vi es que es muy difícil generar que cada integrante del equipo siga a raja tabla el proceso, como se refleja esto? Principalmente se pueden ver Issues cerradas pero sin estar en el board, branches muertas y falta de milestones en cada semana de desarrollo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tecnologias
&lt;/h3&gt;

&lt;p&gt;Como equipo, nos encontramos que debiamos aprender muchisimas cosas nuevas en poco tiempo, como siempre, al ser la primera vez las cosas cuestan mucho mas. No tuvimos problema en aprender las herramientas nuevas, si confieso que a mi parecer la inexperiencia hacia que varias implementaciones sean rústicas, pero creo que eso va mejorando a medida que uno desarrolla y usa aquella tecnología cada vez mas.&lt;/p&gt;

&lt;p&gt;En nuestro caso utilizamos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python - Fast API&lt;/li&gt;
&lt;li&gt;NodeJS - Express&lt;/li&gt;
&lt;li&gt;Postregs SQL&lt;/li&gt;
&lt;li&gt;MongoDB&lt;/li&gt;
&lt;li&gt;Firebase&lt;/li&gt;
&lt;li&gt;Datalog&lt;/li&gt;
&lt;li&gt;React Native&lt;/li&gt;
&lt;li&gt;Expo&lt;/li&gt;
&lt;li&gt;React&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Despliegue y Testing
&lt;/h3&gt;

&lt;p&gt;Desarrollar utilizando TDD es algo de lo que venimos haciendo hace varios cuatrimestre, son pocos los que de verdad siguen aplicando test, muchos para safar implementa a prueba y error. Esto es algo común en aplicaciones de consola pequeñas, pero en una app web mas grande es algo arriesgado, es por eso que nos propusimos testear lo que mas se pueda.&lt;/p&gt;

&lt;p&gt;Para el despliegue utilizamos &lt;a href="https://www.okteto.com/" rel="noopener noreferrer"&gt;Okteto&lt;/a&gt;, que utiliza kubernetes y a partir de un docker-compose.yml levanta el ambiente. Tiene una versión FREE que para nuestro proyecto la verdad que venia excelente.&lt;br&gt;
Tuvimos dos ambientes, el local, utilizando contenedores de Docker y el de producción. Hubiera sido eficiente también tener uno de test. &lt;/p&gt;

&lt;p&gt;Una cosa que notamos positiva de los microservicios, es que teníamos quizás alguno caído pero como la aplicación no lo utilizaba, esta podía estar funcionando correctamente, lo cual con un monolito esto no es posible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desarrollo
&lt;/h3&gt;

&lt;p&gt;Para completar con lo pedido planteamos una arquitectura de 5 servicios + una API GATEWAY&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jdwkdce0xouv63btjak.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9jdwkdce0xouv63btjak.png" alt="Arquitectura" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Al estar trabajando con microservicios, podíamos dividirnos los servicios y avanzar mucho mas rápido que al ser un monolito.&lt;br&gt;
La complicación estaba en la conexión de datos entre servicio. Con esto quiero decir que las restricciones de las claves foráneas entre servicio es algo a tomar con pinzas, a diferencia de un monolito que solo utiliza una db.&lt;/p&gt;

&lt;p&gt;La seguridad también fue algo a tener en cuenta ya que todos los servicios tenían que estar alineados para entender los mismo JWT que tenia el usuario.&lt;/p&gt;

&lt;p&gt;Utilizamos &lt;a href="https://firebase.google.com/" rel="noopener noreferrer"&gt;firebase&lt;/a&gt; para la autenticación segura. Al principio nos complicó la extensa documentación que tiene pero le pudimos agarrar la mano.&lt;br&gt;
Aqui se ve el flujo que utilizamos para el servicio de administradores.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhast0w8d5jm9wwpu3q6u.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhast0w8d5jm9wwpu3q6u.jpg" alt="Flujo de administradores" width="800" height="1131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusión
&lt;/h3&gt;

&lt;p&gt;Creo que hicimos un buen trabajo, pusimos mucho esfuerzo y compromiso, logramos cumplir con las historias de usuarios obligatorias del trabajo y muchas electivas que aportaban usabilidad. &lt;br&gt;
Quedaron algunas deudas técnicas para un futuro pero la aplicación quedo bastante buena y como equipo, estamos orgullosos de nuestro trabajo.&lt;/p&gt;

</description>
      <category>emptystring</category>
    </item>
    <item>
      <title>Basta de usar else innecesarios!</title>
      <dc:creator>Alejo Villores</dc:creator>
      <pubDate>Wed, 27 Apr 2022 15:30:23 +0000</pubDate>
      <link>https://dev.to/alejovillores/basta-de-usar-else-inecesarios-983</link>
      <guid>https://dev.to/alejovillores/basta-de-usar-else-inecesarios-983</guid>
      <description>&lt;p&gt;Cuantas veces hemos visto código de condicionales del tipo&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;myFunction&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condition1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
     &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;something&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;thing&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si bien, no es algo que este mal, podemos refactorizar nuestro código para que el flujo de la lectura sea mas placentera.&lt;/p&gt;

&lt;p&gt;Para poder realizar esto, lo que haremos es tomar lo que esta dentro del else, y ponerlo abajo del if, será ahora una consecuencia de que no se haya cumplido el if, que cambiará solo si la condicion se cumple.&lt;/p&gt;

&lt;p&gt;Miremos un ejemplo sencillito&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usando if/else&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;dividirEnteros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;divisor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividendo&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;divisor&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
     &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No se puede realizar dicha operacion"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dividendo&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;divisor&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt;   
   &lt;span class="p"&gt;}&lt;/span&gt;  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Usando solo if&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;dividirEnteros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;divisor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dividendo&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
   &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;divisor&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
     &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"No se puede realizar dicha operacion"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
     &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
   &lt;span class="n"&gt;resultado&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dividendo&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;divisor&lt;/span&gt;

   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resultado&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Veamos que si lo extendemos a casos mas complejos, su potencial aumenta.&lt;br&gt;
Imaginemos que tenemos que checkear que ciertos datos esten correctos, algo que es muy comun de ver es una cadena de if anidados&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;myFunction&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condition1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
     &lt;span class="n"&gt;si&lt;/span&gt; &lt;span class="n"&gt;condicion1&lt;/span&gt; &lt;span class="n"&gt;se&lt;/span&gt; &lt;span class="n"&gt;cumple&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;miro&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;condicion&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
     &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condition2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;si&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="n"&gt;condicion&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="n"&gt;se&lt;/span&gt; &lt;span class="n"&gt;cumple&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;miro&lt;/span&gt; &lt;span class="n"&gt;la&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="n"&gt;asi&lt;/span&gt; &lt;span class="n"&gt;hasta&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
        &lt;span class="n"&gt;operaciones&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
     &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;operar&lt;/span&gt; &lt;span class="n"&gt;distinto&lt;/span&gt;
     &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;do&lt;/span&gt; &lt;span class="n"&gt;another&lt;/span&gt; &lt;span class="n"&gt;thing&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Luego de 2 ifs, la cosa se pone pesada para comprender la función.&lt;br&gt;
La solución a esto, es proponer un sistema de capas de control, cada capa tendrá una condicion que representa un nivel.De esa manera nuestro código queda de la siguiente manera.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;myFunction&lt;/span&gt;&lt;span class="p"&gt;(){&lt;/span&gt;
   &lt;span class="n"&gt;inicializacion&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;
   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;condition1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
     &lt;span class="n"&gt;hacer&lt;/span&gt; &lt;span class="n"&gt;cosas&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="n"&gt;hacer&lt;/span&gt; &lt;span class="n"&gt;otras&lt;/span&gt; &lt;span class="n"&gt;cosas&lt;/span&gt;

   &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="err"&gt;!&lt;/span&gt;&lt;span class="n"&gt;condition2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
     &lt;span class="n"&gt;hacer&lt;/span&gt; &lt;span class="n"&gt;cosas&lt;/span&gt;
   &lt;span class="p"&gt;}&lt;/span&gt;
   &lt;span class="p"&gt;...&lt;/span&gt;
   &lt;span class="n"&gt;hacer&lt;/span&gt; &lt;span class="n"&gt;otras&lt;/span&gt; &lt;span class="n"&gt;cosas&lt;/span&gt;
   &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>programming</category>
      <category>codequality</category>
      <category>spanish</category>
    </item>
    <item>
      <title>Integración Continua</title>
      <dc:creator>Alejo Villores</dc:creator>
      <pubDate>Wed, 03 Mar 2021 14:26:14 +0000</pubDate>
      <link>https://dev.to/alejovillores/integracion-continua-5c65</link>
      <guid>https://dev.to/alejovillores/integracion-continua-5c65</guid>
      <description>&lt;p&gt;La integración continua es una &lt;strong&gt;práctica de desarrollo de software&lt;/strong&gt; donde los miembros de un equipo integran su trabajo con frecuencia, al menos una vez al día.&lt;/p&gt;

&lt;p&gt;Cada integración es verificada por una compilación automatizada para detectar errores lo más rápido posible. Muchos equipos encuentran que este enfoque conduce a problemas de integración significativamente reducidos y permite que un equipo desarrolle software cohesivo rápidamente.&lt;/p&gt;

&lt;p&gt;Hoy en día existen muchas herramientas de código abierto para trabajar con la integración continua. Por ejemplo, en nuestro último proyecto usamos &lt;a href="https://travis-ci.org/"&gt;CI Travis&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0P_odTHK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qmpgam06r2qawffqlv89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0P_odTHK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qmpgam06r2qawffqlv89.png" alt="Alt Text" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prácticas de integración continua
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MSSR (Maintain a Single Source Repository), esto significa que el proyecto completo debe estar todo en un repositorio.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatice la compilación, utilice las herramientas gratuitas para que su trabajo sea más rápido y seguro.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Haz que tu compilación se auto testee.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cuando trabajamos con un equipo, comprometernos todos los días con la línea principal de nuestros proyectos informa a los otros desarrolladores sobre los cambios. Por tanto, la ** Integración continua ** permite a los miembros del equipo conocer los cambios rápidamente.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Repare las compilaciones falladas de inmediato. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prueba en un clon de los entornos de producción..&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automatizar despliegues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iYPYDcvU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1bmgcaej0583w42dcx1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iYPYDcvU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1bmgcaej0583w42dcx1t.png" alt="Alt Text" width="817" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La integración continua puede reducir los riesgos, facilitar la búsqueda de errores y ayudar con la comunicación del equipo.&lt;/p&gt;

&lt;p&gt;para obtener más información sobre Integración continua, sugiero leer a &lt;a href="https://www.martinfowler.com/"&gt;Martin Fowler&lt;/a&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>spanish</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Continuos Integration</title>
      <dc:creator>Alejo Villores</dc:creator>
      <pubDate>Wed, 03 Mar 2021 14:16:40 +0000</pubDate>
      <link>https://dev.to/alejovillores/continuos-integration-3nlj</link>
      <guid>https://dev.to/alejovillores/continuos-integration-3nlj</guid>
      <description>&lt;p&gt;Continuos integration is a &lt;strong&gt;software development practice&lt;/strong&gt; where members of a team integrate their work frecuently, at least one time per day.&lt;/p&gt;

&lt;p&gt;Each integration is &lt;strong&gt;verified&lt;/strong&gt; by an automated build to detect errors as quick as posible. Many teams finds that this approach leads to significantly reduced integration problems and allow a team to develop cohesive software rapidly.&lt;/p&gt;

&lt;p&gt;Nowadays there are a lot of open source tool to work with continuos integration. For example,in our  last project we used &lt;a href="https://travis-ci.org/"&gt;CI Travis&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xti7li3g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k40kj9bpn6ioqvbx8h1k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xti7li3g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k40kj9bpn6ioqvbx8h1k.png" alt="Alt Text" width="720" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Practices of continuos integration
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;MSSR (Maintain a Single Source Repository), this mean that the complete project should be all in one repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automate the build, use the free tools to make your work faster and safer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make your build self testing.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When we are working with a team ,commiting everyday to de mainline of our projects tells the other developers about the changes. So &lt;strong&gt;Continous Integration&lt;/strong&gt; allows teammembers to know changes quickly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fix broken builds immediately. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Test in a clone of the production enviroments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automate deployments.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Conclutions
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--R6ZMGEtT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7y9rhbcqa9rgadxd2k0m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--R6ZMGEtT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7y9rhbcqa9rgadxd2k0m.png" alt="Alt Text" width="817" height="616"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Continuos integration can reduce risks, make you find bugs easier and helps with the team comunication.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;for more information of Continuos Integration I suggest to read &lt;a href="https://www.martinfowler.com/"&gt;Martin Fowler&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Buenas prácticas</title>
      <dc:creator>Alejo Villores</dc:creator>
      <pubDate>Mon, 25 Jan 2021 22:28:03 +0000</pubDate>
      <link>https://dev.to/alejovillores/buenas-practicas-567n</link>
      <guid>https://dev.to/alejovillores/buenas-practicas-567n</guid>
      <description>&lt;h2&gt;
  
  
  Las buenas prácticas de la programación.
&lt;/h2&gt;

&lt;p&gt;En este artículo hablaremos de lo que son las buenas prácticas a la hora de trabajar en equipos con otros desarrolladores, la intención de este post &lt;strong&gt;NO&lt;/strong&gt; es hablar sobre los principios SOLID sino, que hablaremos sobre hábitos que todo programador debe conocer para poder estandarizar y entenderse con su equipo al momento de escribir código.&lt;/p&gt;

&lt;p&gt;Partamos de una serie de ítems que nos ayudará a organizarnos un poco.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Legibilidad&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Como todo desarrollador sabe, el código se escribe una vez y se lee muchas veces, es por eso que la legibilidad es muy importante a la hora de trabajar.&lt;br&gt;
Sangrías, espacios, intention-revealing names, etc. Estos son algunos conceptos que hace que el código no parezca un espagueti y sea mas fácil de leer/entender a para los demás.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Comentarios&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Un código no necesita comentarios para que otro lo entienda si éste esta escrito correctamente y sigue los pasos del item anterior por lo que es correcto decir que escribí de manera que &lt;em&gt;el código hable solo...&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No sorprender&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;En el mundo de la programación la simpleza es lo mejor que puede haber a la hora de escribir software por lo que evitar sorprender con algoritmos complejos para problemas simples es lo ideal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Idiomas&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Este tema es complicado pero a la hora de escribir funciones, nombres y clases evitemos utilizar mezclas de lenguajes ya que genera malentendidos en la lectura del código. En lo personal me gusta nombrar a los getters y setters en español ya que facilita muchísimo a la hora de leer.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Índices&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los índices tradicionalmente y globalmente son i,j,k por lo que evitemos cambiarlos si es que vamos a compartir nuestro trabajo a otras personas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Variables booleanas&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A la hora de utilizar variables booleanas es convenientes pensarlas en positivo, por ejemplo &lt;em&gt;encontrado&lt;/em&gt;, &lt;em&gt;terminado&lt;/em&gt;,etc.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Estos son las buenas prácticas que yo aprendí. &lt;br&gt;
Me encantaria saber cuales son las que ustedes aprendieron y saben asique sus comentarios y opiniones son bienvenidas.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Saludos!&lt;/p&gt;

</description>
      <category>argentina</category>
      <category>desarrollador</category>
      <category>estudiante</category>
    </item>
    <item>
      <title>Test-Driven-Development</title>
      <dc:creator>Alejo Villores</dc:creator>
      <pubDate>Wed, 06 Jan 2021 22:07:03 +0000</pubDate>
      <link>https://dev.to/alejovillores/test-driven-development-40k4</link>
      <guid>https://dev.to/alejovillores/test-driven-development-40k4</guid>
      <description>&lt;p&gt;Primero hablemos sobre el desarrollo comenzando por las pruebas, éstas acarrean algunas ventajas, tanto de orden técnico como metodológico. Aquí algunos ejemplos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Al escribir antes las pruebas, las mismas se convierten en especificaciones de lo que se espera como respuesta del objeto ante el envió de un determinado mensaje. Por lo tanto, no se debería codificar nada que no tenga su prueba de antemano, de modo tal de no implementar nada innecesario.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Al ir definiendo de a una prueba a la vez, tenemos un desarrollo incremental genuino, definido por pequeños incrementos que se corresponden con funcionalidades muy acotadas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Permiten independizarse del factor humano, con su carga de subjetividad y variabilidad en el tiempo haciendo que sean mas optimas y precisas.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Al necesitar éstas un costo muy bajo para poder ser ejecutadas, generan que el programador genere un hábito de testear y a su vez le de cierta confianza en que su código esté correcto o pase la prueba.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Y el TDD? Ahí va...&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Ésta forma de trabajar fue propuesta formalmente por el señor &lt;a href="https://es.wikipedia.org/wiki/Kent_Beck" rel="noopener noreferrer"&gt;Kent Beck&lt;/a&gt; donde habló sobre una práctica de desarrollo denominada Test-Driven-Development.&lt;br&gt;
Ésta práctica nos obliga a pensar a través de la interfaz necesaria antes de desarrollar&lt;/p&gt;

&lt;p&gt;Según Beck &lt;em&gt;TDD&lt;/em&gt; incluye tres practicas fundamentales:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Test-First: Escribir las pruebas antes del código.&lt;/li&gt;
&lt;li&gt;Automatización: Las prubas deben correr con la mínima intervención humana.&lt;/li&gt;
&lt;li&gt;Refactorización.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Muy lindo hasta ahora pero, cuales son los pasos para aplicar TDD?&lt;br&gt;
&lt;em&gt;Pasos para aplicar TDD&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F25fx1ntggk5uldz4mj52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F25fx1ntggk5uldz4mj52.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Escribir el test, el cual no pasará.&lt;/li&gt;
&lt;li&gt;Agregar el mínimo código posible para que la prueba pase.&lt;/li&gt;
&lt;li&gt;Refactorizar.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fácil no? Claro que si!.&lt;br&gt;
De esta manera el desarrollador podrá avanzar de manera mas lenta pero segura... siempre hay que tener en cuenta hacer &lt;em&gt;baby steps&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Partes del post fue obtenido del libro del Profesor &lt;br&gt;
Carlos Fontela de la Facultad de Ingeniería de la Universidad de Buenos Aires.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>productivity</category>
      <category>spanish</category>
      <category>argentina</category>
    </item>
  </channel>
</rss>
