<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Programación - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Descubre miles de cursos de programación escritos por expertos. Aprende Desarrollo Web, Ciencia de Datos, DevOps, Seguridad y obtén asesoramiento profesional para desarrolladores. ]]>
        </description>
        <link>https://www.freecodecamp.org/espanol/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Programación - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 19 May 2026 10:02:53 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/programacion/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Cómo Escribir una Promesa JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ ¿Qué es una promesa? Una promesa de JavaScript es un objeto que representa la finalización o falla de una tarea asíncrona y su valor resultante.¹ El fin. Estoy bromeando, por supuesto. Entonces, ¿qué significa esa definición? En primer lugar, muchas cosas en JavaScript son objetos. Puedes crear un objeto de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-escribir-una-promesa-de-javascript/</link>
                <guid isPermaLink="false">644ee428e59d8f07c2db32a1</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Vanessa Pineiro Morales ]]>
                </dc:creator>
                <pubDate>Sat, 06 May 2023 00:46:27 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/04/1-RR8oubeQOm63YN90Uth0CA.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-write-a-javascript-promise-4ed8d44292b8/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Write a JavaScript Promise</a>
      </p><h2 id="-qu-es-una-promesa">¿Qué es una promesa?</h2><p>Una promesa de JavaScript es un objeto que representa la finalización o falla de una tarea asíncrona y su valor resultante.¹</p><p>El fin.</p><p>Estoy bromeando, por supuesto. Entonces, ¿qué significa esa definición?</p><p>En primer lugar, muchas cosas en JavaScript son objetos. Puedes crear un objeto de diferentes maneras. La forma más común es con sintaxis literal de objeto:</p><pre><code class="language-js">const miCarro = {
   color: 'azul',
   tipo: 'sedán',
   puertas: '4',
};</code></pre><p>También puedes crear un <code>class</code> e instanciarla con la palabra clave <code>new</code>.</p><pre><code class="language-js">class Carro {
   constructor(color, tipo, puertas) {
      this.color = color;
      this.tipo = tipo;
      this.puertas = puertas
   }
}

const miCarro = new Carro('azul', 'sedán', '4');</code></pre><p><code>console.log(miCarro);</code></p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*QUB10cb7QMBVBEGM2JRo1g.png" class="kg-image" alt="1*QUB10cb7QMBVBEGM2JRo1g" width="636" height="166" loading="lazy"></figure><p>Una promesa es simplemente un objeto como el que creamos con el último ejemplo. Lo instanciamos con la palabra clave <code>new</code>. En lugar de los tres parámetros que pasamos para hacer nuestro auto (color, tipo y puertas), pasamos una función que toma dos argumentos: <code>resolve</code> y <code>reject</code>.</p><p>En última instancia, las promesas nos dicen algo sobre la finalización de la función asíncrona de la que la devolvimos–si funcionó o no. Decimos que la función tuvo éxito al decir que la promesa se <em>resolvió</em>, y que no tuvo éxito al decir que la promesa se <em>rechazó</em>.</p><pre><code class="language-js">const myPromesa = new Promesa(function(resolve, reject) {});</code></pre><p><code>console.log(myPromesa);</code></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*z8UFY0q1iVmr4xzOqOvFlA.png" class="kg-image" alt="1*z8UFY0q1iVmr4xzOqOvFlA" width="518" height="140" loading="lazy"><figcaption>Observe que la promesa está pendiente ("pending").</figcaption></figure><pre><code class="language-js">const myPromesa = new Promesa(function(resolve, reject) {
   resolve(10);
});</code></pre><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*voamRd9sJg_NZ0vOdbYJgg.png" class="kg-image" alt="1*voamRd9sJg_NZ0vOdbYJgg" width="516" height="134" loading="lazy"><figcaption>Observe que resolvimos la promesa con el valor 10.</figcaption></figure><p>Vez, no es demasiado aterrador, solo un objeto que creamos. Y, si lo ampliamos un poco:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*szpVAwKfKzMasjP9Wlpigg.png" class="kg-image" alt="1*szpVAwKfKzMasjP9Wlpigg" width="596" height="320" loading="lazy"><figcaption>Observe que tenemos algunos métodos a los que tenemos acceso, "then" y "catch"</figcaption></figure><p>Además, podemos pasar cualquier cosa que nos gustaría a resolve y reject. Por ejemplo, podríamos pasar un objeto en lugar de una cadena:</p><pre><code class="language-js">return new Promesa((resolve, reject) =&gt; {
   if(algoExitosoPasó) {
      const objetoDeÉxito = {
         msg: 'Éxito',
         data,//...algunos datos que obtuvimos
      }
      resolve(objetoDeÉxito); 
   } else {
      const objetoDeError = {
         msg: 'Ocurrió un error',
         error, //...algún error que recibimos
      }
      reject(objetoDeError);
   }
});</code></pre><p>O, como vimos antes, no tenemos que pasar nada:</p><pre><code class="language-js">return new Promesa((resolve, reject) =&gt; {
   if(algoExitosoPasó) {
      resolve()
   } else {
      reject();
   }
});</code></pre><h3 id="-qu-pasa-con-la-parte-asincr-nica-de-la-definici-n"><strong>¿Qué pasa con la parte "asincrónica" de la definición?</strong></h3><p>JavaScript es de un solo subproceso. Esto significa que solo puede ejecutar una cosa a la vez. Si puedes imaginar una carretera, puedes pensar en JavaScript como una autopista de un solo carril. Cierto código (código asíncrono) puede deslizarse hacia el hombro para permitir que otro código lo pase. Cuando se realiza ese código asíncrono, vuelve a la carretera.</p><blockquote>Como nota al margen, podemos devolver una promesa desde <em>cualquier</em> función. No tiene que ser asíncrono. Dicho esto, las promesas normalmente se devuelven en los casos en que la función de la que devuelven es asíncrona. Por ejemplo, un API que tiene métodos para guardar datos en un servidor sería un gran candidato para devolver una promesa.</blockquote><h3 id="la-conclusi-n-">La conclusión:</h3><p>Las promesas nos brindan una forma de esperar a que se complete nuestro código asíncrono, capturar algunos valores de él y pasar esos valores a otras partes de nuestro programa.</p><h3 id="-c-mo-usamos-una-promesa"><strong>¿Cómo usamos una promesa?</strong></h3><p>El uso de una promesa también se llama <em>consumir</em> una promesa. En nuestro ejemplo anterior, nuestra función devuelve un objeto de promesa. Esto nos permite usar el encadenamiento de métodos con nuestra función.</p><p>Aquí hay un ejemplo de encadenamiento de métodos que apuesto a que no has visto:</p><pre><code class="language-js">const a = 'Una cadena impresionante';
const b = a.toUpperCase().replace('CA', '').toLowerCase();

console.log(b); // una dena impresionante
</code></pre><p>Ahora, recuerda nuestra (pretendida) promesa:</p><pre><code class="language-js">const algoFueExitoso = true;

function algunaFunciónAsíncrona() {
   return new Promesa((resolve, reject){
      if (algoFueExitoso) {
         resolve();     
      } else {
         reject()
      }
   });
}</code></pre><p>Y, consumiendo nuestra promesa usando el encadenamiento de métodos:</p><pre><code class="language-js">algunaFunciónAsíncrona
   .then(ejecutarUnaFunciónSiSeResuelve(conElValorResuelto))
   .catch(oEjecutarUnaFunciónSiEsRechazada(conElValorRechazado));</code></pre><h3 id="un-ejemplo-m-s-real-"><strong>Un ejemplo (más) real.</strong></h3><p>Imagina que tienes una función que obtiene usuarios de una base de datos. He escrito una función de ejemplo en Codepen que simula una API que podrías usar. Proporciona dos opciones para acceder a los resultados. Uno, puede proporcionar una función de retrollamada donde puede acceder al usuario o cualquier error. O dos, la función devuelve una promesa como una forma de acceder al usuario o error.</p><figure class="kg-card kg-embed-card"><iframe id="cp_embed_NoNMgJ" src="https://codepen.io/brandonwoz/embed/preview/NoNMgJ?height=300&amp;slug-hash=NoNMgJ&amp;default-tabs=js,result&amp;host=https://codepen.io" title="Embedded content" scrolling="no" frameborder="0" height="300" allowtransparency="true" class="cp_embed_iframe" loading="lazy" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant-caps: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size-adjust: inherit; font-kerning: inherit; font-variant-alternates: inherit; font-variant-ligatures: inherit; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-position: inherit; font-feature-settings: inherit; font-optical-sizing: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: middle; width: 720px; overflow: hidden;"></iframe></figure><p>Tradicionalmente, accederíamos a los resultados del código asíncrono mediante el uso de retrollamadas.</p><pre><code class="language-js">rr algoDeBaseDeDatos(talVezUnID, function(err, result)) {
   //...Una vez que recuperemos la cosa de la base de datos...
   if(err) {
      hacerAlgoConElError(error)
   }   else {
      hacerAlgoConLosResultados(results);
   }
}</code></pre><p>El uso de retrollamada está <em>bien</em> hasta que se anidan demasiado. En otras palabras, tiene que ejecutar más código asincrónico con cada nuevo resultado. Este patrón de retrollamada dentro de las retrollamadas puede conducir a algo conocido como "infierno de retrollamada".</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*DxEgvtymVuqpLOSx8NJ57A.png" class="kg-image" alt="1*DxEgvtymVuqpLOSx8NJ57A" width="800" height="312" loading="lazy"><figcaption>Los comienzos del infierno de retrollamada</figcaption></figure><p>Las promesas nos ofrecen una forma más elegante y legible de ver el flujo de nuestro programa.</p><pre><code class="language-js">hazAlgo()
   .then(hacerAlgoMás) // y si no te importa
   .catch(cualquierErrorPorFavor);</code></pre><h3 id="escribiendo-nuestra-propia-promesa-ricitos-de-oro-los-tres-osos-y-una-supercomputadora"><strong>Escribiendo nuestra propia promesa: Ricitos de Oro, los Tres Osos y una Supercomputadora</strong></h3><p>Imagina que encuentras un plato de sopa. Te gustaría saber la temperatura de esa sopa antes de comerla. No te quedan termómetros, pero por suerte tienes acceso a una supercomputadora que te dice la temperatura del plato de sopa. Desafortunadamente, esta supercomputadora puede tardar hasta 10 segundos en obtener los resultados.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*XtBW084Eg2feXeR97W2yvw.png" class="kg-image" alt="1*XtBW084Eg2feXeR97W2yvw" width="800" height="405" loading="lazy"></figure><p>Aquí hay un par de cosas para notar.</p><ol><li>Iniciamos una variable global llamado <code>result</code>.</li><li>Simulamos la duración del retraso de la red con <code>Math.random()</code> y <code>setTimeout()</code>.</li><li>Simulamos una temperatura con <code>Math.random()</code>.</li><li>Mantenemos los valores de retardo y temperatura confinados dentro de un rango agregando algunas "matemáticas" adicionales. El rango de <code>temp</code> es de 1 a 300; el rango de <code>delay</code> es de 1000 ms a 10000 ms (1s a 10 segundos).</li><li>Registramos el retraso y la temperatura para tener una idea de cuánto tiempo llevará esta función y los resultados que esperamos ver cuando esté lista.</li></ol><p>Ejecute la función y registre los resultados.</p><pre><code class="language-js">getTemperature(); 
console.log(results); // undefined (indefinido)</code></pre><h3 id="la-temperatura-no-est-definida-qu-pas-"><strong>La temperatura no está definida. ¿Qué pasó?</strong></h3><p>La función tardará un cierto tiempo en ejecutarse. El variable no se establece hasta que finaliza el retraso. Entonces, mientras ejecutamos la función, <code>setTimeout</code> es asíncrono. La parte del código en <code>setTimeout</code> sale del subproceso principal hacia un área de espera.</p><p>Dado que la parte de nuestra función que establece el variable de <code>result</code> se mueve a un área de espera hasta que finaliza, nuestro analizador puede pasar a la siguiente línea. En nuestro caso, es nuestro <code>console.log()</code>. En este punto, el <code>result</code> aún no está definido, ya que nuestro <code>setTimeout</code> no ha terminado.</p><p>Entonces, ¿qué más podríamos intentar? Podríamos ejecutar <code>getTemperature()</code> y luego esperar 11 segundos (ya que nuestro retraso máximo es de diez segundos) y <em>luego</em> console.log los resultados.</p><pre><code class="language-js">getTemperature();
   setTimeout(() =&gt; {
      console.log(result); 
   }, 11000);
   
// Too Hot | Delay: 3323 | Temperature: 209 deg</code></pre><p>Esto funciona, pero el problema con esta técnica es que, aunque en nuestro ejemplo conocemos el retraso máximo de la red, en un ejemplo de la vida real, en ocasiones puede tardar más de diez segundos. Y, aunque pudiéramos garantizar un retraso máximo de diez segundos, si el resultado está listo antes, estamos perdiendo el tiempo.</p><h3 id="promesas-al-rescate"><strong>Promesas al Rescate</strong></h3><p>Vamos a refactorizar nuestra función <code>getTemperature()</code> para devolver una promesa. Y en lugar de establecer el resultado, rechazaremos la promesa a menos que el resultado sea "Exacto", en cuyo caso resolveremos la promesa. En cualquier caso, pasaremos algunos valores para resolver y rechazar.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*4RJERRgVUtHlIYRFm2piVQ.png" class="kg-image" alt="1*4RJERRgVUtHlIYRFm2piVQ" width="800" height="432" loading="lazy"></figure><p>Ahora podemos usar los resultados de nuestra promesa que estamos devolviendo (también conocido como <em>consumir </em>la promesa).</p><pre><code class="language-js">getTemperature()
   .then(result =&gt; console.log(result))
   .catch(error =&gt; console.log(error));
   
// Reject: Too Cold | Delay: 7880 | Temperature: 43 deg</code></pre><p><code>.then</code> será llamado cuando nuestra promesa se resuelva y devolverá cualquier información que pasemos a <code>resolve</code>.</p><p>Se llamará a <code>.catch</code> cuando nuestra promesa se rechace y devolverá cualquier información que pasemos al <code>reject</code>.</p><p>Lo más probable es que consumas más promesas de lo que las creas. En cualquier caso, ayudan a que nuestro código sea más elegante, legible y eficiente.</p><h3 id="resumen"><strong>Resumen</strong></h3><ol><li>Las promesas son objetos que contienen información sobre la finalización de algún código asíncrono y los valores resultantes que queremos pasar.</li><li>Para devolver una promesa usamos <code>return new Promise((resolve, reject)=&gt; {})</code></li><li>Para consumir una promesa usamos <code>.then</code> para obtener la información de una promesa que se ha resuelto y <code>.catch</code> para obtener la información de una promesa que se ha rechazado.</li><li>Probablemente, usarás (consumirás) promesas más de lo que escribirás.</li></ol><h3 id="referencias"><strong>Referencias</strong></h3><p>1.)<a href="https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Promise">https://developer.mozilla.org/es/docs/Web/JavaScript/Reference/Global_Objects/Promise</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo investigué fugas de memoria en Go usando pprof en una base código grande ]]>
                </title>
                <description>
                    <![CDATA[ He estado trabajando con Go durante la mejor parte de este año, implementando una infraestructura de blockchain escalable en Orbs, y ha sido un año estupendo. En el curso de 2018, investigué qué lenguaje elegir para nuestra implementación de blockchain. Esto nos llevó elegir Go porque, a nuestro entender, tiene ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-investigue-fugas-de-memoria-en-go-usando-pprof-en-una-base-codigo-grande/</link>
                <guid isPermaLink="false">6436976210657f0643dec1d2</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Elias Ezequiel Pereyra Gomez ]]>
                </dc:creator>
                <pubDate>Sat, 29 Apr 2023 14:57:20 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/04/gray-pipe-with-water-coming-out-its-hole-scaled-2158x1439.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/how-i-investigated-memory-leaks-in-go-using-pprof-on-a-large-codebase-4bec4325e192/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How I investigated memory leaks in Go using pprof on a large codebase</a>
      </p><p>He estado trabajando con Go durante la mejor parte de este año, implementando una infraestructura de blockchain escalable en Orbs, y ha sido un año estupendo. En el curso de 2018, investigué qué lenguaje elegir para nuestra implementación de blockchain. Esto nos llevó elegir Go porque, a nuestro entender, tiene una buena comunidad y un conjunto de herramientas maravilloso.</p><p>En las semanas recientes estamos entrando en las etapas finales de integración de nuestro sistema. Como en cualquier sistema grande, las etapas siguientes los cuales incluyen problemas de rendimiento, más específico fugas de memoria, podrían ocurrir. Mientras estábamos integrando el sistema, nos dimos cuenta de que encontramos uno. En este artículo tocaré los detalles de cómo investigar una fuga de memoria en Go, detallando los pasos tomados para encontrar, entender y resolverlo.</p><p>El conjunto de herramientas ofrecido por Go(lang) es excepcional, pero tiene sus limitaciones. Tocando estos primeros, el más grande es la habilidad limitada de investigar volcados de memoria completos. Un volcado de memoria completo sería la imagen de la memoria (o memoria de usuario) tomado por el proceso que ejecuta el programa.</p><p>Podemos imaginar el mapeo de memoria como un árbol, y atravesar ese árbol nos tomaría a través de distintas asignaciones de objetos y las relaciones. Esto significa que cualquier cosa que esté en la raíz es la razón para 'sostener' la memoria y que no sea tomado por el Recolector de Basura. Ya que en Go no hay una manera sencilla de analizar el volcado de memoria completo, ir a las raíces de un objeto que no pasa por el Recolector de Basura es difícil.</p><p>Al momento de escribir, fuimos incapaz de encontrar alguna herramienta en línea que nos pueda asistir con eso. Ya que existe un formato de volcado de memoria y una sencilla manera suficiente de exportarlo desde el paquete de depuración, podría ser que haya usado uno en Google. Buscando en línea parece que está en la tubería de Go(lang), creando un visualizador de volcado de memoria como tal, pero parece que nadie está trabajando en él. Habiendo dicho eso, inclusive sin acceso a tal solución, con las herramientas existentes podemos usualmente llegar a la raíz de la causa.</p><h2 id="fugas-de-memoria">Fugas de Memoria</h2><p>Las fugas de memoria, o presión de memoria, pueden venir en varias formas a través de todo el sistema. Usualmente, podemos abarcarlos como errores, pero a veces su causa raíz podría ser en decisiones de diseño.</p><p>A medida que construimos nuestro sistema bajo principios de diseño emergentes, tales consideraciones no se toman como de importancia y eso está bien. Es más importante construir el sistema de una manera que evita las optimizaciones prematuras y te permita ejecutarlos luego a medida que el código madure, más que sobredimensionarlo desde el principio. Aún, algunos ejemplos comunes de ver problemas de presión de memoria materializarse son:</p><ul><li>Demasiadas asignaciones, representación de datos incorrectos</li><li>Uso intenso de reflexión o de cadenas</li><li>Usar globales</li><li>Huérfanos, rutinas de go interminables</li></ul><p>En Go, la manera más sencilla de crear una fuga de memoria es definir una variable global, un arreglo, y adjuntar datos a ese arreglo.</p><p>Entonces, ¿por qué estoy escribiendo este post? Cuando estaba investigando este caso encontré muchos recursos sobre fugas de memoria. Aunque, en realidad los sistemas tienen más de 50 líneas de código y un solo struct. En tales casos, encontrar el recurso de un problema de memoria es mucho más complejo de lo que ese ejemplo describe.</p><p>Go(lang) nos da una herramienta maravillosa llamada <code>pprof</code>. Esta herramienta, cuando se lo domina, puede ayudar en investigar y muy probablemente encontrar cualquier problema de memoria. Otro propósito que tiene es para investigar problemas de CPU, pero no iré en nada relacionado al CPU en este post.</p><h2 id="herramienta-de-go-pprof">Herramienta de go pprof</h2><p>Cubrir todo lo que esta herramienta hace requerirá más que un post de blog. Una cosa que tomó tiempo fue encontrar cómo usar esta herramienta para tener algo procesable. Me concentraré en este post en su característica relacionada a memoria.</p><p>El paquete <code>pprof</code> crea un archivo de volcado de muestra de pila, el cual puedes analizar / visualizar luego para darte un mapeo de ambos:</p><ul><li>Asignaciones de memoria Actuales</li><li>Asignaciones de memoria Totales (acumulativas)</li></ul><p>La herramienta tiene la habilidad de comparar tomas de imágenes instantáneas. Esto te permite comparar en una pantalla la diferencia de tiempo de lo que pasó ahora mismo y 30 segundos atrás, por ejemplo. Para escenarios de estrés, esto puede ser útil para asistir en asignar áreas problemáticas de tu código.</p><h2 id="perfiles-de-pprof">Perfiles de pprof</h2><p>La forma en que pprof funciona es usando perfiles.</p><p>Un Perfil es una colección de rastros de pila mostrando las secuencias de llamada que llevó a las instancias de un evento particular, tales como asignación.</p><p>El archivo <a href="https://golang.org/src/runtime/pprof/pprof.go" rel="noopener">runtime/pprof/pprof.go</a> contiene la información detallada y la implementación de los perfiles.</p><p>Go tiene varias incorporaciones en perfiles para nosotros para usarlos en casos comunes:</p><ul><li>goroutine — rastros de pila de todas las rutinas de go actuales</li><li>heap — un muestreo de asignaciones de memoria de objetos vivos</li><li>allocs — un muestreo de todas las asignaciones de memoria anteriores</li><li>threadcreate — rastros de pila que llevó a la creación de nuevos hilos del OS</li><li>block — rastros de pila que llevó a bloquear las primitivas de sincronización</li><li>mutex — rastros de pila de poseedores de mutexes disputados</li></ul><p>Cuando miremos a los problemas de memoria, nos concentraremos en el perfil de pila. El perfil de asignaciones es idéntico en lo referido a la colección de datos que hace. La diferencia entre los dos es en la manera en que la herramienta pprof lee allí al mismo tiempo. El perfil de <em>asignaciones</em> comenzará pprof en un modo el cual muestra el número total de bytes asignados desde que el programa comenzó (incluyendo los bytes recogidos como basura). Usualmente, usaremos ese modo cuando intentemos hacer nuestro código más eficiente.</p><h2 id="la-pila">La pila</h2><p>En resumen, aquí es donde el OS (Sistema Operativo) almacena los objetos de memoria que nuestro código utiliza. Esta es la memoria el cual luego queda 'coleccionado como basura', o liberado manualmente en lenguajes no coleccionados como basura.</p><p>La pila no es el único lugar donde las asignaciones de memoria ocurren, alguna memoria también es asignado en el Stack. El propósito del stack es de corto plazo. En go el stack es usualmente usado para asignaciones que ocurren dentro del cierre de una función. Otro lugar donde Go usa el stack es donde el compilador 'sabe' cuánto de memoria necesita ser reservada antes del tiempo de ejecución (por ej. arreglos de tamaño fijos). Hay una manera de ejecutar el compilador de Go de manera que mostrará una análisis de dónde las asignaciones 'escapan' del stack a la pila, pero no tocaré eso en este post. </p><p>Mientras que los datos de la pila necesitan ser 'liberados' y pasar por gc, los datos del stack no lo necesitan. Esto significa que es más eficiente usar el stack donde fuera posible.</p><p>Esto es un resumen de las distintas localizaciones donde la asignación de memoria ocurre. Hay un montón más de esto pero estará fuera del alcance para este post.</p><h2 id="obtener-datos-de-la-pila-con-pprof">Obtener datos de la pila con pprof</h2><p>Hay dos manera generales de obtener los datos para esta herramienta. El primero será usualmente parte de esta prueba o una rama e incluye importar <code>runtime/pprof</code> y después llamar a <code>pprof.WriteHeapProfile(algun_archivo)</code> para escribir la información del heap.</p><p>Nota que <code>WriteHeapProfile</code> es sintaxis legible para ejecutar :</p><pre><code>// lookup toma un perfil namepprof.Lookup("heap").WriteTo(algun_archivo, 0)</code></pre><p>De acuerdo con la documentación, <code>WriteHeapProfile</code> existe para retrocompatibilidad. El resto de los perfiles no tienen tales atajos y debes usar la función <code>Lookup()</code> para obtener sus datos de perfil. </p><p>El segundo, el cual es el más interesante, es habilitarlo sobre HTTP (puntos finales basados en web). Esto te permite extraer el adhoc de los datos, desde un contenedor en ejecución en tu entorno e2e / prueba o inclusive desde 'producción'. Este es un lugar mas donde el tiempo de ejecución y el conjunto de herramientas de Go sobresale. La documentación del paquete entero lo <a href="https://golang.org/pkg/net/http/pprof/">encuentras aquí</a>, pero el <a href="https://es.wikipedia.org/wiki/TL;DR">TL;DR</a> es que necesitarás agregarlo a tu código así:</p><pre><code>import (  "net/http"  _ "net/http/pprof")
...
func main() { ... http.ListenAndServe("localhost:8080", nil)}</code></pre><p>El 'efecto secundario' de importar <code>net/http/pprof</code> es el registro de los puntos finales de pprof en la raíz del servidor web en <code>/debug/pprof</code>. &nbsp;Ahora usando curl podemos obtener los archivos de información del heap para investigar:</p><pre><code class="language-bash">curl -sK -v http://localhost:8080/debug/pprof/heap &gt; heap.out</code></pre><p>Agregando el <code>http.ListenAndServe()</code> arriba es requerido solamente si tu programa no tenía un oyente de http antes. Si lo tienes lo enganchará y no hay necesidad de escuchar otra vez. Hay formas también de configurarlo usando <code>ServeMux.HandleFun()</code> el cual tendría más sentido para un programa habilitado para http más complejo.</p><h2 id="usando-pprof">Usando pprof</h2><p>Así que hemos recogidos datos, ¿ahora qué? Como mencionamos arriba, hay dos estrategias de análisis de memorias principales con pprof. Una es mirar las asignaciones actuales (cuenta de bytes u objeto), llamado <code>inuse</code>. El otro es mirar todos los bytes asignados o cuenta de objeto a lo largo del tiempo de ejecución del programa, llamado <code>alloc</code>. Esto significa que a sin importar si fue a través de gc, una suma de todo lo muestreado.</p><p>Este es un buen lugar para reiterar que el <strong>perfil de la <em>pila</em> es un sampleo de las asignaciones de memoria</strong>. <code>pprof</code> en detrás de escena está usando la función <code>runtime.MemProfile</code>, el cual por defecto recolecta información de asignación en cada 512KB de los bytes asignados. Es posible cambiar MemProfile para recoger información de todos los objetos. Nota que muy probablemente, esto ralentizará tu aplicación.</p><p>Esto significa que por defecto, hay alguna chance de que un problema pueda ocurrir con objetos más pequeños que pasará inadvertido del radar de pprof. Para una base de código grande / programa de larga duración, esto no es un problema. </p><p>Una vez que recogimos el archivo del perfil, es tiempo de cargarlo en la consola interactiva que pprof ofrece. Hazlo así corriendo:</p><pre><code class="language-bash">&gt; go tool pprof heap.out</code></pre><p>Observemos la información que se muestra</p><pre><code>Type: inuse_spaceTime: Jan 22, 2019 at 1:08pm (IST)Entering interactive mode (type "help" for commands, "o" for options)(pprof)</code></pre><p>Lo importante a notar aquí es el <code>Type: inuse_space</code>. Esto significa que estamos mirando a los datos de asignación de un momento específico (cuando capturamos el perfil). El tipo es el valor de configuración de <code>sample_index</code>, y los valores posibles son: </p><ul><li>inuse_space — cantidad de memoria asignada y no liberada todavía</li><li>inuse_object s— cantidad de objetos asignados y no liberados todavía</li><li>alloc_space — cantidad total de memoria asignada (sin importar of released)</li><li>alloc_objects — cantidad total de objetos asignados (sin importar de released)</li></ul><p>Ahora escribe <code>top</code> en el interactivo, la salida serán los consumidores máximos de memoria </p><p>Podemos ver una línea diciéndonos sobre <code>Droppped Nodes</code>, esto significa que son filtrados. Un nodo es una entrada de objeto, o un 'nodo' en el árbol. Discontinuar nodos es una buena idea para reducir algo de ruido, pero a veces podría ocultar la causa raíz de un problema de memoria. Veremos un ejemplo de eso mientras continuamos con nuestra investigación.</p><p>Si quieres incluir todos los datos del perfil, agrega la opción <code>-nodefraction=0</code> cuando ejecutes pprof o escribe <code>nodefraction=0</code> en la consola interactiva.</p><p>En la lista expuesta podemos ver dos valores, <code>flat</code> y <code>cum</code>.</p><ul><li><strong><strong>flat</strong></strong> significa que la memoria es asignada por esta función y retenida por esa función </li><li><strong><strong>cum</strong></strong> significa que la memoria fue asignada por esta función o una función que llamó al stack</li></ul><p>Esta sola información puede a veces ayudarnos en entender si hay un problema. Toma por ejemplo un caso en donde la función es responsable de asignar mucha memoria pero no lo está reteniendo. Esto significaría que algún otro objeto está apuntando a esa memoria y manteniéndola asignada, lo que significa que tendríamos un problema de diseño de sistema o un error.</p><p>Otro truco elegante sobre <code>top</code> en la ventana interactiva es que en realidad está ejecutando <code>top10</code>. El comando top soportar el formato <code>topN</code> donde <code>N</code> es el número de entradas que quieres ver. En el caso pegado arriba, ejecutar <code>top70</code> por ejemplo, imprimiría todos los nodos.</p><h2 id="visualizaciones">Visualizaciones</h2><p>Mientras que el <code>topN</code> da una lista textual, hay varias opciones de visualizaciones muy útiles que vienen con pprof. Es posible escribir <code>png</code> o <code>gif</code> y muchos más (mira <code>go tool pprof -help</code> para una lista completa).</p><p>En nuestro sistema, la salida visual por defecto se ve algo así:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*zX28meov6lzXVo4nCkcNvQ.png" class="kg-image" alt="1*zX28meov6lzXVo4nCkcNvQ" width="800" height="486" loading="lazy"></figure><p>Esto podría ser intimidante al principio, pero es la visualización de los flujos de asignación de memoria (según los rastros del stack) en un programa. Leer el gráfico no es tan complicado como parece. Un cuadrado en blanco con un número muestra espacio asignado (y lo acumulativo de cuánta memoria está tomando ahora mismo en el borde del gráfico), y cada rectángulo más ancho muestra la función de asignación.</p><p>Nota que en la imagen de arriba, tomé un png de un modo de ejecución <code>inuse_space</code>. Muchas veces deberías ver &nbsp;también a <code>inuse_objects</code>, ya que puede ayudar en encontrar problemas de asignación.</p><h2 id="indagando-m-s-profundo-encontrando-una-cause-ra-z">Indagando más profundo, encontrando una cause raíz</h2><p>Hasta ahora, fuimos capaz de entender qué es asignar memoria en nuestra aplicación durante el tiempo de ejecución. Esto nos ayuda a tener una sensación de cómo nuestro programa se comporta (o se malcomporta).</p><p>En nuestro caso, podríamos ver que la memoria es retenida por <code>membuffers</code>, el cual es nuestra <a href="https://github.com/orbs-network/membuffers">librería de serialización de datos</a>. Esto no significa que tenemos una fuga de memoria en ese segmento de código, sino que la memoria está siendo retenida por esa función. Es importante entender cómo leer el gráfico, y la salida de pprof en general. En este caso, entender que cuando serializamos los datos, lo que quiere decir que asignamos memoria a objetos structs y primitivos (int, string), nunca es liberado.</p><p>Saltando a conclusiones o malinterpretando el gráfico, podríamos haber asumido que uno de los nodos en el camino a serialización es responsable de retener la memoria, por ejemplo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*Yzeo5J1H0T6w6mFdgUDllQ.png" class="kg-image" alt="1*Yzeo5J1H0T6w6mFdgUDllQ" width="794" height="376" loading="lazy"><figcaption>subconjunto del gráfico</figcaption></figure><p>En algún lugar en la cadena podemos ver nuestra librería de registro, responsable de &gt;50Mb de memoria asignada. Esto es memoria la cual es asignada por funciones llamadas por nuestro registrador. Pensándolo bien, en realidad es lo que se espera. El registrador ocasiona asignaciones de memoria ya que necesita serializar datos para imprimirlos al registro y así causa asignaciones de memoria en el proceso.</p><p>También podemos ver el camino de asignación, la memoria es retenida solamente por serialización y nada más. Adicionalmente, la cantidad de memoria retenida por el registrador es de 30% del total. Lo de arriba nos dice que, muy probablemente, el problema no es con el registrador. Si fuera 100%, o algo cerca a eso, entonces deberíamos haber estado mirando allí – pero no. Lo que podría significar es que algo está siendo registrado que no debería, pero no es una fuga de memoria por el registrador.</p><p>Este es un buen tiempo para introducir otro comando de <code>pprof</code> llamado <code>list</code>. Acepta una expresión regular el cual será un filtro de qué listar. La 'lista' es en realidad el código fuente anotado relacionado a la asignación. En el contexto del registrador el cual estamos viendo, ejecutaremos <code>list RequestNew</code> ya que nos gustaría ver llamadas hechas al registrador. Estas llamadas están viniendo de dos funciones los cuales vienen a empezar con el mismo prefijo.</p><p>Podemos ver que las asignaciones están en la columna <code>cum</code>, lo que significa que la memoria asignada es retenida al stack de llamada. Esto se correlaciona a lo que el gráfico también muestra. En este punto es fácil ver que la razón de que el registrador estaba asignando la memoria es porque le enviamos &nbsp;el objeto 'bloque' entero. Necesitaba serializar algunas partes de éste a lo menos (nuestros objetos son objetos de membuffer, lo cuales siempre implementan algunas función <code>String()</code>). ¿Es un mensaje de registro útil, o una buena práctica? Probablemente no, pero no es una fuga de memoria, no al final del registrador o del código el cual llamó el registrador. </p><p><code>list</code> puede encontrar el código fuente al buscarlo en tu entorno <code>GOPATH</code>. En casos donde la raíz que se busca no coincide, el cual depende en tu máquina de construcción, puedes usar la opción <code>-trim_path</code>. Esto te ayudará para arregrarlo y te permite ver el código de fuente anotado. Recuerda poner tu git al commit correcto el cual se estaba ejecutando cuando el perfil heap fue capturado. &nbsp;</p><h2 id="entonces-por-qu-la-memoria-es-retenida">Entonces, ¿por qué la memoria es retenida?</h2><p>El trasfondo de esta investigación fue la sospecha de que tenemos un problema – una fuga de memoria. Llegamos a esa noción mientras vimos que el consumo de memoria fue más alto de lo que esperaríamos que el sistema necesitara. Encima de eso, lo vimos incrementar, lo cual fue otro fuerte indicador de que 'hay un problema aquí'. </p><p>En este punto, en el caso de Java o .Net, abriríamos algún análisis 'gc roots' o el perfilador y llegar al objeto actual el cual está referenciando a ese dato, y está creando la fuga. Como se explicó, esto no es exactamente posible con Go, ambos por un error de herramienta pero también por la representación baja de memoria de Go.</p><p>Sin ir en detalles, no pensamos que Go tiene noción de qué objeto es almacenado en tal dirección (excepto por los punteros tal vez). Esto significa que en realidad, entender qué dirección de memoria representa tal miembro de tu objeto (struct) requerirá algún tipo de mapeo a la salida de un perfil de pila. Hablando de teoría, esto podría significar que antes de tomar un volcado de memoria completo, uno debería también tomar un perfil de pila, de esa manera las direcciones pueden ser mapeados a la línea de asignación y archivo y así el objeto representado en la memoria.</p><p>En este punto, porque estamos familiarizado con nuestro sistema, fue fácil entender que ya no es un error. Fue (casi) por diseño. Pero continuemos explorando en cómo obtener la información de las herramientas (pprof) para el encontrar la causa raíz.</p><p>Cuando ponemos <code>nodefraction=0</code> llegaremos a ver el mapeo entero de los objetos asignados, incluyendo los más pequeños. Miremos la salida:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*VaWXnlay3BfCwKGd5ypHUg.png" class="kg-image" alt="1*VaWXnlay3BfCwKGd5ypHUg" width="800" height="609" loading="lazy"><figcaption>Visualización de la memoria con nodefraction=0</figcaption></figure><p>Tenemos dos subárboles nuevos. Recordando otra vez, el perfil de pila de pprof está muestreando asignaciones de memoria. Para nuestro sistema eso funciona – no estamos perdiendo ninguna información importante. El nuevo árbol más largo, en verde, el cual está completamente desconectado del resto del sistema es el ejecutador de pruebas, no es interesante.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*jj9eIWDafkAMiC_plwhoww.png" class="kg-image" alt="1*jj9eIWDafkAMiC_plwhoww" width="353" height="710" loading="lazy"><figcaption>El sistema fue configurado a “leak” ?</figcaption></figure><p>El más corto, en azul, el cual tiene una esquina conectándolo al sistema entero es <code>inMemoryBlockPersistance</code>. Ese nombre también explica la 'fuga' que imaginamos que tenemos. Este es el backend de los datos, el cual está ordenando todos los datos en memoria y no persiste en el disco. Lo que es lindo de notar es que podríamos ver inmediatamente que está reteniendo dos objetos grandes. ¿Por qué dos? Porque podemos ver que el objeto es del tamaño de 1.28MB y la función está reteniendo 2.57MB, lo que significa dos de ellos.</p><p>El problema está bien entendido en este punto. Podríamos haber usado delve (el depurador) para ver que este es el arreglo reteniendo todos los bloques para el controlador de persistencia en memoria que tenemos. &nbsp;</p><h2 id="as-que-qu-podr-amos-arreglar">Así que, ¿qué podríamos arreglar?</h2><p>Bueno, eso apesta, fue un error humano. Mientras el proceso fue educativo (y compartir es cuidar), no mejoramos, ¿o sí? </p><p>Hubo una cosa que todavía 'olía' sobre esta información de la pila. Los datos deserializados estaban tomando demasiada memoria, ¿por qué 142MB para algo que debería estar tomando sustancialmente menos?... pprof puede responder eso – en realidad, existe una manera de responder a tales preguntas exactamente.</p><p>Para buscar el código fuente anotado de la función, ejecutaremos <code>list lazy</code>. Usamos <code>lazy</code>, ya que el nombre de la función que estamos buscando es <code>lazyCalcOffsets()</code>, y no sabemos de otra funciones en nuestro código que comiencen con lazy. Escribir <code>list lazyCalcOffsets</code> funcionaría también por supuesto.</p><p>Podemos ver dos pedazos interesantes de información. De nuevo, recuerda que el perfil de pila de pprof muestrea la información sobre las asignaciones. Podemos ver que ambos números <code>flat</code> y <code>cum</code> son los mismos. Esto indica que la memoria asignada también es retenida por estos puntos de asignación. </p><p>Luego, podemos ver que el make() está tomando algo de memoria. Tiene sentido, es el puntero a la estructura de datos. Aunque también vemos la asignación en la línea 43 está tomando memoria, lo que significa que crea una asignación.</p><p>Esto nos enseñó sobre mapeos, donde una asignación a un mapeo no es una asignación de variable directa. <a href="https://dave.cheney.net/2018/05/29/how-the-go-runtime-implements-maps-efficiently-without-generics">Este artículo</a> va en gran detalle sobre cómo el mapeo funciona. En pocas palabras, un mapeo tiene una sobrecarga, y cuanto más elementos, más grande esta sobrecarga va a 'costar' cuando comparamos a un slice.</p><p>Lo siguiente debería ser tomado como un granito de sal: Estaría bien decir que usar un <code>map[int]T</code>, cuando los datos no están esparcidos o pueden ser convertidos a índices sequenciales, usualmente deberían ser probados con una implementación de corte si el consumo de memoria es una consideración relevante. Aunque, un corte grande, cuando se expanda, podría ralentizar una operación, siendo que en un mapeo esta ralentización será despreciable. No hay una fórmula mágica para las optimizaciones.</p><p>En el código de arriba, después de chequear cómo usamos ese mapeo, nos dimos cuenta que mientras nos imaginábamos que es un arreglo esparcido, no llegó a ser tan esparcido. Esto coincide con el argumento de arriba y podríamos ver inmediatamente que una refactorización pequeña de cambiar el mapeo a un corte es en realidad posible, y podría hacer ese código más eficiente para la memoria. Así que lo cambiamos a:</p><p>Tan simple como eso, en vez de usar un mapeo ahora estamos usando un corte. Debido a la manera en que recibimos los datos los cuales son cargados de manera perezoza dentro del corte, y cómo después accedemos a esos datos, aparte de esas dos líneas y la estructura reteniendo esos datos, ningún otro cambio de código fue requerido. ¿Qué le hizo al consumo de memoria? &nbsp;</p><p>Miremos a <code>benchcmp</code> durante un par de pruebas.</p><p>Las pruebas de lectura inicializan la estructura de datos, los cuales crean las asignaciones. Podemos ver que el tiempo de ejecución mejoró con un ~30%, las asignaciones han bajado en un 50% y el consumo de memoria con un &gt;90%(!).</p><p>Ya que el mapeo, ahora corte, nunca fue llenado con muchos items, los números más o menos muestran que veremos en producción. Depende en la entropía de los datos, pero podría haber casos donde las asignaciones y las mejoras de consumo de memoria hubieran sido aún más grandes.</p><p>Viendo a <code>pprof</code> otra vez, y tomando un perfil de pila de la misma prueba, veremos que ahora el consumo de memoria es de hecho por debajo del ~90%.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*d8jhBw3h_ZrHvbgv95Pjvw.png" class="kg-image" alt="1*d8jhBw3h_ZrHvbgv95Pjvw" width="800" height="592" loading="lazy"></figure><p>El punto será que para los conjuntos de datos más pequeños, no deberías usar mapeos donde los cortes bastarían, ya que los mapeos tienen una sobrecarga grande.</p><h2 id="volcado-de-memoria-completo">Volcado de memoria completo</h2><p>Como se mencionó, aquí es donde vemos la limitación más grande con las herramientas ahora mismo. Cuando estábamos investigando este problema, nos obsesionamos con ser capaz de llegar al objeto raíz, sin mucho éxito. Go evoluciona con el tiempo a un gran ritmo, pero esa evolución viene con un precio en el caso del volcado de memoria o la representación de memoria. El formato del volcado de la pila completa, ya que cambia, no es retrocompatible. Para la última versión descrito <a href="https://github.com/golang/go/wiki/heapdump15-through-heapdump17">aquí</a> y escribir un volcado de pila completa, puedes usar <code>debug.WriteHeapDump()</code>.</p><p>Aunque ahora mismo, no nos encontramos 'estancados' porque no hay una buena solución para explorar volcados completos. <code>pprof</code> contestó todas nuestras preguntas hasta ahora. </p><p>Toma nota, la internet recuerda un montón de información que ya no es más relevante. Aquí hay algunas cosas que deberías ignorar si vas a intentar y abrir un volcado completo tu mismo, a partir de go1.11:</p><ul><li>No hay manera de abrir y depurar un volcado de memoria completo en MacOS, solamente en Linux.</li><li>Las herramientas en <a href="https://github.com/randall77/hprof" rel="noopener">https://github.com/randall77/hprof</a> son para Go1.3, existe un fork para 1.7+ pero no funciona apropiadamente tampoco (incompleto).</li><li>viewcore at <a href="https://github.com/golang/debug/tree/master/cmd/viewcore" rel="noopener">https://github.com/golang/debug/tree/master/cmd/viewcore</a> no compila realmente. Es bastante fácil arreglar (los paquetes en lo interno están apuntando a golang.org y no a github.com), pero, <em>tampoco funciona</em>, no en MacOS, tal vez en Linux.</li><li><a href="https://github.com/randall77/corelib" rel="noopener">https://github.com/randall77/corelib</a> también falla en MacOS</li></ul><h2 id="pprof-ui">pprof UI</h2><p>Un último detalle a tener en mente cuando se trata de pprof, es su característica UI. Puede salvar mucho tiempo cuando se empieza una investigación en cualquier problema relacionando a un perfil tomado con pprof.</p><pre><code class="language-bash">go tool pprof -http=:8080 heap.out</code></pre><p>A este punto debería abrir el navegador web. Si no lo hace entonces busca en el puerto en el que lo configuraste. Te permite cambiar las opciones y tener retroalimentación visual más rápido de lo que puedes con una línea de comando. Una manera muy útil de consumir la información.</p><p>La UI en realidad me hizo familiarizar con los gráficos de llama, los cuales exponen áreas culpables del código muy rápidamente.</p><h2 id="conclusi-n">Conclusión</h2><p>Go es un lenguaje emocionante con un muy rico conjunto de herramientas, hay mucho más de lo que puedes hacer con pprof. Este post no toca perfilado de CPU en absoluto, por ejemplo.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Mis cursos gratuitos favoritos para aprender estructuras de datos y algoritmos en profundidad ]]>
                </title>
                <description>
                    <![CDATA[ Las estructuras de datos y los algoritmos son algunos de los temas más esenciales para los programadores, tanto para conseguir un trabajo como para hacerlo bien. Un buen conocimiento de las estructuras de datos y los algoritmos es la base para escribir un buen código. Si estás familiarizado con las ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/mis-cursos-gratuitos-favoritos-para-aprender-estructuras-de-datos-y-algoritmos-en-profundidad/</link>
                <guid isPermaLink="false">63e0fc909a3ea706f58b05b9</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Norvys Gonzalez ]]>
                </dc:creator>
                <pubDate>Fri, 21 Apr 2023 19:30:39 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/02/1_bhnjFh3ZeWNlAtg1unulTw.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/these-are-the-best-free-courses-to-learn-data-structures-and-algorithms-in-depth-4d52f0d6b35a/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">My favorite free courses to learn data structures and algorithms in depth</a>
      </p><p>Las estructuras de datos y los algoritmos son algunos de los temas más esenciales para los programadores, tanto para conseguir un trabajo como para hacerlo bien. Un buen conocimiento de las estructuras de datos y los algoritmos es la base para escribir un buen código.</p><p>Si estás familiarizado con las estructuras de datos esenciales, como por ejemplo: arreglo, cadenas, listas enlazadas, árboles binarios, mapas, y estructuras de datos avanzadas como tries, y árboles autoequilibrados como los árboles AVL, etc., sabrás cuando usar cuál estructura de datos y calcular el costo de CPU y memoria de tu código.</p><p>Aunque no necesitas escribir tu propia arreglo, lista enlazada, o tabla hash, dado que cada SDK de programación importante los proporciona, por ejemplo: JDK o la librería STL de C++, necesitarás entenderlos para poder utilizarlos en el lugar adecuado.</p><h3 id="el-uso-de-la-estructura-de-datos-correcta-puede-mejorar-dr-sticamente-el-rendimiento-de-un-algoritmo-">El uso de la estructura de datos correcta puede mejorar drásticamente el rendimiento de un algoritmo.</h3><p>Idealmente, todos deberíamos aprender <a href="https://hackernoon.com/10-data-structure-algorithms-and-programming-courses-to-crack-any-coding-interview-e1c50b30b927">estructuras de datos</a> y <a href="https://dzone.com/articles/10-coding-interview-preparation-courses-crack-a-pr">algoritmos</a> en nuestras escuelas y universidades, pero rara vez se cubre. La mayoría de los programadores, incluyéndome a mí, solo conocemos una estructura de datos en nuestros cursos de informática, pero realmente no aprendimos su importancia en el mundo real, y es por eso que no los entendemos mejor.</p><p>Para nosotros, son solo los algoritmos y las estructuras de datos, solo conceptos, no herramientas que puedas utilizar para escribir buenos programas. No sabíamos que Facebook los usaría para almacenar nuestros datos o que Google los usaría para almacenar páginas web y enlaces a consultas de búsqueda.</p><blockquote>De todos modos, nunca es demasiado tarde.</blockquote><p>Si crees que tu conocimiento de estructura de datos no está a la altura o deseas mejorar tu conocimiento de estructura de datos, entonces has venido al lugar correcto.</p><p>Anteriormente, compartí algunos <a href="https://javarevisited.blogspot.com/2016/05/5-free-data-structure-and-algorithm-books-in-java.html#axzz4uXETWjmV">libros en inglés gratuitos para aprender estructuras de datos y algoritmos</a>, y en este artículo, aprenderás sobre algunos de los mejores cursos de estructura de datos y algoritmos que están disponibles de forma gratuita en línea.</p><h3 id="cursos-gratis-para-aprender-estructura-de-datos-y-algoritmos"><strong>Cursos gratis para aprender estructura de datos y algoritmos</strong></h3><p>Aquí está mi lista de algunos de los mejores cursos para aprender estructuras de datos y algoritmos, que además son gratuitos. Muchos programadores piensan que los recursos gratuitos no son buenos, lo cual no es cierto.</p><p>Aunque a veces no igualan la calidad y la cobertura de los recursos pagos, son, de hecho, los mejores recursos para empezar.</p><p>Puedes usar estos cursos para familiarizarse con las estructuras de datos esenciales y aprender algunos conceptos básicos.</p><p>Algunos de ellos son particularmente buenos desde el punto de vista de una entrevista, por lo que puede utilizarlos junto con cualquier libro que estés utilizando para prepararte para su <a href="http://www.java67.com/2018/05/top-75-programming-interview-questions-answers.html">entrevista de trabajo de programación</a>.</p><h2 id="curso-1-conceptos-de-estructura-de-datos-en-c"><strong>Curso #1: </strong>Conceptos de estructura de datos en C</h2><p>Este es otro curso gratuito de capacitación en línea sobre algoritmos y estructuras de datos, cuyo objetivo es enseñar estructuras de datos básicas en la programación de computadoras.</p><p>Las estructuras de datos que se enseñan en el curso incluyen <a href="http://www.java67.com/2013/08/ata-structures-in-java-programming-array-linked-list-map-set-stack-queue.html">Stack</a>, <a href="http://javarevisited.blogspot.sg/2017/03/difference-between-stack-and-queue-data-structure-in-java.html#axzz4rZnFiEOx">Queue </a>y <a href="https://javarevisited.blogspot.com/2015/02/simple-junit-example-unit-tests-for-linked-list-java.html">Listas enlazadas</a>, empleando el lenguaje de programación C.</p><p>El objetivo principal de esto es hacer que los estudiantes y los ingenieros de software visualicen cómo funcionan las diferentes estructuras de datos.</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/9KAnoe0SwLrdwMWSxZvutFKzyxq959oVVyZ7" class="kg-image" alt="9KAnoe0SwLrdwMWSxZvutFKzyxq959oVVyZ7" width="400" height="287" loading="lazy"></figure><p>Este no es un curso exhaustivo, pero aprenderás sobre <a href="https://javarevisited.blogspot.com/2017/03/how-to-implement-stack-in-java-using-array-example.html">Stack</a>, Queue y <a href="https://javarevisited.blogspot.com/2017/03/how-to-reverse-linked-list-in-java-using-iteration-and-recursion.html#axzz5bAq1c3jf">listas enlazadas</a>.</p><p>En resumen, es un gran curso para programadores nuevos en estructuras de datos y para aquellos que acaban de aprender un lenguaje de programación y quieren aprender los conceptos básicos de cómo funcionan las estructuras de datos.</p><h2 id="curso-2-algoritmos-parte-1-coursera"><strong>Curso #2: </strong>Algoritmos Parte 1 - Coursera</h2><p>Esta es la <a href="https://www.coursera.org/learn/algorithms-part1">primera parte</a> de una serie de cursos de dos partes que cubren algoritmos y estructuras de datos en Coursera por Robert Sedgewick.</p><p>En esta parte, aprenderá estructuras de datos esenciales como <a href="http://javarevisited.blogspot.sg/2017/07/top-10-linked-list-coding-questions-and.html#axzz4xXS86IVo">listas enlazadas</a>, <a href="https://javarevisited.blogspot.com/2017/03/difference-between-stack-and-queue-data-structure-in-java.html" rel="noopener">stacks</a>, queues, <a href="https://javarevisited.blogspot.com/2015/10/how-to-implement-binary-search-tree-in-java-example.html">árboles binarios</a>, y <a href="http://javarevisited.blogspot.sg/2011/02/how-hashmap-works-in-java.html#axzz5B9NXhuQw">tablas hash</a>, y algoritmos de búsqueda y clasificación como: <a href="https://javarevisited.blogspot.com/2017/04/recursive-binary-search-algorithm-in-java-example.html" rel="noopener">binary search</a>, <a href="https://javarevisited.blogspot.com/2014/08/quicksort-sorting-algorithm-in-java-in-place-example.html" rel="noopener">quicksort</a>, <a href="http://www.java67.com/2018/03/mergesort-in-java-algorithm-example-and.html" rel="noopener">mergesort</a>, <a href="https://javarevisited.blogspot.com/2014/12/insertion-sort-algorithm-in-java-to-array-example.html" rel="noopener">insertion sort</a>, etc.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/Uqip9-SbrXSJg53ERcVRpQIvCRwBl9MQsozM" class="kg-image" alt="Uqip9-SbrXSJg53ERcVRpQIvCRwBl9MQsozM" width="400" height="252" loading="lazy"><figcaption><a href="http://bit.ly/algorithms-part1" rel="noopener" target="_blank" title="" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Algorithms Part 1</a></figcaption></figure><p>También aprenderás sobre las estructuras de datos centrales y los algoritmos utilizados en las aplicaciones cotidianas y comprenderá las ventajas y desventajas involucradas en la elección de cada estructura de datos junto con los algoritmos de <a href="http://www.java67.com/2017/05/binary-tree-post-order-traversal-in-java-without-recursion.html">recorrido</a>, recuperación y actualización.</p><p>Todas las características de este curso están disponibles de forma gratuita, pero no ofrece un certificado al finalizar.</p><h3 id="curso-3-algoritmos-parte-2"><strong><strong><strong>Curs</strong></strong>o<strong><strong> #3: </strong></strong></strong>Algoritmos - Parte 2</h3><p>Esta es la <a href="https://www.coursera.org/learn/algorithms-part2">segunda parte</a> de una serie de dos partes de cursos gratuitos en línea de Coursera que cubren estructuras de datos y algoritmos de Robert Sedgewick y Kevin Wayne, ambos profesores de Ciencias de la Computación.</p><p>Robert Sedgewick también es el autor del libro <strong><strong><a href="http://www.amazon.com/Algorithms-4th-Edition-Robert-Sedgewick/dp/032157351X?tag=javamysqlanta-20" rel="noopener">Algoritmos 4th Edition</a></strong></strong> , uno de los libros más populares sobre algoritmos para desarrolladores de Java.</p><p>En esta <a href="https://www.coursera.org/learn/algorithms-part2">parte</a>, aprenderás sobre los algoritmos de procesamiento de cadenas y gráficos.</p><p>También aprenderás algunas estructuras de datos y algoritmos avanzados empleados en el desarrollo de aplicaciones.</p><p>Hablando de la prueba social, tanto <a href="https://www.coursera.org/learn/algorithms-part1">Algoritmos Parte 1</a> y &nbsp;<a href="https://www.coursera.org/learn/algorithms-part2">Algoritmos Parte 2</a> son cursos altamente recomendados y tienen críticas y calificaciones impresionantes.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/-ClYQqg03sCkaKTze2IFx-gVZ1rJ9oxXbiM3" class="kg-image" alt="-ClYQqg03sCkaKTze2IFx-gVZ1rJ9oxXbiM3" width="225" height="225" loading="lazy"><figcaption><a href="http://bit.ly/algorithms-part2" rel="noopener" target="_blank" title="" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">Algorithms — Part 2</a></figcaption></figure><h2 id="curso-4-estructuras-de-datos-en-java"><strong>Curso #4. </strong>Estructuras de datos en Java</h2><p>Este es un c<a href="http://bit.ly/2zLGO3B">urso introductorio en línea sobre estructuras de datos</a>, algoritmos y análisis de complejidad. Te enseñará el diseño, la implementación y el análisis de estructuras de datos básicas utilizando el lenguaje Java.</p><p>La mejor parte de este <a href="https://www.udemy.com/course/data-structures-part-1-lognacademy/?LSNPUBID=JVFxdTr9V80&amp;ranEAID=JVFxdTr9V80&amp;ranMID=39197&amp;ranSiteID=JVFxdTr9V80-1oRgNI5PlhJsM0hhk7_kWg&amp;utm_medium=udemyads&amp;utm_source=aff-campaign">curso</a> es la cantidad de ejemplos prácticos y que se enfoca en la intuición en lugar de fórmulas y pruebas matemáticas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/BidoQMlvn0BpD8u95vR7IaGcorlUbo87lAMw" class="kg-image" alt="BidoQMlvn0BpD8u95vR7IaGcorlUbo87lAMw" width="400" height="225" loading="lazy"><figcaption><a href="http://bit.ly/2zLGO3B" rel="noopener" target="_blank" title="" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;"><strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; color: var(--gray85);">Data Structure in Java</strong></a></figcaption></figure><p>El <a href="http://bit.ly/2zLGO3B">curso</a> proporciona una buena introducción al “análisis de complejidad”, que permite detectar un programa con un rendimiento deficiente (y excelente), incluso sin necesidad de ejecutarlo.</p><p>Eso es todo acerca de algunos <strong><strong>curs</strong>o<strong>s </strong>gratuitos de estructuras de datos algoritmos </strong>disponibles en línea. Puedes usar estos cursos para aprender estructuras de datos y algoritmos a su propio ritmo.</p><p>Puede que no todos sean exhaustivos, pero proporcionan una buena introducción. Una vez que complete estos cursos, puede elegir un buen libro como <strong><a href="http://javarevisited.blogspot.com/2015/07/5-data-structure-and-algorithm-books-best-must-read.html#axzz54hiGw48b">Introducción a los Algoritmos</a></strong><a href="http://javarevisited.blogspot.com/2015/07/5-data-structure-and-algorithm-books-best-must-read.html#axzz54hiGw48b" rel="noopener"> </a>para complementar aún más su conocimiento.</p><h2 id="curso-5-estructuras-de-datos-de-f-ciles-a-avanzadas"><strong>Curso #5. </strong>Estructuras de datos de fáciles a avanzadas</h2><p>Actualización: este curso ya no es gratuito, pero es un gran curso y puede valer la pena para ti. Este <a href="https://click.linksynergy.com/deeplink?id=JVFxdTr9V80&amp;mid=39197&amp;murl=https%3A%2F%2Fwww.udemy.com%2Fintroduction-to-data-structures%2F">curso</a> de estructura de datos y algoritmos de Udemy son para todas aquellas personas que desean aprender estructuras de datos desde un nivel absolutamente básico hasta avanzado.</p><p>Este <a href="https://click.linksynergy.com/deeplink?id=JVFxdTr9V80&amp;mid=39197&amp;murl=https%3A%2F%2Fwww.udemy.com%2Fintroduction-to-data-structures%2F">curso</a> no espera que tenga ningún conocimiento previo de estructuras de datos, pero un conocimiento previo básico de <a href="http://www.java67.com/2018/08/top-10-free-java-courses-for-beginners-experienced-developers.html">Java</a> es útil.</p><p>El autor @William Fiset es ingeniero de software en <a href="https://javarevisited.blogspot.com/2012/01/google-interview-questions-answers-top.html">Google</a> y ex finalista mundial de <strong>ACM-ICPC</strong> y tiene excelentes habilidades de programación informática y resolución de problemas.</p><p>Hablando de prueba social, el <a href="https://click.linksynergy.com/deeplink?id=JVFxdTr9V80&amp;mid=39197&amp;murl=https%3A%2F%2Fwww.udemy.com%2Fintroduction-to-data-structures%2F">curso</a> tiene más de 25 000 estudiantes y una calificación promedio de 4.1 de 683, lo cual es impresionante.</p><p>En resumen, es una guía completa para aprender todo lo que hay que saber sobre las estructuras de datos.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/4-E1RXoSCW8fNivg1wkYVuFmvzPzhkE3uVIF" class="kg-image" alt="4-E1RXoSCW8fNivg1wkYVuFmvzPzhkE3uVIF" width="392" height="400" loading="lazy"><figcaption>Easy to Advanced Data Structures</figcaption></figure><p>Este también es un curso ideal para estudiantes de ciencias de la computación y profesionales de software en activo que desean aprender estructuras de datos y algoritmos desde una perspectiva de entrevista.</p><p>Entonces, si estás buscando un trabajo en compañías basadas en productos como <a href="http://javarevisited.blogspot.sg/2016/01/top-20-amazon-and-google-programming-interview-questions.html" rel="noopener">Amazon</a>, <a href="http://javarevisited.blogspot.com/2012/01/google-interview-questions-answers-top.html#axzz54hiGw48b" rel="noopener">Google</a>, <a href="http://javarevisited.blogspot.sg/2015/12/30-microsoft-interview-questions-for-software-development-engineers.html" rel="noopener">Microsoft</a>, o Facebook, puedes usar este curso para poner en marcha tu preparación.</p><h4 id="notas-de-cierre"><strong>Notas de cierre</strong></h4><p>Gracias. Llegaste al final del artículo. ¡Buena suerte en tu camino para convertirte en programador! Ciertamente, no será fácil, pero al seguir estos cursos, estarás un paso más cerca de dominar la estructura de datos y los algoritmos que otros.</p><p>Si te gustó este artículo, compártelo con tus amigos y colegas, ¡y no olvides seguir a <a href="https://twitter.com/javinpaul">javinpaul</a> en Twitter!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo configurar Go para Windows: guía rápida y sencilla ]]>
                </title>
                <description>
                    <![CDATA[ Otro gran lenguaje para añadir a tu cinturón de herramientas de desarrollador full-stack es el sencillo y productivo lenguaje de programación de propósito general Go. Gracias a un proyecto iniciado en 2007, Go vio la luz gracias al esfuerzo de algunos programadores de Google. Pusieron mucho cuidado en el diseño ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-configurar-go-para-windows-guia-rapida-y-sencilla/</link>
                <guid isPermaLink="false">63cbee9c700708073437c196</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jorge Sierra ]]>
                </dc:creator>
                <pubDate>Tue, 24 Jan 2023 19:53:21 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/01/5f9c9a97740569d1a4ca2681.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/setting-up-go-programming-language-on-windows-f02c8c14e2f/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to set up Go for Windows — a quick and easy guide</a>
      </p><p>Otro gran lenguaje para añadir a tu cinturón de herramientas de desarrollador full-stack es el sencillo y productivo lenguaje de programación de propósito general Go.</p><p>Gracias a un proyecto iniciado en 2007, Go vio la luz gracias al esfuerzo de algunos programadores de Google. Pusieron mucho cuidado en el diseño de Go para que fuera claro y coherente en sus características de lenguaje y bibliotecas estándar, haciendo que Go fuera fácil y divertido de usar.</p><p>Es lo mejor del código abierto… pero no olvide que distingue entre mayúsculas y minúsculas.</p><p>Empecemos con el sistema operativo Microsoft Windows 10. Verás lo fácil que es en realidad - solo se requiere un conocimiento básico de GitHub y el símbolo del sistema. Seguro que hay otras maneras de instalar y ejecutar el programa, pero con un conocimiento limitado de codificación sentí que este conjunto de instrucciones era el más fácil de entender y seguir.</p><p>Asegúrese de seguir estos pasos en su totalidad, así como en <strong>el orden correcto (como se indica)</strong> para ahorrarse, tener que desinstalar Go y pasar unas cuantas horas solucionando cualquier problema relacionado con la instalación.</p><h3 id="fase-1-instale-lo-siguiente-en-este-orden">Fase 1: Instale lo siguiente en este orden</h3><ol><li>Como Go utiliza a menudo repositorios de código abierto (¡GRATUITOS!), asegúrate de instalar primero el paquete Git <a href="https://git-scm.com/download/win">aquí</a>.</li><li>Navegue hasta el sitio web de instalación de Go <a href="https://go.dev/doc/install">aquí</a>. Descargue e instale la última versión de Go de 64 bits para el sistema operativo Microsoft Windows.</li><li>Siga las instrucciones del programa de instalación Go.</li><li>Ejecute el símbolo del sistema en su ordenador buscando "cmd". Abra la línea de comandos y escriba "go version"</li><li>La salida después de introducir la versión go debería tener este aspecto:</li></ol><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*-j7JjyJSN3DqxEdO4lrjTw.png" class="kg-image" alt="1*-j7JjyJSN3DqxEdO4lrjTw" width="493" height="132" loading="lazy"></figure><h3 id="fase-2-creaci-n-del-espacio-de-trabajo-go">Fase 2: Creación del espacio de trabajo Go</h3><p>En primer lugar, confirme sus binarios Go: vaya al Panel de control de su ordenador, luego a Sistema y seguridad &gt; Sistema &gt; Configuración avanzada del sistema y, en el panel de la izquierda, haga clic en la pestaña Avanzado. A continuación, haga clic en Variables de entorno en la parte inferior derecha. Asegúrese de que la variable "C:\Go\bin" está en la ruta de las variables del sistema.</p><p>A continuación, cree su espacio de trabajo Go. Esto será en una carpeta nueva y separada de donde se guardan los archivos de instalación de Go. Por ejemplo, sus archivos de instalación G se guardaron en la ruta C:\Go y usted está creando su espacio de trabajo Go en C:\Projects\Go</p><p>En tu nueva carpeta Go work-space, crea tres nuevas carpetas:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*I3BO4S6FQ6keH6o75ATuBg.png" class="kg-image" alt="1*I3BO4S6FQ6keH6o75ATuBg" width="724" height="128" loading="lazy"><figcaption>bin, pkg, src</figcaption></figure><h3 id="fase-3-crear-la-variable-de-entorno-gopath">Fase 3: Crear la variable de entorno GOPATH</h3><p>Crea la variable GOPATH y haz referencia a tu recién creado espacio de trabajo Go. Vuelve a tu Panel de Control y navega hasta Sistema y luego a Variables de Entorno. A continuación, en Variables del sistema, haga clic en Nuevo.</p><p>Junto a Nombre de variable, introduzca "GOPATH", y junto a Valor de variable introduzca "C:\Proyectos\Go".</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*EdndcOEfhY8DWreAWXjung.png" class="kg-image" alt="1*EdndcOEfhY8DWreAWXjung" width="641" height="129" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*ErNq0vYJQeTJadnJZczBtw.png" class="kg-image" alt="1*ErNq0vYJQeTJadnJZczBtw" width="701" height="189" loading="lazy"></figure><p>Para comprobar que la ruta se ha establecido correctamente, introduzca "echo %GOPATH%" en la línea de comandos.</p><h3 id="fase-4-probar-y-garantizar">Fase 4: Probar y garantizar</h3><p>Ahora estás listo para verificar que todo funciona correctamente abriendo la línea de comandos y escribiendo: <code>go get github.com/golang/example/hello</code></p><p>Espere a que el código se ejecute por completo (puede tardar unos segundos) y, a continuación, introduzca lo siguiente en la línea de comandos: <code>%GOPATH%/bin/hello</code></p><p>Si la instalación se ha realizado correctamente, debería recibir el siguiente mensaje de retorno: “Hello, Go examples!”</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*EXG3IKaDbFqJ3qMpD_n08Q.png" class="kg-image" alt="1*EXG3IKaDbFqJ3qMpD_n08Q" width="559" height="178" loading="lazy"></figure><p>Espero que tenga éxito. Y si te encuentras con algún error o mensajes confusos, comentar a continuación con los resultados de esta línea de comandos: “go env”</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*z6i4jwGkvPE3S21x_PmvMw.png" class="kg-image" alt="1*z6i4jwGkvPE3S21x_PmvMw" width="245" height="300" loading="lazy"></figure><p>¡Y ahora estás listo para convertirte en un "Gopher"!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Guía paso a paso para crear una IA de ajedrez sencilla ]]>
                </title>
                <description>
                    <![CDATA[ Exploremos algunos conceptos básicos que nos ayudarán a crear una IA de ajedrez sencilla:  * move-generation  * board evaluation  * minimax  * and alpha beta pruning. En cada paso, mejoraremos nuestro algoritmo con una de estas técnicas de programación de ajedrez probadas con el tiempo. Demostraré ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/guia-paso-a-paso-para-crear-una-ia-de-ajedrez-sencilla/</link>
                <guid isPermaLink="false">63cbe65f700708073437c12d</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jorge Sierra ]]>
                </dc:creator>
                <pubDate>Tue, 24 Jan 2023 19:43:52 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/01/1_eP0V-xfRWfW3QHJhALJ5RA.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/simple-chess-ai-step-by-step-1d55a9266977/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">A step-by-step guide to building a simple chess AI</a>
      </p><p>Exploremos algunos conceptos básicos que nos ayudarán a crear una IA de ajedrez sencilla:</p><ul><li>move-generation</li><li>board evaluation</li><li>minimax</li><li>and alpha beta pruning.</li></ul><p>En cada paso, mejoraremos nuestro algoritmo con una de estas técnicas de programación de ajedrez probadas con el tiempo. Demostraré cómo afecta cada una de ellas al estilo de juego del algoritmo.</p><p>Puedes consultar el algoritmo final de IA aquí, en <a href="https://github.com/lhartikk/simple-chess-ai">GitHub</a>.</p><h3 id="paso-1-generaci-n-de-movimientos-y-visualizaci-n-del-tablero">Paso 1: Generación de movimientos y visualización del tablero</h3><p>Usaremos la librería <a href="https://github.com/jhlywa/chess.js">chess.js</a> para la generación de movimientos, y <a href="https://github.com/oakmac/chessboardjs/">chessboard.js</a> para visualizar el tablero. La librería de generación de movimientos básicamente implementa todas las reglas del ajedrez. Basándonos en esto, podemos calcular todos los movimientos legales para un estado dado del tablero.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*_Z_qtrm9ayf_UhycYudE3g.png" class="kg-image" alt="1*_Z_qtrm9ayf_UhycYudE3g" width="800" height="572" loading="lazy"><figcaption>A visualization of the move generation function. The starting position is used as input and the output is all the possible moves from that position.</figcaption></figure><p>El uso de estas bibliotecas nos ayudará a centrarnos solo en la tarea más interesante: crear el algoritmo que encuentre la mejor jugada.</p><p>Empezaremos creando una función que simplemente devuelva una jugada aleatoria de entre todas las posibles:</p><p>Aunque este algoritmo no es un jugador de ajedrez muy sólido, es un buen punto de partida, ya que podemos jugar contra él:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*GzOiJRh6Z3FOC3xmPEmKrQ.gif" class="kg-image" alt="1*GzOiJRh6Z3FOC3xmPEmKrQ" width="410" height="402" loading="lazy"><figcaption>Black plays random moves. Playable on <a href="https://jsfiddle.net/lhartikk/m14epfwb/" rel="noopener" target="_blank" title="" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">https://jsfiddle.net/lhartikk/m14epfwb/</a>4</figcaption></figure><h3 id="paso-2-evaluaci-n-de-la-posici-n">Paso 2: Evaluación de la posición</h3><p>Ahora vamos a intentar comprender qué bando es más fuerte en una posición determinada. La forma más sencilla de conseguirlo es contar la fuerza relativa de las piezas en el tablero utilizando la siguiente tabla:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*e4p9BrCzJUdlqx7KVGW9aA.png" class="kg-image" alt="1*e4p9BrCzJUdlqx7KVGW9aA" width="413" height="488" loading="lazy"></figure><p>Con la función de evaluación, somos capaces de crear un algoritmo que elige el movimiento que da la evaluación más alta:</p><p>La única mejora tangible es que ahora nuestro algoritmo capturará una pieza si puede.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*fTWDdJ2m3L72X6rqce9_tQ.gif" class="kg-image" alt="1*fTWDdJ2m3L72X6rqce9_tQ" width="410" height="402" loading="lazy"><figcaption>Black plays with the aid of the simple evaluation function. Playable on <a href="https://jsfiddle.net/lhartikk/m5q6fgtb/1/" rel="noopener" target="_blank" title="" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">https://jsfiddle.net/lhartikk/m5q6fgtb/1/</a></figcaption></figure><h3 id="paso-3-rbol-de-b-squeda-utilizando-minimax">Paso 3: Árbol de búsqueda utilizando Minimax</h3><p>A continuación vamos a crear un árbol de búsqueda a partir del cual el algoritmo pueda elegir la mejor jugada. Esto se hace mediante el algoritmo <a href="https://es.wikipedia.org/wiki/Minimax">Minimax</a>.</p><p>En este algoritmo, el árbol recursivo de todos los movimientos posibles se explora hasta una profundidad determinada, y la posición se evalúa en las "hojas" finales del árbol.</p><p>Después de eso, devolvemos el menor o el mayor valor del hijo al nodo padre, dependiendo de si es un blanco o un negro para mover. (Es decir, tratamos de minimizar o maximizar el resultado en cada nivel).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*UA5VlNs7s4gl80VknA099w.jpeg" class="kg-image" alt="1*UA5VlNs7s4gl80VknA099w" width="791" height="312" loading="lazy"><figcaption>A visualization of the minimax algorithm in an artificial position. The best move for white is <strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; color: var(--gray85);">b2-c3</strong>, because we can guarantee that we can get to a position where the evaluation is <strong style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: 700; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; color: var(--gray85);">-50</strong></figcaption></figure><p>Con minimax en su lugar, nuestro algoritmo está empezando a entender algunas tácticas básicas del ajedrez:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*xRfitY19MvJW3ynGKWhQ5A.gif" class="kg-image" alt="1*xRfitY19MvJW3ynGKWhQ5A" width="396" height="398" loading="lazy"><figcaption>Minimax with depth level 2. Playable on: <a href="https://jsfiddle.net/k96eoq0q/1/" rel="noopener" target="_blank" title="" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">https://jsfiddle.net/k96eoq0q/1/</a></figcaption></figure><p>La eficacia del algoritmo minimax se basa en gran medida en la profundidad de búsqueda que podamos alcanzar. Esto es algo que mejoraremos en el siguiente paso.</p><h3 id="paso-4-poda-alfa-beta">Paso 4: Poda alfa-beta</h3><p>La poda <a href="https://es.wikipedia.org/wiki/Poda_alfa-beta">alfa-beta</a> es un método de optimización del algoritmo minimax que nos permite descartar algunas ramas del árbol de búsqueda. Esto nos ayuda a evaluar el árbol de búsqueda minimax mucho más profundamente, utilizando los mismos recursos.</p><p>La poda alfa-beta se basa en la situación en la que podemos dejar de evaluar una parte del árbol de búsqueda si encontramos un movimiento que conduce a una situación peor que un movimiento descubierto anteriormente.</p><p>La poda alfa-beta no influye en el resultado del algoritmo minimax, sólo lo hace más rápido.</p><p>El algoritmo alfa-beta también es más eficiente si visitamos primero los caminos que conducen a buenas jugadas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*96QEzhnsOkNqz7swB0qx8w.jpeg" class="kg-image" alt="1*96QEzhnsOkNqz7swB0qx8w" width="791" height="312" loading="lazy"><figcaption>The positions we do not need to explore if alpha-beta pruning isused and the tree is visited in the described order.</figcaption></figure><p>Con alfa-beta, obtenemos una mejora significativa del algoritmo minimax, como se muestra en el siguiente ejemplo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*k3DrkWLNq33ei_t-094qpg.png" class="kg-image" alt="1*k3DrkWLNq33ei_t-094qpg" width="393" height="471" loading="lazy"><figcaption>The number of positions that are required to evaluate if we want to perform a search with depth of 4 and the “root” position is the one that is shown.</figcaption></figure><p>Sigue este <a href="https://jsfiddle.net/Laa0p1mh/3/">enlace </a>para probar la versión alfa-beta mejorada de la IA de ajedrez.</p><h3 id="paso-5-mejora-de-la-funci-n-de-evaluaci-n">Paso 5: Mejora de la función de evaluación</h3><p>La función de evaluación inicial es bastante ingenua, ya que sólo contamos el material que se encuentra en el tablero. Para mejorarla, añadimos a la evaluación un factor que tiene en cuenta la posición de las piezas. Por ejemplo, un caballo en el centro del tablero es mejor (porque tiene más opciones y, por tanto, es más activo) que un caballo en el borde del tablero.</p><p>Utilizaremos una versión ligeramente ajustada de las tablas pieza-cuadrado que se describen originalmente en <a href="https://chessprogramming.wikispaces.com/Simplified+evaluation+function">chess-programming-wiki.</a></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*iG6FUYZpU0_RKlqHnC8XxA.png" class="kg-image" alt="1*iG6FUYZpU0_RKlqHnC8XxA" width="800" height="782" loading="lazy"><figcaption>The visualized piece-square tables visualized. We can decrease or increase the evaluation, depending on the location of the piece.</figcaption></figure><p>Con la siguiente mejora, empezamos a conseguir un algoritmo que juega algo de ajedrez "decente", al menos desde el punto de vista de un jugador ocasional:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*sX_XwfPrOQ6c62iuVZ75fw.gif" class="kg-image" alt="1*sX_XwfPrOQ6c62iuVZ75fw" width="396" height="398" loading="lazy"><figcaption>Improved evaluation and alpha-beta pruning with search depth of 3. Playable on <a href="https://jsfiddle.net/q76uzxwe/1/" rel="noopener" target="_blank" title="" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; vertical-align: baseline; background-color: transparent; color: var(--gray90); text-decoration: underline; cursor: pointer; word-break: break-word;">https://jsfiddle.net/q76uzxwe/1/</a></figcaption></figure><h3 id="conclusiones">Conclusiones</h3><p>El punto fuerte de un algoritmo de ajedrez sencillo es que no comete errores estúpidos. Dicho esto, le sigue faltando comprensión estratégica.</p><p>Con los métodos que he introducido aquí, hemos sido capaces de programar un algoritmo de juego de ajedrez que puede jugar al ajedrez básico. La "parte IA" (excluyendo la generación de jugadas) del algoritmo final tiene sólo 200 líneas de código, lo que significa que los conceptos básicos son bastante sencillos de implementar. Puede consultar la versión final en <a href="https://github.com/lhartikk/simple-chess-ai" rel="noopener">GitHub</a>.</p><p>Otras mejoras que podríamos introducir en el algoritmo serían, por ejemplo:</p><ul><li>move-ordering</li><li>generación de movimientos más rápidos</li><li>y la evaluación específica de los objetivos finales.</li></ul><p>Si quieres aprender más, echa un vistazo a la wiki de programación de ajedrez. Es un recurso útil para explorar más allá de estos conceptos básicos que he introducido aquí.</p><p>Gracias por leerme.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es programación? Manual para principiantes ]]>
                </title>
                <description>
                    <![CDATA[ Bienvenidos al asombroso mundo de la programación. Programar es una de las habilidades más útiles y poderosas que puedes aprender para lograr que tu visión se convierta en realidad. En este manual veremos por qué la programación es tan importante, sus aplicaciones, conceptos básicos y las habilidades que necesitas para ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-programacion-manual-para-principiantes/</link>
                <guid isPermaLink="false">63a0510784f230093051d858</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Estefania Cassingena Navone ]]>
                </dc:creator>
                <pubDate>Tue, 10 Jan 2023 12:29:29 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/12/What-is-programming.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong>Bienvenidos al asombroso mundo de la programación.</strong> Programar es una de las habilidades más útiles y poderosas que puedes aprender para lograr que tu visión se convierta en realidad.</p><p>En este manual veremos por qué la programación es tan importante, sus aplicaciones, conceptos básicos y las habilidades que necesitas para tener éxito en el campo de la programación. </p><p><strong>Aprenderás:</strong></p><ul><li><a href="#-qu-es-programaci-n">Qué es programación y por qué es importante.</a></li><li><a href="#-qu-es-un-lenguaje-de-programaci-n">Qué es un lenguaje de programación y por qué son importantes.</a></li><li><a href="#-programaci-n-y-n-meros-binarios">La relación entre programación y los números binarios.</a></li><li><a href="#-aplicaciones-pr-cticas-de-programaci-n">Aplicaciones prácticas de programación.</a></li><li><a href="#-habilidades-de-un-programador-exitoso">Habilidades que necesitas para tener éxito en el campo de la programación.</a></li><li><a href="#-tips-para-aprender-a-programar">Tips para aprender a programar.</a></li><li><a href="#-conceptos-b-sicos-de-programaci-n">Conceptos básicos de programación.</a></li><li><a href="#-tipos-de-lenguajes-de-programaci-n">Tipos de lenguajes de programación.</a> </li><li><a href="#-c-mo-contribuir-a-proyectos-de-c-digo-abierto-open-source-">Cómo contribuir a proyectos de código abierto (open source).</a> </li><li>Y más...</li></ul><p>¿Preparados? ¡Comencemos! ✨</p><h2 id="-qu-es-programaci-n">🔹<strong> ¿Qué es programación?</strong></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/main-image.png" class="kg-image" alt="main-image" width="600" height="400" loading="lazy"><figcaption>La programación es esencial para nuestras actividades diarias.</figcaption></figure><p>¿Sabías que la programación ya es una parte fundamental de tus actividades diarias? Veamos por qué. Estoy segura de que te sorprenderás.</p><p>Cada vez que enciendes tu smartphone, laptop, tableta, smart TV o cualquier otro dispositivo electrónico, estás ejecutando código que ha sido planeado, desarrollado y escrito por desarrolladores. Este código crea el resultado final e interactivo que puedes ver en tu pantalla. </p><p>Esto es exactamente de lo que se trata la <strong>programación</strong>. Es el proceso de escribir código para resolver un problema en particular o para implementar una tarea específica. </p><p>La programación es lo que le permite a tu computadora ejecutar los programas que usas cada día y es lo que le permite a tu smartphone ejecutar las aplicaciones que te encantan. Es una parte esencial del mundo que conocemos hoy en día. </p><p>Cuando revisas tu calendario, asistes a conferencias virtuales, navegas en la web o editas un documento, estás usando <strong>código</strong> que ha sido escrito por desarrolladores. </p><p>Y quizás te estés preguntado: "¿Qué es código?"</p><p><strong>Código</strong> es una secuencia de instrucciones que un programador escribe para decirle a un dispositivo (como una computadora) qué hacer. </p><p>El dispositivo no puede saber por sí mismo cómo manejar una situación en particular o cómo realizar una tarea específica. Así que los desarrolladores analizan la situación y escriben instrucciones explícitas para implementar lo que se necesita. </p><p>Para hacerlo, deben usar una sintaxis en particular (un conjunto de reglas para escribir el código).</p><p>Un <strong>desarrollador</strong> (también llamado programador) es una persona que analiza un problema e implementa una solución usando código.</p><p>Suena genial, ¿cierto? Es muy poderoso y <strong>tú</strong> puedes ser parte de este maravilloso mundo si aprender a programar. Veamos cómo. </p><h3 id="t-como-desarrollador-">Tú, como desarrollador.</h3><p>Visualízate en el rol de un desarrollador por un momento. Imagina que estás desarrollando una aplicación móvil, como las que probablemente tienes instaladas en tu smartphone en este momento. </p><p>¿Qué es lo primero que harías?</p><p>Piénsalo un momento.</p><p>La respuesta es... </p><p>Analizar el problema. ¿Qué estas intentando crear?</p><p>Como desarrollador, comenzarías diseñando la distribución de la aplicación, cómo funcionará, sus distintas pantallas y funcionalidad y todos esos pequeños detalles que harán que tu aplicación sea genial para los usuarios alrededor del mundo.</p><p>Solo después de haber planificado todo cuidadosamente, puedes comenzar a escribir tu código. Para hacerlo, deberás escoger un <strong>lenguaje de programación</strong> para el proyecto. Veamos qué es un lenguaje de programación y por qué son super importantes. </p><h2 id="-qu-es-un-lenguaje-de-programaci-n">🔸<strong> ¿Qué es un lenguaje de programación?</strong></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/what-is-a-programming-language.png" class="kg-image" alt="what-is-a-programming-language" width="600" height="400" loading="lazy"><figcaption>Logos de lenguajes de programación populares.</figcaption></figure><p>Un<strong> lenguaje de programación</strong> es un lenguaje que las computadoras pueden entender.</p><p>No podemos simplemente escribir palabras en español en nuestro programa, de esta forma:</p><blockquote>"Computadora, ¡Resuelve esta tarea!"</blockquote><p>Y esperar que nuestras computadoras pueden entender lo que intentamos decirles. Debemos seguir ciertas reglas para escribir las instrucciones. &nbsp;</p><p>Cada lenguaje de programación tiene su propio conjunto de reglas que determinan si una línea de código es válida o no. Debido a esto, el código que escribas en un lenguaje de programación será diferente al código que escribas en otros lenguajes de programación. </p><p>💡<strong><strong> </strong>Dato<strong>:</strong> </strong>algunos lenguajes de programación son más complejos que otros pero la mayoría de ellos comparten conceptos básicos y funcionalidad básica. Si aprendes a programar en un lenguaje de programación, es muy probable que puedas aprender a programar en otro lenguaje de programación mucho más rápido. </p><p>Antes de comenzar a desarrollar aplicaciones y programas geniales, debes aprender las reglas básicas del lenguaje de programación que escojas para el proyecto.</p><p>💡 <strong>Dato<strong>:</strong> </strong>un <strong>programa</strong> es un conjunto de instrucciones escritas en un lenguaje de programación para que la computadora las ejecute. Normalmente escribimos el código de nuestro programa en un archivo o en varios archivos. </p><p>Por ejemplo, esta es una línea de código en Python (un lenguaje de programación muy popular) que muestra el mensaje <code>"¡Hola, Mundo!"</code>:</p><pre><code class="language-python">print("¡Hola, Mundo!")</code></pre><p>Pero si escribimos la misma línea de código en JavaScript (un lenguaje de programación usado principalmente para el desarrollo web), veremos un error porque no será válida. </p><p>Para lograr algo similar en JavaScript, debemos escribir esta línea de código:</p><pre><code>console.log("¡Hola, Mundo!");</code></pre><p>Visualmente, se ven muy diferentes, ¿cierto? Esto se debe a que Python y JavaScript tienen una sintaxis diferente y un conjunto diferente de <strong>funciones built-in</strong>.</p><p>💡<strong><strong> </strong>Dato</strong>: las funciones built-in son básicamente tareas que ya están definidas en el lenguaje de programación. Esto nos permite usarlas directamente en nuestro código al escribir sus nombres y especificar los valores que necesitan. </p><p>En nuestros ejemplos, <strong><strong><code>print()</code></strong> </strong>es una función built-in en Python mientras que <code><strong><strong>console.log()</strong></strong></code> es una función que usamos en JavaScript para ver el mensaje en la consola (una herramienta interactiva) si ejecutamos nuestro código en el navegador. </p><p>Ejemplos de lenguajes de programación incluyen Python, JavaScript, TypeScript, Java, C, C#, C++, PHP, Go, Swift, SQL y R. Existen muchos lenguajes de programación y la mayoría de ellos pueden ser usados para distintos propósitos. </p><p>💡 <strong>Dato<strong>:</strong> </strong>estos fueron los lenguajes de programación más populares en la <a href="https://survey.stackoverflow.co/2022/#most-popular-technologies-language">Stack Overflow Developer Survey 2022</a> (una encuesta muy popular en la comunidad de desarrolladores):</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/Screenshot-2023-01-05-at-3.33.07-PM.png" class="kg-image" alt="Screenshot-2023-01-05-at-3.33.07-PM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/01/Screenshot-2023-01-05-at-3.33.07-PM.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2023/01/Screenshot-2023-01-05-at-3.33.07-PM.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2023/01/Screenshot-2023-01-05-at-3.33.07-PM.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/2023/01/Screenshot-2023-01-05-at-3.33.07-PM.png 1860w" sizes="(min-width: 720px) 720px" width="1860" height="1276" loading="lazy"><figcaption>Los 14 lenguajes de programación más populares entre los desarrolladores que respondieron la <a href="https://survey.stackoverflow.co/2022/#most-popular-technologies-language">Stack Overflow Developer Survey 2022</a>. Esta es una encuesta anual que recolecta datos sobre tecnologías populares y tendencias en la comunidad de desarrolladores.</figcaption></figure><p>Existen muchos lenguajes de programación (¡cientos o incluso miles!) pero generalmente aprenderás y trabajarás con algunos de los más populares. Algunos de ellos tienen aplicaciones más amplias como Python y JavaScript mientras que otros (como R) tienen propósitos más específicos (e incluso científicos).</p><p>Esto suena muy interesante, ¿cierto? Y apenas estamos comenzando a hablar sobre los lenguajes de programación. Hay mucho que aprender sobre ellos y te prometo que si decides aprender más sobre programación, tu tiempo y esfuerzo valdrán totalmente la pena. </p><p>¡Genial! Ahora que ya sabes qué es programación y qué son los lenguajes de programación, veamos cómo la programación está relacionada con los números binarios.</p><h2 id="-programaci-n-y-n-meros-binarios">🔹<strong> Programación y números binarios</strong></h2><p>Cuando piensas en programación, probablemente lo primero que viene a tu mente es algo muy parecido a lo que puedes ver en esta imagen, ¿cierto? Una secuencia de ceros y unos en tu computadora. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/image.png" class="kg-image" alt="image" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/01/image.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2023/01/image.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2023/01/image.png 1280w" sizes="(min-width: 720px) 720px" width="1280" height="720" loading="lazy"><figcaption>Los números binarios son 0 y 1.</figcaption></figure><p>En realidad, la programación sí está relacionada con los números binarios (<code>0</code> y <code>1</code>) pero de una forma indirecta porque los desarrolladores no escriben su código usando ceros y unos. </p><p>Generalmente escribimos nuestros programas en un lenguaje de programación de alto nivel, un lenguaje de programación con una sintaxis que reconoce palabras específicas (llamadas palabras clave o <code><strong>keywords</strong></code> en inglés), símbolos y valores de distintos tipos de datos. </p><p>Básicamente, escribimos nuestro código de una forma en la que los seres humanos pueden entenderlo. </p><p>Por ejemplo, estas son las palabras clave que usamos en Python:</p><figure class="kg-card kg-code-card"><pre><code class="language-python">False               class               from                or
None                continue            global              pass
True                def                 if                  raise
and                 del                 import              return
as                  elif                in                  try
assert              else                is                  while
async               except              lambda              with
await               finally             nonlocal            yield
break               for                 not </code></pre><figcaption>Lista de palabras clave en Python.</figcaption></figure><p>Cada lenguaje de programación tiene su propio conjunto de palabras clave (palabras escritas en inglés). Estas palabras clave son parte de la sintaxis y de la funcionalidad esencial del lenguaje de programación. </p><p>Pero las palabras clave son solo palabras comunes en inglés, casi como las que encontraríamos en un libro. </p><p>Eso nos lleva a hacer dos preguntas muy importantes:</p><ul><li>¿Cómo la computadora entiende e interpreta lo que intentamos decir?</li><li>¿Cuál es el rol del sistema numérico binario en este proceso?</li></ul><p>La computadora <strong>no</strong> entiende estas palabras, símbolos o valores directamente. </p><p>Cuando un programa se ejecuta, el código que escribimos en un lenguaje de programación que los seres humanos pueden entender es transformado automáticamente a código binario que la computadora puede entender.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/11---binary-diagram.png" class="kg-image" alt="11---binary-diagram" width="600" height="400" loading="lazy"><figcaption>Proceso de transformar un programa a código binario.</figcaption></figure><p>Esta transformación de código fuente (que los seres humanos pueden entender) a código binario (que la computadora puede entender) se llama <strong>compilación</strong>. </p><p>Según <a href="https://www.britannica.com/technology/compiler">Britannica</a>, un <strong>compilador</strong> se define como:</p><blockquote>Un software de computadora que traduce (compila) código fuente escrito en un lenguaje de alto nivel (por ejemplo, C++) a un conjunto de instrucciones en lenguaje de máquina (machine-language instructions) que pueden ser entendidas por el CPU de una computadora digital. </blockquote><p>Texto original en inglés:</p><blockquote>Computer software that translates (compiles) source code written in a high-level language (e.g., C++) into a set of machine-language instructions that can be understood by a digital computer’s CPU.</blockquote><p>Britannica también menciona que:</p><blockquote>El término compilador fue acuñado por la científica de computación Americana Grace Hopper, quien diseñó uno de los primeros compiladores en los inicios de la década de 1950. </blockquote><p>Texto original en inglés:</p><blockquote>The term <em>compiler</em> was coined by American computer scientist <a href="https://www.britannica.com/biography/Grace-Hopper">Grace Hopper</a>, who designed one of the first compilers in the early 1950s.</blockquote><p>Algunos lenguajes de programación pueden ser clasificados como lenguajes de programación <strong>compilados</strong> mientras que otros pueden ser clasificados como lenguajes de programación <strong>interpretados</strong> en base a cómo se transforman a instrucciones en lenguaje de máquina. &nbsp;</p><p>Sin embargo, todos deben pasar por un proceso que los convierten en instrucciones que la computadora puede entender. </p><p>Genial. Ahora ya sabes por qué el código binario es tan importante para la ciencia de la computación. Sin él, básicamente programación no existiría porque las computadoras no serían capaces de entender nuestras instrucciones. </p><p>Ahora veamos las aplicaciones de programación y las distintas áreas que puedes explorar.</p><h2 id="-aplicaciones-pr-cticas-de-programaci-n">🔸 Aplicaciones prácticas de programación </h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2023/01/Screenshot-2023-01-05-at-4.02.28-PM.png" class="kg-image" alt="Screenshot-2023-01-05-at-4.02.28-PM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2023/01/Screenshot-2023-01-05-at-4.02.28-PM.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2023/01/Screenshot-2023-01-05-at-4.02.28-PM.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2023/01/Screenshot-2023-01-05-at-4.02.28-PM.png 1468w" sizes="(min-width: 720px) 720px" width="1468" height="820" loading="lazy"><figcaption>Programación tiene muchas aplicaciones prácticas en cualquier industria que puedas imaginar.</figcaption></figure><p>La programación tiene distintas aplicaciones en diversas industrias. Esto es verdaderamente sorprendente porque puedes aplicar tu conocimiento en literalmente cualquier industria que te interese. </p><p>Desde ingeniería hasta agricultura, desde desarrollo de videojuegos hasta física, las posibilidades son infinitas si aprendes a programar.</p><p>Veamos algunas de ellas. (¡Te prometo que son asombrosas! ⭐).</p><h3 id="desarrollo-web-front-end">Desarrollo web front-end</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/1---frontend.png" class="kg-image" alt="1---frontend" width="600" height="400" loading="lazy"><figcaption>Los desarrolladores web front-end desarrollan la parte de las páginas y aplicaciones web que los usuarios pueden ver y los elementos con los cuales pueden interactuar.</figcaption></figure><p>Si aprendes a programar, puedes usar tus habilidades de programación para diseñar y desarrollar páginas web y plataformas en línea. Los desarrolladores web front-end crean las partes de las páginas web que los usuarios pueden ver y los elementos con los cuales pueden interactuar directamente.</p><p>Por ejemplo, en este momento estás leyendo un artículo en la publicación de <a href="https://www.freecodecamp.org/">freeCodeCamp</a>. La publicación tiene esta estructura, presentación y funcionalidad gracias al código que los desarrolladores front-end escribieron línea por línea. </p><p>💡<strong> Dato:</strong> si aprender desarrollo web front-end, tú también pueden crear plataformas interactivas.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/Screen-Shot-2022-12-02-at-9.56.43-PM.png" class="kg-image" alt="Screen-Shot-2022-12-02-at-9.56.43-PM" width="600" height="400" loading="lazy"><figcaption>El código HTML y CSS de la página web principal de freeCodeCamp. (Esta es una vista previa del código en las Herramientas de Desarrollo de Chrome).</figcaption></figure><p>Los desarrolladores web front-end usan HML y CSS para crear la estructura de un sitio web (estos son lenguajes de marcado (<em>markup</em>), los cuales se usan para presentar información) y escriben código de JavaScript para agregar funcionalidad e interactividad. </p><p>Si deseas aprender desarrollo web front-end, puedes aprender HTML y CSS con estos cursos gratuitos en los canales de YouTube de freeCodeCamp:</p><ul><li><a href="https://www.youtube.com/watch?v=XqFR2lqBYPs&amp;t=4s">Aprende HTML y CSS - Curso Desde Cero</a> (en Español)</li><li><a href="https://www.youtube.com/watch?v=6Jfk8ic3KVk">Aprende React Desde Cero - Curso de React Con Proyectos</a> (en Español)</li><li><a href="https://www.youtube.com/watch?v=mU6anWqZJcc">Learn HTML5 and CSS3 From Scratch - Full Course</a></li><li><a href="https://www.youtube.com/watch?v=a_iQb1lnAEQ">Learn HTML &amp; CSS – Full Course for Beginners</a></li><li><a href="https://www.youtube.com/watch?v=zJSY8tbf_ys">Frontend Web Development Bootcamp Course (JavaScript, HTML, CSS)</a></li><li><a href="https://www.youtube.com/watch?v=srvUrASNj0s">Introduction To Responsive Web Design - HTML &amp; CSS Tutorial</a></li></ul><p>También puedes aprender JavaScript de forma gratuita con los siguientes cursos:</p><ul><li><a href="https://www.youtube.com/watch?v=ivdTnPl1ND0&amp;t=3s">Aprende JavaScript - Curso Completo desde Cero</a> (en Español)</li><li><a href="https://www.youtube.com/watch?v=PkZNo7MFNFg">Learn JavaScript - Full Course for Beginners</a></li><li><a href="https://www.youtube.com/watch?v=jS4aFq5-91M">JavaScript Programming - Full Course</a></li><li><a href="https://www.youtube.com/watch?v=5fb2aPlgoys">JavaScript DOM Manipulation – Full Course for Beginners</a></li><li><a href="https://www.youtube.com/watch?v=ec8vSKJuZTk">Learn JavaScript by Building 7 Games - Full Course</a></li></ul><p>💡<strong> Dato:</strong> puedes obtener la certificación de <a href="https://www.freecodecamp.org/espanol/learn/2022/responsive-web-design/">Diseño Web Adaptativo</a> aprendiendo con ejercicios interactivos en freeCodeCamp. &nbsp;</p><h3 id="desarrollo-web-back-end">Desarrollo web back-end</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/2---backend.png" class="kg-image" alt="2---backend" width="600" height="400" loading="lazy"><figcaption>Los desarrolladores web back-end desarrollan servidores y bases de datos para manejar todo lo que ocurre detrás de escenas para crear la funcionalidad de aplicaciones web más complejas.&nbsp;</figcaption></figure><p>Las aplicaciones web más complejas y dinámicas que trabajan con información del usuario también requieren de un <strong>servidor</strong>. Un servidor es un programa de computadora que recibe solicitudes y y envía respuestas apropiadas. También necesitan una <strong>base de datos</strong>, una colección de valores almacenados de forma estructurada. </p><p>Los desarrolladores web back-end se encargan de desarrollar el código de los servidores. Deciden cómo manejar las distintas solicitudes, cómo enviar los recursos apropiados, cómo almacenar la información y básicamente cómo lograr que todo lo que se ejecuta detrás de escenas funcione correctamente y de forma eficiente. </p><p>Un ejemplo real de desarrollo back-end es lo que ocurre cuando creas una cuenta en freeCodeCamp y completas un reto de programación. Tu información se almacena en una base de datos y puedes acceder a ella luego cuando inicias sesión con tu correo electrónico y contraseña. &nbsp;</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/Screen-Shot-2022-12-02-at-10.07.41-PM.png" class="kg-image" alt="Screen-Shot-2022-12-02-at-10.07.41-PM" width="600" height="400" loading="lazy"><figcaption>Un reto interactivo de freeCodeCamp</figcaption></figure><p>Esta funcionalidad genial e interactiva fue implementada por desarrolladores web back-end. </p><p>💡<strong> Dato:</strong> los desarrolladores web full-stack se encargan del desarrollo web front-end y back-end. Tienen conocimiento especializado sobre ambas áreas.</p><p>Todas las plataformas complejas que usas cada día, como las plataformas de redes sociales, plataformas de compras en línea y plataformas educativas, usan servidores y desarrollo web back-end para crear su funcionalidad.</p><p>Python es un ejemplo de un lenguaje de programación poderoso para este propósito. Es uno de los lenguajes de programación más populares que existen y su popularidad continúa aumentando cada año. Esto se debe, en parte, a que es sencillo y fácil de aprender y sin embargo, es lo suficientemente poderoso y versátil para ser usado en aplicaciones del mundo real. </p><p>💡<strong> Dato:</strong> si tienes curiosidad sobre las aplicaciones específicas de Python, este es <a href="https://www.freecodecamp.org/espanol/news/para-que-se-usa-python-10-usos-del-lenguaje-de-programacion-python/">un artículo</a> que escribí sobre el tema. </p><p>JavaScript también puede ser usado para desarrollo web back-end gracias a Node.js</p><p>Otros lenguajes de programación usados para desarrollar servidores web son PHP, Ruby, C# y Java.</p><p>Si deseas aprender desarrollo web back-end, puedes tomar estos cursos gratuitos en el canal de YouTube de freeCodeCamp:</p><ul><li><a href="https://www.youtube.com/watch?v=DLikpfc64cA">Introducción a Programación en Python</a> (en Español)</li><li><a href="https://www.youtube.com/watch?v=1hpc70_OoAg">Aprende Node.js y Express - Curso desde Cero</a> (en Español)</li><li><a href="https://www.youtube.com/watch?v=jBzwzrDvZ18">Python Backend Web Development Course (with Django)</a></li><li><a href="https://www.youtube.com/watch?v=Oe421EPjeBE">Node.js and Express.js - Full Course</a></li><li><a href="https://www.youtube.com/watch?v=nu_pCVPKzTk">Full Stack Web Development for Beginners (Full Course on HTML, CSS, JavaScript, Node.js, MongoDB)</a></li><li><a href="https://www.youtube.com/watch?v=qwfE7fSVaZM">Node.js / Express Course - Build 4 Projects</a></li></ul><p>💡 <strong>Tip:</strong> freeCodeCamp también tiene una certificación gratuita de <a href="https://www.freecodecamp.org/espanol/learn/back-end-development-and-apis/">Desarrollo Back End y APIs</a>.</p><h3 id="desarrollo-de-aplicaciones-m-viles">Desarrollo de aplicaciones móviles</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/3---mobile-apps.png" class="kg-image" alt="3---mobile-apps" width="600" height="400" loading="lazy"><figcaption>Los desarrolladores de aplicaciones móviles diseñan y desarrollan las aplicaciones que usamos diariamente.</figcaption></figure><p>Las aplicaciones móviles ya son parte de nuestra rutina diaria. Estoy segura de que no podrías imaginar la vida sin ellas. </p><p>Piensa en tu aplicación móvil favorita. ¿Por qué te gusta tanto?</p><p>Nuestras aplicaciones favoritas nos ayudan a realizar nuestras tareas diarias, nos entretienen, resuelven un problema y nos ayudan a alcanzar nuestras metas. Siempre están allí para nosotros.</p><p>Ese es el poder del desarrollo de aplicaciones móviles y tú puedes ser parte de este maravilloso mundo si aprender desarrollo de aplicaciones móviles. </p><p>Los desarrolladores enfocados en el desarrollo de aplicaciones móviles se encargan de planificar, diseñar y desarrollar la interfaz de usuario y la funcionalidad de las aplicaciones. Identifican un vacío en las aplicaciones existentes e intentan crear un producto funcional que mejore las vidas de las personas. </p><p>💡<strong> Dato:</strong> independientemente del campo de escojas, tu meta como desarrollador siempre debe ser lograr mejorar la calidad de vida de las personas. Las aplicaciones no son solo aplicaciones, tienen el potencial de cambiar nuestras vidas. Siempre debes recordar esto cuando planifiques tus proyectos. Tu código puede mejorar la vida de alguien y esa es una gran responsabilidad. </p><p>Los desarrolladores de aplicaciones móviles usan lenguajes de programación como JavaScript, Java, Swift, Kotlin y Dart. Frameworks como <a href="https://flutter.dev/">Flutter</a> y <a href="https://reactnative.dev/">React Native</a> son muy útiles para desarrollar aplicaciones multiplataforma (aplicaciones que funcionan correctamente en distintos sistemas operativos como Android y iOS).</p><p>Según la documentación oficial de <a href="https://flutter.dev/">Flutter</a>:</p><blockquote>Flutter es un framework de código abierto (open source) desarrollado por Google para desarrollar aplicaciones hermosas, compiladas de forma nativa y multiplataforma a partir de una misma base de código. &nbsp;</blockquote><p>Texto original en inglés:</p><blockquote>Flutter is an open source framework by Google for building beautiful, natively compiled, multi-platform applications from a single codebase.</blockquote><p>Si deseas aprender desarrollo de aplicaciones móviles, puedes tomar estos cursos gratuitos en el canal de YouTube de freeCodeCamp:</p><ul><li><a href="https://www.freecodecamp.org/news/p/98a1b5a8-101b-4993-8a76-e70d833bd91e/Flutter%20Course%20for%20Beginners%20%E2%80%93%2037-hour%20Cross%20Platform%20App%20Development%20Tutorial">Flutter Course for Beginners – 37-hour Cross Platform App Development Tutorial</a></li><li><a href="https://www.youtube.com/watch?v=pTJJsmejUOQ">Flutter Course - Full Tutorial for Beginners (Build iOS and Android Apps)</a></li><li><a href="https://www.youtube.com/watch?v=frvXANSaSec">React Native - Intro Course for Beginners</a></li><li><a href="https://www.youtube.com/watch?v=wEVjaXK4sYQ">Learn React Native Gestures and Animations - Tutorial</a></li></ul><h3 id="desarrollo-de-videojuegos"><strong>Desarrollo de videojuegos</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/12/4---games.png" class="kg-image" alt="4---games" width="600" height="400" loading="lazy"></figure><p>Los juegos crean recuerdos inolvidables. Estoy segura de que recuerdas tus juegos favoritos y por qué te gustaban (o te gustan) tanto. Ser desarrollador de juegos significa tener la oportunidad de traer alegría y entretenimiento a jugadores alrededor del mundo. </p><p>Los desarrolladores de videojuegos visualizan, planifican e implementan la funcionalidad de un videojuego. También deben encontrar o crear recursos como personajes, obstáculos, fondos, música, efectos de sonido y más. </p><p>💡<strong><strong> </strong>Dato<strong>:</strong></strong> si aprendes a programar, puedes crear tus propios videojuegos. Imagina crear un juego genial que le fascine a los jugadores alrededor del mundo. Eso es exactamente lo que me encanta sobre programación. Solo necesitas una computadora, tu conocimiento y herramientas básicas para crear algo asombroso. </p><p>Lenguajes de programación populares usados para desarrollo de videojuegos incluyen JavaScript, C++, Python y C#. </p><p>Si estás interesado en aprender desarrollo de videojuegos, puedes tomar estos cursos gratuitos en el canal de YouTube de freeCodeCamp:</p><ul><li><a href="https://www.youtube.com/watch?v=GFO_txvwK_c">JavaScript Game Development Course for Beginners</a></li><li><a href="https://www.youtube.com/watch?v=ec8vSKJuZTk">Learn JavaScript by Building 7 Games - Full Course</a></li><li><a href="https://www.youtube.com/watch?v=gB1F9G0JXOo">Learn Unity - Beginner's Game Development Tutorial</a></li><li><a href="https://www.youtube.com/watch?v=XGf2GcyHPhc">Learn Python by Building Five Games - Full Course</a></li><li><a href="https://www.youtube.com/watch?v=7BHs1BzA4fs">Code a 2D Game Using JavaScript, HTML, and CSS (w/ Free Game Assets) – Tutorial</a></li><li><a href="https://www.youtube.com/watch?v=iHF5fwsqu4I">2D Game Development with GDevelop - Crash Course</a></li><li><a href="https://www.youtube.com/watch?v=gx_qorHxBpI">Pokémon Coding Tutorial - CS50's Intro to Game Development</a></li></ul><h3 id="biolog-a-f-sica-y-qu-mica"><strong>Biología, Física y Química</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/12/5---biology-and-science.png" class="kg-image" alt="5---biology-and-science" width="600" height="400" loading="lazy"></figure><p>La programación puede aplicarse en todos los campos científicos que puedas imaginar, incluyendo biología, física, química e incluso astronomía. ¡Sí! Los científicos usan programación todo el tiempo para recolectar y analizar datos. Incluso pueden crear simulaciones para probar sus hipótesis. </p><h4 id="biolog-a"><strong>Biología</strong></h4><p>En biología, los programas de computadora pueden simular genética de poblaciones y dinámica de poblaciones. Incluso existe un campo llamado <strong>bioinformática</strong>.</p><p>Según el <a href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1122955/#:~:text=Bioinformatics%20is%20defined%20as%20the,1).">artículo</a> "Bioinformatics" de Ardeshir Bayat, miembro del Centro para la Investigación Médica sobre Genómica Integrada de la Universidad de Manchester:</p><blockquote>La bioinformática se define como la aplicación de las herramientas de computación y análisis a la recolección e interpretación de datos biológicos. </blockquote><p>Texto original en inglés:</p><blockquote>Bioinformatics is defined as the application of tools of computation and analysis to the capture and interpretation of biological data.</blockquote><p>El Dr. Bayat menciona que la bioinformática puede ser usada para secuenciar el genoma. También menciona que estos hallazgos pueden llevar al descubrimiento de nuevos medicamentos y terapias personalizadas.</p><p>Python, R, PHP, PERL y Java son lenguajes de programación usados comúnmente en el campo de la bioinformática.</p><p>💡 <strong>Dato: </strong>R es un "lenguaje y ambiente de programación para computación y gráficos estadísticos" (<a href="https://www.r-project.org/about.html">fuente</a>). </p><p>Un ejemplo de una herramienta genial que los científicos pueden usar para biología es <a href="https://biopython.org/wiki/Documentation">Biopython</a>. Este es un framework de Python con "herramientas disponible de forma gratuita para computación biológica."</p><p>Si te gustaría aprender cómo puedes aplicar tus habilidades de programación en campos científicos, puedes tomar estos cursos gratuitos en el canal de YouTube de freeCodeCamp:</p><ul><li><a href="https://www.youtube.com/watch?v=jBlTQjcKuaY">Python for Bioinformatics - Drug Discovery Using Machine Learning and Data Analysis</a></li><li><a href="https://www.youtube.com/watch?v=_V8eKsto3Ug">R Programming Tutorial - Learn the Basics of Statistical Computing</a></li><li><a href="https://www.youtube.com/watch?v=rfscVS0vtbw">Learn Python - Full Course for Beginners [Tutorial]</a></li></ul><h4 id="f-sica"><strong>Física</strong></h4><p>La física requiere ejecutar simulaciones y programar es perfecto para hacer exactamente eso. Los científicos pueden programar y ejecutar simulaciones basadas en distintos escenarios que serían difíciles de replicar en la vida real. Esto es mucho más eficiente. </p><p>Los lenguajes de programación que se usan comúnmente para simulaciones de física incluyen C, Java, Python, MATLAB y JavaScript.</p><h4 id="qu-mica"><strong>Química</strong></h4><p>La química también utiliza simulaciones y análisis de datos, así que es un campo en el cual la programación puede ser muy útil. </p><p>En <a href="https://onlinelibrary.wiley.com/doi/abs/10.1002/anie.197901111">este artículo científico</a> del Dr. Ivar Ugi y sus colegas del Organisch-chemisches Institut der Technischen Universität München, mencionan que:</p><blockquote>El diseño de síntesis completamente nuevas y la clasificación y documentación de estructuras, subestructuras y reacciones son ejemplos de nuevas aplicaciones de computadoras a la química.</blockquote><p>Texto original en inglés:</p><blockquote>The design of entirely new syntheses, and the classification and documentation of structures, substructures, and reactons are examples of new applications of computers to chemistry.</blockquote><p>Los experimentos científicos también generan datos detallados y resultados que pueden ser analizados con programas de computadora desarrollados por científicos.</p><p>Piénsalo: escribir un programa para generar un diagrama de caja (box plot) o un diagrama de dispersión (scatter plot) o cualquier otro tipo de gráfico para visualizar tendencias en miles de valores puede ahorrar mucho tiempo y esfuerzo a los investigadores. </p><p>Esto les permite enfocarse en la parte más importante de su trabajo: analizar los resultados.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/Screen-Shot-2022-12-04-at-10.40.43-AM.png" class="kg-image" alt="Screen-Shot-2022-12-04-at-10.40.43-AM" width="600" height="400" loading="lazy"><figcaption>Ejemplo de visualizaciones de datos que puedes crear con <a href="https://seaborn.pydata.org/#">Seaborn</a>, una librería de Python para visualización de datos.Esto puede ser muy útil para analizar datos, ¿cierto?</figcaption></figure><p>💡<strong><strong> </strong>Dato<strong>:</strong></strong> si te interesa aprender más sobre este tema, esta es una lista de <a href="https://www.acs.org/education/students/highschool/chemistryclubs/activities/simulations.html">simulaciones de química</a> de la American Chemical Society. Estas simulaciones fueron programadas por desarrolladores y están ayudando a miles de estudiantes y profesores alrededor del mundo.</p><p>Piénsalo... Tú podrías crear la próxima gran simulación. Si te interesa un campo científico, te recomiendo totalmente aprender a programar. Tu trabajo será mucho más productivo y tus resultados serán mucho más fáciles de analizar. </p><p>Si te interesa aprender programación para aplicaciones científicas, puedes tomar estos cursos gratuitos en el canal de YouTube de freeCodeCamp:</p><ul><li><a href="https://www.youtube.com/watch?v=jBlTQjcKuaY">Python for Bioinformatics - Drug Discovery Using Machine Learning and Data Analysis</a></li><li><a href="https://www.youtube.com/watch?v=LHBE6Q9XlzI">Python for Data Science - Course for Beginners (Learn Python, Pandas, NumPy, Matplotlib)</a></li></ul><h3 id="ciencia-de-datos-e-ingenier-a"><strong>Ciencia de datos e ingeniería</strong></h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/12/6---engineering-2.png" class="kg-image" alt="6---engineering-2" width="600" height="400" loading="lazy"></figure><p>Hablando de datos... programación también es esencial para un campo llamado <strong>ciencia de datos</strong>. Si te interesa responder preguntas a través de datos y estadísticas, este campo puede ser exactamente lo que estás buscando y tener habilidades de programación te ayudará a alcanzar tus metas.</p><p>Los científicos de datos recolectan y analizan datos para responder preguntas en distintas áreas. Según UC Berkeley en el artículo "<a href="https://ischoolonline.berkeley.edu/data-science/what-is-data-science/">What is Data Science?</a>":</p><blockquote>Los científicos de datos efectivos son capaces de identificar preguntas relevantes, recolectar datos de una amplia variedad de fuentes de datos, organizar información, traducir resultados a soluciones y comunicar sus hallazgos de una forma que afecta positivamente las decisiones de negocios. </blockquote><p>Texto original en inglés:</p><blockquote>Effective data scientists are able to identify relevant questions, collect data from a multitude of different data sources, organize the information, translate results into solutions, and communicate their findings in a way that positively affects business decisions.</blockquote><p>Existen muchos lenguajes de programación para analizar y visualizar datos, pero quizás uno de los más usados para este propósito es Python. </p><p>Este es un ejemplo de las visualizaciones de datos que puedes crear con Python. Son muy útiles para analizar datos y puedes personalizarlos para que se ajusten a tus necesidades.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/image-6.png" class="kg-image" alt="image-6" width="600" height="400" loading="lazy"><figcaption>Ejemplos de visualizaciones de datos de las galerías de <a href="https://matplotlib.org/">Matplotlib</a> y <a href="https://seaborn.pydata.org/examples/index.html">Seaborn</a>.</figcaption></figure><p>Si deseas aprender a programar para ciencia de datos, puedes tomar estos cursos gratuitos en el canal de YouTube de freeCodeCamp:</p><ul><li><a href="https://www.youtube.com/watch?v=ua-CiDNNj30">Learn Data Science Tutorial - Full Course for Beginners</a></li><li><a href="https://www.youtube.com/watch?v=N6BghzuFLIg">Intro to Data Science - Crash Course for Beginners</a></li><li><a href="https://www.youtube.com/watch?v=LHBE6Q9XlzI">Python for Data Science - Course for Beginners (Learn Python, Pandas, NumPy, Matplotlib)</a></li><li><a href="https://www.youtube.com/watch?v=JwSS70SZdyM">Build 12 Data Science Apps with Python and Streamlit - Full Course</a></li><li><a href="https://www.youtube.com/watch?v=r-uOLxNrNk8">Data Analysis with Python - Full Course for Beginners (Numpy, Pandas, Matplotlib, Seaborn)</a></li></ul><p>💡 <strong>Dato<strong>: </strong></strong>también puedes obtener las siguientes certificaciones en freeCodeCamp:</p><ul><li><a href="https://www.freecodecamp.org/espanol/learn/data-visualization/">Visualización de Datos</a></li><li><a href="https://www.freecodecamp.org/espanol/learn/data-analysis-with-python/">Análisis de Datos con Python</a></li></ul><h3 id="ingenier-a"><strong>Ingeniería</strong></h3><p>La ingeniería es otro campo en el cual programación te puede ayudar a tener éxito. Ser capaz de escribir tus propios programas de computadora puede lograr que tu trabajo sea mucho más eficiente. </p><p>Existen muchas herramientas creadas específicamente para ingenieros. Por ejemplo, el lenguaje de programación R está especializado en aplicaciones estadísticas y Python también es muy popular en este campo.</p><p>Otra herramienta genial para programar en ingeniería es <a href="https://www.mathworks.com/products/matlab.html">MATLAB</a>. De acuerdo a su sitio web oficial:</p><blockquote>MATLAB es una plataforma de programación y computación numérica usada por millones de ingenieros y científicos para analizar datos, desarrollar algoritmos y crear modelos. </blockquote><p>Texto original en inglés:</p><blockquote>MATLAB is a programming and numeric computing platform used by millions of engineers and scientists to analyze data, develop algorithms, and create models.</blockquote><p>Las posibilidades son realmente infinitas.</p><p>Puedes <a href="https://www.freecodecamp.org/news/learn-matlab-with-this-crash-course/">aprender MATLAB en este curso gratuito</a> en el canal de YouTube de freeCodeCamp.</p><p>Si te interesa aprender herramientas de ingeniería relacionadas con programación, este es un curso gratuito en el canal de YouTube de freeCodeCamp sobre AutoCAD, un software de diseño computarizado en 2D y 3D usado por ingenieros. </p><ul><li><a href="https://www.youtube.com/watch?v=VtLXKU1PpRU">AutoCAD for Beginners - Full University Course</a></li></ul><h3 id="medicina-y-farmacolog-a"><strong>Medicina y farmacología</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/7---medicine-an-pharmachology.png" class="kg-image" alt="7---medicine-an-pharmachology" width="600" height="400" loading="lazy"><figcaption>La programación ha ayudado a los científicos a desarrollar nuevas técnicas y dispositivos médicos.</figcaption></figure><p>La medicina y la farmacología están evolucionando constantemente al desarrollar nuevos tratamientos y procedimientos. Veamos cómo puedes aplicar tus habilidades de programación en estos campos. </p><h4 id="medicina"><strong>Medicina</strong></h4><p>La programación está en todas partes. Si te interesa el campo de la medicina, aprender a programar también puede ser muy útil para ti. Incluso si te gustaría enfocarte en ciencias de la computación y desarrollo de software, puedes aplicar tu conocimiento en ambos campos. </p><p>Desarrolladores especializados se encargan de desarrollar y escribir el código que permite que los dispositivos usados por la medicina moderna funcionen correctamente. </p><p>Piénsalo por un momento... todas estas máquinas y dispositivos están controlados por software y alguien tiene que escribir ese software. Los registros médicos también son almacenados y administrados por sistemas especializados creados por desarrolladores. </p><p>Ese podrías ser tú si decides seguir este camino. Suena genial, ¿no?</p><p>Según el artículo científico <a href="https://www.sciencedirect.com/science/article/abs/pii/S0377123717310651">Application of Computer Techniques in Medicine</a>:</p><blockquote>Los usos principales de las computadoras en medicina incluyen sistemas informáticos de hospitales, análisis de datos en medicina, computación para imagenología médica, toma de decisiones asistida por computadoras, cuidado de pacientes en estado crítico, terapias asistidas por computadora, entre otros. </blockquote><p>Texto original en inglés:</p><blockquote>Major uses of computers in medicine include hospital information system, data analysis in medicine, medical imaging laboratory computing, computer assisted medical decision making, care of critically ill patients, computer assisted therapy and so on.</blockquote><h4 id="farmacolog-a"><strong>Farmacología</strong></h4><p>Programación y ciencias de la computación pueden ser aplicadas para desarrollar nuevos medicamentos en el campo de la farmacología. </p><p><a href="https://news.mit.edu/2019/kristy-carpenter-student-medicine-1018">Este artículo</a> de MIT News presenta un ejemplo asombroso de lo que puedes lograr en este campo aprendiendo a programar. Describe cómo un MIT senior, Kristy Carpenter, usó ciencias de la computación en 2019 para desarrollar "medicamentos nuevos y más económicos." Kristy menciona que:</p><blockquote>La inteligencia artificial, la cual puede ayudar a calcular la mejor combinación de compuestos para un medicamento en particular, puede reducir el tiempo de prueba y error e idealmente, puede acelerar el proceso de diseño de nuevos medicamentos. </blockquote><p>Texto original en inglés:</p><blockquote>Artificial intelligence, which can help compute the combinations of compounds that would be better for a particular drug, can reduce trial-and-error time and ideally quicken the process of designing new medicines.</blockquote><p>Otro ejemplo de una aplicación del mundo real de programación en farmacología está relacionada con Python (¡sí, Python tiene muchas aplicaciones!). Entre sus <a href="https://www.python.org/success-stories/">historias de éxito</a>, vemos que Python fue seleccionado por AstraZeneca para desarrollar técnicas y programas que pueden ayudar a los científicos a desarrollar nuevos medicamentos más rápido y más eficientemente. </p><p>La <a href="https://www.python.org/success-stories/python-for-collaborative-drug-discovery/">documentación</a> de Python menciona que:</p><blockquote>Para ahorrar tiempo y dinero en trabajo de laboratorio, los químicos experimentales usan modelos computacionales para reducir el conjunto de buenos candidatos para un medicamento. Además, se verifica que los candidatos a ser evaluados no son simples variaciones de la estructura química básica de otros. </blockquote><p>Texto original en inglés:</p><blockquote>To save time and money on laboratory work, experimental chemists use computational models to narrow the field of good drug candidates, while also verifying that the candidates to be tested are not simple variations of each other's basic chemical structure.</blockquote><p>Si te interesa aprender programación para medicina o campos relacionados con ciencias de la salud, este es un curso gratuito en el canal de YouTube de freeCodeCamp sobre programación para imagenología médica:</p><ul><li><a href="https://www.youtube.com/watch?v=M3ZWfamWrBM">PyTorch and Monai for AI Healthcare Imaging - Python Machine Learning Course</a></li></ul><h3 id="educaci-n"><strong>Educación</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/8---education.png" class="kg-image" alt="8---education" width="600" height="400" loading="lazy"><figcaption>La programación puede ser usada para crear herramientas que ayuden a los profesores y estudiantes a tener experiencias de aprendizaje más productivas y entretenidas. Enseñar a los estudiantes a programar también desarrolla sus habilidades para resolver problemas.&nbsp;</figcaption></figure><p>¿Alguna vez pensaste que la programación podría ser útil para la educación? Bueno, permíteme decirte que sí lo es y que es muy importante. ¿Por qué? Porque las herramientas de aprendizaje digital que los estudiantes y profesores usan hoy en día son programadas por desarrolladores.</p><p>Cada vez que un estudiante abre una aplicación educativa, usa una plataforma educativa como freeCodeCamp, escribe en un pizarrón digital o asiste a una clase a través de una plataforma de reuniones en línea, la programación lo está haciendo posible. </p><p>Como un programador o como un profesor sabe programar, puedes crear la próxima gran aplicación que mejore la experiencia de aprendizaje de los estudiantes alrededor del mundo.</p><p>Quizás será una aplicación para tomar notas, una plataforma de educación en línea, una aplicación de presentaciones, un juego educativo o cualquier otra aplicación que pueda ser útil para los estudiantes. </p><p>Lo importante es crearla pensando en los estudiantes si tu meta es crear algo asombroso que cree recuerdos inolvidables. </p><p>Si tienes una visión clara de lo que quieres crear, puedes crearlo con código. </p><p>Los profesores también pueden enseñarle a sus estudiantes a programar para desarrollar sus habilidades de resolución de problemas y enseñarles habilidades importantes para su futuro.</p><p>💡 <strong>Dato<strong>:</strong> </strong>si estás enseñandole a tus alumnos a programar, <strong>Scratch</strong> es un lenguaje de programación genial para enseñar los fundamentos de programación. En particular, está enfocado en enseñarle a los niños cómo programar de forma interactiva.</p><p>De acuerdo al sitio web oficial de <a href="https://scratch.mit.edu/about">Scratch</a>:</p><blockquote>Scratch es la comunidad más grande de programación para niños del mundo y un lenguaje con una interfaz visual simple que le permite a los jóvenes crear historias digitales, juegos y animaciones. </blockquote><p>Texto original en inglés:</p><blockquote>Scratch is the world’s largest coding community for children and a coding language with a simple visual interface that allows young people to create digital stories, games, and animations.</blockquote><p>Si te interesa aprender a programar con propósitos educativos, puedes tomar estos cursos gratuitos en el canal de YouTube de freeCodeCamp:</p><ul><li><a href="https://www.youtube.com/watch?v=x14G4DCk4nY">Scratch Tutorial for Beginners - Make a Flappy Bird Game</a></li><li><a href="https://www.youtube.com/watch?v=F0WoVEr0-44">Computational Thinking &amp; Scratch - Intro to Computer Science - Harvard's CS50 (2018)</a></li><li><a href="https://www.youtube.com/watch?v=fis26HvvDII">Android Development for Beginners - Full Course</a></li><li><a href="https://www.youtube.com/watch?v=VPvVD8t02U8">Flutter Course for Beginners – 37-hour Cross Platform App Development Tutorial</a></li><li><a href="https://www.youtube.com/watch?v=gB1F9G0JXOo">Learn Unity - Beginner's Game Development Tutorial</a></li></ul><h3 id="aprendizaje-autom-tico-inteligencia-artificial-y-rob-tica"><strong>Aprendizaje automático, inteligencia artificial y robótica</strong></h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/9---robotics.png" class="kg-image" alt="9---robotics" width="600" height="400" loading="lazy"><figcaption>El aprendizaje automático y la inteligencia artificial son muy populares hoy en día porque las plataformas pueden aprender cómo los usuarios interactúan con su contenido para sugerirles información y productos relevantes.</figcaption></figure><p>Algunos de los campos más asombrosos que están directamente relacionados con programación son el aprendizaje automático (machine learning), inteligencia artificial y robótica. Veamos por qué.</p><p>La <strong>inteligencia artificial </strong>está definida por <a href="https://www.britannica.com/technology/artificial-intelligence">Britannica</a> como:</p><blockquote>El proyecto de desarrollar sistemas dotados de los procesos intelectuales característicos de los humanos, tales como la habilidad de razonar, descubrir significado, generalizar o aprender de experiencia pasada.</blockquote><p>Texto original en inglés:</p><blockquote>The project of developing systems endowed with the intellectual processes characteristic of humans, such as the ability to reason, discover meaning, generalize, or learn from past experience.</blockquote><p>El <strong>aprendizaje automático</strong> es una rama o subconjunto del campo de la inteligencia artificial en la cual los sistemas pueden aprender por sí mismos en base a datos. La meta de este proceso de aprendizaje es predecir el output esperado. Estos modelos aprenden continuamente cómo "pensar" y cómo analizar situaciones en base a su entrenamiento previo. </p><p>Los lenguajes de programación usados más comúnmente en estos campos son Python, C, C#, C++ y MATLAB.</p><p>La inteligencia artificial y el aprendizaje automático tienen aplicaciones asombrosas en diversas industrias, tales como:</p><ul><li>Detección de imágenes y objetos.</li><li>Realizar predicciones en base a patrones.</li><li>Reconocimiento de texto.</li><li>Motores de recomendación (como cuando una plataforma de comercio en línea te muestra productos que te pueden gustar o cuando YouTube te muestra videos que te pueden interesar).</li><li>Detección de spam para correos electrónicos.</li><li>Detección de fraudes.</li><li>Funcionalidad de las redes sociales como sugerencias personalizadas.</li><li>Mucho más... existen literalmente millones de aplicaciones en cualquier industria. </li></ul><p>Si te interesa aprender a programar para inteligencia artificial y aprendizaje automático, puedes tomar estos cursos gratuitos en el canal de YouTube de freeCodeCamp:</p><ul><li><a href="https://www.youtube.com/watch?v=i_LwzRVP7bg">Machine Learning for Everybody – Full Course</a></li><li><a href="https://www.youtube.com/watch?v=NWONeJKn6kc">Machine Learning Course for Beginners</a></li><li><a href="https://www.youtube.com/watch?v=V_xro1bcAuA">PyTorch for Deep Learning &amp; Machine Learning – Full Course</a></li><li><a href="https://www.youtube.com/watch?v=tPYj3fFJGjk">TensorFlow 2.0 Complete Course - Python Neural Networks for Beginners Tutorial</a></li><li><a href="https://www.youtube.com/watch?v=Rs_rAxEsAvI">Self-Driving Car with JavaScript Course – Neural Networks and Machine Learning</a></li><li><a href="https://www.youtube.com/watch?v=VtRLrQ3Ev-U">Python TensorFlow for Machine Learning – Neural Network Text Classification Tutorial</a></li><li><a href="https://www.youtube.com/watch?v=0oyCUWLL_fU">Practical Deep Learning for Coders - Full Course from fast.ai and Jeremy Howard</a></li><li><a href="https://www.youtube.com/watch?v=VyWAvY2CF9c">Deep Learning Crash Course for Beginners</a></li><li><a href="https://www.youtube.com/watch?v=01sAkU_NvOY">Advanced Computer Vision with Python - Full Course</a></li></ul><p>💡<strong><strong> </strong>Dato<strong>:</strong></strong> también puedes obtener una certificación de <a href="https://www.freecodecamp.org/espanol/learn/machine-learning-with-python/">Aprendizaje Automático con Python</a> en freeCodeCamp. </p><h3 id="rob-tica"><strong>Robótica</strong></h3><p>La programación también es muy importante para la robótica. ¡Sí! Los robots también se programan. </p><p>La robótica es definida por <a href="https://www.britannica.com/technology/robotics">Britannica</a> como:</p><blockquote>El diseño, construcción y uso de máquinas (robots) para realizar tareas que eran realizadas tradicionalmente por seres humanos.</blockquote><p>Texto original en inglés:</p><blockquote>Design, construction, and use of machines (robots) to perform tasks done traditionally by human beings.</blockquote><p>Los robots son como computadoras. No saben qué hacer hasta que les dices qué hacer escribiendo instrucciones en tus programas. Si aprendes a programar, puedes programar robots y maquinaria industrial en instalaciones de manufactura.</p><p>Si te interesa aprender programación para robótica, electrónica y campos relacionados, este es un curso gratuito sobre Arduino en el canal de YouTube de freeCodeCamp:</p><ul><li><a href="https://www.youtube.com/watch?v=zJ-LqeX_fLU">Arduino Course for Beginners - Open-Source Electronics Platform</a></li></ul><h3 id="otras-aplicaciones"><strong>Otras aplicaciones</strong></h3><p>Existen muchas otras aplicaciones fascinantes de programación en cualquier campo que te imagines. Estos son algunos ejemplos:</p><ul><li><strong>Agricultura: </strong>en <a href="https://news.mit.edu/2015/mitx-mooc-helps-farmer-develop-autonomous-tractor-app-1201">este artículo</a> de MIT News, un granjero aprendió a programar para desarrollar una aplicación para un tractor autónomo. </li><li><strong>Vehículos autónomos:</strong> los vehículos autónomos dependen de software que analiza los alrededores para tomar decisiones rápidas y precisas mientras están en movimiento. Si te interesa esta área, este es un <a href="https://www.youtube.com/watch?v=Rs_rAxEsAvI">curso sobre este tema</a> en el canal de YouTube de freeCodeCamp en español. </li><li><strong>Finanzas:</strong> la programación también puede ser útil para desarrollar programas y modelos que predicen indicadores financieros y tendencias en los mercados. Por ejemplo, este es un <a href="https://www.youtube.com/watch?v=xfzGZB4HhEE">curso de algorithmic trading</a> en el canal de YouTube de freeCodeCamp. </li></ul><p>Las posibilidades son infinitas. Espero que esta sección te dé una noción de por qué aprender a programar es tan importante para tu presente y para tu futuro. Será una habilidad valiosa en cualquier campo de escojas. </p><p>Genial. Ahora veamos las habilidades de personalidad (soft skills) que necesitas para tener éxito como programador.</p><h2 id="-habilidades-de-un-programador-exitoso">🔹<strong> Habilidades de un programador exitoso</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/12/skills.png" class="kg-image" alt="skills" width="600" height="400" loading="lazy"></figure><p>Después de ver una amplia gama de aplicaciones de programación, debes tener curiosidad de las habilidades que necesitas para tener éxito en este campo. </p><h3 id="curiosidad">Curiosidad</h3><p>Un programador debe ser curioso. Independientemente de si estás comenzando a aprender a programar o si ya tienes 20 años de experiencia, los proyectos de programación siempre te presentarán nuevos retos y oportunidades de aprendizaje. Si aprovechas estas oportunidades, estarás mejorando tus habilidades continuamente y podrás tener éxito.</p><h3 id="entusiasmo"><strong>Entusiasmo</strong></h3><p>El entusiasmo es un rasgo clave de la personalidad de un programador pero esto también se aplica a cualquier campo si quieres tener éxito. El entusiasmo te mantendrá feliz y curioso sobre lo que estás creando y aprendiendo.</p><p>💡<strong><strong> </strong>Dato<strong>:</strong> </strong>si ya no tienes tanto entusiasmo como antes, es hora de encontrar o aprender algo nuevo que pueda encender la chispa en ti otra vez y llenarte de esperanza y sueños. </p><h3 id="paciencia"><strong>Paciencia</strong></h3><p>Un programador debe ser paciente porque transformar una idea inicial en un producto funcional puede tomar tiempo, esfuerzo y muchos pasos. La paciencia te mantendrá enfocado en la meta final. </p><h3 id="resiliencia"><strong>Resiliencia</strong></h3><p>Programar puede ser retador. Eso es verdad. Pero lo que te define no es a cuántos retos te enfrentes, sino cómo los enfrentes. Si prosperas a pesar de estos retos te convertirás en un mejor programador y puedes crear algo que cambie al mundo.</p><h3 id="creatividad"><strong>Creatividad</strong></h3><p>Los programadores deben ser creativos porque aunque cada lenguaje de programación tiene un conjuntos de reglas en particular para escribir el código, programar es como usar LEGOs. Tienes los bloques pero debes decidir qué crear y cómo crearlo. El proceso de escribir el código requiere creatividad combinada con buenas prácticas establecidas para cada tecnología.</p><h3 id="resoluci-n-de-problemas-y-an-lisis"><strong>Resolución de problemas y análisis</strong></h3><p>La programación es básicamente analizar y resolver problemas con código. Dependiendo del campo que escojas, esos problemas serán más sencillos o más complejos pero todos requerirán cierto nivel de habilidades de resolución de problemas y un análisis detallado de la situación. </p><p>Preguntas como:</p><ul><li>¿Qué debo desarrollar?</li><li>¿Cómo puedo desarrollarlo?</li><li>¿Cuál es la mejor forma de desarrollarlo?</li></ul><p>Son parte de la rutina diaria de un programador.</p><h3 id="ser-capaz-de-concentrarse-por-largos-periodos-de-tiempo"><strong>Ser capaz de concentrarse por largos periodos de tiempo</strong></h3><p>Cuando estás trabajando en un proyecto de programación, deberás enfocarte en una tarea por largos periodos de tiempo. Desde crear el diseño, planificar y escribir el código, probar el resultado y corregir bugs (problemas en el código), dedicarás muchas horas a una tarea en particular. Por eso es esencial poder enfocarse y mantener la meta final en mente. </p><h3 id="tomar-notas-detalladas"><strong>Tomar notas detalladas</strong></h3><p>Esta habilidad es muy importante para los programadores, especialmente cuando estás aprendiendo a programar. Tomar notas detalladas puede ayudarte a entender y a recordar los conceptos y las herramientas que aprendes. Esto también aplica para programadores con experiencia, ya que ser programador involucra aprender constantemente. </p><h3 id="comunicaci-n"><strong>Comunicación</strong></h3><p>Inicialmente, puedes pensar que la programación es una actividad solitaria e imaginar que un programador pasa cientos de horas solo sentado en su escritorio.</p><p>Pero la realidad es que cuando encuentres tu primer trabajo, verás que la comunicación es super importante para coordinar tareas con otros miembros del equipo y para intercambiar ideas y sugerencias. </p><h3 id="estar-abierto-a-sugerencias"><strong>Estar abierto a sugerencias</strong></h3><p>En programación, generalmente hay más de una forma de implementar la misma funcionalidad. Distintas alternativas pueden funcionar de forma similar, pero algunas pueden ser más fáciles de leer o más eficientes en términos de tiempo o uso de recursos.</p><p>Cuando aprender a programar, siempre debes estar abierto a la crítica constructiva como una herramienta de aprendizaje. De igual forma, cuando trabajas en un equipo, toma las sugerencias de tus compañeros de forma positiva y siempre intenta mejorar. </p><h3 id="aprendizaje-continuo"><strong>Aprendizaje continuo</strong></h3><p>Escoger el campo de la programación equivale a escoger aprendizaje continuo. Si quieres aprender a programar, debes saber que siempre deberás aprender algo nuevo porque siempre surgen nuevas tecnologías y las tecnologías existentes se actualizan. Piénsalo... ¡Eso es genial porque siempre hay algo nuevo e interesante por aprender!</p><h3 id="estar-abierto-a-cosas-nuevas"><strong>Estar abierto a cosas nuevas</strong></h3><p>Finalmente, una habilidad esencial para tener éxito como programador es siempre estar abierto a probar cosas nuevas. Debes salir de tu zona de confort y abrirte a nuevas tecnologías y productos. En la industria de la tecnología las cosas evolucionan muy rápidamente y adaptarse al cambio es esencial. </p><h2 id="-tips-para-aprender-a-programar">🔸 <strong>Tips para aprender a programar</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/12/tips.png" class="kg-image" alt="tips" width="600" height="400" loading="lazy"></figure><p>Ahora que ya sabes más sobre programación, sobre lenguajes de programación y las habilidades que necesitas para ser un programador exitoso, veamos algunos tips (datos) para aprender a programar.</p><p>💡<strong><strong> </strong>Dato<strong>: </strong></strong>estos datos están basados en mi experiencia y en mi opinión personal.</p><ul><li><strong>Escoge un lenguaje de programación para aprender inicialmente.</strong> Cuando aprendes a programar, es fácil sentirse abrumado por el número de opciones y caminos iniciales. Mi consejo sería primero enfocarse en entender los conceptos básicos de ciencias de la computación y un lenguaje de programación. Python y JavaScript son opciones buenísimas para aprender los fundamentos. </li><li><strong>Toma notas detalladas. </strong>La habilidad de tomar notas detalladas es esencial para registrar y analizar los temas que estás aprendiendo. Puedes agregar comentarios personalizados y datos para explicar lo que estás aprendiendo. </li><li><strong>Practica constantemente.</strong> Solo puedes mejorar tus habilidades de resolución de problemas practicando y aprendiendo nuevas técnicas y herramientas. Intenta practicar todos los días. </li></ul><p>💡<strong><strong> </strong>Dato<strong>:</strong></strong> hay un reto llamado <a href="https://www.100daysofcode.com/">#100DaysOfCode</a> (100 días de código) al cual puedes unirte para practicar cada día. </p><ul><li><strong>Siempre inténtalo otra vez.</strong> Si no puedes resolver un problema en tu primer intento, toma un descanso y vuelve una y otra vez hasta que lo resuelvas. Esa es la única forma de aprender. Aprende de tus errores y aprende nuevos enfoques. &nbsp;</li><li><strong>Aprende cómo investigar y encontrar respuestas. </strong>Los lenguajes de programación, las librerías y los frameworks normalmente tienen documentación oficial qué explica sus elementos y cómo usarlos. Este es un recurso muy valioso que definitivamente deberías usar. </li><li><strong>Visita <a href="https://stackoverflow.com/">Stack Overflow</a>. </strong>Esta es una plataforma asombrosa. Es como una enciclopedia online de respuestas a preguntas comunes de programación. Puedes encontrar respuestas a preguntas que ya han sido publicadas y publicar nuevas preguntas para recibir ayuda de la comunidad. </li><li><strong>Define metas</strong>. La motivación es uno de los factores más importantes para el éxito. Definir metas es muy importante para mantenerse enfocado, motivado y con entusiasmo. Una vez que alcances tus metas, define nuevas metas que te parezcan retadoras y emocionantes. </li><li><strong>Crea proyectos.</strong> Cuando estás aprendiendo a programar, aplicar tus habilidades te ayudará a expandir tu conocimiento y a recordar mejor las cosas. Crear proyectos es una forma perfecta de practicar y de crear un portafolio que luego puedes mostrar a posibles empleadores. </li></ul><h2 id="-conceptos-b-sicos-de-programaci-n">🔹 Conceptos básicos de programación</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/12/basic-concepts.png" class="kg-image" alt="basic-concepts" width="600" height="400" loading="lazy"></figure><p>Genial. Si leer este artículo te ha ayudado a confirmar que quieres aprender a programar, es hora de que des tus primeros pasos.</p><p>Estos son algunos conceptos básicos de programación que deberías conocer:</p><ul><li><strong>Variable:</strong> una variable es un nombre que asignamos a un valor en un programa de computadora. Cuando definimos una variable, asignamos un valor a un nombre y reservamos un espacio en la memoria para almacenar ese valor. El valor de una variable puede ser actualizado durante la ejecución del programa. </li><li><strong>Constante:</strong> una constante es similar a una variable. Se usa para almacenar un valor pero no puede ser modificado. Una vez que asignas un valor a una constante, no puedes cambiarlo durante todo el programa. </li><li><strong>Condicional:</strong> un condicional es una estructura de programación que le permite a los desarrolladores escoger lo que la computadora debería hacer en base a una condición. Si la condición es verdadera, algo ocurrirá pero si es falsa, ocurrirá algo diferente. </li><li><strong>Ciclo: </strong>un ciclo es una estructura de programación que nos permite ejecutar un bloque de código (una secuencia de instrucciones) varias veces. Son muy útiles para evitar repetición y para implementar funcionalidad más compleja. </li><li><strong>Función: </strong>una función nos ayuda a evitar repetición de código y a reutilizar nuestro código. Es como un bloque de código al cual le asignamos un nombre, pero también tiene características especiales. Podemos escribir el nombre de la función para ejecutar esa secuencia de instrucciones sin escribirlas nuevamente. </li></ul><p>💡<strong><strong> </strong>Dato<strong>:</strong> </strong>las funciones pueden comunicarse con el programa principal y el programa principal puede comunicarse con las funciones a través de <strong>parámetros</strong>, <strong>argumentos</strong> y sentencias <strong>return</strong>. </p><ul><li><strong>Clase:</strong> una clase se usa como un plano de construcción para definir las características y funcionalidad de un tipo de objeto. De esta forma, podemos representar objetos de la vida real en nuestros programas. </li><li><strong>Bug:</strong> un bug es un error en la lógica o en la implementación de un programa que resulta en un output inesperado o incorrecto. </li><li><strong>Depuración (debugging): </strong>el proceso de debugging es el proceso de encontrar y corregir bugs en un programa. </li><li><strong>IDE:</strong> este acrónimo significa Integrated Development Environment (Entorno Integrado de Desarrollo). Es un ambiente creado para desarrollo de software que tiene las herramientas más útiles que necesitas para escribir programas, tales como un editor de archivos, un explorador, un terminal y un menú con opciones útiles. </li></ul><p>💡 <strong>Dato<strong>:</strong></strong> un IDE gratuito y comúnmente usado es <a href="https://code.visualstudio.com/">Visual Studio Code</a>, creado por Microsoft. </p><p>Genial. Ahora ya sabes algunos de los conceptos fundamentales de programación. Cada lenguaje de programación tiene una sintaxis diferente pero todos comparten la mayoría de estos conceptos y estructuras. </p><h2 id="-tipos-de-lenguajes-de-programaci-n">🔸<strong> Tipos de lenguajes de programación</strong></h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2022/12/types-of-programming-languages.png" class="kg-image" alt="types-of-programming-languages" width="600" height="400" loading="lazy"></figure><p>Los lenguajes de programación pueden ser clasificados en base a distintos criterios. Si quieres aprender a programar, es importante que conozcas estas clasificaciones básicas:</p><h3 id="complejidad"><strong>Complejidad</strong></h3><ul><li><strong>Lenguajes de programación de alto nivel (<strong>High-level programming languages</strong>)<strong>:</strong></strong> están diseñados para que los seres humanos entiendan el código y deben ser convertidos a lenguaje de máquina para que las computadoras los puedan entender. Son los lenguajes de programación que usamos comúnmente. Por ejemplo: JavaScript, Python, Java, C#, C++ y Kotlin. </li><li><strong>Lenguajes de programación de bajo nivel </strong>(<strong><strong>Low-level programming languages</strong></strong>): son más difíciles de entender porque no están diseñados para seres humanos. Están diseñados para que las máquinas puedan entenderlos y procesarlos de forma eficiente. </li></ul><h3 id="conversi-n-a-c-digo-de-m-quina"><strong>Conversión a código de máquina</strong></h3><ul><li><strong>Lenguajes de programación compilados: </strong>los programas escritos en este tipo de lenguaje de programación se convierten directamente a código de máquina gracias a un <strong>compiler</strong> (compilador). Algunos ejemplos son C, C++, Haskell y Go.</li><li><strong>Lenguajes de programación interpretados:</strong> los programas escritos en este tipo de lenguaje de programación necesitan otro programa llamado <strong><strong>interpreter</strong> </strong>(intérprete), el cual se encarga de ejecutar el código línea por línea. Algunos ejemplos son Python, JavaScript, PHP y Ruby. </li></ul><p>💡<strong><strong> </strong>Dato<strong>:</strong></strong> según <a href="https://www.freecodecamp.org/news/compiled-versus-interpreted-languages/">este artículo</a> de la publicación de freeCodeCamp:</p><blockquote>La mayoría de los lenguajes de programación pueden tener implementaciones compiladas e interpretadas - El lenguaje de programación por sí mismo no es necesariamente compilado o interpretado. Sin embargo, para fines de simplificar este concepto, normalmente nos referimos a ellos de esta forma. </blockquote><p>Texto original en inglés:</p><blockquote>Most programming languages can have both compiled and interpreted implementations – the language itself is not necessarily compiled or interpreted. However, for simplicity’s sake, they’re typically referred to as such.</blockquote><p>Existen otros tipos de lenguajes de programación basados en distintos criterios, tales como:</p><ul><li>Lenguajes de programación procedimentales (Procedural programming languages).</li><li>Lenguajes de programación funcionales (Functional programming languages).</li><li>Lenguajes de programación orientados a objetos (Object-oriented programming languages).</li><li>Lenguajes de programación para <em>scripting</em> (Scripting languages).</li><li>Lenguajes de programación lógicos (Logic programming languages).</li></ul><p>Y la lista de tipos de lenguajes de programación continúa. Esto es muy interesante porque puedes analizar las características de un lenguaje de programación para ayudarte a escoger el adecuado para tu proyecto. </p><h2 id="-c-mo-contribuir-a-proyectos-de-c-digo-abierto-open-source-">🔹<strong> Cómo contribuir a proyectos de código abierto (open source)</strong></h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/Screen-Shot-2022-12-04-at-4.53.42-PM.png" class="kg-image" alt="Screen-Shot-2022-12-04-at-4.53.42-PM" width="600" height="400" loading="lazy"><figcaption>La página web principal de GitHub.</figcaption></figure><p>Finalmente, quizás pienses que programar implica sentarse en un escritorio durante muchas horas seguidas viendo tu código sin ninguna interacción humana. Pero permíteme decirte que esto no tiene que ser cierto en lo absoluto. Puedes ser parte de una comunidad de aprendizaje o de una comunidad de desarrolladores. </p><p>Inicialmente, cuando estás aprendiendo a programar, puedes participar en una comunidad de aprendizaje como freeCodeCamp. De esta forma, podrás compartir tu viaje con otras personas que están aprendiendo a programar, igual que tú. </p><p>Luego, cuando tengas suficientes habilidades y confianza en tu conocimiento, puedes practicar contribuyendo a proyectos de código abierto (open source) y unirte a comunidades de desarrolladores. </p><p>El software de código abierto (open source) es definido por <a href="https://opensource.com/resources/what-open-source">Opensource.com</a> como:</p><blockquote>Software con código fuente que cualquier persona puede inspeccionar, modificar y mejorar.</blockquote><p>Texto original en inglés:</p><blockquote>Software with source code that anyone can inspect, modify, and enhance.</blockquote><p><a href="https://github.com/"><strong><strong>GitHub</strong></strong></a><strong> </strong>es una plataforma online que nos permite albergar proyectos creados con control de versiones. Allí puedes encontrar muchos proyectos open source (como <a href="https://github.com/freeCodeCamp/freeCodeCamp">freeCodeCamp</a>), a los cuales puedes contribuir para practicar tus habilidades. </p><p>💡 <strong>Dato<strong>:</strong> </strong>muchos proyectos open source aceptan colaboración de desarrolladores de distintos niveles de experiencia e incluso primeras colaboraciones en GitHub. Estas son oportunidades excelentes para practicar tus habilidades y contribuir a proyectos reales de programación. </p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/Screen-Shot-2022-12-04-at-5.01.58-PM.png" class="kg-image" alt="Screen-Shot-2022-12-04-at-5.01.58-PM" width="600" height="400" loading="lazy"><figcaption>El <a href="https://github.com/freeCodeCamp/freeCodeCamp">repositorio de freeCodeCamp</a> en GitHub.</figcaption></figure><p>Contribuir a proyectos de código abierto (open source) en GitHub es genial para adquirir nueva experiencia trabajando y comunicándote con otros desarrolladores. Esta es una habilidad muy importante para trabajar en este campo. &nbsp;</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2022/12/Screen-Shot-2022-12-04-at-5.06.54-PM.png" class="kg-image" alt="Screen-Shot-2022-12-04-at-5.06.54-PM" width="600" height="400" loading="lazy"><figcaption>GitHub registra tus <a href="https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/managing-contribution-settings-on-your-profile/viewing-contributions-on-your-profile">colaboraciones</a> y las muestra en tu perfil. Se muestran como cuadritos interactivos verdes y grises que representan los días del año. Un tono más oscuro de verde significa que en ese día realizaste más colaboraciones a repositorios en GitHub. Imagen tomada de <a href="https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-profile/managing-contribution-settings-on-your-profile/viewing-contributions-on-your-profile">este artículo</a> de GitHub.</figcaption></figure><p>Trabajar en equipo es una experiencia genial. Te lo recomiendo totalmente una vez que te sientas más cómodo con tus habilidades y conocimiento. </p><p>¡Lo hiciste! Llegaste al final de este artículo. Muy buen trabajo. Ya sabes qué es programación. Ahora veamos un breve resumen. </p><h2 id="-en-resumen">🔸<strong> En resumen</strong></h2><ul><li>Programar es una habilidad muy importante. Si aprendes a programar, puedes lograr que tu visión se vuelva realidad.</li><li>Programación tiene muchas aplicaciones en campos muy diversos. Puedes encontrar una aplicación de programación en prácticamente cualquier campo que escojas. </li><li>Los lenguajes de programación puedes ser clasificados en base a distintos criterios y comparten conceptos básicos tales como variables, condicionales, ciclos y funciones. </li><li>Siempre define metas que quieras alcanzas y toma notas detalladas. Para tener éxito como programador, debes tener entusiasmo y consistencia. </li></ul><p><strong>Muchas gracias por leer mi artículo.</strong> Espero que te haya gustado y que te sea de utilidad. Ahora ya sabes por qué deberías aprender a programar.</p><p>🔅 Te invito a seguirme en Twitter (<a href="https://twitter.com/EstefaniaCassN">@EstefaniaCassN</a>) y YouTube (<a href="https://www.youtube.com/codingwithestefania">Coding with Estefania</a>) para encontrar tutoriales de programación.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Los principios SOLID de programación orientada a objetos explicados en Español sencillo ]]>
                </title>
                <description>
                    <![CDATA[ Los Principios SOLID tienen cinco principios de diseño de clases Orientado a Objetos. Son un conjunto de reglas y mejores prácticas a seguir al diseñar una estructura de clase. Estos cinco principios nos ayudan a comprender la necesidad de ciertos patrones de diseño y arquitectura de software en general. Así ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/los-principios-solid-explicados-en-espanol/</link>
                <guid isPermaLink="false">63554d352b42f608ea5efb0b</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ David Sabalete Rodriguez ]]>
                </dc:creator>
                <pubDate>Mon, 28 Nov 2022 20:37:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/10/solid.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/solid-principles-explained-in-plain-english/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The SOLID Principles of Object-Oriented Programming Explained in Plain English</a>
      </p><p>Los Principios SOLID tienen cinco principios de diseño de clases Orientado a Objetos. Son un conjunto de reglas y mejores prácticas a seguir al diseñar una estructura de clase.</p><p>Estos cinco principios nos ayudan a comprender la necesidad de ciertos patrones de diseño y arquitectura de software en general. Así que creo que es un tema que todo desarrollador debería aprender.</p><p>Este artículo te enseñará todo lo que necesitas saber para aplicar los principios SOLID a tus proyectos.</p><p>Empezaremos echando un vistazo a la historia de este término. Luego vamos a entrar en los detalles esenciales, los por qué y cómo de cada principio, creando un diseño de clase y mejorándolo paso a paso.</p><p>¡Así que toma una taza de café, mate o té y empecemos!</p><h2 id="antecedentes">Antecedentes</h2><p>Los principios SOLID fueron introducidos por primera vez por el famoso científico informático Robert J. Martin (también conocido como el tío Bob) en uno de sus artículos en 2000. Pero el acrónimo SOLID fue introducido más tarde por Michael Feathers.</p><p>El tío Bob también es el autor de los libros best-sellers <em>Clean Code</em> y <em>Clean Architecture</em>, y es uno de los participantes de la "<a href="https://agilemanifesto.org/history.html">Alianza Agile</a>".</p><p>Por lo tanto, no sorprende que todos estos conceptos de codificación limpia, arquitectura orientada a objetos y patrones de diseño estén de alguna manera conectados y se complementen entre sí.</p><p>Todos tienen el mismo propósito:</p><blockquote>"Para crear código comprensible, legible y comprobable en el que muchos desarrolladores puedan trabajar en colaboración."</blockquote><p>Veamos cada principio uno por uno. Siguiendo el acrónimo inglés SOLID, son:</p><ul><li>El Principio de responsabilidad única (<strong>S</strong>ingle Responsibility Principle)</li><li>El Principio Abierto-Cerrado (<strong>O</strong>pen-Closed Principle)</li><li>El Principio de sustitución de Liskov (<strong>L</strong>iskov Substitution Principle) </li><li>El Principio de segregación de interfaz (<strong>I</strong>nterface Segregation Principle) </li><li>El Principio de inversión de dependencia (<strong>D</strong>ependency Inversion Principle) </li></ul><h2 id="principio-de-responsabilidad-nica">Principio de responsabilidad única</h2><p>El Principio de Responsabilidad Única dice que <strong>una clase debe hacer una cosa y, por lo tanto, debe tener una sola razón para cambiar.</strong></p><p>Para enunciar este principio más técnicamente: Solo un cambio potencial (lógica de base de datos, lógica de registro, etc.) en la especificación del software debería poder afectar la especificación de la clase.</p><p>Esto significa que si una clase es un contenedor de datos, como una clase Libro o una clase Estudiante, y tiene algunos campos relacionados con esa entidad, debería cambiar solo cuando cambiamos el modelo de datos.</p><p>Es importante seguir el principio de responsabilidad única. En primer lugar, debido a que muchos equipos diferentes pueden trabajar en el mismo proyecto y editar la misma clase por diferentes motivos, esto podría dar lugar a módulos incompatibles.</p><p>En segundo lugar, facilita el control de versiones. Por ejemplo, digamos que tenemos una clase de persistencia que maneja las operaciones de la base de datos y vemos un cambio en ese archivo en las confirmaciones de GitHub. Al seguir el PRU, sabremos que está relacionado con el almacenamiento o con cosas relacionadas con la base de datos.</p><p>Los conflictos de fusión son otro ejemplo. Aparecen cuando diferentes equipos modifican el mismo archivo. Pero si se sigue el PRU, aparecerán menos conflictos: los archivos tendrán una sola razón para cambiar y los conflictos que existen serán más fáciles de resolver.</p><h3 id="trampas-comunes-y-anti-patrones">Trampas comunes y Anti-patrones</h3><p>En esta sección, veremos algunos errores comunes que violan el Principio de Responsabilidad Única. Luego hablaremos sobre algunas formas de solucionarlos.</p><p>Veremos el código de un programa simple de facturación de librería como ejemplo. Comencemos definiendo una clase de libro para usar en nuestra factura.</p><pre><code class="language-java">class Libro {
	String nombre;
	String nombreAutor;
	int anyo;
	int precio;
	String isbn;

	public Libro(String nombre, String nombreAutor, int anyo, int precio, String isbn) {
		this.nombre = nombre;
		this.nombreAutor = nombreAutor;
		this.anyo = anyo;
        this.precio = precio;
		this.isbn = isbn;
	}
}
</code></pre><p>Esta es una clase de libro simple con algunos campos. Nada sofisticado. No estoy haciendo que los campos sean privados para que no tengamos que lidiar con getters y setters y podamos centrarnos en la lógica.</p><p>Ahora vamos a crear la clase de factura que contendrá la lógica para crear la factura y calcular el precio total. Por ahora, suponga que nuestra librería solo vende libros y nada más.</p><pre><code class="language-java">public class Factura {

	private Libro libro;
	private int cantidad;
	private double tasaDescuento;
	private double tasaImpuesto;
	private double total;

	public Factura(Libro libro, int cantidad, double tasaDescuento, double tasaImpuesto) {
		this.libro = libro;
		this.cantidad = cantidad;
		this.tasaDescuento = tasaDescuento;
		this.tasaImpuesto = tasaImpuesto;
		this.total = this.calculaTotal();
	}

	public double calculaTotal() {
	        double precio = ((libro.precio - libro.precio * tasaDescuento) * this.cantidad);

		double precioConImpuestos = precio * (1 + tasaImpuesto);

		return precioConImpuestos;
	}

	public void imprimeFactura() {
            System.out.println(cantidad + "x " + libro.nombre + " " +          libro.precio + "$");
            System.out.println("Tasa de Descuento: " + tasaDescuento);
            System.out.println("Tasa de Impuesto: " + tasaImpuesto);
            System.out.println("Total: " + total);
	}

        public void guardarArchivo(String nombreArchivo) {
	// Crea un archivo con el nombre dado y escribe la factura.
	}

}</code></pre><p>Aquí está nuestra clase de Factura. También contiene algunos campos sobre facturación y 3 métodos:</p><ul><li><strong>calculaTotal </strong>método que calcula el precio total,</li><li><strong>imprimeFactura</strong> método que debería imprimir la factura por consola, y</li><li><strong>guardaArchivo </strong>método responsable de escribir la factura en un archivo.</li></ul><p>Debe darse un segundo para pensar en lo que está mal con este diseño de clase antes de leer el siguiente párrafo.</p><p>Bien, entonces, ¿qué está pasando aquí? Nuestra clase viola el Principio de Responsabilidad Única de múltiples maneras.</p><p>La primera violación es el método <strong>imprimeFactura</strong>, el cual contiene nuestra lógica de impressión. El PRU establece que nuestra clase solo debería tener una única razón para cambiar, y esa razón debería ser un cambio en el cálculo de la factura para nuestra clase.</p><p>Pero en esta arquitectura, si queremos cambiar el formato de impresión, necesitaríamos cambiar la clase. Esta es la razón por la que no deberíamos tener lógica de impresión mezclada con lógica de negocios en la misma clase.</p><p>Hay otro método que viola el PRU en nuestra clase: el método <strong>guardarArchivo</strong>. También es un error extremadamente común mezclar la lógica de persistencia con la lógica de negocios.</p><p>No piense solo en términos de escribir en un archivo, podría ser guardarlo en una base de datos, hacer una llamada a la API u otras cosas relacionadas con la persistencia.</p><p>Entonces, ¿cómo podemos arreglar esta función de impresión?, puede preguntar.</p><p>Podemos crear nuevas clases para nuestra lógica de impresión y persistencia, por lo que ya no necesitaremos modificar la clase de factura para esos fines.</p><p>Creamos 2 clases, <strong>FacturaImpresion</strong> y <strong>FacturaPersistencia,</strong> y movemos los métodos.</p><pre><code class="language-java">public class FacturaImpresion {
    private Factura factura;

    public FacturaImpresion(Factura factura) {
        this.factura = factura;
    }

    public void imprimir() {
        System.out.println(factura.cantidad + "x " + factura.libro.nombre + " " + factura.libro.precio + " $");
        System.out.println("Tasa de Descuento: " + factura.tasaDescuento);
        System.out.println("Tasa de Impuesto: " + factura.tasaImpuesto);
        System.out.println("Total: " + factura.total + " $");
    }
}</code></pre><pre><code class="language-java">public class FacturaPersistencia {
    Factura factura;

    public FacturaPersistencia(Factura factura) {
        this.factura = factura;
    }

    public void guardarArchivo(String nombreArchivo) {
        // Crea un archivo con el nombre dado y escribe la factura.
    }
}</code></pre><p>Ahora nuestra estructura de clases obedece al principio de responsabilidad única y cada clase es responsable de un aspecto de nuestra aplicación. ¡Excelente!</p><h2 id="principio-de-apertura-y-cierre">Principio de apertura y cierre</h2><p>El principio de apertura y cierre exige que <strong>las clases deban estar abiertas a la extensión y cerradas a la modificación.</strong></p><p>Modificación significa cambiar el código de una clase existente y extensión significa agregar una nueva funcionalidad.</p><p>Entonces, lo que este principio quiere decir es: Deberíamos poder agregar nuevas funciones sin tocar el código existente para la clase. Esto se debe a que cada vez que modificamos el código existente, corremos el riesgo de crear errores potenciales. Por lo tanto, debemos evitar tocar el código de producción probado y confiable (en su mayoría) si es posible.</p><p>Pero, ¿cómo vamos a agregar una nueva funcionalidad sin tocar la clase?, puede preguntarse. Por lo general, se hace con la ayuda de interfaces y clases abstractas.</p><p>Ahora que hemos cubierto los conceptos básicos del principio, apliquémoslo a nuestra aplicación Factura.</p><p>Digamos que nuestro jefe vino a nosotros y dijo que quiere que las facturas se guarden en una base de datos para que podamos buscarlas fácilmente. Creemos que está bien, esto es fácil jefe, ¡solo dame un segundo!</p><p>Creamos la base de datos, nos conectamos a ella y agregamos un método de guardado a nuestra clase <strong>FacturaPersistencia</strong>:</p><pre><code class="language-java">public class FacturaPersistencia {
    Factura factura;

    public FacturaPersistencia(Factura factura) {
        this.factura = factura;
    }

    public void guardarArchivo(String nombreArchivo) {
        // Crea un archivo con el nombre dado y escribe la factura.
    }

    public void guardarEnBaseDatos() {
        // Guarda la factura en la base de datos
    }
}</code></pre><p>Lamentablemente, nosotros, como desarrolladores perezosos de la librería, no diseñamos las clases para que fueran fácilmente ampliables en el futuro. Entonces, para agregar esta función, hemos modificado la clase FacturaPersistencia.</p><p>Si nuestro diseño de clase obedeciera al principio Abierto-Cerrado, no necesitaríamos cambiar esta clase.</p><p>Entonces, como el desarrollador perezoso pero inteligente de la librería, vemos el problema de diseño y decidimos refactorizar el código para obedecer el principio.</p><pre><code class="language-java">interface FacturaPersistencia {

    public void guardar(Factura factura);
}</code></pre><p>Cambiamos el tipo de <strong>FacturaPersistencia</strong> a Interface y agregamos un método de guardado. Cada clase de persistencia implementará este método de guardado.</p><pre><code class="language-java">public class BaseDeDatosPersistencia implements FacturaPersistencia {

    @Override
    public void guardar(Factura factura) {
        // Guardar en la base de datos
    }
}</code></pre><pre><code class="language-java">public class ArchivoPersistencia implements FacturaPersistencia {

    @Override
    public void guardar(Factura factura) {
        // Guardar en archivo
    }
}</code></pre><p>Así que nuestra estructura de clases ahora se ve así:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/10/SOLID-Tutorial-1.png" class="kg-image" alt="SOLID-Tutorial-1-1024x554" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/10/SOLID-Tutorial-1.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/10/SOLID-Tutorial-1.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2022/10/SOLID-Tutorial-1.png 1024w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Ahora nuestra lógica de persistencia es fácilmente extensible. Si nuestro jefe nos pide que agreguemos otra base de datos y tengamos 2 tipos diferentes de bases de datos como MySQL y MongoDB, podemos hacerlo fácilmente.</p><p>Puede pensar que podríamos simplemente crear múltiples clases sin una interfaz y agregar un método de guardado para todas ellas.</p><p>Pero supongamos que ampliamos nuestra aplicación y tenemos varias clases de persistencia como <strong>FacturaPersistencia</strong>, <strong>LibroPersistencia</strong> y creamos una clase <strong>AdministradorPersistencia</strong> que administra todas las clases de persistencia:</p><pre><code class="language-java">public class AdministradorPersistencia {
    FacturaPersistencia facturaPersistencia;
    LibroPersistencia libroPersistencia;
    
    public AdministradorPersistencia(FacturaPersistencia facturaPersistencia, LibroPersistencia libroPersistencia) {
        this.facturaPersistencia = facturaPersistencia;
        this.libroPersistencia = libroPersistencia;
    }
}</code></pre><p>Ahora podemos pasar cualquier clase que implemente la interfaz <strong>FacturaPersistencia</strong> a esta clase con la ayuda del polimorfismo. Esta es la flexibilidad que proporcionan las interfaces.</p><h2 id="principio-de-sustituci-n-de-liskov">Principio de sustitución de Liskov</h2><p>El Principio de Sustitución de Liskov establece que las subclases deben ser sustituibles por sus clases base.</p><p>Esto significa que, dado que la clase B es una subclase de la clase A, deberíamos poder pasar un objeto de la clase B a cualquier método que espere un objeto de la clase A y el método no debería dar ningún resultado extraño en ese caso.</p><p>Este es el comportamiento esperado, porque cuando usamos la herencia asumimos que la clase secundaria hereda todo lo que tiene la superclase. La clase secundaria extiende el comportamiento pero nunca lo reduce.</p><p>Por lo tanto, cuando una clase no obedece este principio, genera algunos errores desagradables que son difíciles de detectar.</p><p>El principio de Liskov es fácil de entender, pero difícil de detectar en el código. Así que veamos un ejemplo.</p><pre><code class="language-java">class Rectangulo {
	protected int ancho, alto;

	public Rectangulo() {
	}

	public Rectangulo(int ancho, int alto) {
		this.ancho = ancho;
		this.alto = alto;
	}

	public int getAncho() {
		return ancho;
	}

	public void setAncho(int ancho) {
		this.ancho = ancho;
	}

	public int getAlto() {
		return alto;
	}

	public void setAlto(int alto) {
		this.alto = alto;
	}

	public int getArea() {
		return ancho * alto;
	}
}</code></pre><p>Tenemos una clase Rectángulo simple y una función <strong>getArea</strong> que devuelve el área del rectángulo.</p><p>Ahora decidimos crear otra clase para Cuadrados. Como sabrás, un cuadrado es solo un tipo especial de rectángulo donde el ancho es igual a la altura.</p><pre><code class="language-java">class Cuadrado extends Rectangulo {
	public Cuadrado() {}

	public Cuadrado(int talla) {
		ancho = alto = talla;
	}

	@Override
	public void setAncho(int ancho) {
		super.setAncho(ancho);
		super.setAlto(ancho);
	}

	@Override
	public void setAlto(int alto) {
		super.setAlto(alto);
		super.setAncho(alto);
	}
}</code></pre><p>Nuestra clase Cuadrado amplía la clase Rectángulo. Establecemos alto y ancho en el mismo valor en el constructor, pero no queremos que ningún cliente (alguien que use nuestra clase en su código) cambie el alto o el peso de una manera que pueda violar la propiedad cuadrada.</p><p>Por lo tanto, anulamos los setters para establecer ambas propiedades cada vez que se cambia una de ellas. Pero al hacerlo acabamos de violar el principio de sustitución de Liskov.</p><p>Vamos a crear una clase principal para realizar pruebas en la función <strong>getArea</strong>.</p><pre><code class="language-java">class Test {

   static void getAreaTest(Rectangulo r) {
      int ancho = r.getAncho();
      r.setAlto(10);
      System.out.println("Area esperada de " + (ancho * 10) + ", tiene " + r.getArea());
   }

   public static void main(String[] args) {
      Rectangulo rc = new Rectangulo(2, 3);
      getAreaTest(rc);

      Rectangulo sq = new Cuadrado();
      sq.setAncho(5);
      getAreaTest(sq);
   }
}</code></pre><p>Al probador de su equipo se le ocurrió la función de prueba <strong>getAreaTest</strong> y le dice que su función <strong>getArea</strong> no pasa la prueba de objetos cuadrados.</p><p>En la primera prueba, creamos un rectángulo donde el ancho es 2 y la altura es 3 y llamamos a <strong>getAreaTest</strong>. La salida es 20 como se esperaba, pero las cosas salen mal cuando pasamos en la plaza. Esto se debe a que la llamada a la función <strong>setAlto</strong> en la prueba también establece el ancho y da como resultado un resultado inesperado.</p><h2 id="principio-de-segregaci-n-de-interfaces">Principio de segregación de interfaces</h2><p>La segregación significa mantener las cosas separadas, y el Principio de Segregación de Interfaces se trata de separar las interfaces.</p><p>El principio establece que muchas interfaces específicas del cliente son mejores que una interfaz de propósito general. No se debe obligar a los clientes a implementar una función que no necesitan.</p><p>Este es un principio simple de entender y aplicar, así que veamos un ejemplo.</p><pre><code class="language-java">public interface Estacionamiento {

	void aparcarCoche(); // Reducir el recuento de puntos vacíos en 1
	void sacarCoche(); // Aumenta los espacios vacíos en 1
	void getCapacidad(); // Devuelve la capacidad del coche
	double calcularTarifa(Coche coche); // Devuelve el precio en función del número de horas.
	void hacerPago(Coche coche);
}

class Coche {

}</code></pre><p>Modelamos un estacionamiento muy simplificado. Es el tipo de estacionamiento donde pagas una tarifa por hora. Ahora considere que queremos implementar un estacionamiento que sea gratuito.</p><pre><code class="language-java">public class EstacionamientoGratis implements Estacionamiento {

	@Override
	public void aparcarCoche() {
		
	}

	@Override
	public void sacarCoche() {

	}

	@Override
	public void getCapacidad() {

	}

	@Override
	public double calcularTarifa(Coche coche) {
		return 0;
	}

	@Override
	public void hacerPago(Coche coche) {
		throw new Exception("Estacionamiento es gratis");
	}
}</code></pre><p>Nuestra interfaz de estacionamiento se componía de 2 cosas: lógica relacionada con el estacionamiento (aparcar coche, sacar automóvil, obtener capacidad) y lógica relacionada con el pago.</p><p>Pero es demasiado específico. Debido a eso, nuestra clase EstacionamientoGratis se vio obligada a implementar métodos relacionados con el pago que son irrelevantes. Separemos o segreguemos las interfaces.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/10/SOLID-Tutorial-1024x432.png" class="kg-image" alt="SOLID-Tutorial-1024x432" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/10/SOLID-Tutorial-1024x432.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/10/SOLID-Tutorial-1024x432.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/2022/10/SOLID-Tutorial-1024x432.png 1024w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Ahora hemos separado el estacionamiento. Con este nuevo modelo, incluso podemos ir más allá y dividir <strong>EstacionamientoPagado</strong> para admitir diferentes tipos de pago.</p><p>Ahora nuestro modelo es mucho más flexible, extensible y los clientes no necesitan implementar ninguna lógica irrelevante porque solo proporcionamos funcionalidad relacionada con el estacionamiento en la interfaz del estacionamiento.</p><h2 id="principio-de-inversi-n-de-dependencia">Principio de inversión de dependencia</h2><p>El principio de inversión de dependencia establece que nuestras clases deben depender de interfaces o clases abstractas en lugar de clases y funciones concretas.</p><p>En su <a href="https://fi.ort.edu.uy/innovaportal/file/2032/1/design_principles.pdf">artículo</a> (2000), el tío Bob resume este principio de la siguiente manera:</p><blockquote>"Si el PAC establece el objetivo de la arquitectura OO, el PID establece el mecanismo principal".</blockquote><p>Estos dos principios están realmente relacionados y hemos aplicado este patrón antes mientras discutíamos el Principio Abierto-Cerrado.</p><p>Queremos que nuestras clases estén abiertas a la extensión, por lo que hemos reorganizado nuestras dependencias para que dependan de interfaces en lugar de clases concretas. Nuestra clase <strong>AdministradorPersistencia</strong> depende de <strong>FacturaPersistencia</strong> en lugar de las clases que implementan esa interfaz.</p><h2 id="conclusi-n">Conclusión</h2><p>En este artículo, comenzamos con la historia de los principios SOLID y luego tratamos de adquirir una comprensión clara de los por qué y los cómo de cada principio. Incluso refactorizamos una aplicación de Factura simple para obedecer los principios de SOLID.</p><p>Quiero agradecerte por tomarte el tiempo de leer el artículo completo y espero que los conceptos anteriores sean claros.</p><p>Sugiero tener en cuenta estos principios al diseñar, escribir y refactorizar su código para que su código sea mucho más limpio, extensible y comprobable.</p><p>Si estás interesado en leer más artículos como este, puedes suscribirte a la lista de correo de <a href="https://erinc.io/">mi blog</a> para recibir una notificación cuando publique un nuevo artículo. </p><hr> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 12 juegos gratuitos de programación para aprender siendo principiante ]]>
                </title>
                <description>
                    <![CDATA[ Muchos principiantes pueden sentirse intimidados cuando están aprendiendo a programar. Pero aprender jugando puede ser divertido y educativo. De acuerdo a True Education Partnerships [https://www.trueeducationpartnerships.com/schools/gamification-in-education/], > La gamificación en el aprendizaje implica el uso de elementos basados en el juego, como la puntuación, la competición entre compañeros, el trabajo en ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/12-juegos-gratuitos-de-programacion-para-aprender-siendo-principiante/</link>
                <guid isPermaLink="false">63370a97d632c3088e4f18cb</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sonia Garcia Alcaraz ]]>
                </dc:creator>
                <pubDate>Mon, 28 Nov 2022 20:05:33 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/09/naser-tamimi-yG9pCqSOrAg-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/12-free-coding-games-to-learn-programming-for-beginners/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">12 Free Coding Games to Learn Programming for Beginners</a>
      </p><p>Muchos principiantes pueden sentirse intimidados cuando están aprendiendo a programar. Pero aprender jugando puede ser divertido y educativo.</p><p>De acuerdo a <a href="https://www.trueeducationpartnerships.com/schools/gamification-in-education/">True Education Partnerships</a>,</p><blockquote><strong>La gamificación en el aprendizaje</strong> implica el uso de elementos basados en el juego, como la puntuación, la competición entre compañeros, el trabajo en equipo y las tablas de puntuación, para impulsar el compromiso, ayudar a los estudiantes a asimilar nueva información y poner a prueba sus conocimientos.</blockquote><p><a href="https://neuromotricidad.es/blog/gamificacion-en-el-aula/">En este blog</a> se puede encontrar más información sobre gamificación en español.</p><p>He elaborado una lista de 12 juegos de codificación para principiantes.</p><p>Aquí está la lista completa. Una vez que encuentres un sitio web que te interese, haz clic en ese enlace y te llevará a una descripción más detallada de ese sitio web.</p><ol><li><a href="#codingame">CodinGame</a></li><li><a href="#css-diner">CSS Diner</a></li><li><a href="#flexbox-froggy">Flexbox Froggy</a></li><li><a href="#flexbox-defense">Flexbox Defense</a></li><li><a href="#grid-garden">Grid Garden</a></li><li><a href="#codecombat">CodeCombat</a></li><li><a href="#scratch">Scratch</a></li><li><a href="#tynker">Tynker</a></li><li><a href="#sql-murder-mystery">SQL Murder Mystery</a></li><li><a href="#untrusted">Untrusted</a></li><li><a href="#elevator-saga">Elevator Saga</a></li><li><a href="#checkio">CheckiO</a></li></ol><h2 id="codingame">CodinGame</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-3.19.31-AM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-3.19.31-AM" width="600" height="400" loading="lazy"></figure><p><a href="https://www.codingame.com/start">CodinGame</a> es un sitio que te ayuda a trabajar en habilidades de resolución de problemas y aprender conceptos básicos de programación a través de un juego por turnos.</p><p>Esta plataforma es compatible con más de 25 lenguajes de programación diferentes y brinda a los jugadores la oportunidad de practicar, aprender y competir en concursos de codificación.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-10.44.38-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-10.44.38-PM" width="600" height="400" loading="lazy"></figure><p>Una vez que crees una cuenta, puedes empezar con la sección de orientación de nivel principiante. Se te presentarán los conceptos de programación estándar y resolverás mini-retos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-10.44.10-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-10.44.10-PM" width="600" height="400" loading="lazy"></figure><h2 id="css-diner">CSS Diner</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/09/cena-css---platos.jpg" class="kg-image" alt="cena-css---platos" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/09/cena-css---platos.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/09/cena-css---platos.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2022/09/cena-css---platos.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/2022/09/cena-css---platos.jpg 1914w" sizes="(min-width: 720px) 720px" width="1914" height="883" loading="lazy"></figure><p>En <a href="https://flukeout.github.io/">CSS Diner</a>, puedes practicar los conceptos básicos de CSS a través de una serie de 32 desafíos. Esta es una buena manera de familiarizarse con el idioma y divertirse aprendiéndolo.</p><p>Los primeros desafíos son cortos y se enfocan en trabajar con clases e ids. Pero a medida que avanza por los niveles, conocerás los pseudo-selectores, el selector <a href="https://developer.mozilla.org/es/docs/Web/CSS/:first-of-type">first-of-type</a>, el selector <a href="https://developer.mozilla.org/es/docs/Web/CSS/:last-of-type">last-of-type</a> y <a href="https://developer.mozilla.org/es/docs/Web/CSS/Universal_selectors">el selector universal</a>.</p><p>La comunidad ha hecho traducciones en varios idiomas como esta versión en español: <a href="http://cgosorio.es/DW/comedor-css/">Cena CSS</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/09/cena-css--naranjas-1.jpg" class="kg-image" alt="Screen-Shot-2021-08-02-at-10.55.36-PM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/09/cena-css--naranjas-1.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/09/cena-css--naranjas-1.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/2022/09/cena-css--naranjas-1.jpg 1366w" sizes="(min-width: 720px) 720px" width="1366" height="884" loading="lazy"></figure><h2 id="flexbox-froggy">Flexbox Froggy</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/09/flex-rana-1.jpg" class="kg-image" alt="Screen-Shot-2021-08-02-at-4.05.43-AM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/09/flex-rana-1.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/09/flex-rana-1.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2022/09/flex-rana-1.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/2022/09/flex-rana-1.jpg 1890w" sizes="(min-width: 720px) 720px" width="1890" height="890" loading="lazy"></figure><p>En <a href="https://flexboxfroggy.com/">Flexbox Froggy</a>, aprenderá Flexbox CSS colocando las ranas en los nenúfares correctos. Cuando termines el nivel 24, deberías tener la suficiente confianza como para usar Flexbox en tu próximo proyecto.</p><p>Cada desafío proporciona una descripción de las propiedades de Flexbox. Los primeros desafíos comienzan con facilidad, pero a medida que avanzas en el juego, las cosas se complican.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/09/flex-rana-23.jpg" class="kg-image" alt="Screen-Shot-2021-08-02-at-11.17.03-PM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/09/flex-rana-23.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/09/flex-rana-23.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2022/09/flex-rana-23.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/2022/09/flex-rana-23.jpg 1910w" sizes="(min-width: 720px) 720px" width="1910" height="879" loading="lazy"></figure><h2 id="flexbox-defense">Flexbox Defense</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-4.26.01-AM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-4.26.01-AM" width="600" height="400" loading="lazy"></figure><p><a href="http://www.flexboxdefense.com/">Flexbox Defense</a> es un juego de defensa de torres que te ayuda a fortalecer tus habilidades de CSS. Coloca las torres para mantener alejados a tus enemigos usando Flexbox CSS.</p><p>Los desafíos te proporcionarán definiciones de las propiedades de Flexbox. Una vez que escribas tu código, presiona el botón <em>Start Wave</em> (Iniciar oleada) y verás si has logrado detener a tus enemigos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-11.22.57-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-11.22.57-PM" width="600" height="400" loading="lazy"></figure><h2 id="grid-garden">Grid Garden</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/09/css-garden-1.jpg" class="kg-image" alt="Screen-Shot-2021-08-02-at-4.17.37-AM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/09/css-garden-1.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/09/css-garden-1.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2022/09/css-garden-1.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/2022/09/css-garden-1.jpg 1905w" sizes="(min-width: 720px) 720px" width="1905" height="885" loading="lazy"></figure><p>Aprende CSS Grid pasando por los 28 niveles de <a href="https://cssgridgarden.com/">Grid Garden</a>. Se recomienda cierto conocimiento previo de CSS Grid, pero no es necesario para empezar con el juego.</p><p>Cada desafío proporciona una descripción de las propiedades de CSS Grid. Los primeros desafíos comienzan siendo fáciles, pero a medida que se avanza en el juego las cosas se complican.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/09/css-garden-27.jpg" class="kg-image" alt="Screen-Shot-2021-08-02-at-11.27.18-PM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/09/css-garden-27.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/09/css-garden-27.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/2022/09/css-garden-27.jpg 1370w" sizes="(min-width: 720px) 720px" width="1370" height="641" loading="lazy"></figure><h2 id="codecombat">CodeCombat</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/09/code-combat.jpg" class="kg-image" alt="Screen-Shot-2021-08-02-at-1.56.36-AM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/09/code-combat.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/09/code-combat.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2022/09/code-combat.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/2022/09/code-combat.jpg 1876w" sizes="(min-width: 720px) 720px" width="1876" height="880" loading="lazy"></figure><p><a href="https://codecombat.com/">CodeCombat</a> funciona bien tanto para niños como para adultos. Puedes crear una cuenta gratuita y aprender fundamentos de la programación como bucles, funciones, condicionales y variables.</p><p>Puedes elegir el lenguaje de programación con el que quieras empezar y trabajar a través de los juegos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/09/code-combat-lenjuages.jpg" class="kg-image" alt="Screen-Shot-2021-08-02-at-2.03.07-AM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/09/code-combat-lenjuages.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/2022/09/code-combat-lenjuages.jpg 896w" sizes="(min-width: 720px) 720px" width="896" height="446" loading="lazy"></figure><p>También tienes la opción de pasar a la cuenta <em>premium </em>si te interesa tener acceso a más niveles.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/09/code-combat-pro.jpg" class="kg-image" alt="Screen-Shot-2021-08-02-at-2.05.35-AM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/09/code-combat-pro.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/09/code-combat-pro.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/2022/09/code-combat-pro.jpg 1134w" sizes="(min-width: 720px) 720px" width="1134" height="793" loading="lazy"></figure><h2 id="scratch">Scratch</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/09/scratch.jpg" class="kg-image" alt="Screen-Shot-2021-08-02-at-2.16.25-AM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/09/scratch.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/09/scratch.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2022/09/scratch.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/2022/09/scratch.jpg 1836w" sizes="(min-width: 720px) 720px" width="1836" height="861" loading="lazy"></figure><p><a href="https://scratch.mit.edu/">Scratch</a> creado por el Instituto de Tecnología de Massachusetts (MIT, por sus siglas en inglés) es un lenguaje de programación basado en bloques en el que puedes aprender sobre eventos, condicionales, variables y más, creando tus propios juegos y animaciones.</p><p>Elije entre docenas de <em>sprites </em>(gráficos), sonidos y fondos para codificar tus propias creaciones y comenzar a comprender los conceptos básicos de programación.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2022/10/scratch-bedroom.jpg" class="kg-image" alt="Screen-Shot-2021-08-02-at-2.28.37-AM" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2022/10/scratch-bedroom.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2022/10/scratch-bedroom.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2022/10/scratch-bedroom.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/2022/10/scratch-bedroom.jpg 1880w" sizes="(min-width: 720px) 720px" width="1880" height="693" loading="lazy"></figure><p>Scratch también es el lenguaje utilizado durante la primera semana del curso de Harvard <a href="https://www.edx.org/es/course/introduction-computer-science-harvardx-cs50x">CS50: Introduction to Computer Science</a> (CS50: Introducción a ciencias de la computación).</p><h2 id="tynker">Tynker</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-2.43.52-AM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-2.43.52-AM" width="600" height="400" loading="lazy"></figure><p><a href="https://www.tynker.com/">Tynker</a> es un sitio donde puedes construir proyectos y jugar juegos usando HTML, CSS, JavaScript, Python y Java. Tienen una extensa lista de proyectos, algoritmos y desafíos de estructura de datos.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-2.56.25-AM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-2.56.25-AM" width="600" height="400" loading="lazy"></figure><p>Puedes crear proyectos en el editor en linea y compartir tus creaciones con la comunidad. Este sitio está dirigido a niños y niñas de entre 5 y 18 años.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-10.23.31-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-10.23.31-PM" width="600" height="400" loading="lazy"></figure><h2 id="sql-murder-mystery">SQL Murder Mystery</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-8.52.08-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-8.52.08-PM" width="600" height="400" loading="lazy"></figure><p><a href="https://mystery.knightlab.com/">SQL Murder Mystery</a> es ideal tanto para principiantes como para desarrolladores experimentados de SQL. Fortalece tu SQl y tus habilidades de resolución de problemas tratando de rastrear al asesino en esta historia policíaca de misterio.</p><p>El juego usa SQLite y &nbsp;antes de comenzar el juego, tendrás que familiarizarte con la estructura de la base de datos .</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-10.17.01-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-10.17.01-PM" width="600" height="400" loading="lazy"></figure><p>Si estás dado tus primeros pasos con SQL, hay <a href="https://mystery.knightlab.com/walkthrough.html">un recorrido detallado</a> para principiantes. De lo contrario, si tienes más experiencia con SQL, puedes sumergirse directamente en el juego.</p><h2 id="untrusted">Untrusted</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-9.16.13-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-9.16.13-PM" width="600" height="400" loading="lazy"></figure><p><a href="https://alexnisnevich.github.io/untrusted/">Untrusted</a> es un juego de aventuras en el que puedes poner a prueba tu JavaScript y tus habilidades para resolver problemas. Guía al Dr. Eval a través de una serie de niveles resolviendo desafíos de JavaScript.</p><p>Si no tienes mucha experiencia en JavaScript, este juego puede ser un poco avanzado para ti. Pero si has pasado algún tiempo programando en JavaScript, los desafíos son factibles.</p><h2 id="elevator-saga">Elevator Saga</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-9.20.11-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-9.20.11-PM" width="600" height="400" loading="lazy"></figure><p><a href="http://play.elevatorsaga.com/">Elevator Saga</a> es un juego de JavaScript en el que atravesarás una serie de desafíos tratando de transportar personas en ascensores de la manera más eficiente posible dentro del tiempo dado.</p><p>Una vez que modifiques el código, puedes probar la eficiencia de tu solución haciendo clic en el botón de <em>Start </em>(Inicio), en la esquina superior derecha. Cuando el programa se está ejecutando, puedes consultar las estadísticas para ver si pasas el desafío o no.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-10.08.06-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-10.08.06-PM" width="600" height="400" loading="lazy"></figure><h2 id="checkio">CheckiO</h2><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-9.30.59-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-9.30.59-PM" width="600" height="400" loading="lazy"></figure><p><a href="https://checkio.org/">CheckiO</a> es un juego de estrategia en el que puedes aprender TypeScript o Python a través de una serie de desafíos. Una vez que creas una cuenta gratuita, comenzarás con los desafíos para principiantes y te abrirás camino hasta los avanzados.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-9.48.46-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-9.48.46-PM" width="600" height="400" loading="lazy"></figure><p>El juego te dará acceso a sugerencias y soluciones de otros jugadores si necesitas ayuda. Resolverás cada uno de los desafíos en el editor en línea y pasarás a la siguiente misión cuando la tarea esté resuelta.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2021/08/Screen-Shot-2021-08-02-at-9.58.49-PM.png" class="kg-image" alt="Screen-Shot-2021-08-02-at-9.58.49-PM" width="600" height="400" loading="lazy"></figure><hr> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Lenguajes de programación interpretados vs compilados: ¿Cuál es la diferencia? ]]>
                </title>
                <description>
                    <![CDATA[ Cada programa es un conjunto de instrucciones, ya sea sumar dos números o enviar una petición a través de internet. Los compiladores e intérpretes toman código legible por los humanos y lo convierten en código máquina legible por computadoras. En un lenguaje compilado, la máquina de destino traduce directamente el ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/lenguajes-compilados-vs-interpretados/</link>
                <guid isPermaLink="false">62fc725d7b4ec209a4023fed</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Erick ]]>
                </dc:creator>
                <pubDate>Fri, 23 Sep 2022 00:48:50 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/08/interpretedVsCompiledLangsMain.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/compiled-versus-interpreted-languages/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Interpreted vs Compiled Programming Languages: What's the Difference?</a>
      </p><p>Cada programa es un conjunto de instrucciones, ya sea sumar dos números o enviar una petición a través de internet. Los compiladores e intérpretes toman código legible por los humanos y lo convierten en código máquina legible por computadoras.</p><p>En un lenguaje compilado, la máquina de destino traduce directamente el programa. En un lenguaje interpretado, el código fuente no es directamente traducido por la máquina de destino. En cambio, un distinto programa, mejor conocido como intérprete, lee el código y lo ejecuta.</p><h3 id="okay-pero-qu-significa-eso-realmente"><strong><strong><strong>Okay… </strong></strong>¿Pero qué significa eso realmente<strong><strong>?</strong></strong></strong></h3><p>Imagina que tienes una receta de hummus y la quieres preparar, pero está escrita en griego antiguo. Hay dos maneras en que tú, alguien que no habla griego antiguo, podrías seguir dichas instrucciones.</p><p>La primera es si alguien ya lo ha traducido al español para ti. Tú (y cualquiera que hable el idioma) podrías leer la versión en español de la receta y hacer el hummus. Piensa en esta receta traducida como la versión <em>compilada</em>.</p><p>La segunda manera es si tienes un amigo que sabe griego antiguo. Cuando estés listo para hacer hummus, tu amigo se sienta junto a ti y traduce la receta al español mientras avanzas, línea por línea. En este caso, tu amigo es el intérprete de la versión <em>interpretada</em> de la receta.</p><h3 id="lenguajes-compilados"><strong>Lenguajes compilados</strong></h3><p>Los lenguajes compilados son convertidos directamente a código máquina que el procesador puede ejecutar. Como resultado, suelen ser más rápidos y más eficientes al ejecutarse en comparación con los lenguajes interpretados. También le dan al desarrollador más control sobre aspectos del hardware, como la gestión de memoria y el uso del CPU.</p><p>Los lenguajes compilados necesitan un paso de compilación (<em>build</em>) - primero necesitan compilarse manualmente. Necesitas "recompilar" el programa cada vez que necesites hacer un cambio. En nuestro ejemplo del hummus, la traducción completa está escrita antes de que la tengas. Si el autor original decide que quiere usar un distinto aceite de oliva, toda la receta necesitaría ser traducida de nuevo y reenviada a ti.</p><p>Algunos ejemplos de lenguajes compilados puros son C, C++, Erlang, Haskell, Rust y Go.</p><h3 id="lenguajes-interpretados"><strong>Lenguajes interpretados</strong></h3><p>Estos lenguajes ejecutan línea por línea el programa y a la vez ejecutan cada comando. Aquí, si el autor decide que quiere usar un distinto aceite de oliva, podría borrar el anterior y agregar el nuevo. Tu amigo traductor puede decirte ese cambio a medida que sucede.</p><p>Los lenguajes interpretados alguna vez fueron significativamente más lentos que los lenguajes compilados. Pero, con el desarrollo de la <a href="https://www.freecodecamp.org/news/just-in-time-compilation-explained/">compilación justo a tiempo</a>, esa diferencia se está reduciendo.</p><p>Ejemplos comunes de lenguajes interpretados son PHP, Ruby, Python y JavaScript.</p><h3 id="una-peque-a-advertencia"><strong>Una pequeña advertencia</strong></h3><p>La mayoría de lenguajes de programación pueden tener implementaciones tanto compiladas como interpretadas, el lenguaje en sí mismo no es necesariamente compilado o interpretado. Sin embargo, por cuestiones de simplicidad, normalmente se les conoce de tal manera.</p><p>Python, por ejemplo, puede ser ejecutado ya sea como programa compilado o como un lenguaje interpretado en modo interactivo. Por el otro lado, la mayoría de las herramientas de línea de comandos, CLIs y shells pueden ser teóricamente clasificadas como lenguajes interpretados.</p><h2 id="ventajas-y-desventajas"><strong>Ventajas y desventajas</strong></h2><h3 id="ventajas-de-los-lenguajes-compilados"><strong>Ventajas de los lenguajes compilados</strong></h3><p>Los programas que son compilados a un código máquina nativo suelen ser más rápidos que los lenguajes interpretados. Esto es debido a que el proceso de traducción del código en tiempo de ejecución aumenta la sobrecarga y puede ocasionar que el programa sea más lento en general.</p><h3 id="desventajas-de-los-lenguajes-compilados"><strong>Desventajas de los lenguajes compilados</strong></h3><p>Las desventajas más notables son:</p><ul><li>Tiempo extra necesario para completar la compilación completa antes de la prueba</li><li>Dependencia de la plataforma del código binario generado</li></ul><h3 id="ventajas-de-los-lenguajes-interpretados"><strong>Ventajas de los lenguajes interpretados</strong></h3><p>Los lenguajes interpretados suelen ser más flexibles, y a menudo ofrecen características como escritura dinámica y tamaño de programa más pequeño. Además, ya que los intérpretes ejecutan el código fuente del programa ellos mismos, el código en sí es independiente de la plataforma.</p><h3 id="desventajas-de-los-lenguajes-interpretados"><strong>Desventajas de los lenguajes interpretados</strong></h3><p>La desventaja más notable es la velocidad de ejecución típica comparada con los lenguajes compilados.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Operador Ternario en C ]]>
                </title>
                <description>
                    <![CDATA[ Los programadores usan el operador ternario para tomar decisiones en lugar de sentencias condicionales if y else más largas. El operador ternario toma tres argumentos:  1. Un argumento de comparación  2. El resultado si esa comparación devuelve true  3. El resultado si esa comparación devuelve false Es ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/operador-ternario-en-c/</link>
                <guid isPermaLink="false">6302763849da500911a0ee62</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                    <category>
                        <![CDATA[ c ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Anna Aimeri ]]>
                </dc:creator>
                <pubDate>Thu, 22 Sep 2022 17:33:19 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/08/5f9c9db2740569d1a4ca3922.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/c-ternary-operator/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Ternary Operator in C Explained</a>
      </p><p>Los programadores usan el <strong>operador ternario</strong> para tomar decisiones en lugar de sentencias condicionales <strong>if </strong>y <strong>else </strong>más largas.</p><p>El operador ternario toma tres argumentos:</p><ol><li>Un argumento de comparación</li><li>El resultado si esa comparación devuelve true</li><li>El resultado si esa comparación devuelve false</li></ol><p>Es de ayuda pensar en el operador ternario como una forma corta de escribir una sentencia if-else. A continuación un ejemplo simple de toma de decisiones usando <strong>if </strong>y <strong>else</strong>:</p><pre><code class="language-c">int a = 10, b = 20, c;

if (a &lt; b) {
    c = a;
}
else {
    c = b;
}

printf("%d", c);</code></pre><p>Este ejemplo tiene más de 10 líneas, pero eso no es necesario. El programa puede escribirse en 3 líneas de código usando un operador ternario.</p><h3 id="sintaxis"><strong><strong><strong>S</strong>intaxis</strong></strong></h3><p><code>condición ? valor_true : valor_false</code></p><p>Esta sentencia se evalúa a <code>valor_true</code> si se cumple la <code>condición</code>, y a <code>valor_false</code> en caso contrario.</p><p>Este es el ejemplo de arriba usando el operador ternario:</p><pre><code class="language-c">int a = 10, b = 20, c;

c = (a &lt; b) ? a : b;

printf("%d", c);</code></pre><p>El output del ejemplo de arriba es:</p><pre><code class="language-c">10</code></pre><p><code>c</code> toma el valor de <code>a</code>, porque se cumplió la condición <code>a &lt; b</code>.</p><p>Recordemos que los argumentos de <code>valor_true</code> y <code>valor_false</code> deben tener el mismo tipo, y deben ser expresiones simples en lugar de sentencias completas.</p><p>Los operadores ternarios pueden anidarse al igual que las sentencias if-else. Consideremos el siguiente código:</p><pre><code class="language-c">int a = 1, b = 2, ans;
if (a == 1) {
    if (b == 2) {
        ans = 3;
    } else {
        ans = 5;
    }
} else {
    ans = 0;
}
printf ("%d\n", ans);</code></pre><p>Este es el código de arriba escrito con operadores ternarios anidados:</p><pre><code class="language-c">int a = 1, b = 2, ans;
ans = (a == 1 ? (b == 2 ? 3 : 5) : 0);
printf ("%d\n", ans);</code></pre><p>El output de ambos programas debería ser:</p><pre><code class="language-c">3</code></pre> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo trabajar de manera óptima con bases de datos relacionales ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Milap Neupane [https://www.freecodecamp.org/news/author/milapneupane/] Artículo originalHow to work optimally with relational databases [https://www.freecodecamp.org/news/how-to-work-optimally-with-relational-databases-627073f82d56/] Traducido y adaptado por Gemma Fuster [/espanol/news/author/gemma/] Las bases de datos relacionales manejan los datos sin problemas, ya sea trabajando con volúmenes pequeños o procesando millones de filas. Veremos cómo podemos utilizar ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-trabajar-de-manera-optima-con-bases-de-datos-relacionales/</link>
                <guid isPermaLink="false">617004dd56587409993535cc</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ GM Fuster ]]>
                </dc:creator>
                <pubDate>Fri, 29 Oct 2021 12:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/10/mysql.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong><strong>Artículo original escrito por </strong></strong><a href="https://www.freecodecamp.org/news/author/milapneupane/">Milap Neupane</a><br><strong><strong>Artículo original &nbsp;</strong></strong><a href="https://www.freecodecamp.org/news/how-to-work-optimally-with-relational-databases-627073f82d56/">How to work optimally with relational databases</a><br><strong><strong>Traducido y adaptado por</strong> </strong><a href="https://www.freecodecamp.org/espanol/news/author/gemma/">Gemma Fuster</a></p><p>Las bases de datos relacionales manejan los datos sin problemas, ya sea trabajando con volúmenes pequeños o procesando millones de filas. Veremos cómo podemos utilizar las bases de datos relacionales de acuerdo con nuestras necesidades y sacarles el máximo partido.</p><p>MySQL ha sido una opción popular para empresas grandes y pequeñas debido a su capacidad de escalabilidad. De manera similar, PostgreSQL también ha experimentado un aumento en popularidad.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/NuCURJVqv3ixjGlK-U2yBGDWGzmoloI9PzIe" class="kg-image" alt="NuCURJVqv3ixjGlK-U2yBGDWGzmoloI9PzIe" width="800" height="418" loading="lazy"><figcaption>Photo source: <a href="https://insights.stackoverflow.com/survey/2018/" rel="noopener" target="_blank" title="" style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; background-color: transparent; color: var(--gray90); cursor: pointer; text-decoration: underline; word-break: break-word;">https://insights.stackoverflow.com/survey/2018/</a></figcaption></figure><blockquote>Según <a href="https://insights.stackoverflow.com/survey/2018/">la encuesta de Stack Overflow 2018</a>, MySQL es la base de datos más popular entre todos los usuarios.</blockquote><p>Los ejemplos descritos anteriormente utilizan InnoDB como motor de almacenamiento para MySQL. No son solamente relevantes en MySQL sino también en otras bases de datos relacionales como PostgreSQL. &nbsp;Todas las comparativas se realizan en una computadora con 8GB de RAM y con un procesador i5 a 2.7 GHz.</p><p>Comencemos con los conceptos básicos de cómo la base de datos relacional almacena los datos.</p><h3 id="entendiendo-las-bases-de-datos-relacionales"><strong>Entendiendo las bases de datos relacionales</strong></h3><h4 id="almacenamiento"><strong>Almacenamiento</strong></h4><p>MySQL es una base de datos relacional donde los <strong>datos (data</strong>) estan representados en <strong>tuplas o lista de registros (tuples)</strong>, agrupadas en <strong>relaciones (<strong>relations</strong>)</strong>. Un tupla se representa por sus atributos (attributes).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/5aDL3AR1tfjEnDtw4rPGQYskfOyDJ-V2RBgg" class="kg-image" alt="5aDL3AR1tfjEnDtw4rPGQYskfOyDJ-V2RBgg" width="800" height="374" loading="lazy"><figcaption>Image source: <a href="https://commons.wikimedia.org/wiki/File:Relational_database_terms.svg" rel="noopener" target="_blank" title="" style="box-sizing: inherit; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 17.6px; margin: 0px; padding: 0px; vertical-align: baseline; background-color: transparent; color: var(--gray90); cursor: pointer; text-decoration: underline; word-break: break-word;">https://commons.wikimedia.org/wiki/File:Relational_database_terms.svg</a></figcaption></figure><p>Supongamos que tenemos una aplicación en la que las personas pueden prestar libros. Necesitaremos almacenar todas las transacciones de préstamo de libros. Para almacenarlos, hemos diseñado una tabla relacional simple con el siguiente comando:</p><pre><code>&gt; CREATE TABLE libro_transacciones ( id INTEGER NOT NULL   AUTO_INCREMENT, libro_id INTEGER, prestatario_id INTEGER, prestador_id INTEGER, retorno_fecha DATE, PRIMARY KEY (id));</code></pre><p>La tabla es:</p><pre><code>libro_transacciones
------------------------------------------------
id  prestatario_id  prestador_id  libro_id  retorno_fecha</code></pre><p>El <strong><strong>id</strong></strong> es la clave principal y <strong>prestatario<strong>_id</strong></strong>, <strong>prestador<strong>_id</strong></strong>, <strong>libro<strong>_id</strong></strong> son las claves foráneas. Después de lanzar nuestra aplicación, hay registradas pocas transacciones:</p><pre><code>libro_transacciones
----------------------------------------------------------
id  prestatario_id  prestador_id  libro_id  retorno_fecha
----------------------------------------------------------
1                1             1          1    2018-01-13
2                2             3          2    2018-01-13
3                1             2          1    2018-01-13</code></pre><h4 id="obteniendo-los-datos">Obteniendo los datos</h4><p>Tenemos una página de tablero para cada usuario donde pueden ver las transacciones de sus libros prestados. Busquemos las transacciones de libros para un usuario:</p><pre><code>&gt; SELECT * FROM libro_transacciones WHERE prestatario_id = 1;
libro_transacciones
---------------------------------------------------------
id  prestatario_id  prestador_id  libro_id  retorno_fecha
---------------------------------------------------------
1                1             1          1    2018-01-13
2                1             2          1    2018-01-13</code></pre><p>Esto escanea la relación secuencialmente y nos da los datos para el usuario. Esto es muy rápido, ya que hay muy pocos datos en la relación. Para ver la hora exacta de ejecución de la consulta, <strong>configura <strong>profiling</strong></strong> a true (verdadero) ejecutando lo siguiente:</p><pre><code>&gt; set profiling=1;</code></pre><p>Una vez que profiling está configurado, ejecuta la misma consulta nuevamente y luego ejecuta esto para ver el <strong>tiempo de ejecución<strong>:</strong></strong></p><pre><code>&gt; show profiles;</code></pre><p>Esto devolverá la duración de la consulta que hemos ejecutado.</p><pre><code>Query_ID | Duration   | Query
       1 | 0.00254000 | SELECT * FROM libro_transacciones ...</code></pre><p>La ejecución parece muy buena (rápida).</p><p>Poco a poco, la tabla libro_transacciones se empieza a llenar de datos, a medida que aumentan las transacciones.</p><h3 id="el-problema"><strong>El problema</strong></h3><p>Esto incrementa el número de <strong><strong>tupl</strong>a<strong>s</strong></strong> de la relación. Con esto, el tiempo que lleva recuperar las transacciones del libro para el usuario comenzará a tomar más y más tiempo. &nbsp;MySQL necesita pasar por todas las tuplas para encontrar el resultado.</p><p>Para insertar muchos datos en la tabla, he escrito el siguiente procedimiento almacenado:</p><pre><code>DELIMITER //
 CREATE PROCEDURE insertarMuchos()
   BEGIN
   DECLARE i INT DEFAULT 1;
   WHILE (i &lt;= 100000) DO
    INSERT INTO libro_transacciones (prestatario_id, prestador_id, libro_id,   retorno_fecha) VALUES ((FLOOR(1 + RAND() * 60)), (FLOOR(1 + RAND() * 60)), (FLOOR(1 + RAND() * 60)), CURDATE());
    SET i = i+1;
   END WHILE;
 END //
 DELIMITER ;
* Ha tardado 7 minutos en insertar 1.5 millines de datos</code></pre><p>Esto inserta 100,000 registros aleatorios en la tabla libro_transacciones. Al ejecutar esto, el profiler muestra un ligero aumento en el tiempo de ejecución:</p><pre><code>Query_ID | Duration   | Query
       1 | 0.07151000 | SELECT * FROM libro_transacciones ...</code></pre><p>Agreguemos algunos datos más ejecutando el procedimiento anterior y veamos qué sucede. Con más y más datos agregados, la duración de la consulta aumenta. Con 1,5 millones de datos insertados en la tabla, ahora el tiempo de respuesta aumenta.</p><pre><code>Query_ID | Duration   | Query
       1 | 0.36795200 | SELECT * FROM libro_transacciones ...</code></pre><p>Esta es solamente una consulta simple con un valor integer (entero).</p><p>Con más consultas compuestas, consultas ordenadas y consultas con recuento, el tiempo de ejecución empeora aún más.</p><p>Esto no parece ser mucho tiempo para una consulta, pero cuando tenemos miles o incluso millones de consultas ejecutándose cada minuto, esto hace una gran diferencia.</p><p>Habrá mucho más tiempo de espera y esto obstaculizará el rendimiento general de la aplicación. El tiempo de ejecución para la misma consulta aumentó de 2 ms a 370 ms.</p><h3 id="recuperando-la-velocidad">Recuperando la velocidad</h3><h4 id="index"><strong>Index</strong></h4><p>MySQL, y otras bases de datos proporcionan indexación, una estructura de datos que ayuda a recuperar datos más rápido.</p><p>Hay diferentes tipos de indexación en MySQL:</p><ul><li><strong>Clave primaria<strong> </strong></strong>— Index agregado a la clave primaria. Por defecto, las claves primarias siempre están indexadas. Esto también asegura que las dos filas no tengan el mismo valor de clave principal.</li><li><strong><strong>Unique — </strong></strong>El index (índice) de Unique key index asegura que no haya dos filas en una relación que tengan el mismo valor. Se pueden almacenar varios valores nulos con un index de Unique Key .</li><li><strong><strong>Index — </strong></strong>Adición a cualquier otro campo que no sea la clave principal.</li><li><strong><strong>Full Text — </strong></strong>el index de Full text ayuda a las consultas de datos basados en caracteres.</li></ul><p>Hay dos formas principales de almacenar un índice:</p><p><strong><strong>Hash</strong></strong> — esto se usa principalmente para una coincidencia exacta (=), y no funciona con comparaciones (≥, ≤)</p><p><strong><strong>B-Tree</strong></strong> — Esta es la forma más común en la que se almacenan los tipos de índices (indexes) mencionados anteriormente.</p><p>MySQL utiliza un B-Tree como formato de indexación por defecto. Los datos se almacenan en un<a href="https://es.wikipedia.org/wiki/%C3%81rbol_binario"> árbol binario(binary tree)</a> lo que hace que la recuperación de datos sea rápida.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/xUuJBk8kDuyCrIzQTpfznpiwENHzXr5gMLYC" class="kg-image" alt="xUuJBk8kDuyCrIzQTpfznpiwENHzXr5gMLYC" width="800" height="439" loading="lazy"><figcaption>B-Tree data storage format</figcaption></figure><p>La organización de datos realizada por el B-tree ayuda a omitir el escaneo completo de la tabla en todas las tuplas de nuestra relación.</p><p>Hay un total de 16 nodos en el árbol (B-Tree) anterior. Si necesitamos encontrar el número 6, solamente necesitamos hacer un número total de 3 escaneos para obtenerlo. Esto ayuda a mejorar el rendimiento de la búsqueda.</p><p>Para mejorar el rendimiento en libro_transacciones, agreguemos el index en el campo prestador_id.</p><pre><code>&gt; CREATE INDEX prestadorId ON libro_transaccciones(prestador_id)
----------------------------------------------------
* Ha tardado unos 6.18sec</code></pre><p>El comando anterior agrega un index al campo prestador_id. Veamos cómo esto afecta el rendimiento de los 1,5 millones de datos que tenemos al ejecutar la misma consulta nuevamente.</p><pre><code>&gt; SELECT * FROM libro_transacciones WHERE prestador_id = 1;
Query_ID | Duration   | Query
       1 | 0.00787600 | SELECT * FROM libro_transacciones ...</code></pre><p>Woohoo! Ya hemos vuelto.</p><p>Es tan rápido como cuando solo había 3 registros en nuestra relación. Con el índice (index) correcto agregado, podemos ver una mejora dramática en la duración.</p><h4 id="-ndice-compuesto-y-nico">Índice compuesto y único</h4><p>El índice que hemos agregado es un índice de campo único. Los índices también se pueden agregar a un campo compuesto.</p><p>Si nuestra consulta involucrara varios campos, un índice compuesto nos ayudaría. Podemos agregar un índice compuesto de la siguiente forma:</p><pre><code>&gt; CREATE INDEX prestadorRetornoFecha ON libro_transacciones(pretador_id, retorno_fecha);</code></pre><h4 id="otro-uso-para-los-ndices">Otro uso para los índices</h4><p>Las consultas no son para lo único que sirven los índices. Además se puedan usar para la cláusula <strong><strong>ORDER BY</strong></strong>. Ordenemos los registros en base a prestador_id.</p><pre><code>&gt; SELECT * FROM libro_transacciones ORDER BY prestador_id;
1517185 rows in set (4.08 sec)</code></pre><p><strong><strong>4.08</strong></strong> <strong><strong>sec</strong></strong>, ¡es mucho! ¿qué ha pasado? Tenemos el índice. Profundicemos en cómo se ejecuta la consulta con la ayuda de la cláusula <strong>EXPLAIN</strong>.</p><h4 id="usando-explain"><strong>Usando Explain</strong></h4><p>Podemos agregar una cláusula explain para ver cómo se ejecutará la consulta en nuestro conjunto de datos actual.</p><pre><code>&gt; EXPLAIN SELECT * FROM libro_transacciones ORDER BY prestador_id;
</code></pre><p>El resultado es:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/ZDNJi8luN9QYAnV54eRQ4WZp6WMCQQLnGdOY" class="kg-image" alt="ZDNJi8luN9QYAnV54eRQ4WZp6WMCQQLnGdOY" width="800" height="123" loading="lazy"><figcaption>Using explain to see how the query will be executed</figcaption></figure><p>Hay varios campos que explican las devoluciones. Veamos la tabla anterior e identifiquemos el problema.</p><p><strong><strong>rows</strong> (filas)<strong>: </strong></strong>Número total de filas que se analizarán</p><p><strong><strong>filtered</strong> (filtrado)<strong>: </strong></strong>El porcentaje de fila que se escaneará para obtener los datos.</p><p><strong><strong>type</strong> (tipo)<strong>:</strong> </strong>Se da si se está utilizando el índice. ALL significa que no está usando index.</p><p><strong><strong>possible_keys, key, key_len</strong></strong> son NULL, lo que significa que no se está utilizando ningún índice.</p><p>Entonces, ¿por qué la consulta no usa el índice?</p><p>Es porque tenemos <code>select *</code> en la consulta, lo que significa que estamos seleccionando todos los campos de nuestra relación.</p><p>El índice solo tiene información sobre los campos que están indexados y no sobre otros campos. Esto significa que MySQL deberá ir a la tabla principal para recuperar datos nuevamente.</p><p>Entonces, ¿cómo deberíamos escribir la consulta?</p><h4 id="selecciona-solo-el-campo-requerido">Selecciona solo el campo requerido</h4><p>Para eliminar la necesidad de ir a la tabla principal para la consulta, necesitamos seleccionar solo el valor que está presente en la tabla de índice. Así que cambiemos la consulta a:</p><pre><code>&gt; SELECT prestador_id FROM libro_transacciones ORDER BY prestador_id;
</code></pre><p>Esto devolverá el resultado en 0,46 segundos, que es mucho más rápido. Pero todavía hay margen de mejora.</p><p>Como esta consulta se realiza en todos los 1,5 millones de registros que tenemos, está tomando un poco más de tiempo, ya que necesita cargar datos en la memoria.</p><h4 id="usa-limit"><strong>Usa Limit</strong></h4><p>Es posible que no necesitemos todos los 1,5 millones de datos al mismo tiempo. Entonces, en lugar de obtener todos los datos, usar LIMIT y obtener datos en lotes es una manera &nbsp;mejor de hacerlo.</p><pre><code>&gt; SELECT prestador_id
  FROM libro_transacciones
  ORDER BY prestador_id LIMIT 1000;</code></pre><p>Con un límite establecido, el tiempo de respuesta mejora drásticamente y se ejecuta en 0,0025 segundos. Ahora podemos buscar el siguiente lote con <strong>OFFSET</strong>.</p><pre><code>&gt; SELECT prestador_id
  FROM libro_transacciones
  ORDER BY prestador_id LIMIT 1000 OFFSET 1000;</code></pre><p>Esto buscará el siguiente lote de 1000 filas. Con esto podemos aumentar el desplazamiento y el límite para obtener todos los datos. ¡Pero hay un "te pillé"! Con un aumento en la compensación, el rendimiento de la consulta disminuye.</p><p>Esto se debe a que MySQL escaneará todos los datos para alcanzar el punto de compensación. Por lo tanto, es mejor no utilizar un desplazamiento más alto.</p><h4 id="-qu-pasa-con-la-consulta-count-recuento-">¿Qué pasa con la consulta Count (recuento)?</h4><p>El motor InnoDB tiene la capacidad de escribir simultáneamente. Esto lo hace altamente escalable y mejora el rendimiento por segundo.</p><p>Pero esto tiene un precio. InnoDB no puede agregar un contador de caché para el número de registros en ninguna tabla. Por lo tanto, el recuento debe realizarse en tiempo real escaneando todos los datos filtrados. Esto hace que la consulta COUNT sea lenta.</p><p>Por lo tanto, se recomienda calcular los datos de recuento resumidos en la lógica de la aplicación cuando se trata de una gran cantidad de datos.</p><h3 id="-por-qu-no-agregar-un-ndice-a-todos-los-campos">¿Por qué no agregar un índice a todos los campos?</h3><p>Agregar índice ayuda a mejorar mucho el rendimiento, pero también tiene un precio. Debe utilizarse de forma eficaz. Agregar un índice a más campos tiene los siguientes problemas:</p><ul><li>Necesita mucha memoria, una computadora más grande</li><li>Cuando eliminamos, hay una reindexación (eliminaciones intensivas de CPU y más lentas)</li><li>Cuando agregamos algo, hay reindexación (inserciones intensivas de CPU y más lentas)</li><li>Los cambios a un registro no reindexan por completo, por lo que la actualización es más rápida y eficiente en la CPU.</li></ul><p>Ahora tenemos claro que agregar un índice ayuda mucho. Pero no podemos seleccionar todos los datos, excepto los que están indexados para un rendimiento rápido.</p><p>¿cómo podemos seleccionar todos los atributos y seguir obteniendo un rendimiento rápido?</p><h3 id="particionamiento-partitioning-"><strong>Particionamiento (partitioning)</strong></h3><p>Cuando creamos índices, solamente tenemos información sobre el campo que está indexado. Pero no tenemos datos de los campos que no están presentes en el índice.</p><p>Entonces, como dijimos anteriormente, MySQL necesita mirar hacia atrás en la tabla principal para obtener los datos de otros campos. Esto puede ralentizar el tiempo de ejecución.</p><p>La forma en que podemos resolver esto es mediante particiones.</p><p>El particionamiento es una técnica en la que MySQL divide los datos de una tabla en varias tablas, pero los administra como una sola tabla.</p><p>Al realizar cualquier tipo de operación en la tabla, necesitamos especificar qué partición se está utilizando. Con los datos desglosados, MySQL tiene un conjunto de datos más pequeño para consultar. Determinar la partición correcta de acuerdo con las necesidades es clave para un alto rendimiento.</p><p>Pero si seguimos usando la misma máquina, ¿escalará?</p><h3 id="fragmentaci-n-sharding-">Fragmentación (<strong>Sharding)</strong></h3><p>Con un gran conjunto de datos, almacenar todos sus datos en la misma máquina puede resultar problemático.</p><p>Una partición específica puede ser muy grande y necesitar más consultas, mientras que otras menos. Entonces uno afectará a otro. No pueden escalarse por separado.</p><p>Supongamos que los datos de los últimos tres meses son los más utilizados, mientras que los más antiguos se utilizan menos. Quizás los datos recientes en su mayoría se actualizan / crean, mientras que los datos antiguos en su mayoría solo se leen.</p><p>Para resolver este problema, podemos mover la partición de los últimos tres meses a otra máquina. La fragmentación es una forma en la que dividimos un gran conjunto de datos en fragmentos más pequeños y lo pasamos a RDBMS separados. En otras palabras, la fragmentación también se puede llamar "partición horizontal".</p><p>Las bases de datos relacionales tienen la capacidad de escalar a medida que crece la aplicación. Es necesario encontrar el índice correcto y ajustar la infraestructura según las necesidades.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ HTML vs Body: ¿Cómo configurar el ancho y el alto para el tamaño de la página completa? ]]>
                </title>
                <description>
                    <![CDATA[ CSS es difícil pero también es permisivo, esto nos permite introducir estilo al azar en nuestro CSS. La página todavía carga y no hay "accidentes". Cuando se trata del ancho y el alto de la página ¿Sabes qué configurar del elemento html? ¿Y del elemento body? ¿Simplemente colocas los estilos ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/html-vs-body-como-configurar-el-ancho-y-el-alto-para-el-tamano-de-la-pagina-completa/</link>
                <guid isPermaLink="false">605f2af9b121f60935dc7f88</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Mitchell Contreras ]]>
                </dc:creator>
                <pubDate>Fri, 18 Jun 2021 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/06/measure.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>CSS es difícil pero también es permisivo, esto nos permite introducir estilo al azar en nuestro CSS. La página todavía carga y no hay "accidentes".</p>
<p>Cuando se trata del ancho y el alto de la página ¿Sabes qué configurar del elemento <code>html</code>? ¿Y del elemento <code>body</code>? ¿Simplemente colocas los estilos en ambos elementos y esperas lo mejor? Si lo haces, no estás solo.</p>
<p>Las respuestas a esas preguntas no son intuitivas, Soy culpable de aplicar estilos a ambos elementos en el pasado sin considerar exactamente cuál propiedad debe ser aplicada a qué elemento ?‍. No es raro ver las propiedades CSS aplicadas tanto al elemento <code>html</code> como al elemento <code>body</code> de la siguiente manera:</p>
<pre><code>html, body {
     min-height: 100%;
}
</code></pre>
<h2 id="acasoimporta">¿Acaso importa?</h2>
<p>Si, si importa.</p>
<p>La definición de estilos anterior crea un problema:</p>
<p>Establece la altura mínima al 100% en ambos elementos, y esto no permite que el <code>body</code>llene la página como se esperaría. Cuando verificamos los estilos en las <em>herramientas del desarrollador</em>, el <code>body</code> tiene una altura cero. Mientras tanto, el elemento <code>html</code> tiene una altura igual a la parte visible de la página del navegador.</p>
<p>Miremos la siguiente captura de pantalla de <em>herramientas del desarrollador de Chrome</em>:</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/empty_body.png" class="kg-image" alt="empty_body" width="596" height="280" loading="lazy"></figure><!--kg-card-begin: markdown--><p>El <code>body</code> tiene por defecto un margen de 8px indicado por la barra en la parte superior, pero la altura tiene de valor 0.</p>
<h2 id="porquestoocurre">¿Por qué esto ocurre?</h2>
<p>El uso de un porcentaje como tamaño necesita usar como referencia el elemento padre en el que basar el porcentaje. El elemento <code>html</code> hace referencia a la ventana gráfica que tiene un valor de altura igual a la altura de la ventana gráfica visible. Sin embargo, nosotros solo establecemos el <code>min-value</code> del elemento <code>html</code>... NO un valor a la propiedad <code>height</code>. Por lo tanto, el elemento <code>body</code>no tiene un elemento padre al que hacer referencia cuando establece la propiedad igual al 100%.</p>
<h2 id="elproblemapuedeestaroculto">El problema puede estar oculto</h2>
<p>Si comenzamos con suficiente contenido para el cuerpo de la página web, es posible que no notemos el problema. Y para hacerlo más difícil de observar, si establecemos <code>background-color</code> en ambos elementos o incluso en uno solo de ellos, la ventana gráfica estará llena de ese color. Esto da la impresión que el elemento <code>body</code> es tan grande como la ventana gráfica. Pero no, todavía está en cero.</p>
<p>La imagen anterior fue tomada de una página con el siguiente CSS:</p>
<pre><code>html, body {
    min-height: 100%;
}
body { background-color: dodgerblue; }
</code></pre>
<h2 id="herenciainversa">¿Herencia inversa?</h2>
<p>En un giro extraño, el elemento <code>html</code>asume el <code>background-color</code>del elemento <code>body</code>si no se establece un <code>background-color</code> separado para el elemento <code>html</code>.</p>
<h2 id="entoncesculeslaconfiguracindealturaidealparaunapginafullresponsive">Entonces, ¿cuál es la configuración de altura ideal para una página full responsive?</h2>
<p>Por años, la respuesta fue la siguiente:</p>
<pre><code>html {
    height: 100%;
}
body {
    min-height: 100%;
}
</code></pre>
<p>Esto permite al elemento <code>html</code> hacer referencia a la ventana gráfica y tenga un valor de altura igual al 100%. Con el elemento <code>html</code> recibiendo un valor de altura, el  <code>min-height</code> asignado al elemento <code>body</code> le da una altura inicial que coincide con el elemento <code>html</code>. Esto también permite que el <code>body</code>crezca más alto si el contenido supera el tamaño de lo visible de la página.</p>
<p>El único inconveniente es que el elemento <code>html</code> no crezca más allá de la altura de la ventana gráfica visible. Sin embargo, se ha permitido que el elemento <code>body</code>supere el elemento <code>html</code>.</p>
<h2 id="lasolucinactualestsimplificada">La solución actual está simplificada</h2>
<pre><code>body { min-height: 100vh; }
</code></pre>
<p>En este ejemplo usamos como unidad <strong>vh</strong>(altura de la ventana gráfica) para permitir que el <code>body</code> establezca una altura mínima basada en la altura completa de la ventana gráfica.</p>
<p>Al igual que la discusión anterior de <code>background-color</code>, si nosotros no seteamos el valor de la altura máxima del elemento <code>html</code>, asumirá el mismo valor de la altura del elemento <code>body</code>.</p>
<p>Por lo tanto, esta solución evita el desbordamiento del elemento <code>html</code>presente en la solución anterior y ambos elementos crecen con su contenido.</p>
<p>El uso de la unidad <strong>vh</strong> causó algunos problemas con el navegador móvil en el pasado, pero parece que Chrome y Safary son consistentes con las unidades de visualización ahora.</p>
<h2 id="tamaodepginapuedecausarunscrollhorizontal">Tamaño de página puede causar un scroll horizontal</h2>
<p>Espera... ¿qué? ¿No debería decir "Ancho de página?<br>
¡No!</p>
<p>En otra extraña serie de eventos, la altura de tu página puede activar el scroll horizontal en tu navegador. Cuando el contenido de tu página web es más alto que la altura de la ventana gráfica, se activa la barra del scroll vertical a la derecha. Esto puede causar que tu página tenga instantáneamente una barra de scroll horizontal.</p>
<h2 id="cmopodemossolucionarestproblema">¿Cómo podemos solucionar esté problema?</h2>
<p>Podemos dormir mejor sabiendo que comenzamos con una configuración del ancho de la página. Este problema surge cuando cualquier elemento, no solo los elementos <code>html</code> o <code>body</code>- se establecen con 100vw (ancho de la ventana gráfica).</p>
<p>Las unidades de la ventana gráfica no tienen en cuenta los 10 píxeles aproximados que ocupa la barra de desplazamiento vertical. Por lo tanto, cuando se activa la barra de desplazamiento vertical, también se obtiene una barra de desplazamiento horizontal.</p>
<h2 id="cmoconfiguramoslapginaparaeltamaocompleto">¿Cómo configuramos la página para el tamaño completo?</h2>
<p>Si no establecemos un ancho en los elementos <code>html</code>y <code>body</code>, el tamaño predeterminado de la pantalla será el tamaño completo de la pantalla. Si establecemos un valor de ancho que no sea automático, consideremos restablecer primero el CSS. Recordemos, por defecto el elemento <code>body</code>tiene 8 píxeles de margen en todos los lados.</p>
<p>Reestablecer el CSS elimina esto. De lo contrario, establecer el ancho al 100% antes de eliminar los márgenes hará que el elemento del <code>body</code> desborde. Aquí está el restablecimiento de CSS que uso:</p>
<pre><code>* { 
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
</code></pre>
<h2 id="cmoestablecemoselanchodenuestrapreferencia">¿Cómo establecemos el ancho de nuestra preferencia?</h2>
<p>Si bien puede que no siempre sea necesario establecer un ancho, generalmente lo hago. Puede ser simplemente un hábito.</p>
<p>Si establecemos el ancho al 100% en el elemento <code>body</code>, tendrá un ancho de página completo. Esto es equivalente a no establecer un valor de ancho y permitir el valor predeterminado.</p>
<p>Si deseamos utilizar el elemento del <code>body</code> como un contenedor más pequeño y dejar que el elemento HTML llene la página, podemos establecer un valor de ancho máximo en el <code>body</code>.</p>
<p>Aquí un ejemplo:</p>
<pre><code>html { background-color: #000; } 
body {
    min-height: 100vh;
    max-width: 400px;
    background-color: papayawhip; 
    margin: 0 auto;
}
</code></pre>
<h2 id="conclusin">Conclusión</h2>
<p>Sin una altura proporcionada para el elemento <code>html</code>, establecer <code>height</code> y/o <code>min-height</code> del elemento <code>body</code> no da como resultado la altura (antes de agregar el contenido). Sin embargo, sin un ancho para el elemento <code>html</code>, establecer el ancho del elemento <code>body</code> en 100% da como resultado el ancho de la página completa. Esto puede parecer contra intuitivo y confuso.</p>
<p>Para una página responsive, establezca el <code>min-height</code> del elemento <code>body</code> en 100vh. Si estableces el ancho de página, elije el 100% sobre 100vw para evitar el scroll horizontal.</p>
<p>Les dejo un tutorial de mi canal de YouTube demostrando como configurar el ancho y el alto para una página web que crece con el contenido que contiene:</p>
<p><a href="https://www.youtube.com/watch?v=dpuKVjX6BJ8">HTML Page Width and Height Settings | CSS Full Screen Size</a></p>
<p>¿Tienes una manera diferente de establecer el ancho y el alto que te guste más?</p>
<p>¡Dejame saber tu método!</p>
<p>Traduccion del articulo - <a href="https://www.freecodecamp.org/news/html-page-width-height/">HTML vs Body: How to Set Width and Height for Full Page Size</a> por <a href="https://www.freecodecamp.org/news/author/dave/">Dave Gray</a></p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Dos maneras de desplegar un sitio público de GitHub Pages desde un repositorio privado de Hugo ]]>
                </title>
                <description>
                    <![CDATA[ Mantén tus borradores fuera del ojo público haciendo uso de las herramientas de despliegue continuo para publicar tu sitio público de GitHub Pages - desde un repositorio privado separado. Herramientas como Travis CI y Netlify ofrecen algunas características bastante ingeniosas, como el despliegue sin problemas de tu sitio de GitHub ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/dos-maneras-de-desplegar-un-sitio-publico-de-github-pages-desde-un-repositorio-privado-de-hugo/</link>
                <guid isPermaLink="false">5fe026c88c7cd154bb97bd58</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Arturo Maltos ]]>
                </dc:creator>
                <pubDate>Sun, 11 Apr 2021 04:56:41 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/0_PIWDprt12aR7QsJ8.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <h4 id="mant-n-tus-borradores-fuera-del-ojo-p-blico-haciendo-uso-de-las-herramientas-de-despliegue-continuo-para-publicar-tu-sitio-p-blico-de-github-pages-desde-un-repositorio-privado-separado-">Mantén tus borradores fuera del ojo público haciendo uso de las herramientas de despliegue continuo para publicar tu sitio público de GitHub Pages - desde un repositorio privado separado.</h4><p>Herramientas como Travis CI y Netlify ofrecen algunas características bastante ingeniosas, como el despliegue sin problemas de tu sitio de GitHub Pages cuando los cambios son empujados a su repositorio. Junto con un generador de sitios estáticos como Hugo, el mantenimiento de un blog al día es bastante sencillo.</p><p>He utilizado Hugo para construir mi sitio durante años, pero hasta esta semana pasada nunca había conectado mi repositorio de Pages a ningún servicio de despliegue. ¿Por qué? Porque usar una herramienta que construya mi sitio antes de desplegarlo parecía requerir tener toda la receta en un solo lugar - y si estás usando GitHub Pages con la versión gratuita de GitHub, ese lugar es público. Eso significa que todas mis ideas brillantes de las tres de la mañana y los borradores desordenados sin terminar (y sin gracia) estarían disponibles públicamente - y ninguna conveniencia profunda iba a convencerme de hacer eso.</p><p>Así que mantuve las cosas separadas, con el desorden de Hugo detrás la escena en un repositorio Git local, y la carpeta generada <code>public/</code> empujando a mi repositorio remoto GitHub Pages. Cada vez que quería desplegar mi sitio, tenía que ir a mi portátil y a Hugo para construir mi sitio, luego <code>cd public/ &amp;&amp; git add . &amp;&amp; git commit</code>... etc etc. Y todo estaba bien, excepto por la persistente sensación de que había una mejor manera de hacer esto.</p><p>Hace poco escribí otro artículo sobre el uso de GitHub y Working Copy para hacer cambios en mis repositorios en mi iPad cuando estoy fuera de casa. Me parecía que no podía hacer todo excepto desplegar mi sitio desde mi iPad, así que me propuse cambiar eso.</p><p>Un par de ideas brillantes a las tres de la mañana y un token de acceso revocado (oops), ahora tengo no una, sino dos maneras de desplegar a mi repositorio público de GitHub Pages desde un repositorio de GitHub completamente separado y privado. En este post, te mostraré cómo lograr esto con <a href="https://travis-ci.com/">Travis CI</a> o usando <a href="http://netlify.com/">Netlify</a> y <a href="https://www.gnu.org/software/make/">Make</a>.</p><p>No hay nada de hacking en ello: mi repositorio público de GitHub Pages sigue teniendo el mismo aspecto que cuando lo empujo localmente desde mi terminal. Sólo que ahora puedo aprovechar un par de grandes herramientas de despliegue para que el sitio se actualice cada vez que empujo a mi repositorio privado, ya sea que esté en mi computadora portátil o fuera de casa con mi iPad.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/BWGFKiySx83s7T-PKOSYkuokL5FLBYVDLZ10" class="kg-image" alt="BWGFKiySx83s7T-PKOSYkuokL5FLBYVDLZ10" width="800" height="600" loading="lazy"><figcaption>#YouDidNotPushFromThere</figcaption></figure><p>Este artículo asume que tienes conocimientos de Git y GitHub Pages. Si no es así, es posible que quieras abrir algunas páginas de mis artículos sobre el <a href="https://victoria.dev/blog/a-remote-sync-solution-for-ios-and-linux-git-and-working-copy/">uso de GitHub y Working Copy</a> y la <a href="https://victoria.dev/verbose/how-i-ditched-wordpress-and-set-up-my-custom-domain-https-site-for-almost-free/">construcción de un sitio con Hugo y GitHub Pages</a> primero.</p><p>¡Vamos a hacerlo!</p><h3 id="despliegue-de-github-pages-de-privado-a-p-blico-con-travis-ci">Despliegue de GitHub Pages de privado a público con Travis CI</h3><p>Travis CI tiene la capacidad incorporada (♪) para desplegar a GitHub Pages después de una compilación exitosa. Estos hacen un trabajo decente en la documentación explicando cómo añadir esta funcionalidad, especialmente si has usado Travis CI antes... lo que yo no he hecho. No te preocupes, he realizado la mayor parte de las cosas por ti.</p><ul><li>Travis CI obtiene todas sus instrucciones de un archivo de configuración en la raíz de tu repositorio llamado <code>.travis.yml</code></li><li>Necesitas proporcionar un token de acceso personal de GitHub como una variable encriptada segura, que puedes generar usando travis en la línea de comandos</li><li>Una vez que tu script termine de hacer con éxito lo que le has dicho que haga (no necesariamente lo que quieres que haga, pero eso es otra entrada del blog), Travis desplegará tu directorio de compilación en un repositorio que puedes especificar con la variable de configuración repo.</li></ul><h4 id="preparaci-n-del-archivo-de-configuraci-n-de-travis">Preparación del archivo de configuración de Travis</h4><p>Cree un nuevo archivo de configuración para Travis con el nombre de archivo <code>.travis.yml</code> (tenga en cuenta el "." inicial). Estos scripts son muy personalizables y me costó encontrar un ejemplo relevante para usar como punto de partida - ¡por suerte, no tienes ese problema!</p><p>Aquí está mi <code>.travis.yml</code> básico::</p><pre><code>git:
 depth: false

env:
 global:
 - HUGO_VERSION="0.54.0"
 matrix:
 - YOUR_ENCRYPTED_VARIABLE

install:
 - wget -q https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_${HUGO_VERSION}_Linux-64bit.tar.gz
 - tar xf hugo_${HUGO_VERSION}_Linux-64bit.tar.gz
 - mv hugo ~/bin/

script:
 - hugo --gc --minify

deploy:
 provider: pages
 skip-cleanup: true
 github-token: $GITHUB_TOKEN
 keep-history: true
 local-dir: public
 repo: gh-username/gh-username.github.io
 target-branch: master
 verbose: true
 on:
 branch: master</code></pre><p>Este script descarga e instala Hugo, construye el sitio con el garbage collection y <a href="https://gohugo.io/commands/hugo/#synopsis">las instrucciones</a> de minimificación, y luego despliega el directorio <code>public/</code> en el <code>repo</code> especificado - en este ejemplo, tu repositorio público de GitHub Pages. Puedes leer sobre cada una de las opciones de configuración de <code>deploy</code> aquí.</p><p><a href="https://docs.travis-ci.com/user/environment-variables#defining-encrypted-variables-in-travisyml">Para añadir el token de acceso personal de GitHub como una variable encriptada</a>, no necesitas editar manualmente tu <code>.travis.yml</code>. Los comandos de la gema <code>travis</code> que aparecen a continuación cifrarán y añadirán la variable por ti cuando los ejecutes en el directorio de tu repositorio.</p><p>Primero, instala <code>travis</code> con <code>sudo gem install travis</code>.</p><p>A continuación, <a href="https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line">genera tu token de acceso personal de GitHub</a>, cópialo (¡sólo aparece una vez!) y ejecuta los siguientes comandos en la raíz de tu repositorio, sustituyendo los asteriscos por tu token:</p><pre><code>travis login --pro --github-token xxxxxxxxxxxxxxxxxxxxxxxxxxx
travis encrypt GITHUB_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxx --add env.matrix</code></pre><p>Tu token encriptado aparece mágicamente en el archivo. Una vez que hayas incluido el archivo <code>.travis.yml</code> en tu repositorio privado de Hugo, Travis CI ejecutará el script y, si la compilación tiene éxito, desplegará tu sitio en tu repositorio público de GitHub Pages. ¡Magia!</p><p>Travis siempre ejecutará una compilación cada vez que empuje a su repositorio privado. Si no quiere desencadenar este comportamiento con un commit en particular, <a href="https://docs.travis-ci.com/user/customizing-the-build/#skipping-a-build">añada el comando <code>skip</code> a su mensaje de commit</a>.</p><p><em>Oye, eso es genial, pero me gusta Netlify.</em></p><p>Está bien.</p><h3 id="desplegar-a-un-repositorio-distinto-con-netlify-y-make">Desplegar a un repositorio distinto con Netlify y Make</h3><p>Podemos hacer que Netlify haga nuestro trabajo utilizando un Makefile, que ejecutaremos con el comando de compilación de Netlify.</p><p>Este es el aspecto de nuestro <code>Makefile</code>:</p><pre><code>SHELL:=/bin/bash
BASEDIR=$(CURDIR)
OUTPUTDIR=public
.PHONY: all
all: clean get_repository build deploy
.PHONY: clean
clean:
@echo "Removing public directory"
rm -rf $(BASEDIR)/$(OUTPUTDIR)
.PHONY: get_repository
get_repository:
@echo "Getting public repository"
git clone https://github.com/gh-username/gh-username.github.io.git public
.PHONY: build
build:
@echo "Generating site"
hugo --gc --minify
.PHONY: deploy
deploy:
@echo "Preparing commit"
@cd $(OUTPUTDIR) \
 &amp;&amp; git config user.email "you@youremail.com" \
 &amp;&amp; git config user.name "Your Name" \
 &amp;&amp; git add . \
 &amp;&amp; git status \
 &amp;&amp; git commit -m "Deploy via Makefile" \
 &amp;&amp; git push -f -q https://$(GITHUB_TOKEN)@github.com/gh-username/gh-username.github.io.git master
@echo "Pushed to remote"</code></pre><p>Para preservar el historial Git de nuestro repositorio separado de GitHub Pages, primero lo clonaremos, construiremos nuestro nuevo sitio Hugo en él, y luego lo empujaremos de nuevo al repositorio de Pages. Este script primero elimina cualquier carpeta <code>public/</code> existente que pueda contener archivos o un historial Git. Luego clona nuestro repositorio de Pages a <code>public/</code>, construye nuestro sitio Hugo (esencialmente actualizando los archivos en <code>public/</code>), y luego se encarga de confirmar el nuevo sitio al repositorio de Pages.</p><p>En la sección de <code>deploy (despliegue)</code>, verás que hay líneas que empiezan por &amp;&amp;. Estos son comandos encadenados. Dado que Make <a href="https://www.gnu.org/software/make/manual/html_node/Execution.html#Execution">invoca un nuevo sub-shell para cada línea</a>, comienza de nuevo con cada nueva línea de nuestro directorio raíz. Para conseguir que nuestro <code>cd</code> se mantenga y evitar la ejecución de nuestros comandos Git en el directorio raíz del proyecto, estamos encadenando los comandos y utilizando el carácter de barra invertida para <a href="http://clarkgrubb.com/makefile-style-guide#breaking-long-lines">romper las líneas</a> largas para la legibilidad.</p><p>Encadenando nuestros comandos, somos capaces de <a href="https://stackoverflow.com/questions/6116548/how-to-tell-git-to-use-the-correct-identity-name-and-email-for-a-given-project">configurar nuestra identidad Git</a>, añadir todos nuestros archivos actualizados, y crear un commit para nuestro repositorio Pages.</p><p>Al igual que con Travis CI, tendremos que pasar un <a href="https://github.com/settings/tokens">token de acceso personal de GitHub</a> para empujar a nuestro repositorio público de GitHub Pages - sólo que Netlify no proporciona una forma directa de cifrar el token en nuestro Makefile.</p><p>En su lugar, utilizaremos las <a href="https://www.netlify.com/docs/continuous-deployment/#build-environment-variables">variables de entorno de construcción de Netlify</a>, que viven de forma segura en la configuración de nuestro sitio en la aplicación Netlify. Podemos entonces llamar a nuestra variable token en el Makefile. Lo usamos para empujar (silenciosamente, para evitar imprimir el token en los registros) a nuestro repositorio de Pages <a href="https://stackoverflow.com/questions/44773415/how-to-push-a-commit-to-github-from-a-circleci-build-using-a-personal-access-tok">pasándolo en la URL remota</a>.</p><p>Para evitar la impresión del token en los registros de Netlify, suprimimos la <a href="https://www.gnu.org/software/make/manual/html_node/Echoing.html#Echoing">impresión de la receta</a> para esa línea con el carácter <code>@</code> inicial.</p><p>Con tu Makefile en la raíz de tu repositorio privado de GitHub, puedes configurar Netlify para que lo ejecute por ti.</p><h4 id="configuraci-n-de-netlify">Configuración de Netlify</h4><p>La configuración de Netlify a través de la <a href="https://app.netlify.com/">interfaz web</a> es sencilla. Una vez que te registres en GitHub, elige el repositorio privado de GitHub donde vive tu sitio Hugo. La siguiente página a la que te lleva Netlify te permite introducir los ajustes de despliegue:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/w6TKS71OtIM1jgkarOqfuRpAu-WnEQzz4ZoM" class="kg-image" alt="w6TKS71OtIM1jgkarOqfuRpAu-WnEQzz4ZoM" width="800" height="781" loading="lazy"><figcaption>Create a new site page on Netlify</figcaption></figure><p>Puedes especificar el comando de construcción que ejecutará tu Makefile (<code>make all</code> para este ejemplo). La rama a desplegar y el directorio de publicación no importan demasiado en nuestro caso específico, ya que sólo nos preocupa empujar a un repositorio separado. Puede introducir la típica rama <code>master</code> de despliegue y el directorio <code>public</code> de publicación.</p><p>En "Advanced build settings" haz clic en "New variable" para añadir tu token de acceso personal de GitHub como una variable de entorno de construcción. En nuestro ejemplo, el nombre de la variable es <code>GITHUB_TOKEN</code>. Haz clic en "Deploy site" para que se produzca la magia.</p><p>Si ya has configurado previamente tu repositorio con Netlify, encuentra la configuración para el Despliegue Continuo en Settings &gt; Build &amp; deploy.</p><p>Netlify compilará su sitio cada vez que empuje al repositorio privado. Si no quiere que una confirmación en particular active una compilación, <a href="https://docs.netlify.com/site-deploys/manage-deploys/#skip-a-deploy">añada <code>[skip ci]</code> en su mensaje de confirmación Git</a>.</p><h4 id="lo-mismo-pero-diferente">Lo mismo pero diferente</h4><p>Uno de los efectos de usar Netlify de esta manera es que tu sitio se construirá en dos lugares: uno es el repositorio público de GitHub Pages al que el Makefile empuja, y el otro es tu sitio de Netlify que se despliega en su CDN desde tu repositorio privado de GitHub vinculado. Esto último es útil si vas a jugar con <a href="https://www.netlify.com/blog/2016/07/20/introducing-deploy-previews-in-netlify/">Deploy Previews</a> y otras características de Netlify, pero eso está fuera del alcance de este post.</p><h3 id="salir-y-desplegar-sin-miedo">Salir y desplegar sin miedo</h3><p>Espero que el efecto de esta nueva información sea que te sientas más capaz de actualizar tus sitios, estés donde estés. Las posibilidades son infinitas: en casa, en el sofá, con el portátil, en un café con el iPad o en medio de una primera cita con el teléfono. No hay límites.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/HXM8dI8xKrzd7oA9wLXqjdOSzrWdXKOWmAt8" class="kg-image" alt="HXM8dI8xKrzd7oA9wLXqjdOSzrWdXKOWmAt8" width="800" height="486" loading="lazy"><figcaption>Don’t do stuff on your phone when you’re on a date. Not if you want a second one, anyway.e</figcaption></figure><p>Traducido del artículo <a href="https://www.freecodecamp.org/news/two-ways-to-deploy-a-public-github-pages-site-from-a-private-hugo-repository-627312ec63b9/">Two ways to deploy a public GitHub Pages site from a private Hugo repository</a> de <a href="https://www.freecodecamp.org/news/author/victoria/">Victoria Drake</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo agregar una imagen social a tu repositorio en GitHub ]]>
                </title>
                <description>
                    <![CDATA[ Compartir enlaces sin una imagen social puede convertir un contenido poderoso en un fracaso. ¿Cómo podemos aprovechar al máximo los beneficios que nos brindan las redes sociales cuando compartimos nuestro arduo trabajo en GitHub? ¿Quieres omitir el "qué" y el "por qué"? ¡Salta directo al "cómo"! El impacto de las ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-agregar-una-imagen-de-red-social-a-tu-repositorio-en-github/</link>
                <guid isPermaLink="false">5ffda95f8c7cd154bb98670d</guid>
                
                    <category>
                        <![CDATA[ Programación ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kelvin Sanchez ]]>
                </dc:creator>
                <pubDate>Wed, 03 Mar 2021 05:54:13 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/01/--C-mo.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Compartir enlaces sin una imagen social puede convertir un contenido poderoso en un fracaso. ¿Cómo podemos aprovechar al máximo los beneficios que nos brindan las redes sociales cuando compartimos nuestro arduo trabajo en GitHub?</p><p>¿Quieres omitir el "qué" y el "por qué"? <a href="#agregar-una-imagen-a-tu-repositorio-de-github">¡Salta directo al "cómo"!</a></p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.25%;" class="fluid-width-video-wrapper">
            <iframe src="https://www.youtube.com/embed/KRNiqCLlPNQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" name="fitvid0" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 22px; vertical-align: middle; position: absolute; top: 0px; left: 0px; width: 840px; height: 472.5px;"></iframe>
          </div>
        </div>
      </figure><h2 id="el-impacto-de-las-im-genes-en-las-redes-sociales">El impacto de las imágenes en las redes sociales</h2><p>Cualquier feed de red social es una ráfaga de contenido que puede ser difícil de digerir por completo. A medida que deslizas o te desplazas a través de los feeds, te encontrarás con contenido basado en texto y otros diferentes medios.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/02/twitter-feed-media-1.jpg" class="kg-image" alt="twitter-feed-media-1" width="600" height="400" loading="lazy"><figcaption>Feeds en Twitter usando TweetDeck</figcaption></figure><p>¡Y esto es por una buena razón! Al analizar el ejemplo anterior, ¿qué se destaca? No el <a href="https://twitter.com/uiswarup/status/1230781530907324417">retweet sobre Dust Particle</a> de <a href="https://twitter.com/CodePen">CodePen</a> a la izquierda, sino el de AWS en el medio, la nariz de perro en la parte superior izquierda y Al Pacino en la parte superior derecha entre las otras publicaciones mediáticas grandes.</p><p>Las imágenes, los gifs y los videos son una buena forma de proporcionar contenido llamativo. Como beneficio adicional, por lo general ocupan mucho más espacio en el feed, por lo que es aún más probable que tengas la oportunidad de verlo.</p><h2 id="lo-m-nimo-en-github"><strong><strong><strong><strong><strong>Lo mínimo en Git</strong></strong>H<strong><strong>ub</strong></strong></strong></strong></strong></h2><p>Al compartir tus proyectos de GitHub en las redes sociales, la opción predeterminada es bastante insulsa. Toma este tweet como ejemplo:</p><figure class="kg-card kg-embed-card"><iframe id="twitter-widget-0" scrolling="no" frameborder="0" allowtransparency="true" allowfullscreen="true" class="" title="Twitter Tweet" src="https://platform.twitter.com/embed/index.html?creatorScreenName=colbyfayock&amp;dnt=false&amp;embedId=twitter-widget-0&amp;frame=false&amp;hideCard=false&amp;hideThread=false&amp;id=1226204581824204804&amp;lang=en&amp;origin=https%3A%2F%2Fwww.freecodecamp.org%2Fnews%2Fhow-to-add-a-social-media-image-to-your-github-project%2F&amp;siteScreenName=freecodecamp&amp;theme=light&amp;widgetsVersion=ed20a2b%3A1601588405575&amp;width=550px" data-tweet-id="1226204581824204804" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 22px; vertical-align: middle; position: static; visibility: visible; width: 550px; height: 322px; display: block; flex-grow: 1;" loading="lazy"></iframe></figure><p>GitHub nos brinda una simple <a href="https://developer.twitter.com/en/docs/tweets/optimize-with-cards/overview/abouts-cards">tarjeta de redes sociales</a> que consta de nuestro avatar de GitHub, la ruta de nuestro proyecto y una breve descripción de la parte superior de la página.</p><p>Ahora, es genial que al menos muestren una tarjeta, y para ser justos, ¿Que más podrían mostrar?. Pero este tweet se saltará con bastante facilidad en los feeds de las personas entre las imágenes más grandes y llamativas.</p><h2 id="im-genes-de-red-social-en-github"><strong>Imágenes de red social en GitHub</strong></h2><p>Afortunadamente, GitHub nos provee una forma fácil de agregar una imagen a cada repositorio que puede ayudar a que el contenido que compartamos funcione de mejor manera.</p><p>Con un poco de creatividad, podemos subir una imagen que aprovechará el espacio en los feeds de las personas y conseguirá que tu trabajo reciba la atención que se merece.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/02/canva-social-media-example-2.jpg" class="kg-image" alt="canva-social-media-example-2" width="600" height="400" loading="lazy"><figcaption>Ejemplo de una imagen social usando Canva</figcaption></figure><p>Antes de entrar en detalle, debes saber que para cambiar la imagen del repositorio es necesario tener el acceso adecuado a la configuración del mismo. Si creaste el repositorio, lo más probable es que tengas este acceso.</p><h2 id="buscar-o-crear-una-imagen"><strong><strong><strong>Buscar<strong><strong> o crear una imagen</strong></strong></strong></strong></strong></h2><p>Antes de cargar una imagen, necesitamos una imagen en primer lugar. Puedes escoger una de estas dos alternativas: buscar una imagen o crear una nueva.</p><p>Si escoges la alternativa simple, puedes buscar imágenes gratuitas para usar, son bastante fáciles de encontrar en la web. Uno de mis sitios favoritos es <a href="https://unsplash.com/">Unsplash</a>, ya que normalmente encontrarás imágenes de alta calidad, pero hay un montón de otras que puedes encontrar con <a href="https://www.google.com/search?q=free+stock+photos">una simple búsqueda</a>. Sin embargo, agregar fotos suele ser mejor para publicaciones de blog y publicaciones basadas en contenido.</p><figure class="kg-card kg-embed-card"><iframe id="twitter-widget-1" scrolling="no" frameborder="0" allowtransparency="true" allowfullscreen="true" class="" title="Twitter Tweet" src="https://platform.twitter.com/embed/index.html?creatorScreenName=colbyfayock&amp;dnt=false&amp;embedId=twitter-widget-1&amp;frame=false&amp;hideCard=false&amp;hideThread=false&amp;id=1230190815605121024&amp;lang=en&amp;origin=https%3A%2F%2Fwww.freecodecamp.org%2Fnews%2Fhow-to-add-a-social-media-image-to-your-github-project%2F&amp;siteScreenName=freecodecamp&amp;theme=light&amp;widgetsVersion=ed20a2b%3A1601588405575&amp;width=550px" data-tweet-id="1230190815605121024" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 22px; vertical-align: middle; position: static; visibility: visible; width: 550px; height: 654px; display: block; flex-grow: 1;" loading="lazy"></iframe></figure><p>La mejor alternativa es crear la tuya propia. Una ventaja de crear una imagen es que puedes personalizarla con un texto más grande para captar más atención en el feed.</p><p>Hay un <a href="https://zapier.com/blog/graphic-design-tools-for-social-media-images/">montón de herramientas gratuitas</a> disponibles que te permiten crear una imagen comenzando con una plantilla específica para redes sociales, por lo que no necesitas gastar dinero en <a href="https://www.adobe.com/products/photoshopfamily.html">Photoshop</a> para lograrlo.</p><p>El único requisito para tu imagen es que su tamaño debe ser de al menos 640×320px. De ser posible, céntrate en obtener al menos 1280×640px para asegurarte de que la imagen se muestre en alta resolución en los feeds.</p><h2 id="agregar-una-imagen-a-tu-repositorio-de-github"><strong>Agregar una imagen a tu repositorio de Github</strong></h2><p>Una vez que tenemos nuestra imagen, solo nos queda agregarla a nuestro repositorio, que posiblemente sea la parte más simple.</p><p>Primero, navega a la configuración (settings) de tu repositorio usando la pestaña de navegación en la parte superior de la página. Como recordatorio, debes poder modificar la configuración para cambiar la imagen.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/02/github-settings-page-1.jpg" class="kg-image" alt="github-settings-page-1" width="600" height="400" loading="lazy"><figcaption>Página de configuración de GitHub</figcaption></figure><p>A continuación, desplaza hacia abajo hasta la sección vista previa <em>Social (Social preview), </em> donde si actualmente no tienes ninguna imagen, encontrarás un gran rectángulo vacío con el botón <em>Edit</em> (Editar) en la esquina inferior izquierda.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/02/github-upload-social-image.jpg" class="kg-image" alt="github-upload-social-image" width="600" height="400" loading="lazy"><figcaption>Subir imagen social en GitHub</figcaption></figure><p>Has clic en el botón <em>Edit</em> (Editar), selecciona <em>Upload an image</em> (Cargar una imagen), luego busca la imagen en tu ordenador y selecciona el archivo.</p><p>Una vez seleccionado, el archivo de imagen se cargará en GitHub y se establecerá como imagen social del repositorio.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2020/02/github-social-media-image.jpg" class="kg-image" alt="github-social-media-image" width="600" height="400" loading="lazy"><figcaption>Vista previa de imagen social en GitHub</figcaption></figure><h2 id="pre-visualizar-tu-nueva-imagen"><strong>Pre-visualizar tu nueva imagen</strong></h2><p>Cuando hayas terminado de cargar tu imagen, puedes dirigirte a tu plataforma social favorita y probarla. Por ejemplo, al publicar en Twitter, se mostrará una bonita y grande imagen en lugar de tu pequeño avatar de GitHub.</p><figure class="kg-card kg-embed-card"><iframe id="twitter-widget-2" scrolling="no" frameborder="0" allowtransparency="true" allowfullscreen="true" class="" title="Twitter Tweet" src="https://platform.twitter.com/embed/index.html?creatorScreenName=colbyfayock&amp;dnt=false&amp;embedId=twitter-widget-2&amp;frame=false&amp;hideCard=false&amp;hideThread=false&amp;id=1230604806324183046&amp;lang=en&amp;origin=https%3A%2F%2Fwww.freecodecamp.org%2Fnews%2Fhow-to-add-a-social-media-image-to-your-github-project%2F&amp;siteScreenName=freecodecamp&amp;theme=light&amp;widgetsVersion=ed20a2b%3A1601588405575&amp;width=550px" data-tweet-id="1230604806324183046" style="box-sizing: inherit; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 22px; vertical-align: middle; position: static; visibility: visible; width: 550px; height: 580px; display: block; flex-grow: 1;" loading="lazy"></iframe></figure><p>Como puedes ver, este tweet maximiza el espacio disponible y hace entender de qué se trata el proyecto.</p><h2 id="algunos-consejos-al-crear-im-genes"><strong><strong><strong><strong><strong>Algunos consejos al crear imágenes</strong></strong></strong></strong></strong></h2><h3 id="texto-grande-y-sencillo"><strong><strong><strong><strong><strong>Texto grande y sencillo</strong></strong></strong></strong></strong></h3><p>Puede ser fácil quedarse atrapado sobre-diseñando un gráfico en exceso o no prestar suficiente atención al tamaño de la fuente. Asegúrate de usar letras grandes con una fuente que sea fácil de leer, de modo que cuando alguien se desplace sobre tu publicación, pueda entenderla y no simplemente omitirla.</p><h3 id="agregar-un-logo"><strong><strong><strong><strong><strong>Agregar un logo</strong></strong></strong></strong></strong></h3><p>¿Tienes un logo para tu proyecto? ¿O es un complemento para una herramienta específica? ¡Intenta agregar un logotipo para dar contexto de inmediato sobre el tema del proyecto!</p><h3 id="maximizar-la-resoluci-n"><strong><strong><strong><strong><strong>Maximizar la resolución</strong></strong></strong></strong></strong></h3><p>A nadie le gusta mirar imágenes de mala calidad. Aprovecha todos esos valiosos píxeles y carga una imagen que se traduzca con alta calidad en cualquier feed. GitHub recomienda particularmente un tamaño de imagen de al menos 1280×640px.</p><h2 id="-tienes-otros-trucos-para-maximizar-el-intercambio-en-las-redes-sociales"><strong><strong><strong><strong><strong>¿Tiene</strong></strong>s<strong><strong> otros trucos para maximizar el intercambio en las redes sociales?</strong></strong></strong></strong></strong></h2><p>¡Comparte tus consejos favoritos conmigo en <a href="https://twitter.com/colbyfayock">Twitter</a> !</p><figure class="kg-card kg-image-card"><img src="https://res.cloudinary.com/fay/image/upload/w_2000,h_400,c_fill,q_auto,f_auto/w_1020,c_fit,co_rgb:007079,g_north_west,x_635,y_70,l_text:Source%20Sans%20Pro_64_line_spacing_-10_bold:Colby%20Fayock/w_1020,c_fit,co_rgb:383f43,g_west,x_635,y_6,l_text:Source%20Sans%20Pro_44_line_spacing_0_normal:Follow%20me%20for%20more%20JavaScript%252c%20UX%252c%20and%20other%20interesting%20things!/w_1020,c_fit,co_rgb:007079,g_south_west,x_635,y_70,l_text:Source%20Sans%20Pro_40_line_spacing_-10_semibold:colbyfayock.com/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_68,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_145,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_222,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_295,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/v1/social-footer-card" class="kg-image" alt="Follow me for more Javascript, UX, and other interesting things!" width="2000" height="400" loading="lazy"></figure><ul><li><a href="https://twitter.com/colbyfayock">? Sigueme en Twitter</a></li><li><a href="https://youtube.com/colbyfayock">? ️ Suscríbete a mi Youtube</a></li><li><a href="https://www.colbyfayock.com/newsletter/">✉️ Suscríbete a mi boletín</a></li></ul><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/colbyfayock/"><strong>Colby Fayock</strong></a><strong><strong> - </strong><a href="https://www.freecodecamp.org/news/how-to-add-a-social-media-image-to-your-github-project/">How to Add a Social Media Image to Your Github Project Repository</a></strong>.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
