<?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: Santiago Persico</title>
    <description>The latest articles on DEV Community by Santiago Persico (@spersico).</description>
    <link>https://dev.to/spersico</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%2F99463%2F431b4e51-a56b-48cb-b3ab-5d72aba750c6.png</url>
      <title>DEV Community: Santiago Persico</title>
      <link>https://dev.to/spersico</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/spersico"/>
    <language>en</language>
    <item>
      <title>Programación Basada en Slogans</title>
      <dc:creator>Santiago Persico</dc:creator>
      <pubDate>Tue, 18 Apr 2023 15:08:51 +0000</pubDate>
      <link>https://dev.to/spersico/programacion-basada-en-slogans-6eb</link>
      <guid>https://dev.to/spersico/programacion-basada-en-slogans-6eb</guid>
      <description>&lt;p&gt;El software existe para proporcionar valor a alguien. Generalmente a nuestros clientes o empleadores. Como desarrolladores, se nos paga para construir software de la forma más efectivamente posible, para maximizar ese valor. &lt;/p&gt;

&lt;p&gt;Como profesionales, tratamos de que nuestro código haga lo que tenga que hacer, y que sea fácil de mantener y mejorar a futuro. Para eso, hacemos uso de Patrones de Diseño que son, en esencia, soluciones comprobadas ante problemas habituales, que sirven como guía para tomar decisiones al momento de construir software. &lt;/p&gt;

&lt;p&gt;Muchas veces los conocemos a través de mini frases, o eslóganes, como &lt;strong&gt;&lt;em&gt;Don't Repeat Yourself&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Don't Reinvent the Wheel&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Keep It Simple, Stupid&lt;/em&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;em&gt;Composition over Inheritance&lt;/em&gt;&lt;/strong&gt;, y varias otras. &lt;/p&gt;

&lt;p&gt;Todo esto tiene un punto, pero para eso quiero arrancar con dos de estas frases: &lt;strong&gt;&lt;em&gt;DRY&lt;/em&gt;&lt;/strong&gt; y &lt;strong&gt;&lt;em&gt;Don’t Reinvent the Wheel&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  DRY
&lt;/h2&gt;

&lt;p&gt;DRY, ó Don’t Repeat Yourself, es un principio de diseño de software bastante conocido. La idea general es que la repetición de código debe evitarse, ya que dificulta mantener una pieza de software, a medida que esta va creciendo.&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%2Fuploads%2Farticles%2Fqo1gzlhlamw7x4zzhf8n.gif" 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%2Fuploads%2Farticles%2Fqo1gzlhlamw7x4zzhf8n.gif" alt="https://media3.giphy.com/media/YAy9NNu16pYYg/giphy.gif" width="245" height="155"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La lógica tiene sentido, si duplicamos código, a la hora de cambiarlo o arreglarlo, uno tiene que acordarse de arreglarlo en todos los lugares donde este se usa, y cada uno de estos lugares puede que tenga comportamientos diferentes. Esto conlleva VARIOS problemas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Puede que te olvides de aplicar un cambio en alguno de los lugares repetidos.&lt;/li&gt;
&lt;li&gt;Probablemente, va a llevar más tiempo al tener que aplicarlo (y probarlo) en todos los lugares donde se repita.&lt;/li&gt;
&lt;li&gt;Puede que al aplicar el cambio, lo apliques de la misma forma en código que tiene o contextos diferentes, o comportamientos esperados diferentes.&lt;/li&gt;
&lt;li&gt;Ligado al anterior, puede no ser inmediatamente obvio el hecho de que dos piezas de código hagan lo mismo, pero estén en lugares diferentes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Okay, te vendí un montón el porqué aplicar DRY, del porqué evitar la duplicación de código. ¿Entonces cuál es el problema?&lt;/p&gt;

&lt;p&gt;Bueno, de lo que no se habla mucho, es que aplicar DRY (y generalmente de la aplicación de patrones de diseño), conlleva una serie de desventajas:&lt;/p&gt;

&lt;h3&gt;
  
  
  Problema 1 - Acoplamiento
&lt;/h3&gt;

&lt;p&gt;¿Qué pasa cuando tu Manager, o el equipo de Producto o UX, decide que de los 35 inputs que hiciste, quieren que uno (solo uno) en particular se comporte de forma diferente?  &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%2Fuploads%2Farticles%2Ft8cjt2403p2mwijf0m0x.gif" 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%2Fuploads%2Farticles%2Ft8cjt2403p2mwijf0m0x.gif" alt="https://media0.giphy.com/media/jN86rcdOyrpyo/giphy.gif" width="480" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Si, el código DRY, generalmente es código más acoplado. ¿Se puede resolver esto? ¡Seguro! Podemos agregar ifs por todos lados, o implementar otros patrones para solucionarlo de forma prolija, pero siempre a costa de más complejidad.&lt;/p&gt;

&lt;p&gt;El código, al unificarse, no puede evolucionar de forma independiente, es generalmente un todo o nada.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problema 2 - Complejidad y Tiempo
&lt;/h3&gt;

&lt;p&gt;¿Cuánto tiempo te lleva hacer un componente genérico, frente a uno bien especifico para un caso particular? No me arriesgo al decir que el genérico, que contempla más casos, te lleva más tiempo.&lt;/p&gt;

&lt;p&gt;Hacer componentes genéricos, conlleva hacer componentes que son más versátiles. Esto en la gran mayoría de los casos lleva más tiempo que hacerlos específicos para el caso a considerar. &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%2Fuploads%2Farticles%2Fsccdek6px0u40c3wcj9r.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%2Fuploads%2Farticles%2Fsccdek6px0u40c3wcj9r.png" alt="Complejidad - Código.png" width="800" height="624"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;El aumento de complejidad no solo afecta al tiempo de desarrollo inicial, sino a la dificultad de manutención de los componentes:&lt;/p&gt;

&lt;p&gt;Dale la tarea a un junior de agregar una validación extra a &lt;strong&gt;esa&lt;/strong&gt; función que genera CRUD automáticos de forma mágica en el backend hace meses, y miralo llorar.&lt;/p&gt;

&lt;p&gt;Y sí, seguro de que el generador de Forms genérico que se usa en toda la empresa funciona bien, pero si le toca hacer un cambio que le pidieron al nuevo, de que algunos mensajes de error estén en mayúscula y en violeta, le va a llevar mucho más tiempo.&lt;/p&gt;

&lt;p&gt;La &lt;strong&gt;complejidad&lt;/strong&gt; es un concepto un poco difícil de explicar. A efectos prácticos, digamos que es la tasa de “Que Carajo” por minuto que te genere leer una pieza de código. &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%2Fuploads%2Farticles%2Fo0mz4oyj1nmr11rh8qc1.gif" 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%2Fuploads%2Farticles%2Fo0mz4oyj1nmr11rh8qc1.gif" alt="https://media1.giphy.com/media/Qe5oD5aXjEbKw/giphy.gif" width="200" height="183"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aumentar la complejidad de una pieza de software, implica aumentar la curva de dificultad de un nuevo desarrollador en el equipo (o de un junior/semi-senior) a la hora de entender y poder mantener una pieza de código. Esto no es poca cosa, porque de nuevo: &lt;strong&gt;se nos paga para hacer código mantenible y mejorable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cambiemos de eslogan antes de que me tiren con algo. Voy a volver a este tema al final.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Don’t Reinvent the Wheel
&lt;/h2&gt;

&lt;p&gt;Que pasa si tomamos &lt;strong&gt;DRY&lt;/strong&gt;, y lo aplicamos en todo un ecosistema de desarrollo de software?. No reinventar la rueda (Don’t Reinvent the Wheel) es otro eslogan que se suele escuchar bastante, relacionado con el anterior.&lt;/p&gt;

&lt;p&gt;La idea es que como desarrolladores, teniendo en cuenta que nuestro trabajo implica producir software que genere valor a nuestros clientes, no deberíamos intentar hacer todo desde cero, sino reutilizar donde podamos el código.&lt;/p&gt;

&lt;p&gt;Bastante parecido a DRY, pero con código de otros, ¿verdad?&lt;/p&gt;

&lt;p&gt;La realidad es que la industria del desarrollo web, en parte, creció gracias a este patrón. La web está construida, desde el principio, sobre los hombros de gigantes. Sin el Open Source, y al ecosistema de aplicaciones que nos da NPM y Node, la web no sería lo que es hoy. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Las razones son simples: Dinero y Tiempo&lt;/strong&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%2Fuploads%2Farticles%2Flburgwq0mzd8r8828f38.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%2Fuploads%2Farticles%2Flburgwq0mzd8r8828f38.png" alt="Untitled" width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para una empresa emergente, el tiempo entre idea y MVP puede llegar a ser cortísimo, y el coste de alcanzar una audiencia grande, bastante bajo.&lt;/p&gt;

&lt;p&gt;Con herramientas y productos como Wordpress, Wix, Squarespace o Shopify, una empresa puede levantar un proyecto en re poco tiempo de forma muy barata, y si nos vamos más a lo nuestro, los frameworks y librerías que usamos abstraen mucha de la complejidad que implica hacer una aplicación, reduciendo el tiempo y esfuerzo necesario para hacer algo hoy en día.&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%2Fi.imgur.com%2FsovsO4T.jpg" 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%2Fi.imgur.com%2FsovsO4T.jpg" alt="Photo by [Lukas Tennie](https://unsplash.com/it/@luk10?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText) on [Unsplash](https://unsplash.com/photos/3dyDozzCORw?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText)" width="800" height="529"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No solo eso, sino que cuando el código es probado, revisado, y mejorado por más gente, generalmente mejora.&lt;/p&gt;

&lt;p&gt;React y Angular son mejores hoy que hace unos años, por simple hecho de que tienen gente interesada en ellos, que aporta con revisiones de código, bug reports, casos de uso, optimizaciones, tiempo, plata.&lt;/p&gt;

&lt;p&gt;Esto va haciendo que la calidad, performance y seguridad mejore.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pero, al final del día, este enfoque también tiene problemas:&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Problema 1 - Es un montón de Código
&lt;/h3&gt;

&lt;p&gt;Las librerías de las que dependemos generalmente hacen lugar para tantos, pero tantos casos de uso, que por más &lt;a href="https://developer.mozilla.org/en-US/docs/Glossary/Tree_shaking" rel="noopener noreferrer"&gt;tree-shaking&lt;/a&gt; que hagamos, el código que se corre no es el óptimo, que no sea la herramienta correcta. Estamos enviando enormes cantidades de JavaScript a nuestros usuarios, en gran medida por incluir librerías y código que no nos hacen falta, no realmente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplemente, porque ese código hace demasiadas cosas. &lt;a href="https://httparchive.org/reports/state-of-javascript?lens=top1m&amp;amp;start=earliest&amp;amp;end=latest&amp;amp;view=list" rel="noopener noreferrer"&gt;Y el problema se va agravando año a año&lt;/a&gt;.&lt;/strong&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%2Fi.imgur.com%2FbnGelvE.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%2Fi.imgur.com%2FbnGelvE.png" alt="Fuente [https://httparchive.org/reports/state-of-javascript?lens=top1m&amp;amp;start=earliest&amp;amp;end=latest&amp;amp;view=list](https://httparchive.org/reports/state-of-javascript?lens=top1m&amp;amp;start=earliest&amp;amp;end=latest&amp;amp;view=list)" width="800" height="444"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta es la cantidad de kilobytes de JavaScript enviados este último año en promedio desde hace unos 3 años a ahora.&lt;/p&gt;

&lt;p&gt;Este número debería ir en descenso!. Las API de los navegadores se van haciendo mejores y más fáciles de usar, estamos creando herramientas para eliminar código muerto, pero la tendencia sigue en alza, y seguimos pusheando cada vez más código.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problema 2 - Supply Chain Attacks (Ataque a Cadena de Suministro)
&lt;/h3&gt;

&lt;p&gt;No solamente nuestro software puede terminar siendo más lento, sino que también puede ser menos seguro. Las dependencias abren nuevos vectores de ataque en nuestras computadoras, y a las de nuestros clientes y usuarios. &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%2Fi.imgur.com%2F0d8bI8n.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%2Fi.imgur.com%2F0d8bI8n.png" alt="Traducción: Arriba: Toda la infraestructura moderna digital. &amp;lt;br&amp;gt;
Abajo: el proyecto de un loco cualquiera que lo viene manteniendo desde 2003." width="770" height="978"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Traducción: Arriba: Toda la infraestructura moderna digital. &lt;br&gt;
Abajo: el proyecto de un loco cualquiera que lo viene manteniendo desde 2003.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;A veces no tomamos en consideración, lo mucho que estamos confiando en otros programadores a la hora de ejecutar npm install (o sus equivalentes) en nuestras computadoras. El proceso de instalación de dependencias permite correr software aleatorio con un MONTÓN de permisos. Y cada vez se ve más y más software malicioso siendo subido a NPM. &lt;/p&gt;

&lt;p&gt;Y cada vez pasa más seguido, que gente malintencionada (o perturbada) rompa nuestras apps o librerías, porque todo depende de todo, todo por No Reinventar la Rueda, aun cuando hay razones para hacerlo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Y por si no me creen, les cuento de algunos casos reales:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenSSL se encarga de firmar las peticiones y respuestas para cientos de millones de usuarios, en millones de servidores. A pesar de esto, era mantenida solo por 4 desarrolladores, de hobby nomás. Apareció un agujero de seguridad, y tardaron 3 años en darse cuenta de que un atacante podía, de forma bastante fácil, obtener mucha información confidencial.&lt;/li&gt;
&lt;li&gt;En otro caso, un desarrollador que había hecho como 250 paquetes de NPM, decidió sacarlos a todos del registro. Rompiendo por ello miles y miles de apps y librerías. Por primera vez en su historia, NPM republicó un paquete que había sido borrado por su creador. No fue la última vez que pasó algo así.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Esto es, literalmente, toda la librería leftpad.&lt;/span&gt;
&lt;span class="c1"&gt;// Solo le agrega caracteres a un string&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;leftpad&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;leftpad&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;ch&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="nx"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;len&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;str&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;str&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;También hubo un tema con ESLint, donde una dependencia/plug-in muy popular, empezó a meter malware en la PC de muchos desarrolladores. El proceso de NPM install descargaba un archivo de texto, que era básicamente un virus que después ejecutaba. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Problema 3 - No entender cómo funciona la rueda
&lt;/h3&gt;

&lt;p&gt;Más de una vez vi gente que en vez de filtrar un array, con los métodos de filtrado de array, importa lodash. Esto nos atrasa como profesionales, tenerle miedo a reinventar la rueda también implica que no tenemos incentivos para aprender cómo funciona. Aunque sea para aprender nomás.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aclaraciones sobre WET y Zero-Deps
&lt;/h2&gt;

&lt;p&gt;Antes de que me tiren con algo, voy a mencionar que ante DRY, existe WET, que propone siempre escribir todo código al menos dos veces antes de abstraer, para tener una imagen mejor formada de lo que se planea abstraer y simplificar. Es un approach que me gusta más, pero que tampoco seguiría a ciegas.&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%2Fi.imgur.com%2F6qBpwDm.jpg" 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%2Fi.imgur.com%2F6qBpwDm.jpg" alt="Photo by [Jeppe Hove Jensen](https://unsplash.com/@jayhaywire?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText) on [Unsplash](https://unsplash.com/photos/b3eaH1hguOA?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText)" width="800" height="1200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Frente a Don’t Reinvent the Wheel, hay librerías que se jactan de no tener dependencias y que por ello, sí, son inmunes a supply chain attacks, pero eso no implica que esas mismas librerías no vayan a ser las que tengan problemas de seguridad u otros problemas.&lt;/p&gt;

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

&lt;p&gt;La solución no es un approach o el otro el 100 % del tiempo. &lt;strong&gt;No hay balas de plata.&lt;/strong&gt; Todo patrón tiene implicancias positivas y negativas en su aplicación y &lt;strong&gt;entender el balance de pros y contras&lt;/strong&gt; es parte de nuestro trabajo. &lt;strong&gt;Siempre hay una contra&lt;/strong&gt;, aunque esta sea el aumento de complejidad de aplicación que desarrollamos. &lt;/p&gt;

&lt;p&gt;El resultado neto de su aplicación suele ser positivo, especialmente para programadores junior, ya que funcionan como guía de estilo a seguir, frente a la incertidumbre. Para alguien que recién arranca, seguir un patrón a ciegas es mejor opción que avanzar a oscuras. &lt;/p&gt;

&lt;h3&gt;
  
  
  Pero es importante no ser dogmático al respecto.
&lt;/h3&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%2Fi.imgur.com%2FjhSBqX6.jpg" 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%2Fi.imgur.com%2FjhSBqX6.jpg" alt="Photo by [Ante Hamersmit](https://unsplash.com/de/@ante_kante?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText) on [Unsplash](https://unsplash.com/photos/U3AKT6ryvic?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText)" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A medida que vamos creciendo profesionalmente, tenemos que empezar a considerar los contras que tienen nuestras prácticas, a &lt;em&gt;tomar las cosas con pinzas&lt;/em&gt; y de forma pragmática, y a tener en consideración los posibles problemas que pueden surgir, para tomar decisiones informadas, y preparados para las posibles consecuencias.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Eso es lo que me interesa que se lleven de este artículo, de que cuando vean uno de esos eslóganes, piensen &lt;em&gt;“okay, pero por qué?”&lt;/em&gt;, y… *“Como lo podría romper?”.&lt;/strong&gt;*&lt;/p&gt;

&lt;p&gt;Eso es todo. Suerte! 🤙🏻&lt;/p&gt;




&lt;p&gt;Si te quedaste con ganas de Leer más, y sabes inglés, acá van algunos artículos interesantes del tema:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.entropywins.wtf/blog/2017/09/06/the-fallacy-of-dry/" rel="noopener noreferrer"&gt;The Fallacy of Dry.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://startup-cto.medium.com/moist-code-why-code-should-not-be-completely-dry-1f06f2d31c31" rel="noopener noreferrer"&gt;Moist Code&lt;/a&gt; y &lt;a href="https://kentcdodds.com/blog/aha-programming" rel="noopener noreferrer"&gt;AHA programming&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/steveblue/the-hidden-cost-of-don-t-reinvent-the-wheel-1e3l"&gt;The Hidden cost of don’t reinvent the wheel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The cost of Javascript &lt;a href="https://techforce1.nl/the-cost-of-javascript" rel="noopener noreferrer"&gt;1&lt;/a&gt; y &lt;a href="https://v8.dev/blog/cost-of-javascript-2019" rel="noopener noreferrer"&gt;2&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/lionelrowe/what-makes-a-package-useless-or-when-should-i-reinvent-the-wheel-4j5n"&gt;When to Reinvent the Wheel.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://somedudesays.com/2020/02/when-is-it-okay-to-reinvent-the-wheel-in-programming/" rel="noopener noreferrer"&gt;When it’s okay to reinvent the wheel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/jyotishman/10-useless-npm-package-with-millions-of-downloads-de9"&gt;10 Useles NPM packages with million&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Créditos de las imágenes:&lt;br&gt;
&lt;a href="https://unsplash.com/it/@luk10?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Lukas Tennie&lt;/a&gt;, &lt;a href="https://unsplash.com/de/@ante_kante?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Ante Hamersmit&lt;/a&gt;, &lt;a href="https://unsplash.com/@jayhaywire?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText" rel="noopener noreferrer"&gt;Jeppe Hove Jensen&lt;/a&gt; y &lt;a href="https://xkcd.com/2347/" rel="noopener noreferrer"&gt;XKCD Infraestructure comic&lt;/a&gt;&lt;/p&gt;

</description>
      <category>patterns</category>
      <category>javascript</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>Proyecto Nuevo, Problemas Nuevos (2/2)</title>
      <dc:creator>Santiago Persico</dc:creator>
      <pubDate>Tue, 01 Mar 2022 00:00:00 +0000</pubDate>
      <link>https://dev.to/spersico/proyecto-nuevo-problemas-nuevos-22-35kc</link>
      <guid>https://dev.to/spersico/proyecto-nuevo-problemas-nuevos-22-35kc</guid>
      <description>&lt;p&gt;En esta segunda parte de la guía (si no vieron la primera parte, &lt;a href="https://dev.to/spersico/proyecto-nuevo-problemas-nuevos-12-30a9"&gt;está acá&lt;/a&gt;), y asumiendo que ya tenemos el proyecto levantado y una idea general de la arquitectura del sistema y del contexto de negocio en el que trabajamos, voy a compartirte algunos consejos para esos primeros tickets y días de trabajo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Caminante no hay camino!
&lt;/h3&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%2Fuploads%2Farticles%2Fhocbwn4o057rldeul6dw.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%2Fuploads%2Farticles%2Fhocbwn4o057rldeul6dw.png" alt="image.png" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
En general, a menos que estés haciendo algo realmente muy extraño (como un proyecto de investigación, o algo así), considero que la mejor forma de aprenderte como funciona el código de un proyecto, es haciendo tareas simples en el mismo, generalmente bugfixing.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Y no estoy solo, en mi experiencia, la mayoría de PMs, POs y Líderes Técnicos comparte esta manera de pensar y, al "recién llegado" inicialmente le van a dar tareas más simples para que vaya aprendiendo el proyecto, y limitando el alcance de los problemas que el recién llegado se pueda encontrar o pueda causar.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Por lo que no tengas miedo, que tu equipo y superiores sabe que los primeros días son complicados, y que lleva tiempo amoldarse a un proyecto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Equilibrando el Tiempo
&lt;/h3&gt;

&lt;p&gt;Como recién llegados, nuestra cabeza tiene que hacer un balance en como usar nuestro tiempo. Queremos al mismo tiempo pasar rápido de hacer estas primeras tareas, y entender el código del proyecto.&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%2Fuploads%2Farticles%2F36fozkvw9kkjk5hx15n4.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%2Fuploads%2Farticles%2F36fozkvw9kkjk5hx15n4.png" alt="image.png" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Queremos entender el código, para no frustrarnos a futuro cuando tengamos que hacer algo más complicado y no entendamos nada de como funciona y la situación nos sobrepase. Queremos estar preparados digamos.&lt;/p&gt;

&lt;p&gt;Y queremos pasar rápido de las primeras tareas, porque el 99.9% de las veces las primeras tareas son más aburridas que chupar un clavo, o mirar el pasto crecer, y aparte nos hace quedar bien con el resto del equipo y la empresa.&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%2Fuploads%2Farticles%2Fz8bwmbfu43twidso56ot.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%2Fuploads%2Farticles%2Fz8bwmbfu43twidso56ot.png" alt="image.png" width="800" height="342"&gt;&lt;/a&gt;&lt;br&gt;
Respecto a mindset, recomiendo dejar la brújula en "entendamos como está estructurado en líneas generales el proyecto" y en "entendamos en líneas generales el código involucrado en la tarea". Esto último es importante: no hace falta que entiendas todo, absolutamente todo de lo que estás tocando, lo importante es que entiendas como funciona el contexto de lo que vas a modificar (más o menos) y en caso de que sea algo relacionado con datos, el flujo de datos de la aplicación.&lt;/p&gt;

&lt;p&gt;Entendé por donde llegan los datos desde el backend al frontend, o desde la base de datos a la respuesta que tengas que dar de una petición (si, estos consejos aplican para backend también).&lt;/p&gt;

&lt;h3&gt;
  
  
  Aplicá el método científico:
&lt;/h3&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%2Fuploads%2Farticles%2F5l5unz657lu9f04bl8tp.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%2Fuploads%2Farticles%2F5l5unz657lu9f04bl8tp.png" alt="image.png" width="800" height="381"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reproducir el problema, e identificar el componente más importante&lt;/strong&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Si lo que estás haciendo es resolver un bug, lo primero es reproducirlo&lt;/strong&gt;, el bugfixing es muy difícil y poco confiable si no podés reproducir el problema.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Luego toca identificar el código más relevante en el proyecto&lt;/strong&gt;. ¿Cómo? Buscando en el código del proyecto, a partir de las palabras que veas en la UI afectada. En el caso de ser un problema de backend, podés buscar a partir del nombre del endpoint.&lt;br&gt;
O más o menos, por donde creas que esté el componente/controlador. &lt;br&gt;
Si no, ¿Tenés QA en el proyecto para preguntarle? Puede que ese error tenga un test que no esté bien armado, o sea algo no cubierto por tests, pero que el QA sepa por donde viene la cosa.&lt;/p&gt;

&lt;p&gt;Pudiendo reproducir el bug y el código donde más o menos ocurre, podés empezar a entender el problema específico.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Armar una hipótesis de cuál es el problema y que deberías hacer para resolverlo.&lt;/strong&gt;
Habiendo podido reproducir el problema y sabiendo el componente donde ocurre (puede que a fuerza de debugger y console.log), tratá de identificar porque ocurre, usando la línea temporal de GIT, o investigando la situación. 
Puede ser muy útil tomar notas o hacer diagramas de lo que vas viendo, para que te ayuden a entender que lo que estás viendo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una cosa a tener en cuenta siempre que estés haciendo funcionalidades, es que es posible que lo que estés haciendo ya fué hecho antes en el proyecto. Te recomiendo revisar componentes parecidos, buscate si lo que estás haciendo (o algo parecido) ya fué implementado. No te recomiendo copiar y pegar sin entender (eso es muy peligroso, y te va a hacer quedar mal), pero fijate como se encaró el problema en una situación parecida.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Implementar tu solución.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Probar la solución, si no funciona volver al segundo paso.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Si funciona, dejarla en condiciones, lista para aplicar en un Pull Request.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cuando te sientas perdido, aplicar el método científico (y tomar notas) puede ser de gran ayuda, para ordenar las ideas y llegar a una solución (o al menos entender el problema).&lt;/p&gt;

&lt;h3&gt;
  
  
  Anticipá los Problemas, Arrancá por lo Lento:
&lt;/h3&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%2Fuploads%2Farticles%2Fv3xc6h7p3rgbq0534fd0.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%2Fuploads%2Farticles%2Fv3xc6h7p3rgbq0534fd0.png" alt="image.png" width="800" height="281"&gt;&lt;/a&gt;&lt;br&gt;
Tratá de aprovechar el tiempo, asegurando que los supuestos sobre los que se basa tu tarea sean realmente válidos: Si el ticket dice que lo que estás haciendo depende de un endpoint del backend ya existente, probá primero el endpoint, y después te ponés a hacer la UI. ¿Por qué? Porque la comunicación entre equipos usualmente es más lenta que maquetar un div con un par de inputs y un botón, y puede que hagas tu feature en 2 horas y te pases un día esperando por un endpoint. &lt;/p&gt;

&lt;p&gt;Por eso, &lt;strong&gt;Atacá lo más difícil, probá los supuestos sobre los que se maneja el ticket.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Somos pocos y... &lt;em&gt;ya nos vamos a conocer&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Quiero dejar claro tres cosas que creo es lo más importante a recordar y realzar de esta guía:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PEDÍ AYUDA, NO SEAS TERCO.&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esos primeros días se espera que tengas dudas, no tengas miedo de quedar mal.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MANEJÁ TUS EXPECTATIVAS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;El proceso de onboarding es una inversión que la empresa hace en vos&lt;/strong&gt;, ellos saben que tenés que aprender como funciona su proyecto, su código y sus prácticas, por lo que &lt;strong&gt;no te persigas a vos mismo&lt;/strong&gt; por no rendir tanto como el resto del equipo, en esas primeras semanas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OPINÁ Y DISCUTÍ&lt;/strong&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Con respeto y razones, obvio, pero recordá que sos un par más de ojos que pueden ver algo que puede que esté mal. Especialmente en equipos chicos, o en cosas que no tengan una suite de tests como la gente. Tus ideas valen.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ES PREFERIBLE SOBRE-COMUNICAR, QUE SUB-COMUNICAR&lt;/strong&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Esto es algo que vi hasta en gente con mucho seniority. &lt;br&gt;
Comunicá el estado de lo que vas haciendo a tu PM, PO, o lo que sea seguido. &lt;br&gt;
Si te trabas, decilo rápido. Es más rápido y eficiente que el PM, PO, o un par te tire un centro a que te trabes por un día entero. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recordá lo siguiente:&lt;/strong&gt; El tiempo de los programadores es el recurso más caro y preciado de una empresa. Que te trabes (después de investigar y tratar de resolver/entender algo) es más caro para la empresa a que le avises a tu PM y te tengan que explicar de nuevo un ticket o una parte del código. &lt;/p&gt;

&lt;p&gt;Eso es todo, espero que te sirva. ¿Se te ocurren más consejos? Compartilos en un comentario acá mismo!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Te quedaste con ganas de leer más? :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.samueltaylor.org/articles/how-to-learn-a-codebase.html" rel="noopener noreferrer"&gt;Artículo que me inspiró a escribir esto&lt;br&gt;
&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://blog.lantum.com/top-tips-to-finding-your-way-around-a-new-codebase" rel="noopener noreferrer"&gt;Top tips to finding your way around a new codebase&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

</description>
      <category>javascript</category>
      <category>tips</category>
      <category>tricks</category>
      <category>career</category>
    </item>
    <item>
      <title>Proyecto Nuevo, Problemas Nuevos (1/2)</title>
      <dc:creator>Santiago Persico</dc:creator>
      <pubDate>Tue, 01 Mar 2022 00:00:00 +0000</pubDate>
      <link>https://dev.to/spersico/proyecto-nuevo-problemas-nuevos-12-30a9</link>
      <guid>https://dev.to/spersico/proyecto-nuevo-problemas-nuevos-12-30a9</guid>
      <description>&lt;p&gt;Hace un tiempo di una charla en la BeerJS, que pueden ver  &lt;a href="https://youtu.be/-8NmULU6YhE?t=6183" rel="noopener noreferrer"&gt;acá&lt;/a&gt;. Y quiero compartirla con ustedes por escrito, en forma de guía de "buenas prácticas" a la hora de agarrar un nuevo trabajo, y ahorrarnos unos cuantos dolores de cabeza, y para:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Sentirte productivo y que no estás atrapado en un pozo.&lt;/li&gt;
&lt;li&gt;Quedar bien con tus compañeros y jefes.&lt;/li&gt;
&lt;li&gt;No tener un "periodo de ajuste" de 1 mes hasta poder codear algo más complicado que el color de un título.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No voy a proponer ideas muy locas, ya que los consejos que voy a dar, son los que me sirvieron y que, vas a terminar aprendiendo a la larga.  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;A tener en cuenta, asumo en varias partes que estamos hablando de aplicaciones web escritas en JavaScript, pero los consejos son aplicables a cualquier stack.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  3 Cosas a Hacer en Todo Proyecto
&lt;/h1&gt;

&lt;p&gt;En muchos trabajos, te van a dar un tiempo inicial para aclimatarte e ir entendiendo el proyecto. Y si tenés mala suerte y no tenés ese tiempo, lo que podés hacer es calcular de más los primeros tickets teniendo en cuenta que vas a tener que hacer estas cosas. No estoy recomendando mentir, sino tener en cuenta de que el tiempo de algún lado va a tener que salir, porque siempre vas a tener que hacer la configuración inicial del proyecto para arrancar a trabajar.&lt;/p&gt;

&lt;p&gt;En este tiempo extra inicial, te recomiendo que hagas siempre estas 3 cosas (puede que en simultáneo), así que a arremangarse.&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%2Fuploads%2Farticles%2F9ujbwse0ngh3f9v6p9um.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%2Fuploads%2Farticles%2F9ujbwse0ngh3f9v6p9um.png" alt="image.png" width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Levantar el proyecto
&lt;/h2&gt;

&lt;p&gt;Necesitas tener el proyecto corriendo. La aplicación tiene que poder abrirse y estar funcionando. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;¿El Objetivo final?&lt;/strong&gt; Poder meter un "Hola Mundo" en alguna parte del proyecto (en varias, idealmente), y verlo corriendo en tu PC. &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%2Fuploads%2Farticles%2Fp5i1cl3uqj6f4x00kl40.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%2Fuploads%2Farticles%2Fp5i1cl3uqj6f4x00kl40.png" alt="image.png" width="800" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para esto, al momento de levantar el proyecto, toca lo siguiente:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Identifica el punto de partida, y la estructura del proyecto:&lt;/strong&gt;
Partiendo del/los repositorio/s, trata de reconocer lo familiar, herramientas que ya hayas utilizado y que te puedan ayudar a ubicarte en el proyecto, y así ubicar el punto de partida. Este es un punto crítico, por lo que prestá atención a lo que hacés.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Para darte un ejemplo: ¿Te toca levantar un servidor REDIS? Es muy posible que tu proyecto haga uso de una &lt;a href="https://redis.com/es/soluciones/casos-de-uso/cache/" rel="noopener noreferrer"&gt;caché&lt;/a&gt;  en algún lado *(o tal vez  &lt;a href="https://cloud.google.com/architecture/rate-limiting-strategies-techniques" rel="noopener noreferrer"&gt;rate limiter&lt;/a&gt;, u otra cosa)&lt;/em&gt;, tenelo en cuenta a medida que vas armando la imagen mental de la estructura del sistema.*&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Entendé las dependencias a nivel código interno del proyecto:&lt;/strong&gt;
Es parte de la mirada muy por encima que le tenés que dar a cualquier proyecto. ¿Qué dependencias usa (no hace falta que mires todo)? ¿Qué linter tiene instalado? ¿Usa  &lt;a href="https://prettier.io/" rel="noopener noreferrer"&gt;Prettier&lt;/a&gt;  o  &lt;a href="https://eslint.org/" rel="noopener noreferrer"&gt;ESLint&lt;/a&gt;  o ambos o alguna otra cosa?
En unos segundos, mirando el

&lt;code&gt;package.json&lt;/code&gt;

del proyecto (o equivalente), podés llegar a ver todo el stack tecnológico de un proyecto. Incluso podés ver que extensiones deberías tener instaladas en tu entorno de desarrollo.&lt;/li&gt;
&lt;/ul&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cuidado con la versión de las dependencias:&lt;/strong&gt;
Si estás empezando un proyecto nuevo, y ves que tiene dependencias por actualizar, resistí la tentación del update, porque es muy posible que rompas todo y la pases mal por un buen rato. &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Es más, si es posible y tu proyecto utiliza &lt;a href="https://yarnpkg.com/" rel="noopener noreferrer"&gt;yarn&lt;/a&gt; o &lt;a href="https://docs.npmjs.com/about-npm" rel="noopener noreferrer"&gt;npm&lt;/a&gt;, tratá de usar  &lt;a href="https://docs.npmjs.com/cli/v8/commands/npm-ci" rel="noopener noreferrer"&gt;&lt;code&gt;npm ci&lt;/code&gt;&lt;/a&gt; o &lt;a href="https://classic.yarnpkg.com/en/docs/cli/install/#toc-yarn-install-frozen-lockfile" rel="noopener noreferrer"&gt;&lt;code&gt;yarn --frozen-lockfile&lt;/code&gt;&lt;/a&gt;, que te va a asegurar tener las mismas dependencias que tiene instalado el ambiente de producción.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lee la Documentación:&lt;/strong&gt;&lt;br&gt;
Si se da el caso de que tengas la &lt;strong&gt;gran&lt;/strong&gt; suerte de tener una guía de como levantar el proyecto, LÉELA Y SEGUILA,  pero teniendo en cuenta que es posible que no esté actualizada, o que tengas que cambiar algún paso. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tomá notas de lo que vas haciendo:&lt;/strong&gt;&lt;br&gt;
Los comandos que corriste, las cosas que instalaste, los archivos que cambiaste, el orden de lo que hiciste y los errores o resultados inesperados que te encuentres. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recordá que si te trabás, &lt;strong&gt;no tenés que tener miedo en preguntar&lt;/strong&gt; a tus compañeros sobre problemas o dudas que tengas,  y las notas que hayas tomado te van a ayudar a vos y a tus compañeros para destrabarte, en caso de que no puedas avanzar.&lt;br&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%2Fuploads%2Farticles%2Fu16khpv587tahbry984t.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%2Fuploads%2Farticles%2Fu16khpv587tahbry984t.png" alt="image.png" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
  Además, tomar notas tiene la gran ventaja, de que si algo cambió respecto a la documentación, o no es correcto, ese puede ser tu primer Pull Request para la empresa. Literalmente podés hacer tu primera contribución a la hora de arrancar a configurar todo!! &lt;em&gt;(si tenés suerte y logras configurar el proyecto rápido&lt;/em&gt; 😅&lt;em&gt;)&lt;/em&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Revisa que tengas las variables de entorno correctas y permisos de acceso habilitados:&lt;/strong&gt; &lt;br&gt;
Casi todos los proyectos necesitan de variables de entornos, ya sea la URL de la base de datos, alguna secret key de alguna API, o el usuario y contraseña de algún servicio. Usualmente, a estas cosas te la pasan de forma independiente al acceso del repositorio. Si te encontrás con un error al correr el proyecto, esto es de las primeras cosas que pueden ser la causa, y una de las cosas a pedir.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Corré los Tests:&lt;/strong&gt; &lt;br&gt;
Es posible que te encuentres algún tipo de test automatizado (si esto pasa, tenés suerte). Todo depende de la empresa y el proyecto. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2Fuploads%2Farticles%2Fwxc7c3t5445uzfgpa8o0.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%2Fuploads%2Farticles%2Fwxc7c3t5445uzfgpa8o0.png" alt="image.png" width="800" height="433"&gt;&lt;/a&gt;&lt;br&gt;
Una buena prueba para saber si tenés todo andando bien, es corriendo los tests localmente. De la misma manera, no tomes a los test no funcionando como un fallo inmediatamente, porque algunos test dependen de bases de datos o cosas externas que puede que no tengas.&lt;/p&gt;




&lt;h3&gt;
  
  
  A tener en cuenta
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Levantar el proyecto es el paso más urgente,&lt;/strong&gt; porque para poder trabajar necesitas el proyecto funcionando, por lo que siempre dale prioridad por sobre comprender en detalle la arquitectura o el contexto de negocio.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Entender la Arquitectura
&lt;/h2&gt;

&lt;p&gt;Algunos proyectos van a tener un documento sobre esto, y si el documento es una representación válida de la realidad actual, de una, aseguráte de entenderlo.&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%2Fuploads%2Farticles%2F2xj1lioan19ewslqtho2.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%2Fuploads%2Farticles%2F2xj1lioan19ewslqtho2.png" alt="image.png" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
En mi experiencia, casi nunca está actualizado, o completo del todo. Te recomiendo molestar sin asco a algún senior o responsable del equipo, para que te dé una guía de la arquitectura actual del proyecto, el responsable del equipo debería saber que tan al día está el documento (si es que existe), y hacerte una explicación más fácil de entender respecto a como es la arquitectura del proyecto. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algunas preguntas que me parece que son importantes a responder:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;En que contexto corre el código?:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;El código de producción corre en servidores Linux? ¿Usa Docker/Kubernetes? Serverless? &lt;/li&gt;
&lt;li&gt;Está armado con micro-servicios o es un monolito?.&lt;/li&gt;
&lt;li&gt;Que soporte de Sistemas Operativos tiene? ¿Funciona en Windows? ¿Que OS tienen mis compañeros de trabajo?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;En donde se guardan los datos?&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;¿El proyecto usa bases de datos SQL, o alguna cosa NoSQL? Si es NoSQL, que tipo de NoSQL? &lt;/li&gt;
&lt;li&gt;Como se dividen los datos de las DB entre el ambiente de development y produccion? &lt;/li&gt;
&lt;li&gt;Que permisos tengo en cada ambiente?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Como se reparte el codigo del proyecto?&lt;/strong&gt; 

&lt;ul&gt;
&lt;li&gt;Que repositorios son los que vamos a usar más frecuentemente, que hace cada uno? ¿Por dónde debería empezar?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Como es el flujo de desarrollo y despliegue?&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;¿Cómo llevo un fix/feature local de código en mi PC al ambiente de producción?&lt;/li&gt;
&lt;li&gt;¿Cómo es el modelo de branching acá? ¿Hay un esquema de nombrado?&lt;/li&gt;
&lt;li&gt;¿Utilizan un entorno de Staging? ¿Tengo acceso a eso?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Hacen testeo del código? Pertenecen al flujo diario de desarrollo?&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;¿Tengo que hacer tests de cada feature o fix que haga? Hacen TDD?&lt;/li&gt;
&lt;li&gt;¿Qué nivel de granularidad y coverage precisan de los tests?&lt;/li&gt;
&lt;li&gt;Cuál es el estado de los tests del proyecto? ¿Se espera que funcionen en local?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Que cosas me conviene esquivar a la hora de arrancar para no romper?&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Hay algún componente que esté muy atado con alambre y solo el creador sabe cómo funciona?&lt;/li&gt;
&lt;li&gt;Cuál es la expectativa y situación actual de ownership de código de la empresa?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Que servicios externos usa el sistema y la empresa?&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Que API (e.g. SendGrid, DataDog, Sentry) o productos externos utiliza el sistema o la empresa?&lt;/li&gt;
&lt;li&gt;Tengo acceso a todas las API que necesito?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Tienen alguna preferencia o buenas prácticas de código especificas?&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Cuál es la preferencia del proyecto en términos de comentarios en el código?&lt;/li&gt;
&lt;li&gt;Tienen alguna política a respetar ya sea legal o técnica respecto de como tiene que ser el código?&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Estas preguntas son importantes, te pueden ayudar a levantar el proyecto, resolver problemas que te encuentres eventualmente y, en general, te ayudan a formar una imagen más completa de como está armado el sistema, y como tenés que trabajar.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si tenés la mala suerte que nadie sabe nada, te va a tocar arremangarte y ver el código y buscar, y responderte a vos mismo esas preguntas. Generalmente, alguien siempre sabe, porque alguien paga por la infraestructura, y poco a poco vas a ir entendiendo. &lt;br&gt;
&lt;strong&gt;Llegado este punto no tengas miedo de preguntar, eso es lo más importante.&lt;/strong&gt; Y si nadie responde, toca ponerse a investigar, y apuntar para arriba en la cadena de mando. Los bautismos de fuego son feos, pero no son tan comunes, es cuestión de tiempo hasta que te puedas armar una imagen de como funcionan las cosas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recomendación:&lt;/strong&gt; &lt;br&gt;
Tratá de ayudar al equipo a documentar lo que te van enseñando y respondiendo. Ya sea escribiendo un primer esbozo de lo que entendiste que es la arquitectura y publicándolo y perfeccionarlo, o completando o actualizando las partes que falten de lo que ya haya. Ponele fecha, cosa de que quede claro cuando fue la última que se actualizó, todos los proyectos cambian y evolucionan.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Entender el Negocio
&lt;/h2&gt;

&lt;p&gt;La idea es armarte una idea de en donde están parados el proyecto, la empresa, y tu posición en la misma.&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;A nivel general, querés saber: *&lt;/em&gt;¿Qué hace la empresa o el proyecto?, ¿Quiénes son los clientes, que es lo que ofrece de valor?, ¿Cuáles son las prioridades a nivel general?, ¿Cuáles son las expectativas de la empresa sobre el proyecto?, ¿Son una empresa "avanza rápido, rompe cosas" o es más madura y rígida?.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Y ya a nivel proyecto, deberías preguntar:&lt;/strong&gt; ¿Como se relaciona tu equipo y proyecto con la empresa o el producto?, ¿Quién se enoja si el proyecto se rompe?, ¿Qué tan crítico es el proyecto para la empresa?, ¿Con qué otros equipos voy a terminar interactuando seguido?, ¿El código entre equipos se comparte o como funciona la cosa respecto a eso?, ¿Hasta dónde llega la responsabilidad de mi equipo?.&lt;/p&gt;

&lt;p&gt;Este tipo de cosas son las que le preguntás al de Recursos Humanos al momento de entrar a la empresa, o al PO, o al PM, o es algo que te va a tocar investigar o darte cuenta. &lt;br&gt;
&lt;strong&gt;No tengas miedo de hacer estas preguntas&lt;/strong&gt;, porque te va a dar un contexto más claro del proyecto, tu posición y la empresa, y tomar decisiones con más información.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usá la aplicación!
&lt;/h3&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%2Fuploads%2Farticles%2Fos9888thx3grw0vb0lmb.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%2Fuploads%2Farticles%2Fos9888thx3grw0vb0lmb.png" alt="image.png" width="798" height="466"&gt;&lt;/a&gt;&lt;br&gt;
Probala en producción o en staging o donde sea. &lt;br&gt;
No siempre es aplicable (puede que estés arrancando el desarrollo de 0, o que sea una librería compleja o algo así), pero literalmente probar a ver que tal te parece lo que estas meter mano es una de las mejores formas de entender "de que va" el sistema. &lt;/p&gt;

&lt;h3&gt;
  
  
  Lo Importante es Mantenerse en Movimiento
&lt;/h3&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%2Fuploads%2Farticles%2F4slnu8hf3w6kbpkl8xjn.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%2Fuploads%2Farticles%2F4slnu8hf3w6kbpkl8xjn.png" alt="image.png" width="800" height="455"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;No tengas miedo de pedir ayuda, pero no te duermas en los laureles y seguí probando y avanzando todo lo que puedas, y no te cierres si las cosas no salen.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Continuará
&lt;/h3&gt;

&lt;p&gt;Como esto se está haciendo demasiado largo ya, en el próximo artículo (que ya está disponible &lt;a href="https://dev.to/spersico/proyecto-nuevo-problemas-nuevos-22-35kc"&gt;acá&lt;/a&gt;), comparto unos cuantos consejos a la hora de encarar los primeros tickets que nos tiren, para esos días de transición y onboarding.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>tips</category>
      <category>tricks</category>
      <category>career</category>
    </item>
  </channel>
</rss>
