<?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: Verdura</title>
    <description>The latest articles on DEV Community by Verdura (@verdura).</description>
    <link>https://dev.to/verdura</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%2F342939%2F067222f3-04c0-428b-ae8b-65377075ffbb.png</url>
      <title>DEV Community: Verdura</title>
      <link>https://dev.to/verdura</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/verdura"/>
    <language>en</language>
    <item>
      <title>Castaña Driven Development</title>
      <dc:creator>Verdura</dc:creator>
      <pubDate>Wed, 13 Aug 2025 20:22:12 +0000</pubDate>
      <link>https://dev.to/verdura/castana-driven-development-4p7c</link>
      <guid>https://dev.to/verdura/castana-driven-development-4p7c</guid>
      <description>&lt;h2&gt;
  
  
  Introducción en la metodología de trabajo.
&lt;/h2&gt;

&lt;p&gt;Programación por "sensaciones", cortoplacismo, microgestión, y otra serie de plagas que nos hacen la vida imposible.&lt;/p&gt;

&lt;p&gt;En este capítulo os traigo una serie normas para trabajar en consultoría mediocre que os sacarán una sonrisa, o no. Cualquier parecido con la realidad es una mera casualidad.&lt;/p&gt;

&lt;h2&gt;
  
  
  CDD aplicada al desarrollo.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Idiomas en el código.
&lt;/h3&gt;

&lt;p&gt;Una aplicación es CDD Compliant when the code is básicamente en (1, N) idiomas y no tiene sentido en ninguno. Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt; &lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;span class="c1"&gt;// Since UID t specified in the $connectionInfo array,&lt;/span&gt;
&lt;span class="c1"&gt;// The connection will be attempted using Wi&lt;/span&gt;
&lt;span class="nv"&gt;$usuario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"por_favor_no_me_pongas_másTICKETS"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nv"&gt;$pass&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"123456789"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//(Recomendada por los mejores expertos en ciberseguridad)&lt;/span&gt;

&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;familyName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
 &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;mysql_connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'mysql_host'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$pass&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;"Ok"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Exception&lt;/span&gt; &lt;span class="nv"&gt;$e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"NO FUNCIONA"&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;echo&lt;/span&gt; &lt;span class="nf"&gt;familyName&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$usuario&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$pass&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gestión de dependencias
&lt;/h3&gt;

&lt;p&gt;El límite lo pone el disco duro principalmente. Eso de eliminar lo que no usas, o actualizarlo en la medida posible no es del todo compatible con el patrón CDD. &lt;br&gt;
No tiene sentido preocuparse hasta que se llene tu repositorio de artefactos, o tardes 45 minutos de instalación.&lt;/p&gt;

&lt;p&gt;¡Recuerda! Si no te cazan, todo va bien. ¿Qué es lo peor que puede pasar, que la aplicación vaya a mejor y sea más segura?&lt;/p&gt;
&lt;h3&gt;
  
  
  Autores del código
&lt;/h3&gt;

&lt;p&gt;Si no hay sistema alguno de control de versiones, el/la autor/a siempre puede ponerse la diana en la espalda de forma manual.&lt;br&gt;
Ejemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt; &lt;span class="cm"&gt;/**
  * TODO: Hacer que funcione
  *
  * @author Verdura
  */&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;dropDatabaseS_inConFirMAR&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;databaseName&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Gestión de errores
&lt;/h3&gt;

&lt;p&gt;En aras de optimizar el coste de la aplicación, el patrón CDD recomienda siempre delegar la observabilidad al cliente. Es decir, que te contacte él diciendo el mensaje de error.&lt;/p&gt;

&lt;p&gt;Si el cliente no sabe lo que es 0X42358724 LANG ERROR CRITICAL FAILURE, es un problema con su formación, no con que alguien quiera dividir algo por cero. Capturar las excepciones está penado por la CDD Alliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Infraestructura
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Nube pública y contenedores.
&lt;/h3&gt;

&lt;p&gt;Efectivamente, está por llegar una tormenta de despidos cuando llegue la  factura del proveedor. Sólo apta para millonarios, la nube permite engañar como servicio a la gente pensando que el patrón CDD aplicado en el servidor de un externo va a servir para algo.&lt;/p&gt;

&lt;p&gt;El método CDD siempre recomienda aislar el código en contenedores, que es la versión triste de la virtualización. Esto permite ahorrar recursos sin tener que emular un sistema operativo completo y pagar por usar un servicio gestionado de Kubernetes o similares por el doble de coste y la mitad de rendimiento. Fuente: &lt;a href="https://acecloud-ai.translate.goog/blog/cpu-vs-vcpus/?_x_tr_sl=en&amp;amp;_x_tr_tl=es&amp;amp;_x_tr_hl=es&amp;amp;_x_tr_pto=rq" rel="noopener noreferrer"&gt;VCores vs Cores&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  CI/CD
&lt;/h2&gt;

&lt;p&gt;CI/CD, al contrario que mucha gente piensa, no es ningún grupo de Rock, sino que se trata de dos tipos de procesos distintos.&lt;/p&gt;

&lt;h3&gt;
  
  
  CI
&lt;/h3&gt;

&lt;p&gt;CI (Continuous integration):&lt;/p&gt;

&lt;p&gt;Consiste en enviar el código a un repositorio central de código &lt;strong&gt;(OPCIONAL)&lt;/strong&gt;, pasar test de tu app &lt;strong&gt;(MUY OPCIONAL)&lt;/strong&gt;, generar un artefacto &lt;strong&gt;(OPCIONAL)&lt;/strong&gt; y y enviarlas en algún sitio como un repositorio de artefactos, por que es un poco raro seguir este flujo para no hacer nada con el código.&lt;/p&gt;

&lt;p&gt;Una buena práctica de CI aplicado CDD, es generar una imagen de Docker con tu apliación y luego al montar la imagen de Docker publicar una versión de tu código en el repositorio de artefactos. Por ejemplo: Generar una imagen de Docker de una aplicación escrita en Node y luego subirla como paquete de NPM.&lt;/p&gt;

&lt;h3&gt;
  
  
  CD
&lt;/h3&gt;

&lt;p&gt;CD (Continuos Delivery):&lt;/p&gt;

&lt;p&gt;Consiste en desplegar lo que genera el CI.&lt;/p&gt;

&lt;p&gt;Hay múltiples estrategias de despliegue, por ejemplo, desplegar en un entorno de pruebas y cuando sea estable &lt;strong&gt;(OPCIONAL)&lt;/strong&gt; promocionarlo a entorno productivo, reemplazar las réplicas antiguas gradualmente cuando la aplicación está ya lista para recibir peticiones... etc.&lt;/p&gt;

&lt;p&gt;Y luego, la 3ª opción, que es conectarse al servidor por escritorio remoto y abrir el IDE de confianza y ahorrarse todo este proceso bonito sobre el papel, pero no siempre neceseario.&lt;/p&gt;

&lt;h3&gt;
  
  
  Infraestructura como código
&lt;/h3&gt;

&lt;p&gt;Dado que escribir código CDD es tendencia, sería discriminatorio que el departamento de Sistemas / DevOOOPS / SecDevOOOPS / Plataforma de Ingeniería no siguiera convenciones parecidas.&lt;/p&gt;

&lt;p&gt;Gracias a herramientas como Terraform / OpenTofu / Pulumi puedes escribir lo vergonzoso / innecesariamente complejo que es el estado de tu infraestructura. Creas bloques de código que se conectan a la API del proveedor que uses y luego te llega una factura millonaria por que había cosas que no habías declarado por que lo hiciste a mano en 1742.&lt;/p&gt;

&lt;p&gt;También hay herramientas como Ansible, el que gestionas el mantenimiento / setup de los servidores, etc... Por ejemplo, para automatizar instalación de paquetería, propagar configuraciones, etc..&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;Huid de cualquier entidad que aplique CDD.&lt;br&gt;
Queda pendiente CDD aplicado a gestión de equipos.&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>humour</category>
      <category>spanish</category>
    </item>
    <item>
      <title>QA de ofertas de empleo</title>
      <dc:creator>Verdura</dc:creator>
      <pubDate>Sat, 29 Feb 2020 17:30:42 +0000</pubDate>
      <link>https://dev.to/verdura/qa-de-ofertas-de-empleo-47m9</link>
      <guid>https://dev.to/verdura/qa-de-ofertas-de-empleo-47m9</guid>
      <description>&lt;p&gt;Últimamente las ofertas de trabajo son bastante vacías. Se dan situaciones absurdas como no saber para qué cliente vas a trabajar o cuántos días de vacaciones vas a recibir. ¿Merece la pena una oferta de la compañía de mis sueños si no sé qué quieren para su proyecto?&lt;/p&gt;

&lt;p&gt;Viendo desde el punto de vista del empleador, ¿por qué nadie me responde a mis ofertas de trabajo? Si soy de una empresa de selección de personal, ¿cómo le hago entender a mi cliente que ha de darme más detalles?&lt;/p&gt;

&lt;p&gt;Por ello necesitamos una manera de hacer ver a los demás desde un punto de vista matemático si una oferta es buena. Para ello desarrollé el proyecto &lt;a href="https://github.com/RafaelAybar/qa-empleo" rel="noopener noreferrer"&gt;qa-empleo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aunque todos los criterios son subjetivos por que no todo el mundo busca el mismo tipo de trabajo, con qa-empleo quiero crear una forma de poder evitar que por ejemplo, por querer trabajar en una compañía famosa acabemos frustrados por no tener en cuenta aspectos como el teletrabajo o que el proyecto no es lo parecía&lt;/p&gt;

&lt;p&gt;El proyecto está muy muy verde,me falta calcular la rotación histórica (ratio de trabajadores que abandonan la compañía) a través de la api de LinkedIn. &lt;/p&gt;

&lt;p&gt;El proyecto en sí no es más que un script que se ejecuta de la siguiente forma:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;python3 qa-empleo.py nombre-de-la-empresa nota-tipo-contrato nota-ubicación-cliente nota-requerimientos-cliente nota-vacaciones nota-salario nota-horario nota-teletrabajo&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;El script mostrará por pantalla la rotación histórica del proyecto y si la oferta es buena (la nota ha de ser superior a 6)&lt;/p&gt;

&lt;p&gt;Si os gusta la idea cualquier sugerencia es bienvenida, bien por aquí, bien mediante un issue en el repositorio del proyecto.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>qa</category>
      <category>trabajo</category>
    </item>
  </channel>
</rss>
