<?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[ Desarrollo Web - 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[ Desarrollo Web - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/espanol/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 15:27:07 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/espanol/news/tag/desarrollo-web/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Cómo convertirse en Desarrollador Front-End - Habilidades para Desarrollo Web Front-End ]]>
                </title>
                <description>
                    <![CDATA[ Algunos de los profesionales mejores pagados del mundo son los desarrolladores front-end. Ellos usan sus conocimientos y talento para diseñar sitios web atractivos y amigables para el usuario. Los desarrolladores front-end no necesitan un título de grado para trabajar. Solo deben comprender los conceptos fundamentales del desarrollo front-end, de los ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-convertirse-en-desarrollador-front-end-habilidades/</link>
                <guid isPermaLink="false">6536e2e8a37ad203ea2a0c27</guid>
                
                    <category>
                        <![CDATA[ frontend ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Desarrollo Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Constanza Areal ]]>
                </dc:creator>
                <pubDate>Mon, 13 Nov 2023 06:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/11/cover-template--1-.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-to-become-a-frontend-developer/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Become a Front End Developer – Front End Web Dev Skills</a>
      </p><p>Algunos de los profesionales mejores pagados del mundo son los desarrolladores front-end. Ellos usan sus conocimientos y talento para diseñar sitios web atractivos y amigables para el usuario.</p><p>Los desarrolladores front-end no necesitan un título de grado para trabajar. Solo deben comprender los conceptos fundamentales del desarrollo front-end, de los lenguajes de programación, y de entornos de desarrollo front-end.</p><p>En esta guía, aprenderás a cómo convertirte en un desarrollador front-end, primero entendiendo de qué trata el desarrollo front-end, las habilidades técnicas y blandas que se necesitan, los lenguajes y entornos de programación existentes, y los primeros pasos necesarios para empezar.</p><p>En Estados Unidos, un desarrollador front-end puede ganar en promedio USD 86.178 al año, de acuerdo con <a href="https://www.glassdoor.co.in/Salaries/us-front-end-developer-salary-SRCH_IL.0,2_IN1_KO3,22.htm" rel="noreferrer nofollow noopener">Glassdoor</a>. De acuerdo con Payscale, un desarollador front-end "típico" puede ganar un ingreso anual de USD 71.350.</p><p>Si recién incursionas en el mundo de la tecnología, quizás no sabes qué significa front-end u otros términos del mundo del desarrollo web como back-end y full-stack. Por eso, vamos a empezar explicándolos.</p><h2 id="-qu-es-el-front-end"><strong>¿Qué es el front-end?</strong></h2><p>Todos los sitios web que navegamos, los sitios de comercio electrónico de donde compramos productos, los blogs que leemos, y demás sitios son sitios amigables con el usuario y estéticamente agradables realizados por desarrolladores front-end.</p><p>Existen dos grandes áreas del desarrollo web que hay que tener en cuenta cuando se diseñan sitios web y aplicaciones web: el front-end y el back-end.</p><p>El desarrollo front-end está relacionado con la cara visible por el usuario de cualquier aplicación web. Es lo que el usuario ve y con lo que interactúa al hacer clic sobre un botón, desplazarse por la página, completar un formulario, etc. Esto es la funcionalidad del lado del cliente de una aplicación web.</p><p>El back-end se refiere a todos los eventos que ocurren por detrás de escena, como la infraestructura, la conexión y comunicación con la base de datos, etc. Full stack se refiere a la combinación de las áreas de front-end y back-end.</p><h2 id="-qu-es-lo-que-hace-un-desarrollador-front-end"><strong>¿Qué es lo que hace un Desarrollador Front-end?</strong></h2><p>Recién hablábamos de las distintas áreas del desarrollo web: front, back-end y full stack. Así también tenemos distintos desarrolladores, especializados en las distintas áreas del desarrollo web. Por lo que tenemos desarrolladores front-end, desarrolladores back-end y desarrolladores full-stack.</p><p>Un desarrollador front-end es un profesional que tiene a su cargo la tarea de crear la interfaz y la experiencia de usuario (UI/UX) con la que los usuarios interactúan para acceder a la aplicación. Son los que resuelven problemas a través de los lenguajes de programación, herramientas, creatividad y la experiencia para crear un sitio web o aplicación que no solo resuelva el problema del usuario y además tiene un buen diseño.</p><p>Un desarrollador back-end, como dijimos anteriormente, es responsable por todo lo relacionado con la lógica, la comunicación de la base de datos, entre otras cosas.</p><p>Por último, un desarrollador full-stack son los que entienden tanto de desarrollo front-end como de back-end. Esto les permite poder comenzar y terminar un proyecto por sí mismos.</p><p>En un ambiente profesional o de empresa, usualmente hay un diseñador UI/UX quién se encarga de diseñar la interfaz y la experiencia del usuario. </p><p>Ellos después le pasan el diseño a los desarrolladores front-end y back-end, quienes se encargan en la implementación para que la aplicación diseñada funcione en la web.<br>El desarrollador front-end va a recrear el diseño al escribir el código en HTML, CSS y JavaScript.</p><h2 id="c-mo-convertirse-en-desarrollador-front-end"><strong>Cómo convertirse en Desarrollador Front-end</strong></h2><p> Hasta ahora hablamos sobre qué significa front-end y quién es un desarrollador front-end. Ahora, veamos cuáles son los requisitos o habilidades necesarias para poder ser un desarrollador front-end.</p><p>Es importante entender que no es necesario saber todo antes de empezar a trabajar como desarrollador front-end, pero hay saberes fundamentales como HTML, CSS, y JavasScript que siempre van a ser esenciales.</p><h3 id="1-aprende-html-css-y-javascript"><strong><strong>1. </strong>Aprende HTML, CSS, y JavaScript</strong></h3><p>Cuando miramos un sitio en la web, las tres cosas más importantes que componen lo que vemos en la web son HTML, CSS, y JavaScript. Estas son las tres cosas que primero tienes que aprender como base para convertirte un desarrollador front-end.</p><p>Son las bases de los sitios web y aplicaciones, por lo que debes aprenderlos si quieren dedicarte al desarrollo web. Por suerte, hay muchos recursos en línea disponibles para ayudarte en aprender y practicar.</p><h4 id="-qu-es-html"><strong>¿Qué es HTML?</strong></h4><p>HTML significa, por sus siglas en inglés, Lenguaje de Marcado de HyperTexto. Es el esqueleto de todas las páginas web y aplicaciones. Es el bloque para construir más básico de todos. El HTML se usa para estructurar tu página en elementos como párrafos, secciones, encabezados, barras de navegación, etcétera. </p><p>El HTML provee de estructura al contenido que aparece en el sitio web, como imágenes, texto o videos. Una página con solo HTML es muy básica y nada atractiva, por lo que se necesitará usar estilos CSS para hacerla más presentable. </p><p>HTML es frecuentemente el primer lenguaje que los desarrolladores aprenden, ya que es esencial para el trabajo de desarrollo web. ¿Quieres aprender más sobre HTML? Puedes empezar con la certificación en <a href="https://www.freecodecamp.org/espanol/learn/2022/responsive-web-design/">Diseño Web Responsive de freeCodeCamp</a> y el <a href="https://www.freecodecamp.org/news/html-crash-course/">nuevo curso completo de HTML de Beau Carnes (en inglés)</a></p><h4 id="-qu-es-css"><strong>¿Qué es CSS?</strong></h4><p>CSS es la abreviatura, en inglés, para Hojas de Estilo en Cascada, y lo usas para mejorar la apareciencia de una página web con estilos CSS. Estos estilos hacen que tu sitio web sea más atractivo y agradable a la vista para el usuario final.</p><p>¿Quieres aprender más sobre CSS? Para empezar, puedas darle un vistazo a la <a href="https://www.freecodecamp.org/espanol/learn/2022/responsive-web-design/">segunda parte de la certificación de Diseño Web Responsive de freeCodeCamp</a>.</p><h4 id="-qu-es-javascript"><strong>¿Qué es JavaScript?</strong></h4><p>HTML es un lenguaje de marcado, CSS es una hoja de estilo, y después tenemos a JavaScript, el tercer bloque básico de construcción. JavaScript es un lenguaje de programación que te permite hacer tus páginas web más interactivas. Esto puede incluir animaciones, estilos dinámicos, efectos cuando se les hacen clic a los botones, game motion, etcétera.</p><p>Si quieres aprender JavaScript, puedes darle un vistazo a la certificación en <a href="https://www.freecodecamp.org/espanol/news/ghost/#/editor/post/6536e2e8a37ad203ea2a0c27:~:text=https%3A/www.freecodecamp.org/learn/javascript%2Dalgorithms%2Dand%2Ddata%2Dstructures/">Algoritmos de Javascript y Estructura de Datos.</a> Puedes complementar tu aprendizaje con este excelente <a href="https://www.freecodecamp.org/news/learn-javascript-full-course/">curso introductorio a JavaScript</a>.</p><h3 id="2-pr-ctica-con-ejercicios-de-programaci-n"><strong><strong>2. </strong>Práctica con ejercicios de programación</strong></h3><p>Hay una frase que dice "la práctica hace al maestro". Esto significa que si haces algo con frecuencia, cada vez irás mejorando.</p><p>Si quieres convertirte en un desarrollador front-end profesional, tienes que practicar constantemente. Esto te ayudará a aprender los conceptos más profundamente (y no solo lo superficial). Cuanto más practiques, mejor entenderás los conceptos.</p><h3 id="3-mejora-tus-habilidades"><strong><strong>3. </strong>Mejora tus habilidades</strong></h3><p>"Aprende constantemente, siempre hay algo más por aprender", decía Steve Jobs. Esto es verdad para todos los aspectos de la vida, incluidos la programación y el desarrollo front-end.</p><p>Mientras nuevas tecnologías, herramientas, sintaxis y maneras de resolver problemas sigan apareciendo, siempre es mejor estar al tanto de las nuevas tendencias en tecnología para no quedarnos atrás.</p><p>Esto te ayudará a que tus habilidades como desarrollador front-end crezcan. Siempre puedes estar al tanto de todo lo nuevo uniéndote e interactuando con comunidades activas de desarrolladores. <br>Existen muchas comunidades como la comunidad de desarrolladores de freeCodeCamp y todas las comunidades locales &nbsp;que existen alrededor nuestro.</p><h3 id="4-aprende-la-l-nea-de-comandos-y-control-de-versiones"><strong><strong>4. </strong>Aprende la Línea de Comandos y Control de Versiones</strong></h3><p>Como desarrollador front-end, debes entender como funciona la línea de comandos porque te permite acceder a funciones del sistema operativo a través de una interfaz de texto. <br>Muchos desarrolladores profesionales prefieren las CLIs (Command Line Interface, por sus siglas en inglés) por su velocidad y rendimiento al instalar librerías y frameworks. </p><p>Los desarrolladores front-end también deben estar familiarizados con sistemas de control de versiones como Git, que es el más usado. Al programar, frecuentemente vas a querer hacer seguimiento de los que vas programando y otras informaciones.</p><p>El control de versiones lo hace mucho más fácil porque te permite a ti y a tu equipo comunicarte y seguir todos los cambios al código original de manera eficiente.<br>También te proporciona información sobre quién hizo el cambio y qué cambio hizo.</p><h3 id="5-entendiendo-las-interfaces-de-programaci-n-de-aplicaciones-apis-"><strong><strong>5. </strong>Entendiendo las Interfaces de Programación de Aplicaciones (APIs)</strong></h3><p>Como desarrollador front-end profesional, tienes que estar familiarizado con las APIs, sobretodo en cómo usarlas. Esto es importante para poder comunicarte con la lógica del back-end y las bases de datos.</p><p>Para interactuar con APIs usando JavaScript, mayormente vas a usar la Fetch API de tu navegador o la librería Axios. Este artículo explica <a href="https://www.freecodecamp.org/espanol/news/fetch-api-como-realizar-un-get-request-y-un-post-request-en-javascript/">cómo usar Fetch API con JavaScript. </a></p><h3 id="6-aprende-c-mo-funcionan-las-librer-as-de-javascript-css"><strong><strong>6. </strong>Aprende cómo funcionan las librerías de JavaScript/CSS</strong></h3><p>Actualmente, hay muchas librerías de JavaScript, todas ellas apuntan a hacer el desarrollo de un aplicación web más fácil. &nbsp;Todas son scripts de JavaScript que hacen que el desarrollo de aplicaciones basadas en JavaScript sea más fácil.</p><p>Hay muchas librerías como React, Vue, o Angular (tres de las más populares), por lo cual es mejor elegir una y profundizar en su aprendizaje. Puedes darle una mirada al <a href="https://www.freecodecamp.org/espanol/learn/front-end-development-libraries/">curso de certificación el librerías de desarrollo frontend de freeCodeCamp</a> para aprender más.</p><p>También hay algunas librerías de estilo para darle estilo a tus páginas web de manera simple como Bootstrap, Sass/Scss, Tailwind, y otras.</p><h3 id="7-construye-tu-portfolio-online"><strong><strong>7. </strong>Construye tu portfolio online</strong></h3><p>Construir tu portfolio es un manera fácil de mostrar tu habilidad como desarrollador front-end.</p><p>Si recién estás comenzando como desarrollador front-end, no es necesario que cada proyecto que muestres en tu portfolio pertenezca a un cliente. Podes tomar la iniciativa y ser creativo.</p><p>Usa nuevas herramientas y librerías para crear algo espectacular. Mientras vayas avanzando en tu carrera, podrás incluir los proyectos en los que vayas trabajando.</p><p>También podes darle una mirada los portfolios de otros desarrolladores front-end para inspirarte y ver qué es lo que te gusta o no. Entonces, al saber que es lo que quieres mostrar al mundo, ya puedes crear tu propio sitio web.</p><p><a href="https://www.freecodecamp.org/news/create-a-portfolio-website-using-html-css-javascript/">Aquí tienes un curso entretenido</a> que te ayudará a construir tu propio portfolio con HTML, CSS y JavaScript- para que puedas practicar esas habilidades de desarrollo web.</p><p>Puedes hacer que tus amigos y miembros de la comunidad te den feedback sobre tu sitio para asegurarte de que todo se ve y funciona bien. No debes olvidarte que todas las palabras que uses en tu sitio web deberían ayudarte a conseguir un buen trabajo. No vas a querer que los textos que incluyas sean demasiados largos o aburridos.</p><p><a href="https://www.freecodecamp.org/news/level-up-developer-portfolio/">Aquí tienes algunos tips</a> que te ayudarán a que tu portfolio desarrollador realmente destaque.</p><h3 id="8-cultiva-tus-habilidades-blandas"><strong><strong>8. </strong>Cultiva tus habilidades blandas</strong></h3><p>Los desarrolladores front-end deben ser comunicadores eficaces, tanto en lo escrito como lo oral, porque interactúan con el equipo técnico y con el cliente.</p><p>También deben ser excelentes comunicadores a través de su código, por lo que es crucial que se tomen el tiempo para comentar dentro del código y escribir la documentación apropiada así tanto tu como otros desarrolladores pueden entenderlo, aún cuando haya pasado tiempo.</p><p>Los desarrolladores front-end también deben prestar atención a los detalles y ser meticulosos en todos los aspectos relacionados con su trabajo. Tienen que tener un buen ojo y ser capaces de darse cuenta de pequeños errores o inconsistencias que pueden existir al momento de crear una página web.</p><p>Y los desarrolladores front-end deben también ser también capaces de seguir aprendiendo durante toda su vida, porque los sitios web siempre están evolucionando y las expectativas en cuanto a accesibilidad y apariencia siempre están cambiando. Los ingenieros front-end deben estar en constante actualización, ya que seguramente necesitarán aprender nuevos lenguajes de programación o librerías, a lo largo del tiempo. &nbsp;</p><h3 id="9-empieza-a-postularte-a-las-pasant-as-o-puestos-de-trabajo-que-quieras"><strong><strong>9. </strong>Empieza a postularte a las pasantías o puestos de trabajo que quieras</strong></h3><p>Una vez que tengas el conocimiento de frontend necesario a través del aprendizaje de las habilidades necesarios y de <a href="https://www.freecodecamp.org/news/how-to-write-a-developer-resume-recruiters-will-read/">la creación de un curriculum vitae simple</a>, puedes empezar a buscar ofertas de trabajo relacionadas con el front-end.</p><p>Chequea los requisitos de las ofertas para ver en que otras áreas necesitas mejorar como desarrollador front-end.</p><p> Finalmente, siempre postúlate a trabajos y nunca tengas miedo de hacerlo. Esto te dará experiencia para ayudarte a comprender cómo son los procesos de contratación de las empresas y qué es lo que se necesita para ser contratados.</p><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>En este artículo, hemos aprendido qué es un desarrollador front-end y qué es lo que se necesita para convertirse en uno.</p><p>También hemos aprendido que convertirse en un desarrollador front-end sin título no solo es posible, sino que hasta alcanzable.</p><p>Una pregunta final que las personas se hacen mucho es cuánto se tarda para convertirse en desarrollador front-end. Bueno, el tiempo depende totalmente de tu ritmo de aprendizaje y conocimientos previos que tengas.</p><p>Solo recuerda que no debes compararte a ti o tu ritmo de aprendizaje con el de otros mientras estás aprendiendo. Resérvate un momento cada semana o día para aprender, apégate a ese hábito lo mejor que puedas y luego disfruta. <br><br></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Cómo triunfar en la entrevista de programación: consejos que me ayudaron a conseguir ofertas de trabajo de Google, Airbnb y Dropbox ]]>
                </title>
                <description>
                    <![CDATA[ En 2017, pasé por algunas entrevistas de programación y recibí ofertas de varias grandes empresas tecnológicas. Entonces, en ese momento, decidí compartir lo que había aprendido en este artículo. Y es que lo acabo de actualizar para 2022, por lo que será relativamente útil y relevante si estás buscando trabajo ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/como-triunfar-en-la-entrevista-de-programacion-consejos-que-me-ayudaron-a-conseguir-ofertas-de-trabajo-de-google-airbnb-y-dropbox/</link>
                <guid isPermaLink="false">64852f964ecd43077f3f625e</guid>
                
                    <category>
                        <![CDATA[ Desarrollo Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Andrés  Torres ]]>
                </dc:creator>
                <pubDate>Mon, 26 Jun 2023 18:15:42 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2023/06/1_Qf9fEs5XdOEQiWX3R6R6ww.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artículo original:</strong> <a href="https://www.freecodecamp.org/news/coding-interviews-for-dummies-5e048933b82b/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Rock the Coding Interview – Tips That Helped Me Land Job Offers from Google, Airbnb, and Dropbox</a>
      </p><p>En 2017, pasé por algunas entrevistas de programación y recibí ofertas de varias grandes empresas tecnológicas. Entonces, en ese momento, decidí compartir lo que había aprendido en este artículo.</p><p>Y es que lo acabo de actualizar para 2022, por lo que será relativamente útil y relevante si estás buscando trabajo ahora.</p><p>A pesar de obtener calificaciones decentes tanto en mi clase de Algoritmos CS101 como en mi clase de Estructuras de Datos en la universidad, me estremezco al pensar en pasar por una entrevista de programación que se enfoca en algoritmos.</p><p>Por lo tanto, pasé los últimos tres meses averiguando cómo mejorar mis habilidades de programación de entrevistas y finalmente recibí ofertas de grandes compañías tecnológicas como Google, Facebook, Airbnb, Lyft, Dropbox y más.</p><p>En esta publicación, compartiré las ideas y los consejos que obtuve en el camino. Los candidatos experimentados también pueden esperar preguntas sobre el diseño de sistemas, pero eso está fuera del alcance de esta publicación.</p><p>Muchos de los conceptos algorítmicos probados en entrevistas de programación no son los que uso habitualmente en el trabajo, donde soy Ingeniero Front End (web). Naturalmente, me he olvidado un poco de estos algoritmos y estructuras de datos, que aprendí principalmente durante mi primer y segundo año de universidad.</p><p>Es estresante tener que producir código (de trabajo) en una entrevista, mientras alguien examina cada pulsación de tecla que haces. Lo que es peor es que, como entrevistado, se te anima a comunicar su proceso de pensamiento en voz alta al entrevistador.</p><p>Solía pensar que ser capaz de pensar, programar y comunicarse simultáneamente era una hazaña imposible, hasta que me di cuenta de que la mayoría de las personas simplemente no son buenas programando en entrevistas cuando recién comienzan. La entrevista es una habilidad en la que puedes mejorar estudiando, preparándose y practicando.</p><p>Mi reciente búsqueda de trabajo me ha llevado a un viaje para mejorar mis habilidades de programación en las entrevistas. A los ingenieros front-end les gusta despotricar sobre cómo se rompe el proceso de contratación actual porque las entrevistas técnicas pueden incluir habilidades que no están relacionadas con el desarrollo front-end. </p><p>Por ejemplo, escribir un algoritmo de resolución de laberintos y fusionar dos listas ordenadas de números. Como ingeniero front-end, puedo empatizar con ellos.</p><p>El front-end es un dominio especializado en el que los ingenieros tienen que preocuparse por muchos problemas relacionados con la compatibilidad de los navegadores, el modelo de objetos del documento, el rendimiento de JavaScript, los diseños de CSS, etc. </p><p>Es poco común que los ingenieros front-end implementen algunos de los complejos algoritmos probados en las entrevistas.</p><blockquote>En empresas como Facebook y Google, las personas son ingenieros de software en primer lugar y, en segundo lugar, expertos en dominios.<br></blockquote><p>Lamentablemente, las reglas las establecen las empresas, no los candidatos. Hay un gran énfasis en conceptos generales de informática como algoritmos, patrones de diseño, estructuras de datos. Habilidades básicas que debe poseer un buen ingeniero de software. Si deseas el trabajo, debes seguir las reglas establecidas por los maestros del juego: ¡Mejorar tus habilidades de entrevista de programación!</p><p>Este post está estructurado en las siguientes dos secciones. Siéntete libre de pasar directamente a la sección que te interese.</p><ul><li>El desglose de las entrevistas de programación y cómo prepararse para ellas.</li><li>Sugerencias y sugerencias útiles para cada tema de algoritmo (matrices, árboles, programación dinámica, etc.), junto con preguntas de práctica recomendadas de LeetCode para revisar los conceptos básicos y mejorar esos temas.</li></ul><p>El contenido de esta publicación <a href="https://www.techinterviewhandbook.org/">se puede encontrar aquí</a>. Haré actualizaciones allí cuando sea necesario.</p><p>Si estás interesado en el contenido de Front End, consulta mi <a href="https://www.frontendinterviewhandbook.com/">manual de entrevistas de front end aquí.</a></p><h2 id="elige-un-lenguaje-de-programaci-n">Elige un lenguaje de programación</h2><p>Antes que nada, debe elegir un lenguaje de programación para su entrevista de programación algorítmica.</p><p>La mayoría de las empresas te permitirán programar en el lenguaje de tu elección. La única excepción que conozco es Google. Permiten que sus candidatos elijan solo Java, C++, Python, Go o JavaScript.</p><p>En su mayor parte, recomiendo utilizar un lenguaje con el que esté muy familiarizado, en lugar de uno que sea nuevo para usted pero que la empresa utilice ampliamente.</p><p>Hay algunos lenguajes que son más adecuados que otros para codificar entrevistas. Luego hay algunos que absolutamente querrás evitar.</p><p>Según mi experiencia como entrevistador, la mayoría de los candidatos eligen Python o Java. Otros lenguajes comúnmente seleccionados incluyen JavaScript, Ruby y C++. Absolutamente, evitaría los lenguajes de nivel inferior como C o Go, simplemente porque carecen de estructuras de datos y funciones de biblioteca estándar.</p><p>Personalmente, Python es mi elección de facto para codificar algoritmos durante las entrevistas. Es sucinto y tiene una enorme biblioteca de funciones y estructuras de datos.</p><p>Una de las principales razones por las que recomiendo Python es que utiliza API consistentes que operan en diferentes estructuras de datos, como <code>len()</code>, <code>for ... in ...</code> y notación de corte en secuencias (cadenas, listas y tuplas). Obtener el último elemento en una secuencia es <code>arr[-1]</code> , e invertirlo es simplemente <code>arr[::-1]</code>. Puede lograr mucho con una sintaxis mínima en Python.</p><p>Java también es una opción decente. Pero debido a que tendrás que declarar constantemente tipos en su código, significa ingresar pulsaciones de teclas adicionales. Esto ralentizará la velocidad a la que codifica y escribe. Este problema será más evidente cuando tengas que escribir en una pizarra durante las entrevistas en el sitio.</p><p>Las razones para elegir o no C++ son similares a Java. En última instancia, Python, Java y C++ son opciones decentes. Si has estado usando Java por un tiempo y no tienes tiempo para familiarizarse con otro lenguaje, te recomiendo que te ciña a Java en lugar de retomar Python desde cero.</p><p>Esto te ayuda a evitar tener que usar un lenguaje para el trabajo y otro para las entrevistas. La mayoría de las veces, el cuello de botella está en el pensamiento y no en la escritura.</p><p>Una excepción a la convención de permitir que el candidato "escoja cualquier lenguaje de programación que desee" es cuando la entrevista es para un puesto de dominio específico, como roles de ingeniero front-end, iOS o Android. Debes estar familiarizado con los algoritmos en JavaScript, Objective-C, Swift y Java, respectivamente.</p><p>Si necesitas usar una estructura de datos que el lenguaje no admite, como una cola o un montón en JavaScript, pregúntale al entrevistador si puede suponer que tiene una estructura de datos que implementa ciertos métodos con complejidades de tiempo específicas. </p><p>Si la implementación de esa estructura de datos no es crucial para resolver el problema, el entrevistador generalmente lo permitirá.</p><p>En realidad, ser consciente de las estructuras de datos existentes y seleccionar las adecuadas para abordar el problema en cuestión es más importante que conocer los intrincados detalles de implementación.</p><h2 id="revisa-introducci-n-a-las-ciencias-de-la-computaci-n">Revisa introducción a las ciencias de la computación</h2><p>Si has estado fuera de la universidad durante algún tiempo, es muy recomendable que revises los fundamentos de CS. Prefiero repasarlo mientras practico. Escaneo mis notas de la universidad y reviso los diversos algoritmos mientras trabajo en los problemas de algoritmos de LeetCode y Cracking the Coding Interview.</p><p>Si tienes interés en cómo se implementan las estructuras de datos, consulta <a href="https://github.com/yangshun/lago">Lago</a>, un repositorio de GitHub que contiene ejemplos de estructuras de datos y algoritmos en JavaScript.</p><figure class="kg-card kg-bookmark-card"><a class="kg-bookmark-container" href="https://github.com/yangshun/lago"><div class="kg-bookmark-content"><div class="kg-bookmark-title">GitHub - yangshun/lago: ? Data Structures and Algorithms library in TypeScript</div><div class="kg-bookmark-description">? Data Structures and Algorithms library in TypeScript - GitHub - yangshun/lago: ? Data Structures and Algorithms library in TypeScript</div><div class="kg-bookmark-metadata"><img class="kg-bookmark-icon" src="https://github.githubassets.com/favicons/favicon.svg" width="32" height="32" alt="favicon" loading="lazy"><span class="kg-bookmark-author">GitHub</span><span class="kg-bookmark-publisher">yangshun</span></div></div><div class="kg-bookmark-thumbnail"><img src="https://opengraph.githubassets.com/39ada1a566f82185e85c8120be8d9c0d1608443f10be70f2430769f3ac8cbbdd/yangshun/lago" width="1200" height="600" alt="lago" loading="lazy"></div></a></figure><h2 id="la-maestr-a-deviene-de-la-pr-ctica">La maestría deviene de la práctica</h2><p>Luego, adquiere familiaridad y dominio de los algoritmos y las estructuras de datos en el lenguaje de programación elegido.</p><p>Practica y resuelve preguntas de algoritmos en el lenguaje que elijas. Si bien Cracking the Coding Interview es un buen recurso, prefiero resolver problemas escribiendo código, dejándolo funcionar y recibiendo comentarios instantáneos.</p><p>Existen diversos recursos online como <a href="https://leetcode.com/" rel="noopener">LeetCode</a>, <a href="https://www.hackerrank.com/" rel="noopener">HackerRank</a>, y <a href="http://codeforces.com/" rel="noopener">CodeForces</a> con los que puedes practicar ejercicios a la vez que te acostumbras al lenguaje. </p><p>Según mi experiencia, las preguntas de LeetCode son muy similares a las preguntas que se hacen en las entrevistas.</p><p>Las preguntas de HackerRank y CodeForces son más similares a las preguntas de la programación competitiva. Si practicas suficientes preguntas de LeetCode, es muy probable que veas o completes una de las preguntas de su entrevista real (o alguna variante de la misma).<br>Aprender y llegar a comprender las complejidades de tiempo y espacio de las operaciones comunes en el lenguaje elegido. Para Python, esta página será útil. Además, aprende sobre el algoritmo de clasificación subyacente que se usa en la función sort() del lenguaje y sus complejidades de tiempo y espacio (en Python es Timsort, que es un híbrido).<br>Después de completar una pregunta sobre LeetCode, generalmente agrego las complejidades de tiempo y espacio del código escrito como comentarios sobre el cuerpo de la función. </p><p>En lo personal utilizo los comentarios para recordarme comunicar el análisis del algoritmo después de haber completado la implementación.<br>Lee sobre el estilo de programación recomendado para tu lenguaje y apégate a él. Si eliges Python, consulta la Guía de estil. Si eliges Java, consulta la Guía de estilo de Java de Google.<br>Aprende y acostúmbrate a las trampas y advertencias comunes del lenguaje. Si las señalas durante la entrevista y evitas caer en ellos, ganarás puntos de bonificación e impresionarás al entrevistador, independientemente de si el entrevistador está familiarizado con el lenguaje o no.<br>Obtén una amplia exposición a las preguntas de varios temas. En la segunda mitad del artículo, menciono temas de algoritmos y las preguntas útiles para practicar cada tema. Hacer alrededor de 100 a 200 preguntas de LeetCode debería considerarse como algo bueno.</p><p>Si prefieres cursos donde el aprendizaje está más estructurado, aquí hay algunas recomendaciones. De ninguna manera es obligatorio tomar cursos en línea para aprobar las entrevistas.</p><ul><li><a href="https://algo.monster/">AlgoMonster</a> :Tiene como objetivo ayudarlo a superar la entrevista técnica en el menor tiempo posible. Diseñado por los ingenieros de Google, AlgoMonster utiliza un enfoque basado en datos para enseñarte los patrones de preguntas clave más útiles y tiene contenido para ayudarte a revisar rápidamente las estructuras de datos y los algoritmos básicos. Lo mejor de todo es que AlgoMonster no está basado en suscripción: paguas una tarifa única y obtienes acceso de por vida.</li><li><a href="https://www.educative.io/courses/grokking-the-coding-interview">Grokking the Coding Interview: Patterns for Coding Questions</a>: por Educative amplía las preguntas de práctica recomendadas en este artículo, pero aborda la práctica desde una perspectiva de patrón de preguntas. Este es un enfoque con el que también estoy de acuerdo para aprender y que he usado personalmente para mejorar en las entrevistas de programación. El curso te permite practicar preguntas seleccionadas en Java, Python, C++, JavaScript y también proporciona soluciones de muestra en esos lenguajes. Aprende y entiende los patrones, no memorices las respuestas.<br>Y por supuesto, práctica, práctica y más práctica!</li></ul><h2 id="fases-de-una-entrevesta-de-programaci-n"><strong>Fases de una entrevesta de programación </strong></h2><p>¡Felicitaciones, estás listo para poner en práctica tus habilidades! En una entrevista de programación, el entrevistador te hará una pregunta técnica. Escribirás el código en un editor colaborativo en tiempo real (pantalla del teléfono) o en una pizarra (<em>whiteboard</em>), y tendrás de 30 a 45 minutos para resolver el problema. </p><p>¡Aquí es donde comienza la verdadera diversión!<br>Tu entrevistador buscará que cumplas con los requisitos del puesto. Depende de ti demostrarles que tienes las habilidades. Inicialmente, puede parecer extraño hablar mientras programan, ya que la mayoría de los programadores no tienen la costumbre de explicar en voz alta sus pensamientos mientras escriben el código.<br>Sin embargo, es difícil para el entrevistador saber lo que estás pensando con solo mirar tu código. </p><p>Si comunicas tu enfoque al entrevistador incluso antes de comenzar a codificar, puedes validar tu enfoque con ellos. De esta manera, los dos pueden ponerse de acuerdo sobre un enfoque aceptable.</p><h2 id="prepar-ndote-para-una-entrevista-remota">Preparándote para una entrevista remota</h2><p>Para pantallas telefónicas y entrevistas remotas, ten papel y bolígrafo o lápiz para anotar notas o diagramas. Si te hacen una pregunta sobre árboles y gráficos, generalmente ayuda si dibuja ejemplos de la estructura de datos.</p><p>Usa auriculares. Asegúrate de estar en un ambiente tranquilo. No querrás tener un teléfono en una mano y escribir con la otra. Trate de evitar el uso de altavoces. Si la retroalimentación es mala, la comunicación se hace más difícil. Tener que repetirse solo resultará en la pérdida de un tiempo valioso.</p><h2 id="-qu-hacer-cuando-tengas-la-pregunta">¿Qué hacer cuando tengas la pregunta?</h2><p>Muchos candidatos comienzan a programar tan pronto como escuchan la pregunta. Eso suele ser un gran error. Primero, tómate un momento y repita la pregunta al entrevistador para asegurarse de que comprendes la pregunta. </p><p>Si no entiendes la pregunta, entonces el entrevistador puede aclararla.<br>Siempre busca una aclaración sobre la pregunta al escucharla, incluso si crees que está clara. Es posible que descubras que te has perdido de algo. De esta forma también le muestras al entrevistador que estás atento a los detalles.</p><p>Considera hacer las siguientes preguntas.</p><ul><li>¿Cuál es el tamaño del <em>input</em>?</li><li>¿Cuál es el tamaño del rango de valores?</li><li>¿Qué tipo de valores hay? ¿Hay números negativos? ¿Puntos flotantes? ¿Habrá entradas vacías?</li><li>¿Hay duplicados en el <em>input</em>?</li><li>¿Cuáles son algunos casos extremos que aplican para el <em>input</em>?</li><li>¿Cómo se almacena el input ? Si me dan un diccionario de palabras... ¿Es una lista de cadenas o un <em>trie</em>?</li></ul><p>Después de haber aclarado suficientemente el alcance y la intención del problema, explica tu enfoque de alto nivel al entrevistador, incluso si es una solución ingenua. Si estás atascado, considera varios enfoques y explica en voz alta por qué puede o no funcionar. A veces, tu entrevistador puede dar pistas y guiarte hacia el camino correcto.<br>Comienza con un enfoque algo directo; comunica al entrevistador. Explica las complejidades de tiempo y espacio y aclara por qué es malo. En este punto, el entrevistador generalmente mostrará el temido "¿Podemos hacerlo mejor?" pregunta. </p><p>Esto significa que<strong> están buscando un enfoque más óptimo.</strong><br>Esta suele <strong>ser la parte más difícil de la entrevista. </strong>En general, busca trabajos repetidos e intenta optimizarlos almacenando potencialmente en caché el resultado calculado en alguna parte. </p><p>Consúltalo más tarde, en lugar de calcularlo todo de nuevo. Proporciono aquí algunos consejos sobre cómo abordar preguntas específicas del tema en detalle a continuación.<br>Solo comienza a programar después de que tú y tu entrevistador hayan acordado un enfoque y le hayan dado luz verde.</p><h2 id="comenzando-a-programar"><strong>Comenzando a programar</strong></h2><p>Usa un buen estilo para escribir tu código. Leer código escrito por otros no suele ser una tarea agradable. Leer código con un formato horrible escrito por otros es aún peor. Tu objetivo es hacer que su entrevistador entienda tu código para que pueda evaluar rápidamente si tu código hace lo que se supone que debe hacer y si resuelve un problema determinado.<br>Utiliza nombres de variables claros y evita nombres que sean letras sueltas, a menos que sean para iteración. Sin embargo, si estás programando en <em>whiteboard</em>, evita usar nombres de variables detallados. Esto reduce la cantidad de escritura que tendrás que hacer.<br>Siempre explica al entrevistador lo que estás escribiendo. No se trata de leer, palabra por palabra, al entrevistador el código que estás produciendo. Habla sobre la sección del código que estás implementando actualmente en un nivel superior. Explica por qué está escrito así y qué estás tratando de lograr.<br>Cuando copies y pegues el código, considera si es necesario. A veces lo es, a veces no lo es. </p><p>Si te encuentras copiando y pegando una gran cantidad de código que abarca varias líneas, probablemente sea un indicador de que puedas reestructurar el código extrayendo esas líneas en una función. Si se trata de una sola línea que copiaste, por lo general está bien.<br>Sin embargo, recuerda cambiar las variables respectivas en tu línea de código copiada cuando sea relevante. Los errores de copiado y pegado son una fuente común de errores, ¡Incluso en la programación diaria!</p><h2 id="despu-s-de-programar">Después de programar</h2><p>Una vez que hayas terminado de codificar, no anuncies inmediatamente al entrevistador que has terminado. En la mayoría de los casos, tu código no suele ser perfecto. Puede contener bugs o errores de sintaxis. Lo que tienes que hacer es revisar tu código.<br>Primero, revisa tu código de principio a fin. Míralo como si lo hubiera escrito otra persona, lo estás viendo por primera vez y tratando de detectar errores en él. Eso es exactamente lo que hará tu entrevistador. Revisa y arregla cualquier problema que puedas encontrar.<br>A continuación, propón casos de prueba pequeños y avance a través del código (no tu algoritmo) con esas entradas de muestra.<br>A los entrevistadores les gusta cuando les lees la mente. Lo que suelen hacer después de que hayas terminado de codificar es pedirte que escribas pruebas. Es una gran ventaja si escribes pruebas para su código incluso antes de que te soliciten que lo haga. Deberías estar emulando un depurador al recorrer su código. Anota o diles los valores de ciertas variables mientras guía al entrevistador a través de las líneas de código.</p><p>Si hay grandes fragmentos de código duplicados en su solución, reestructura el código para mostrarle al entrevistador que valoras la progamación de calidad. Además, busca lugares donde pueda hacer una <a href="https://en.wikipedia.org/wiki/Short-circuit_evaluation">evaluación de cortocircuito.</a></p><p><br>Por último, menciona las complejidades de tiempo y espacio de su código y explicas por qué es así. Puedes anotar fragmentos de su código con sus diversas complejidades de tiempo y espacio para demostrar su comprensión del código. Incluso puedes proporcionar las API de su lenguaje de programación elegido. Explica cualquier compensación entre tu enfoque actual y los enfoques alternativos, posiblemente en términos de tiempo y espacio.<br>Si tu entrevistador está satisfecho con la solución, la entrevista generalmente termina aquí. </p><p>También es común que el entrevistador te haga preguntas de extensión, como cómo manejarías el problema si toda la entrada es demasiado grande para caber en la memoria, o si la entrada llega como un flujo. Esta es una pregunta de seguimiento común en Google, donde se preocupan mucho por la escala.<br>La respuesta suele ser un enfoque de divide y vencerás: realiza un procesamiento distribuido de los datos y solo lee ciertos fragmentos de la entrada del disco en la memoria, escribe la salida nuevamente en el disco y combínalos más tarde.</p><h2 id="practica-con-entrevistas-simuladas">Practica con entrevistas simuladas</h2><p>Los pasos mencionados anteriormente se pueden ensayar una y otra vez hasta que los hayas internalizado por completo y se conviertan en una segunda naturaleza para ti. Una buena manera de practicar es asociarse con un amigo y turnarse para entrevistarse.<br>Un gran recurso para prepararse para entrevistas de codificación es <a href="https://iio.sh/r/DMCa">interviewing.io.</a> Esta plataforma ofrece entrevistas de práctica gratuitas y anónimas con ingenieros de Google y Facebook, que pueden conducir a trabajos y pasantías reales.<br>En virtud de ser anónimo durante la entrevista, el proceso de entrevista inclusiva es imparcial y de bajo riesgo. Al final de la entrevista, tanto el entrevistador como el entrevistado pueden retroalimentarse mutuamente con el fin de ayudarse mutuamente a mejorar.<br>Hacer bien las entrevistas simuladas desbloqueará la página de trabajos para los candidatos y les permitirá reservar entrevistas (también de forma anónima) con las principales empresas como Uber, Lyft, Quora, Asana y más. </p><p>Para aquellos que son nuevos en las entrevistas de codificación, se puede ver una entrevista de demostración en <a href="https://start.interviewing.io/interview/9hV9r4HEONf9/replay">este sitio</a>. Ten en cuenta que este sitio requiere que los usuarios inicien sesión.<br>He usado interviewing.io, tanto como entrevistador como como entrevistado. La experiencia fue genial. A Aline Lerner, directora ejecutiva y cofundadora de entrevistas.io, y a su equipo les apasiona revolucionar el proceso de codificación de entrevistas y ayudar a los candidatos a mejorar sus habilidades de entrevista.<br>También ha publicado una serie de artículos relacionados con entrevistas de codificación en el blog interviewing.io. Recomiendo registrarse lo antes posible en interviewing.io, aunque esté en versión beta, para aumentar la probabilidad de recibir una invitación.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/news/content/images/2022/02/image-58.png" class="kg-image" alt="image-58" width="600" height="400" loading="lazy"></figure><p>Otra plataforma útil para las entrevistas es <a href="https://pramp.com/" rel="noopener">Pramp</a>. Mientras que Interviewing.io conecta a los posibles buscadores de empleo con entrevistadores de codificación experimentados, Pramp adopta un enfoque diferente. Pramp te empareja con otro compañero que también busca trabajo. Los dos se turnan para asumir los roles de entrevistador y entrevistado. Pramp también prepara preguntas y brinda soluciones e indicaciones para guiar al entrevistado.</p><h2 id="avanza-y-conquista"><strong>Avanza y conquista </strong></h2><p>Después de hacer una buena cantidad de preguntas en LeetCode y tener suficiente práctica haciendo entrevistas simuladas, continúe y ponga a prueba sus nuevas habilidades de entrevista.<br>Postula a tus empresas favoritas o, mejor aún, obtén referencias de tus amigos que trabajan para esas empresas. Las referencias tienden a notarse antes y tienen una tasa de respuesta más rápida que la solicitud sin una referencia. ¡Buena suerte!</p><h2 id="consejos-pr-cticos-para-resolver-preguntas-de-programaci-n"><strong>Consejos prácticos para resolver preguntas de programación</strong></h2><p>Esta sección profundiza en consejos prácticos para temas específicos de algoritmos y estructuras de datos, que aparecen con frecuencia en las preguntas de codificación. Muchas preguntas de algoritmos involucran técnicas que se pueden aplicar a preguntas de naturaleza similar.<br>Cuantas más técnicas tengas en tu arsenal, mayores serán tus posibilidades de pasar la entrevista. Para cada tema, también hay una lista de preguntas recomendadas, que es valiosa para dominar los conceptos básicos. Algunas de las preguntas solo están disponibles con una suscripción paga a LeetCode, que en mi opinión vale la pena si te consigue un trabajo.</p><h2 id="consejos-generales"><strong>Consejos generales</strong></h2><p>Siempre valida la entrada primero. Verifica las entradas que no son válidas, están vacías, son negativas o diferentes. Nunca asumas que te dan los parámetros válidos. </p><p>Alternativamente, aclara con el entrevistador si puedes asumir una entrada válida (generalmente sí), lo que puede ahorrarte tiempo al escribir código que valida la entrada.<br>¿Hay algún requisito o restricción de complejidad de tiempo y espacio?<br>Comprueba si hay errores de apagado por uno.</p><p>En lenguajes donde no hay coerción automática de tipos, comprobar que la concatenación de valores sea del mismo tipo: <code>int</code>,<code>str</code>, y <code>list</code>.</p><p>Después de terminar tu código, use algunas entradas de ejemplo para probar su solución.<br>¿Se supone que el algoritmo debe ejecutarse varias veces, quizás en un servidor web? En caso afirmativo, es probable que la entrada se pueda procesar previamente para mejorar la eficiencia en cada llamada a la API.</p><p>Usa una combinación de paradigmas de programación funcional e imperativa:</p><ul><li>Escribe funciones puras tan a menudo como sea posible.</li><li>Usa funciones puras porque es más fácil razonar con ellas y pueden ayudar a reducir errores en su implementación.</li><li>Evita mutar los parámetros pasados a su función, especialmente si se pasan por referencia, a menos que esté seguro de lo que está haciendo.</li><li>Logra un equilibrio entre precisión y eficiencia. Usa la cantidad correcta de código funcional e imperativo cuando corresponda. La programación funcional suele ser costosa en términos de complejidad espacial debido a la no mutación y la asignación repetida de nuevos objetos. Por otro lado, el código imperativo es más rápido porque opera en objetos existentes.</li><li>Evita confiar en la mutación de variables globales. Las variables globales introducen el estado.</li><li>Asegúrate de no mutar accidentalmente las variables globales, especialmente si tienes que depender de ellas.</li></ul><p>Generalmente, para mejorar la velocidad de un programa, podemos optar por usar una estructura de datos o algoritmo apropiado, o usar más memoria. Es un intercambio clásico de espacio y tiempo.<br>Las estructuras de datos son sus armas. Elegir el arma adecuada para la batalla adecuada es la clave de la victoria. Conozca las fortalezas de cada estructura de datos y la complejidad del tiempo para sus diversas operaciones.<br>Las estructuras de datos se pueden aumentar para lograr una complejidad de tiempo eficiente en diferentes operaciones. Por ejemplo, un HashMap se puede usar junto con una lista doblemente enlazada para lograr una complejidad de tiempo O(1) para la operación &nbsp;<code>get</code> <em>and</em> <code>put</code> &nbsp;en una <a href="https://leetcode.com/problems/lru-cache/">memoria caché LRU.</a></p><p>HashMaps es probablemente la estructura de datos más utilizada para preguntas de algoritmos. Si estás atascado en una pregunta, su último recurso puede ser enumerar las posibles estructuras de datos (afortunadamente no hay tantas) y considerar si cada una de ellas se puede aplicar al problema. Esto ha funcionado para mí a veces.<br>Si estás tomando atajos en tu código, díselo en voz alta a tu entrevistador y explícale lo que harías fuera de un entorno de entrevista (sin limitaciones de tiempo). Por ejemplo, explica que escribirías una expresión regular para analizar una cadena en lugar de usar <code>split</code> , que no cubre todos los casos.</p><h2 id="secuencia"><strong>Secuencia</strong></h2><h4 id="notas">Notas</h4><p>Las matrices y las cadenas se consideran secuencias (una cadena es una secuencia de caracteres). Hay consejos para tratar con matrices y cadenas, que se tratarán aquí.<br>¿Hay valores duplicados en la secuencia? ¿Afectarían la respuesta?<br>Comprueba si hay una secuencia fuera de los límites.<br>Ten cuidado con dividir o concatenar secuencias en tu código. Por lo general, las secuencias de corte y concatenación requieren tiempo O(n). Utiliza índices de inicio y finalización para delimitar un subarreglo o una subcadena siempre que sea posible.<br>A veces se atraviesa la secuencia desde el lado derecho en lugar de desde el izquierdo.</p><p>Domina la técnica de <a href="https://discuss.leetcode.com/topic/30941/here-is-a-10-line-template-that-can-solve-most-substring-problems" rel="noopener">sliding window</a> ya que se aplica a muchos problemas de subcadenas o subarreglos.</p><p>Cuando se le dan dos secuencias para procesar, es común tener un índice por secuencia para recorrer. Por ejemplo, usamos el mismo enfoque para fusionar dos matrices ordenadas.</p><h4 id="casos-comunes">Casos comunes</h4><ul><li>Secuencia vacía</li><li>Secuencia con 1 o 2 elementos </li><li>Secuencia con elementos repetidos</li></ul><h2 id="arreglos">Arreglos</h2><h4 id="notas-1"><strong><strong><strong>Not</strong></strong>as</strong></h4><p>¿La matriz está ordenada o parcialmente ordenada? Si es así, alguna forma de búsqueda binaria debería ser posible. Esto generalmente significa que el entrevistador está buscando una solución que sea más rápida que O(n).<br>¿Puedes ordenar la matriz? A veces, ordenar la matriz primero puede simplificar significativamente el problema. Asegúrate de que no sea necesario conservar el orden de los elementos de la matriz antes de intentar ordenarlos.<br>Para las preguntas en las que se trata de la suma o la multiplicación de un subarreglo, puede ser útil el cálculo previo mediante hashing o un prefijo, una suma de sufijos o un producto.<br>Si te dan una secuencia y el entrevistador te pide espacio O(1), podría ser posible usar la matriz en sí como una tabla hash. Por ejemplo, si la matriz tiene valores solo de 1 a N, donde N es la longitud de la matriz, niega el valor en ese índice (menos uno) para indicar la presencia de ese número.</p><h4 id="practice-questions"><strong><strong><strong>Practice Questions</strong></strong></strong></h4><ul><li><a href="https://leetcode.com/problems/two-sum/" rel="noopener">Dos Sumas </a></li><li><a href="https://leetcode.com/problems/best-time-to-buy-and-sell-stock/" rel="noopener">Mejor tiempo para comprar y vender existencias</a></li><li><a href="https://leetcode.com/problems/contains-duplicate/" rel="noopener">Contenido duplicado </a></li><li><a href="https://leetcode.com/problems/product-of-array-except-self/" rel="noopener">Producto del arreglo con excepción de Self</a></li><li><a href="https://leetcode.com/problems/maximum-subarray/" rel="noopener">Máximo subarreglo</a></li><li><a href="https://leetcode.com/problems/maximum-product-subarray/" rel="noopener">Máximo producto del subarreglo</a></li><li><a href="https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/" rel="noopener"> Encuentra el mínimo en una matriz traspuesta ordenada </a></li><li><a href="https://leetcode.com/problems/search-in-rotated-sorted-array/" rel="noopener">SearchBusca en un arreglo traspuesto ordenado</a></li><li><a href="https://leetcode.com/problems/3sum/" rel="noopener">3Sum</a></li><li><a href="https://leetcode.com/problems/container-with-most-water/" rel="noopener">Contenedor con mayor cantidad de agua </a></li></ul><h2 id="binario"><strong>Binario</strong></h2><h4 id="links-de-estudio"><strong>Links de estudio</strong></h4><ul><li><a href="https://medium.com/basecs/bits-bytes-building-with-binary-13cb4289aafa" rel="noopener">Bits, Bytes, construyendo con los binarios</a></li></ul><h4 id="notas-2">Notas</h4><p>A veces se hacen preguntas que involucran representaciones binarias y operaciones bit a bit. Debes saber cómo convertir un número de forma decimal a forma binaria, y viceversa, en el lenguaje de programación elegido.<br>Algunos fragmentos útiles de utilidad:</p><ul><li>Probar que kth es: <code>num &amp; (1 &lt;&lt; k) != 0</code></li><li>Conjunto kth bit es: <code>num |= (1 &lt;&lt; k)</code></li><li>Turn off kth bit: <code>num &amp;= ~(1 &lt;&lt; k)</code></li><li>Alternar el k-ésimo bit: <code>num ^= (1 &lt;&lt; k)</code></li><li>Para comprobar si un número es una potencia de 2: <code>num &amp; num - 1 == 0</code>.</li></ul><h4 id="casos-comunes-1"><strong>Casos comunes</strong></h4><ul><li>Comprueba si hay desbordamiento/subdesbordamiento</li><li>Números negativos</li></ul><h4 id="preguntas-de-pr-cticas"><strong><strong><strong>Pr</strong></strong>eguntas de prácticas<strong><strong> </strong></strong></strong></h4><ul><li><a href="https://leetcode.com/problems/sum-of-two-integers/" rel="noopener">Suma de dos enteros </a></li><li><a href="https://leetcode.com/problems/number-of-1-bits/" rel="noopener">Número de 1 Bits</a></li><li><a href="https://leetcode.com/problems/counting-bits/" rel="noopener">Contador de Bits</a></li><li><a href="https://leetcode.com/problems/missing-number/" rel="noopener">Número faltante</a></li><li><a href="https://leetcode.com/problems/reverse-bits/" rel="noopener">Reverso de Bits</a></li></ul><h2 id="programaci-n-din-mica">Programación Dinámica</h2><h4 id="links-de-estudio-1"><strong>Links de estudio</strong></h4><ul><li><a href="https://medium.freecodecamp.org/demystifying-dynamic-programming-3efafb8d4296" rel="noopener">Desmistificando la Programación Dinámica </a></li></ul><h4 id="notas-3">Notas</h4><p>La Programación Dinámica (DP) se usa generalmente para resolver problemas de optimización.<a href="https://www.freecodecamp.org/news/coding-interviews-for-dummies-5e048933b82b/undefined"> Alaina Kafkes</a> ha escrito una <a href="https://medium.freecodecamp.org/demystifying-dynamic-programming-3efafb8d4296">publicación increíble </a>sobre cómo abordar los problemas de DP. Deberías leerlo.<br>La única forma de mejorar en DP es con práctica. Se necesita mucha práctica para reconocer que un problema puede ser resuelto por DP.<br>Para optimizar el espacio, a veces no es necesario almacenar toda la tabla DP en la memoria. Los dos últimos valores o las dos últimas filas de la matriz serán suficientes.</p><h4 id="practice-questions-1"><strong><strong><strong>Practice Questions</strong></strong></strong></h4><ul><li><a href="http://www.geeksforgeeks.org/knapsack-problem/" rel="noopener">0/1 Knapsack</a></li><li><a href="https://leetcode.com/problems/climbing-stairs/" rel="noopener">Subiendo escaleras </a></li><li><a href="https://leetcode.com/problems/coin-change/" rel="noopener">Cambio de moneda</a></li><li><a href="https://leetcode.com/problems/longest-increasing-subsequence/" rel="noopener">Subsecuencia creciente más larga </a></li><li><a href="https://github.com/yangshun/tech-interview-handbook/blob/master/algorithms" rel="noopener">Subsecuencia común más larga</a></li><li><a href="https://leetcode.com/problems/word-break/">Problema de salto de palabra</a></li><li><a href="https://leetcode.com/problems/combination-sum-iv/" rel="noopener">Suma de combinación</a></li><li><a href="https://leetcode.com/problems/house-robber/" rel="noopener">House Robber</a> y <a href="https://leetcode.com/problems/house-robber-ii/" rel="noopener">House Robber II</a></li><li><a href="https://leetcode.com/problems/decode-ways/" rel="noopener">Formas de decodificar</a></li><li><a href="https://leetcode.com/problems/unique-paths/" rel="noopener">Caminos únicos</a></li><li><a href="https://leetcode.com/problems/jump-game/" rel="noopener">Jump Game</a></li></ul><h2 id="geometr-a">Geometría</h2><p><strong>Notas</strong></p><p>Al comparar la distancia euclidiana entre dos pares de puntos, es suficiente usar dx² + dy². No es necesario sacar la raíz cuadrada del valor.<br>Para saber si dos círculos se superponen, verifica que la distancia entre los dos centros de los círculos sea menor que la suma de sus radios.</p><h3 id="grafos"><strong><strong><strong>Gr</strong></strong>afos</strong></h3><h4 id="links-de-estudio-2"><strong><strong><strong>Links</strong></strong> de estudio</strong></h4><ul><li><a href="https://medium.com/basecs/from-theory-to-practice-representing-graphs-cfd782c5be38" rel="noopener">De la teoría a la práctica: Representando grafos Theory To Practice: Representing Graphs</a></li><li><a href="https://medium.com/basecs/deep-dive-through-a-graph-dfs-traversal-8177df5d0f13" rel="noopener">Profundiza a través de un grafo: DFS Traversal</a></li><li><a href="https://medium.com/basecs/going-broad-in-a-graph-bfs-traversal-959bd1a09255" rel="noopener">Explicando un grafo: BFS Traversal</a></li></ul><h4 id="notas-4"><strong>Notas</strong></h4><p>Estar familiarizado con las diversas representaciones gráficas y algoritmos de búsqueda de gráficos, y con sus complejidades de tiempo y espacio.<br>Se le puede dar una lista de bordes y se le puede asignar la tarea de construir su propio gráfico a partir de los bordes para realizar un recorrido. Las representaciones gráficas comunes son</p><ul><li>Matriz de<a href="https://es.wikipedia.org/wiki/Matriz_de_adyacencia"> adyacencia</a></li><li>Lista de adyacencia</li><li>HashMap de HashMaps</li></ul><p>Algunas entradas parecen árboles, pero en realidad son grafos. Aclara esto con tu entrevistador. En ese caso, deberá manejar los ciclos y mantener un conjunto de nodos visitados al atravesar.</p><h4 id="algoritmos-de-b-squeda-de-grafos"><strong>Algoritmos de búsqueda de grafos</strong></h4><ul><li>Común: Primera Búsqueda en Amplitud (BFS), Primera búsqueda en profundidad (DFS)</li><li>Poco común: clasificación topológica, algoritmo de Dijkstra<br>Raro: algoritmo de Bellman-Ford, algoritmo de Floyd-Warshall, algoritmo de Prim y algoritmo de Kruskal</li></ul><p>En las entrevistas de codificación, los grafos se representan comúnmente como matrices 2-D, donde las celdas son los nodos y cada celda puede atravesar a sus celdas adyacentes (arriba, abajo, izquierda y derecha). Por lo tanto, es importante estar familiarizado con atravesar una matriz 2-D.<br>Cuando atravieses recursivamente la matriz, siempre asegúrate de que su próxima posición esté dentro de los límites de la matriz. Puedes encontrar más consejos para hacer DFS en una matriz <a href="https://discuss.leetcode.com/topic/66065/python-dfs-bests-85-tips-for-all-dfs-in-matrix-question/">aquí</a>. Una plantilla simple para hacer DFS en una matriz aparece así:</p><pre><code class="language-py">def traverse(matrix):
  rows, cols = len(matrix), len(matrix[0])
  visited = set()
  directions = ((0, 1), (0, -1), (1, 0), (-1, 0))
  def dfs(i, j):
    if (i, j) in visited:
      return
    visited.add((i, j))
    # Traverse neighbors
    for direction in directions:
      next_i, next_j = i + direction[0], j + direction[1]
      if 0 &lt;= next_i &lt; rows and 0 &lt;= next_j &lt; cols: # Check boundary
        # Add any other checking here ^
        dfs(next_i, next_j)
  for i in range(rows):
    for j in range(cols):
      dfs(i, j)</code></pre><h4 id="casos-comunes-2">Casos comunes</h4><ul><li>Grafo vacío</li><li>Grafo con uno o dos nodos</li><li>Grafo disjuntas</li><li>Grafo con ciclos</li></ul><h4 id="preguntas-de-pr-ctica">Preguntas de práctica</h4><ul><li><a href="https://leetcode.com/problems/clone-graph/" rel="noopener">Gráfica de clón </a></li><li><a href="https://leetcode.com/problems/course-schedule/" rel="noopener">Horario de clases </a></li><li><a href="https://leetcode.com/problems/alien-dictionary/" rel="noopener">Diccionario Alien </a></li><li><a href="https://leetcode.com/problems/pacific-atlantic-water-flow/" rel="noopener">Flujo de agua del Pacífico-Atlántico</a></li><li><a href="https://leetcode.com/problems/number-of-islands/" rel="noopener">Número de islas</a></li><li><a href="https://leetcode.com/problems/graph-valid-tree/" rel="noopener">Grafo de árbol válido</a></li><li><a href="https://leetcode.com/problems/number-of-connected-components-in-an-undirected-graph/" rel="noopener">Número de componentes conectados en un grafo no dirigido </a></li><li><a href="https://leetcode.com/problems/longest-consecutive-sequence/" rel="noopener">Secuencia consecutiva más larga Consecutive </a></li></ul><h2 id="intervalo"><strong>Intervalo</strong></h2><h4 id="notas-5">Notas</h4><p>Las preguntas de intervalo son preguntas que dan una matriz de matrices de dos elementos (un intervalo). Los dos valores representan un valor inicial y final. Las preguntas de intervalo se consideran parte de la familia de matrices, pero involucran algunas técnicas comunes. Por lo tanto, tienen su propia sección especial.</p><p>Un ejemplo de un arreglo con intervalo es el siguiente: <code>[[1, 2], [4, 7]]</code>.</p><p>Las preguntas de intervalo pueden ser complicadas para aquellos que no tienen experiencia con ellas. Esto se debe a la gran cantidad de casos a considerar cuando las matrices de intervalos se superponen.</p><p>Aclara con el entrevistador si <code>[1, 2]</code> y <code>[2, 3]</code> se consideran intervalos superpuestos, porque afecta cómo escribirá sus comprobaciones de igualdad. </p><p>Una rutina común para las preguntas de intervalo es ordenar la matriz de intervalos por el valor inicial de cada intervalo.<br>Tienes que familiarizarte con la escritura de código para verificar si dos intervalos se superponen y fusionar dos intervalos superpuestos:</p><pre><code class="language-js">def is_overlap(a, b):
  return a[0] &lt; b[1] and b[0] &lt; a[1]
  
def merge_overlapping_intervals(a, b):
  return [min(a[0], b[0]), max(a[1], b[1])]</code></pre><h4 id="casos-comunes-3"><strong>Casos comunes</strong></h4><ul><li>Intervalo único</li><li>Intervalos no superpuestos</li><li>Un intervalo totalmente consumido dentro de otro intervalo</li><li>Intervalos duplicados</li></ul><h4 id="practice-questions-2"><strong><strong><strong>Practice Questions</strong></strong></strong></h4><ul><li><a href="https://leetcode.com/problems/insert-interval/" rel="noopener">Inserta un Intervalo</a></li><li><a href="https://leetcode.com/problems/merge-intervals/" rel="noopener">Une intervalos</a></li><li><a href="https://leetcode.com/problems/meeting-rooms/" rel="noopener">Meeting Rooms</a> and <a href="https://leetcode.com/problems/meeting-rooms-ii/" rel="noopener">Meeting Rooms II</a></li><li><a href="https://leetcode.com/problems/non-overlapping-intervals/" rel="noopener">Intervalos no superpuestos</a></li></ul><h2 id="lista-enlazada"><strong>Lista enlazada</strong></h2><h4 id="notas-6">Notas</h4><p>Al igual que las matrices, las listas enlazadas se utilizan para representar datos secuenciales. El beneficio de las listas enlazadas es que la inserción y eliminación de código desde cualquier lugar de la lista es O(1), mientras que en las matrices, los elementos deben cambiarse.<br>Agregar un nodo ficticio en la cabeza o en la cola podría ayudar a manejar muchos casos extremos en los que las operaciones deben realizarse en la cabeza o en la cola. La presencia de nodos ficticios asegura que las operaciones nunca se ejecutarán en la cabeza o la cola. Los nodos ficticios eliminan el dolor de cabeza de escribir comprobaciones condicionales para tratar con punteros nulos. Asegúrate de quitarlos al final de la operación.<br>A veces, el problema de las listas enlazadas se puede resolver sin almacenamiento adicional. Trata de tomar prestadas ideas del problema de listas enlazadas inversas.<br>Para la eliminación en listas vinculadas, puedes modificar los valores de los nodos o cambiar los punteros de los nodos. Es posible que debas mantener una referencia al elemento anterior.<br>Para particionar listas vinculadas, crea dos listas vinculadas separadas y vuelve a unirlas.<br>Los problemas de listas enlazadas comparten similitudes con los problemas de matrices. Piensa en cómo resolvería un problema de matriz y aplíquelo a una lista enlazada.</p><p>Los enfoques de dos punteros también son comunes para las listas enlazadas:</p><ul><li>Obtener el kth del último nodo: tienes dos punteros, donde uno está k nodos delante del otro. Cuando el nodo de delante llega al final, el otro nodo está k nodos detrás.</li><li>Ciclos de detección: tienes dos punteros, donde un puntero aumenta el doble que el otro. Si los dos punteros se encuentran, significa que hay un ciclo.</li><li>Obtener el nodo medio: tienes dos punteros. Un puntero se incrementa el doble que el otro. Cuando el nodo más rápido llegue al final de la lista, el nodo más lento estará en el medio.</li></ul><p>Es bueno acostumbrarse a las siguientes rutinas porque muchas preguntas de listas enlazadas utilizan una o más de estas rutinas en su solución.</p><ul><li>Contar el número de nodos en la lista enlazada</li><li>Invertir una lista enlazada en su lugar</li><li>Encuentra el nodo medio de la lista enlazada usando punteros rápidos o lentos</li><li>Combinar dos listas juntas</li></ul><h4 id="casos-comunes-4"><strong>Casos comunes</strong></h4><ul><li>Nodo único</li><li>Dos nodos</li><li>La lista enlazada tiene un ciclo. Aclare con el entrevistador si puede haber un ciclo en la lista. Por lo general, la respuesta es no.</li></ul><h4 id="preguntas-de-pr-ctica-1"><strong>Preguntas de práctica</strong></h4><ul><li><a href="https://leetcode.com/problems/reverse-linked-list/" rel="noopener">Revierte una lista enlazada </a></li><li><a href="https://leetcode.com/problems/linked-list-cycle/" rel="noopener">Detecta un ciclo en una lista enlazada </a></li><li><a href="https://leetcode.com/problems/merge-two-sorted-lists/" rel="noopener">Une dos listas ordenadas Two Sorted Lists</a></li><li><a href="https://leetcode.com/problems/merge-k-sorted-lists/" rel="noopener">Une K listas ordenadas</a></li><li><a href="https://leetcode.com/problems/remove-nth-node-from-end-of-list/" rel="noopener">Remueve el nodo Nth del final de la lista </a></li><li><a href="https://leetcode.com/problems/reorder-list/" rel="noopener">Reordena la Lista</a></li></ul><h2 id="matem-ticas">Matemáticas</h2><h4 id="notas-7">Notas</h4><p>Si el código implica división o módulo, recuerda verificar si hay división o módulo por 0.<br>Cuando una pregunta involucra "un múltiplo de un número", el módulo puede ser útil.<br>Verifica y maneja el desbordamiento y el subdesbordamiento si estás utilizando un lenguaje escrito como Java y C++. Como mínimo, menciona que es posible un desbordamiento o un desbordamiento y pregunta si necesitas manejarlo.<br>Considera números negativos y números de coma flotante. Esto puede sonar obvio, pero cuando estás bajo presión en una entrevista, muchos puntos obvios pasan desapercibidos.<br>Si la pregunta pide implementar un operador como potencia, raíz cuadrada o división, y debes ser más rápido que O(n), la búsqueda binaria suele ser el enfoque.</p><h4 id="algunas-f-rmulas-comunes"><strong>Algunas fórmulas comunes</strong></h4><ul><li>Suma de 1 a N = (n+1) * n/2</li><li>Suma de GP = 2⁰ + 2¹ + 2² + 2³ + … 2^n = 2^(n+1)-1</li><li>Permutaciones of N = N! / (N-K)!</li><li>Combinaciones of N = N! / (K! * (N-K)!)</li></ul><h4 id="casos-comunes-5">Casos comunes</h4><ul><li>División por 0</li><li>Desbordamiento y subdesbordamiento de enteros</li></ul><h4 id="preguntas-de-pr-ctica-2"><strong>Preguntas de práctica</strong></h4><ul><li><a href="https://leetcode.com/problems/powx-n/" rel="noopener">Pow(x, n)</a></li><li><a href="https://leetcode.com/problems/sqrtx/" rel="noopener">Sqrt(x)</a></li><li><a href="https://leetcode.com/problems/integer-to-english-words/" rel="noopener">Entero a palabras en inglés </a></li></ul><h2 id="matriz"><strong>Matriz</strong></h2><h4 id="notas-8"><strong><strong><strong>Not</strong></strong>as</strong></h4><p>Una matriz es un arreglo bidimensional. Las preguntas que involucran matrices generalmente están relacionadas con la programación dinámica o el recorrido de gráficos.<br>Para preguntas que involucren programación transversal o dinámica, tienes que hacer una copia de la matriz con las mismas dimensiones que se inicializan a valores vacíos. Utiliza estos valores para almacenar el estado visitado o la tabla de programación dinámica. Familiarízate con esta rutina:</p><pre><code class="language-py">rows, cols = len(matrix), len(matrix[0])
copy = [[0 for _ in range(cols)] for _ in range(rows)</code></pre><ul><li>Muchos juegos basados en cuadrículas se pueden modelar como una matriz. Por ejemplo, Tic-Tac-Toe, Sudoku, Crossword, Connect 4 y Battleship. No es raro que se te pida que verifiques la condición ganadora del juego. </li><li>Para juegos como Tic-Tac-Toe, Connect 4 y Crosswords, la verificación debe realizarse vertical y horizontalmente. Un truco es escribir código para verificar la matriz de las celdas horizontales. Luego transpón la matriz, reutilizando la lógica utilizada para la verificación horizontal para verificar celdas originalmente verticales (que ahora son horizontales).</li><li>Transponer una matriz en Python es simple:</li></ul><pre><code class="language-py">transposed_matrix = zip(*matrix)</code></pre><h4 id="casos-comunes-6"><strong>Casos comunes</strong></h4><ul><li>Matriz vacía. Verifique que ninguna de las matrices tenga una longitud de 0.</li><li>Matriz 1 x 1.</li><li>Matriz con una fila o columna</li></ul><h4 id="preguntas-de-pr-ctica-3"><strong>Preguntas de práctica</strong></h4><ul><li><a href="https://leetcode.com/problems/set-matrix-zeroes/" rel="noopener">Conjunto de matriz cero </a></li><li><a href="https://leetcode.com/problems/spiral-matrix/" rel="noopener">Matriz espiral</a></li><li><a href="https://leetcode.com/problems/rotate-image/" rel="noopener">Imagen traspuesta </a></li><li><a href="https://leetcode.com/problems/word-search/" rel="noopener">Buscador de palabras </a></li></ul><h2 id="recursi-n"><strong>Recursión</strong></h2><h4 id="notas-9">Notas</h4><p>La recursividad es útil para la permutación, porque genera todas las combinaciones y preguntas basadas en árboles. Debes saber cómo generar todas las permutaciones de una secuencia y cómo manejar los duplicados.<br>Recuerda siempre definir un caso base para que su recursión termine.</p><p>La recursividad utiliza implícitamente una pila. Por lo tanto, todos los enfoques recursivos se pueden reescribir iterativamente usando una pila.</p><p>Ten cuidado con los casos en los que el nivel de recurrencia es demasiado profundo y provoca un desbordamiento de la pila (el límite predeterminado en Python es 1000). Puedes obtener puntos de bonificación por señalar esto al entrevistador.</p><p>La recursividad nunca será una complejidad de espacio O(1) porque se trata de una pila, a menos que haya una<a href="https://stackoverflow.com/questions/310974/what-is-tail-call-optimization"> optimización de llamada final (TCO)</a>. Averigua si su lenguaje elegido es compatible con TCO.</p><h4 id="preguntas-de-pr-ctica-4"><strong>Preguntas de práctica</strong></h4><ul><li><a href="https://leetcode.com/problems/subsets/" rel="noopener">Subconjunto</a> and <a href="https://leetcode.com/problems/subsets-ii/" rel="noopener">Subconjunto II</a></li><li><a href="https://leetcode.com/problems/strobogrammatic-number-ii/" rel="noopener">Número Strobogramático II</a></li></ul><h2 id="cadenas"><strong>Cadenas</strong></h2><h4 id="notas-10">Notas</h4><p>Por favor lee los siguientes tips en la <a href="https://github.com/yangshun/tech-interview-handbook/tree/main/algorithms#sequence">secuencia</a>. Aplica para las cadenas también.</p><p>Pregunta sobre el conjunto de caracteres de entrada y la distinción entre mayúsculas y minúsculas. Por lo general, los caracteres se limitan a caracteres latinos en minúsculas, por ejemplo, de la a a la z.<br>Cuando necesites comparar cadenas donde el orden no es importante (como un anagrama), puedes considerar usar un HashMap como contador.</p><p>Si tu lenguaje de programación tiene una clase <code>Counter</code> como Python, pregunta si puedes usar esta clase mejor.</p><p>Si necesitas mantener un contador de caracteres, un error común es decir que la complejidad del espacio requerida para el contador es O(n). El espacio requerido para un contador es O(1) no O(n). Esto se debe a que el límite superior es el rango de caracteres, que suele ser una constante fija de 26. El conjunto de entrada son solo caracteres latinos en minúsculas.<br>Las estructuras de datos comunes para buscar cadenas de manera eficiente son</p><ul><li><a href="https://www.wikiwand.com/en/Trie" rel="noopener">Trie/Árbol de prefijo</a></li><li><a href="https://www.wikiwand.com/en/Suffix_tree" rel="noopener">Árbol de sufijo</a></li></ul><p>Algunos algoritmos comunes son:</p><ul><li><a href="https://www.wikiwand.com/en/Rabin%E2%80%93Karp_algorithm" rel="noopener">Rabin Karp</a>, que realiza búsquedas eficientes de subcadenas, utilizando un hash rodante</li><li><a href="https://www.wikiwand.com/en/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm" rel="noopener">KMP</a>, que realiza búsquedas eficientes de subcadenas</li></ul><p><strong>Caracteres que no se repiten</strong></p><p>Usa una máscara de bits de 26 bits para indicar qué caracteres latinos en minúsculas están dentro de la cadena.</p><pre><code class="language-py">mask = 0
for c in set(word):
  mask |= (1 &lt;&lt; (ord(c) - ord('a')))</code></pre><p>Para determinar si dos cadenas tienen caracteres comunes, realiza <code>&amp;</code> en las dos máscaras de bits. Si el resultado es distinto de cero, <code>mask_a &amp; mask_b &gt; 0</code> , entonces las dos cadenas tienen caracteres comunes.</p><h4 id="anagrama"><strong>Anagrama</strong></h4><p>Un anagrama es cambio de palabra o juego de palabras. Es el resultado de reorganizar las letras de una palabra o frase para producir una nueva palabra o frase, usando todas las letras originales una sola vez. En las entrevistas, por lo general solo nos molestan las palabras sin espacios en ellas.<br>Para determinar si dos cadenas son anagramas, existen algunos enfoques plausibles:</p><ul><li>Ordenar ambas cadenas debería producir la misma cadena resultante. Esto toma el tiempo O (log n) y el espacio O (logn).</li><li>Si asignamos cada carácter a un número primo y multiplicamos cada número asignado, los anagramas deben tener el mismo múltiplo (descomposición en factores primos). Esto toma O(n) tiempo y O(1) espacio.</li><li>El conteo de frecuencia de caracteres ayudará a determinar si dos cadenas son anagramas. Esto también toma tiempo O(n) y espacio O(1).<br>Palíndromo</li></ul><p><strong>Palíndromo</strong></p><p>Un palíndromo es una palabra, frase, número u otra secuencia de caracteres que se lee igual hacia adelante y hacia atrás, como señora o coche de carreras.<br>Aquí hay formas de determinar si una cadena es un palíndromo:</p><ul><li>Invierte la cuerda y debería ser igual a sí misma.</li><li>Tienes dos punteros al principio y al final de la cadena. Mueve los punteros hacia adentro hasta que se encuentren. En cualquier momento, los caracteres de ambos punteros deben coincidir.</li></ul><p>El orden de los caracteres dentro de la cadena es importante, por lo que los HashMaps generalmente no son útiles.<br>Cuando una pregunta se trata de contar el número de palíndromos, un truco común es tener dos punteros que se muevan hacia afuera, alejándose del centro. Ten en cuenta que los palíndromos pueden tener una longitud par o impar. Para cada posición de pivote central, debes verificarla dos veces: una vez que incluye el personaje y otra sin el personaje.</p><ul><li>Para las subcadenas, puedes terminar antes de tiempo una vez que no haya ninguna coincidencia.</li><li>Para las subsecuencias, use la programación dinámica ya que hay subproblemas superpuestos. <a href="https://leetcode.com/problems/longest-palindromic-subsequence/">Mira esta pregunta.</a></li></ul><h4 id="casos-comunes-7"><strong>Casos comunes</strong></h4><ul><li>Cadena vacía</li><li>Cadena de un solo carácter</li><li>Cadenas con un solo carácter diferente</li></ul><h4 id="preguntas-de-pr-ctica-5"><strong>Preguntas de práctica</strong></h4><ul><li><a href="https://leetcode.com/problems/longest-substring-without-repeating-characters/">Subcadena más larga sin caracteres repetidos</a></li><li><a href="https://leetcode.com/problems/longest-repeating-character-replacement/">Reemplazo de caracteres repetitivo más largo</a></li><li><a href="https://leetcode.com/problems/minimum-window-substring/description/" rel="noopener">Subcadena de ventana mínima </a></li><li><a href="https://leetcode.com/problems/encode-and-decode-strings/" rel="noopener">Cadenas Encode y Decode</a></li><li><a href="https://leetcode.com/problems/valid-anagram" rel="noopener">Anagrama válidoa</a></li><li><a href="https://leetcode.com/problems/group-anagrams/" rel="noopener">Anagramas de grupo</a></li><li><a href="https://leetcode.com/problems/valid-parentheses" rel="noopener">Parentesis válidos</a></li><li><a href="https://leetcode.com/problems/valid-palindrome/" rel="noopener">Palíndromo válido</a></li><li><a href="https://leetcode.com/problems/longest-palindromic-substring/" rel="noopener">Cadena con Palíndromos más larga </a></li><li><a href="https://leetcode.com/problems/palindromic-substrings/" rel="noopener">Subcadenas con palíndromos</a></li></ul><h2 id="-rboles"><strong>Árboles</strong></h2><h4 id="links-de-estudio-3"><strong>Links de estudio</strong></h4><ul><li><a href="https://medium.com/basecs/leaf-it-up-to-binary-trees-11001aaf746d">Lánzalo a árboles binarios</a></li></ul><h4 id="notas-11"><strong>Notas</strong></h4><p>Un árbol es un grafo acíclico no dirigido y conexo.<br>La recursividad es un enfoque común para los árboles. Cuando notes que el problema del subárbol se puede usar para resolver el problema completo, intenta usar la recursividad.<br>Cuando utilices la recursividad, recuerda siempre verificar el caso base, generalmente donde está el nodo. <code>null</code>.</p><p>Cuando se te pida que atravieses un árbol por nivel, utiliza primero la búsqueda en profundidad.<br>A veces es posible que tu función recursiva necesite devolver dos valores.<br>Si la pregunta involucra la suma de nodos en el camino, asegúrate de verificar si los nodos pueden ser negativos.<br>Debes estar muy familiarizado con la escritura transversal recursiva en orden previo, en orden y posterior al pedido. Como extensión, desafíate a ti mismo escribiéndolos iterativamente. </p><p>A veces, los entrevistadores preguntan a los candidatos por el enfoque iterativo, especialmente si el candidato termina de escribir el enfoque recursivo demasiado rápido.</p><h2 id="-rbol-binario"><strong>Árbol binario</strong></h2><p>El recorrido en orden de un árbol binario no es suficiente para serializar un árbol de forma única. También se requiere un recorrido previo o posterior al pedido.</p><h2 id="-rbol-de-b-squeda-binario-bst-"><strong>Árbol de búsqueda binario (BST)</strong></h2><p>El recorrido en orden de un BST te dará todos los elementos en orden.<br>Estar muy familiarizado con las propiedades de un BST. Valida que un árbol binario sea un BST. Esto aparece con más frecuencia de lo esperado.<br>Cuando una pregunta implica un BST, el entrevistador suele buscar una solución que se ejecute más rápido que O(n).</p><h4 id="casos-comunes-8"><strong>Casos comunes</strong></h4><ul><li>Árbol vacío</li><li>Un solo nodo</li><li>Dos nodos</li><li>Árbol muy inclinado (como una lista enlazada)</li></ul><h4 id="preguntas-de-pr-cticas-1"><strong>Preguntas de prácticas</strong></h4><ul><li><a href="https://leetcode.com/problems/maximum-depth-of-binary-tree/">Profundidad máxima del árbol binario</a></li><li><a href="https://leetcode.com/problems/same-tree/">Mismo árbol</a></li><li><a href="https://leetcode.com/problems/invert-binary-tree/">Invertir o voltear árbol binario</a></li><li><a href="https://leetcode.com/problems/binary-tree-maximum-path-sum/">Suma máxima de ruta de acceso del árbol binario </a></li><li><a href="https://leetcode.com/problems/binary-tree-level-order-traversal/">Recorrido de orden a nivel de árbol binario </a></li><li><a href="https://leetcode.com/problems/serialize-and-deserialize-binary-tree/">Serializar y deserializar árbol binario </a></li><li><a href="https://leetcode.com/problems/subtree-of-another-tree/">Subárbol de otro árbol </a></li><li><a href="https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/">Construir árbol binario a partir de preorden y recorrido en orden </a></li><li><a href="https://leetcode.com/problems/validate-binary-search-tree/">Validar árbol de búsqueda binario </a></li><li><a href="https://leetcode.com/problems/kth-smallest-element-in-a-bst/">Elemento Kth más pequeño en un BST </a></li><li><a href="https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/">Ancestro común más bajo de BST</a></li></ul><h2 id="tries">Tries</h2><h4 id="links-de-estudio-4"><strong>Links de estudio</strong></h4><ul><li><a href="https://medium.com/basecs/trying-to-understand-tries-3ec6bede0014" rel="noopener">Intentando entender los Tries</a></li><li><a href="https://leetcode.com/articles/implement-trie-prefix-tree/" rel="noopener">Implementando un Trie (Tree de prefijo)</a></li></ul><h4 id="notas-12"><strong>Notas</strong></h4><p>Los Tries son un tipo específico de estructura de datos. &nbsp;Como tal son árboles especiales (árboles de prefijos) que hacen que la búsqueda y el almacenamiento de cadenas sean más eficientes. Los intentos tienen muchas aplicaciones prácticas, como realizar búsquedas y proporcionar autocompletado. Es útil conocer estas aplicaciones comunes para que puedas identificar fácilmente cuándo un problema se puede resolver de manera eficiente utilizando un trie.<br>A veces, el procesamiento previo de un diccionario de palabras (dado en una lista) en un trie mejorará la eficiencia de la búsqueda de una palabra de longitud k, entre n palabras. La búsqueda se convierte en O(k) en lugar de O(n).</p><p>Estar familiarizado con la implementación, desde cero, de una clase <code>Trie</code> y sus métodos<code>add</code>, <code>remove</code> , y <code>search</code>.</p><p><strong>Preguntas de Práctica</strong></p><ul><li><a href="https://leetcode.com/problems/implement-trie-prefix-tree" rel="noopener">Implementando un Trie ( Tree de prefijo)</a></li><li><a href="https://leetcode.com/problems/add-and-search-word-data-structure-design" rel="noopener">Añadir y buscar palabras</a></li><li><a href="https://leetcode.com/problems/word-search-ii/" rel="noopener">Buscador de palabras II</a></li></ul><h2 id="mont-culo">Montículo</h2><h4 id="links-de-estudios"><strong>Links de estudios</strong></h4><ul><li><a href="https://medium.com/basecs/learning-to-love-heaps-cef2b273a238" rel="noopener">Aprendiendo a amar los montículos</a></li></ul><h4 id="notas-13">Notas</h4><p>Si ves un k superior o inferior mencionado en la pregunta, generalmente es una señal de que se puede usar un montón para resolver el problema, como en Elementos frecuentes K principales.<br>Si necesitas los k elementos superiores, use un Min Heap de tamaño k. Iterar a través de cada elemento, empujándolo en el montón. </p><p>Siempre que el tamaño del almacenamiento dinámico exceda k, elimina el elemento mínimo. Eso garantizará que tengas los k elementos más grandes.</p><h4 id="preguntas-de-pr-ctica-6">Preguntas de práctica</h4><ul><li><a href="https://leetcode.com/problems/merge-k-sorted-lists/" rel="noopener">Une K listas ordenadas</a></li><li><a href="https://leetcode.com/problems/top-k-frequent-elements/" rel="noopener">Top de elementos K más frecuentes</a></li><li><a href="https://leetcode.com/problems/find-median-from-data-stream/" rel="noopener">Encuetra la mediana a partir de un conjunto de datos </a></li></ul><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Las entrevistas de programación son difíciles. Pero afortunadamente, puedes mejorar tus resultados estudiando y practicando para ellas, así como haciendo entrevistas simuladas.<br>En resumen, para hacerlo bien en la codificación de entrevistas:</p><ol><li>Elige un lenguaje de programación</li><li>Estudia los principios de las Ciencias de la Computación.</li><li>Practica resolviendo ejercicios de algoritmos.</li><li>Internaliza el qué hacer y el qué no en las<a href="https://github.com/yangshun/tech-interview-handbook/blob/master/preparing/cheatsheet.md" rel="noopener"> entrevistas</a></li><li>Practica haciendo entrevistas simuladas</li><li>Ve a la entrevista a obtener el trabajo</li></ol><p>Al seguir estos pasos, mejorarás tus habilidades de codificación de entrevistas y estarás un paso más cerca (o probablemente más) de conseguir el trabajo de sus sueños.</p><p>¡Mis mejores deseos!</p><p>Si te ha gustado este artículo, ¡compártelo con tus amigos!<br>También puedes seguirme en <a href="https://github.com/yangshun">GitHub</a> y <a href="https://twitter.com/yangshunz">Twitter</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es Prettier? ]]>
                </title>
                <description>
                    <![CDATA[ Cuarto artículo de esta serie sobre herramientas orientadas a la experiencia de desarrollador revisamos Prettier. Puedes encontrar los artículos previos en:  * ¿Qué es Linting y ESLint? [/espanol/news/que-es-linting-y-eslint/]  * ¿Qué es npm? [/espanol/news/que-es-npm/]  * ¿Qué es Babel? [/espanol/news/que-es-babel/] ¿Qué es Prettier? En resumen y muy acotado, Prettier ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-prettier/</link>
                <guid isPermaLink="false">61d1ac990a738c094c2db2d9</guid>
                
                    <category>
                        <![CDATA[ Desarrollo Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matias Hernandez ]]>
                </dc:creator>
                <pubDate>Tue, 04 Jan 2022 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2022/01/Prettier.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Cuarto artículo de esta serie sobre herramientas orientadas a la experiencia de desarrollador revisamos <strong>Prettier<strong>.</strong></strong></p><p>Puedes encontrar los artículos previos en:</p><ul><li><a href="https://www.freecodecamp.org/espanol/news/que-es-linting-y-eslint/">¿Qué es Linting y ESLint?</a></li><li><a href="https://www.freecodecamp.org/espanol/news/que-es-npm/">¿Qué es npm?</a></li><li><a href="https://www.freecodecamp.org/espanol/news/que-es-babel/">¿Qué es Babel?</a></li></ul><h2 id="-qu-es-prettier">¿Qué es Prettier?</h2><p>En resumen y muy acotado, Prettier es un formateador automático de código. ¿Qué quiere decir esto?</p><p>Escribir código es una acción humana y como tal hay opiniones sobre como se debe escribir este código y no solamente desde el punto de vista algorítmico o técnico, si no, incluso se crean discusiones sobre estilos de "escritura" (Famosa es la "guerra sagrada" sobre si usar o no <code>;</code> es JavaScript o tabs vs espacios).</p><p>Al trabajar en un proyecto de código que incluya a más de una persona estas discusiones sobre como debería escribirse o no el código (guía de estilo) pueden mermar la productividad del equipo enfrascándose en nimiedades que pueden tornarse bastante molestas, por ejemplo, al revisar un pull-request. Las diferencias de estilo se mostrarán como cambios que en efecto no son parte del real desarrollo que se intenta lograr.</p><p>Prettier busca solucionar esto otorgando una serie de configuraciones y opiniones sobre esta guía de estilo.</p><p>Prettier ofrece soporte para múltiples lenguajes y frameworks.</p><ul><li>Javascript</li><li>JSX</li><li>Angular</li><li>Vue</li><li>Typescript</li><li>CSS</li><li>HTML</li><li>JSON</li><li>Graphql</li><li>Markdown</li><li>YAML</li></ul><p>Lo que ofrece Prettier es tomar tu código y "re-formatearlo" en base a las configuraciones definidas manteniendo así un estilo consistente.</p><p>Uno de los casos más comunes que podemos usar como ejemplo es el largo de la definición de una función:</p><pre><code class="language-javascript">function calcularMuchosArgumentos(unaVariableMuyLarga, otraVariableConUnNombreDeclarativo) </code></pre><p>Prettier tomará este trozo de código y automáticamente lo re-escribirá como</p><pre><code class="language-javascript">function calcularMuchosArgumentos(
    unaVariableMuyLarga,
    otraVariableConUnNombreDeclarativo
)</code></pre><p>Haciéndolo mucho más legible y sin intervención nuestra ni preocupación de como lo escribes inicialmente.</p><p>Finalmente, lo que Prettier otorga es una forma sencilla y automatizada de definir un <strong>estilo de código</strong> en todo tu proyecto ya que simplemente desecha el estilo original (el que fue escrito por un desarrollador) al re-escribirlo bajo las reglas y configuraciones definidas.</p><p></p><h2 id="-por-qu-querr-as-usar-prettier">¿Por qué querrías usar Prettier?</h2><p>Algo dejé entrever en el párrafo anterior. Definir una guía de estilo única en el proyecto que permita evitar discusiones innecesarias sobre cómo escribir código y evite conflictos a la hora de revisar cambios en el código.</p><p>Pero hay algunas otras ventajas como por ejemplo:</p><ul><li><strong>Ayudar a los nuevos desarrolladores del equipo</strong>. Quienes llegan a unirse a un equipo que ya lleva un tiempo trabajando no tendrán que aprender las reglas de estilo del equipo y acostumbrarse a nuevas formas de escribir su trabajo, evitando así gastar tiempo en tomar nuevos hábitos.</li><li><strong>Enfoque</strong>: Al usar una herramienta como prettier es fácil notar que tendrás un poco más de tiempo para enfocarte en lo que realmente importa en tu trabajo: <strong>escribir código</strong> sin preocuparte de formatear o estilizar lo que escribiste. Prettier tiene integraciones con la gran mayoría de editores de texto por lo que el formateo es completamente no-intrusivo y automático.</li><li><strong>Fácil adopción</strong>: Integrar Prettier en tu proyecto es sencillo y no generará cambios bruscos que debas tener en cuenta.</li></ul><h2 id="-qu-diferencia-hay-entre-prettier-y-un-linter-c-mo-eslint">¿Qué diferencia hay entre Prettier y un linter cómo ESLint?</h2><p>Es fácil asociar el trabajo de Prettier y ESLint, pero en realidad difieren en su objetivo</p><blockquote>Si quieres saber más sobre que es ESLint, como funciona y como instalarlo <a href="https://www.freecodecamp.org/espanol/news/que-es-linting-y-eslint/">revisa este artículo de la serie.</a></blockquote><p>En pocas palabras, el trabajo de un linter como ESLint es encontrar bugs y el de Prettier formatear el código.</p><p>Por ejemplo, ESLint tiene reglas para mejorar la calidad del código cómo: <a href="https://eslint.org/docs/rules/no-unused-vars">no-unused-vars</a>, <a href="https://eslint.org/docs/rules/no-await-in-loop">no-await-in-loop</a>, <a href="https://eslint.org/docs/rules/no-dupe-args">no-dupe-args</a>, etc. Prettier no tiene nada que hacer con este tipo de reglas, ya que están relacionadas a una tarea diferente.</p><h2 id="-c-mo-instalar-prettier">¿Cómo instalar Prettier?</h2><p>Prettier es un paquete que puedes encontrar en npm </p><blockquote>Para saber más sobre que es NPM te invito <a href="https://www.freecodecamp.org/espanol/news/que-es-npm/">a revisar este artículo de la serie</a></blockquote><p>Comienza por abrir tu terminal e instalar Prettier localmente en tu proyecto</p><pre><code class="language-bash">npm install --save-dev --save-exact prettier</code></pre><p>Luego deberás crear un archivo de configuración para que así el editor de texto que utilizas sepa que Prettier está disponible.</p><pre><code class="language-bash">echo {} &gt; .prettierrc.json</code></pre><p>Además, es buena idea configurar un archivo <code>.prettierignore</code> que te permitirá indicarle a Prettier que archivos no formatear.</p><pre><code># Ignore artifacts:
build
coverage
static</code></pre><blockquote>Este archivo es muy parecido e incluso a veces idéntico a tu archivo <code>.gitignore</code> o <code>.eslintignore</code></blockquote><p>Con esto Prettier ya está disponible para su uso, puedes comenzar por formatear todos tus archivos utilizando, nuevamente la terminal</p><pre><code class="language-bash">npx prettier --write .</code></pre><p>Si tienes muchos archivos esto puede tomar un tiempo, ahora es buen momento para configurar tu editor de texto favorito para que trabaje con Prettier &nbsp;momento de guardar los archivos o mediante alguna combinación de teclas.</p><p>Puedes revisar la documentación de cada editor o este listado en el sitio oficial de Prettier sobre la <a href="https://prettier.io/docs/en/editors.html">Integración con Editores</a></p><h2 id="tips">Tips</h2><p>Es común tener varias herramientas trabajando en tu proyecto, por lo que es importante configurar todo para que "jueguen bien", una de esas configuraciones es permitir que ESLint y Prettier trabajen en conjunto sin interponerse (algunas reglas pueden sobreponerse). Para ello existe un plugin <a href="https://github.com/prettier/eslint-config-prettier#installation"><code>eslint-config-prettier</code></a> que permite que ESLint deshabilite las reglas que pueden chocar con Prettier</p><p>Puedes instalarlo utilizando la terminal</p><pre><code>npm install --save-dev eslint-config-prettier</code></pre><p>Luego tendrás que añadir algunas configuraciones a tu configuración es ESLint.</p><pre><code class="language-json">{
    "extends": [
    	"prettier"
    ]
}</code></pre><p>También es buena idea permitir que Prettier funcione con tus acciones relacionadas con Git</p><p>Una forma de reforzar el uso de Prettier en el equipo es que se ejecute automáticamente al momento de "guardar" tu código en tu repositorio (hacer commit). La idea es asegurarte que todos los archivos que fueron modificados sean formateados por Prettier. Para esto debes instalar algunas herramientas y configurar tu archivo <code>package.json</code></p><pre><code>npm install --save-dev husky lint-staged
npx husky install
npm set-script prepare "husky install"
npx husky add .husky/pre-commit "npx lint-staged"</code></pre><p>Finalmente, edita tu archivo <code>package.json</code> y agrega</p><pre><code class="language-json">{
    "lint-staged": {
        "**/*": "prettier --write --ignore-unknown"
    }
}</code></pre><p>En resumen, en este artículo hemos revisado que es y como funciona Prettier, también el razonamiento de porque querrías utilizarlo para evitar problemas de guías de estilo.</p><p>También revisamos como instalar localmente Prettier en tu proyecto, configurar <code>.prettierrc.json</code> y el archivo `.prettierigore`. </p><p>Finalmente, vimos como configurar para que ESLint y Prettier funcionen en conjunto.</p><!--kg-card-begin: html--><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/03/Footer-Social-Card.jpg" class="kg-image" alt="Footer-Social-Card" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/03/Footer-Social-Card.jpg 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/03/Footer-Social-Card.jpg 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/03/Footer-Social-Card.jpg 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/03/Footer-Social-Card.jpg 2400w" sizes="(min-width: 720px) 720px" width="2000" height="533" loading="lazy"></figure>
<div style="display: grid; grid-template-columns: repeat(3,1fr);font-size: 18px;width: 100%;">
    <div>✉️ <a href="https://microbytes.dev">Únete a Micro-bytes</a> <br> newsletter de micro cursos </div>
<div>
    ? <a href="https://twitter.com/matiasfha">Sígueme en Twitter</a> &nbsp; </div>
<div>❤️ <a href="https://buymeacoffee.com/matiasfha">Apoya mi trabajo</a> 
    </div>
</div><!--kg-card-end: html--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Desarrollo web para principiantes: Aprende HTML básico y CSS para construir tu página web ]]>
                </title>
                <description>
                    <![CDATA[ Artículo original escrito por Vasyl Lagutin [https://www.freecodecamp.org/news/author/coderslang/] Artículo original Web Development for Beginners – Learn Basic HTML and CSS to Build Your First Web Page [https://www.freecodecamp.org/news/web-development-for-beginners-basic-html-and-css/] Traducido y adaptado por Santiago Yanguas [https://twitter.com/ToqYang] ¿Te has preguntado alguna vez cómo se construyen y diseñan los sitios web? ¿Desea aprender el arte ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/desarrollo-web-para-principiantes-aprende-html-basico-y-css-para-construir-tu-pagina-web/</link>
                <guid isPermaLink="false">6154f2e5c757580942e5bfb4</guid>
                
                    <category>
                        <![CDATA[ Desarrollo Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Santiago Toquica Yanguas ]]>
                </dc:creator>
                <pubDate>Fri, 08 Oct 2021 12:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/10/halgatewood-com-tZc3vjPCk-Q-unsplash--1-.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p><strong>Artículo original escrito por </strong><a href="https://www.freecodecamp.org/news/author/coderslang/">Vasyl Lagutin</a><br><strong>Artículo original </strong><a href="https://www.freecodecamp.org/news/web-development-for-beginners-basic-html-and-css/">Web Development for Beginners – Learn Basic HTML and CSS to Build Your First Web Page</a><br><strong>Traducido y adaptado por </strong><a href="https://twitter.com/ToqYang">Santiago Yanguas</a></p><p>¿Te has preguntado alguna vez cómo se construyen y diseñan los sitios web? ¿Desea aprender el arte del desarrollo web, pero no es tan experto en tecnología, todavía?</p><p>Bueno, entonces este tutorial es para ti. Es una introducción al desarrollo web para principiantes, para que puedas aprender lo básico incluso si eres totalmente nuevo en el tema.</p><h1 id="conceptos-b-sicos-de-html-la-estructura-de-una-p-gina-web">Conceptos básicos de HTML: la estructura de una página web</h1><p>HTML significa <code>Hyper-Text Markup Language</code>. Antes de adentrarnos en el funcionamiento de HTML, vamos a tener una comprensión básica de lo que significa realmente <code>Hyper-Text Markup Language</code>.</p><p>El <code>Hyper-Text</code> se refiere a los hipervínculos que se ven en un texto, una imagen o un marcador que redirige a otra página, archivo, documento u otra parte de una página web. </p><p>Un lenguaje de marcado es simplemente un lenguaje informático que contiene etiquetas que definen elementos dentro de un documento. Un ejemplo de etiqueta podría ser el titular de un blog, que normalmente se escribe como una etiqueta <code>h</code>.</p><p>Hay más etiquetas, algunas de las cuales descubriremos más adelante.</p><p>Puedes pensar simplemente en HTML como la estructura de una página web. Supongamos que tienes que construir una casa. El primer paso de la construcción debe ser construir su estructura general, ¿verdad?</p><p>Diseñará el sótano, las paredes, el césped, el garaje, etc. Así es como puedes imaginar el HTML: son los bloques de construcción de una página web.</p><p>En un sitio web, puede contener la barra de navegación, el cuerpo principal/contenido, el pie de página, la barra lateral y todas las divisiones estructurales de la página. Todo ello con HTML.</p><h2 id="c-mo-empezar-con-html">Cómo empezar con HTML</h2><p>Hay muchos editores de código, como VS Code, Sublime Text 3, Atom y Brackets. Todos estos pueden sonar extraños para ti. Así que empezamos usando <code>Notepad</code> que podemos usar de una forma u otra para escribir notas u otras cosas.</p><p>Veamos cómo se haría la estructura de una página web sencilla en HTML con código básico.</p><p>Vamos a diseñar una página web que tiene diferentes secciones: una barra de navegación, el cuerpo principal con un título, un párrafo, una imagen, y un pie de página.</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;!DOCTYPE html&gt;

&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Título de la página&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;

        &lt;nav&gt;Esta es el Navbar de mi página web&lt;/nav&gt;

        &lt;h1&gt;Mi primera título&lt;/h1&gt;
        &lt;p&gt;Mi primer párrafo.&lt;/p&gt;

        &lt;img src = "https://miro.medium.com/max/1584/1*lJ32Bl-lHWmNMUSiSq17gQ.png"/&gt;

        &lt;footer&gt;
          &lt;p&gt;Pie de página&lt;/p&gt;
        &lt;/footer&gt;

    &lt;/body&gt;
&lt;/html&gt;</code></pre><figcaption>Página basica</figcaption></figure><p>En el código anterior, la declaración <code>&lt;!DOCTYPE html&gt;</code> significa que este documento es un archivo HTML5.</p><p>El <code>5</code> de arriba solo se refiere a la versión, ya que HTML ha avanzado mucho y ha mejorado respecto a sus versiones anteriores. La versión <code>5</code> solo se refiere a su última versión estable. No tienes que preocuparte por las versiones anteriores.</p><p><code>&lt;html&gt;</code> actúa como elemento raíz de todos los elementos (título, encabezados, párrafos, etc.) de una página web HTML.</p><p><code>&lt;head&gt;</code> contiene la metainformación (información sobre datos como el autor, la fecha de caducidad, una lista de palabras clave, el autor del documento) de la página.</p><p>El <code>&lt;title&gt;</code> refiere al título de la página web, que se ve en el navegador cuando se abre una página web. Aquí hay un ejemplo para tu referencia. En esta imagen, <code>Page Title</code> se refiere a la etiqueta title.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/05/Screenshot_-1313-.png" class="kg-image" alt="Understanding%20Web%20design%20Basics%20with%20HTML%20&amp;%20CSS%20f00187c06fae4c0582422f7947326b9b/Screenshot_(1313).png" width="600" height="400" loading="lazy"><figcaption>Título de la página</figcaption></figure><p><code>&lt;body&gt;</code> es donde está todo el contenido de tu página web, como el encabezado, los párrafos, las imágenes, toda la interfaz de usuario.</p><p><code>&lt;nav&gt;</code> representa la barra de navegación, que debe estar en la parte superior, seguida del cuerpo de contenidos principal y por último, el <code>&lt;footer&gt;</code>.</p><p>El cuerpo principal está compuesto por un encabezado representado por una etiqueta <code>&lt;h1&gt;</code> (el <code>1</code> con la <code>h</code> representa el tamaño del encabezado. El tamaño del encabezado va de 1 a 6, siendo 1 el más grande y 6 el más pequeño). Le sigue una etiqueta <code>&lt;p&gt;</code> de párrafo, luego una etiqueta de imagen <code>&lt;img&gt;</code>, finalmente el pie de página, la última sección de una página web.</p><p>Observe que la etiqueta de la imagen tiene la palabra clave <code>src</code> que se refiere a la fuente de la imagen, que en este caso es una imagen tomada de la web. Por eso adjuntamos el enlace URL de la imagen.</p><p>Todas estas etiquetas comienzan con un mayor y menor que <code>&lt;&gt;</code>; también finalizan con un mayor y menor que <code>&lt;/&gt;</code> con una barra inclinada de por medio, como puedes ver en los fragmentos de código.</p><h2 id="c-mo-guardar-los-archivos-html-y-mostrar-los-resultados">Cómo guardar los archivos HTML y mostrar los resultados</h2><p>Solo tienes que seguir estos dos pasos básicos para ver tu HTML como página web.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/05/Screenshot_-1319-.png" class="kg-image" alt="Understanding%20Web%20design%20Basics%20with%20HTML%20&amp;%20CSS%20f00187c06fae4c0582422f7947326b9b/Screenshot_(1319).png" width="600" height="400" loading="lazy"><figcaption>Página web</figcaption></figure><ol><li>Guarde su archivo HTML con la extensión <code>.html</code>. En el ejemplo que hemos utilizado, hemos guardado el archivo como <code>Tutorial.html</code>.</li></ol><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/05/Screenshot_-1322-.png" class="kg-image" alt="Understanding%20Web%20design%20Basics%20with%20HTML%20&amp;%20CSS%20f00187c06fae4c0582422f7947326b9b/Screenshot_(1322).png" width="600" height="400" loading="lazy"><figcaption>Página web</figcaption></figure><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/05/Screenshot_-1321-.png" class="kg-image" alt="Understanding%20Web%20design%20Basics%20with%20HTML%20&amp;%20CSS%20f00187c06fae4c0582422f7947326b9b/Screenshot_(1321).png" width="600" height="400" loading="lazy"><figcaption>Página web basica</figcaption></figure><p>2. Abra el archivo en cualquier navegador (Chrome, Firefox, IE), y entonces podrá ver su página web HTML.</p><h2 id="resultados-de-nuestro-dise-o-html-b-sico">Resultados de nuestro diseño HTML básico</h2><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/05/_C__Users_wel_Desktop_Tutorial.html_-2-.png" class="kg-image" alt="Understanding%20Web%20design%20Basics%20with%20HTML%20&amp;%20CSS%20f00187c06fae4c0582422f7947326b9b/_C__Users_wel_Desktop_Tutorial.html_(2).png" width="600" height="400" loading="lazy"><figcaption>HTML básico</figcaption></figure><p>Puedes ver claramente los resultados, aunque todavía no hay colores ni estilo. Aunque todavía se mira que la estructura está ahí - la barra de navegación, seguida por el cuerpo principal que contiene el contenido, luego por un pie de página en la parte inferior.</p><h1 id="c-mo-a-adir-colores-estilo-y-potencia-al-html-con-css">Cómo añadir colores, estilo y potencia al HTML con CSS</h1><p>CSS son las siglas de <code>Cascading Style Sheets</code> (hojas de estilo en cascada), que son los archivos de hojas de diseño que añaden colores, estilo y potencia a los elementos estructurales de tu HTML.</p><p>Puede pensar en el CSS como la pintura, la decoración y los elementos de diseño que añade para que tu casa quede bonita.</p><p>Existen múltiples formas de añadir CSS a tu estructura HTML. Vamos a explorar la técnica más básica que es añadir CSS a través de la etiqueta <code>&lt;style&gt;</code>.</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;head&gt;
	&lt;title&gt;Título página&lt;/title&gt;
    
    &lt;style&gt;

    body {
      background-color: lightblue;
      margin: 0;
      text-align: center;
    }

    nav {
     background-color: black;
     width: 100%;
     color: white;
     height: 50px;
     padding-top: 25px;
    }

    h1 {
     color: black;
    }

    footer {
     background-color: gray;
     color: white;
     padding: 5px;
    }

    &lt;/style&gt;
&lt;/head&gt;</code></pre><figcaption>CSS creado con la etiqueta style en el head</figcaption></figure><h2 id="explicaci-n-del-anterior-css">Explicación del anterior CSS</h2><p>Puedes ver que hemos añadido el CSS a través de la etiqueta style dentro de la etiqueta head del documento en el código anterior. Esta es una forma básica de añadir CSS.</p><p>Vamos a desglosar y explorar las propiedades CSS que hemos utilizado en los cuatro elementos anteriores.</p><h3 id="el-elemento-body">El elemento body</h3><figure class="kg-card kg-code-card"><pre><code class="language-css">body {
  background-color: lightblue;
  margin: 0;
  text-align: center;
}</code></pre><figcaption>Estilo aplicado a body</figcaption></figure><p>El selector CSS del cuerpo se refiere a toda la estructura de la interfaz de usuario que vemos. Añade algunas propiedades de CSS:</p><ul><li><code>background-color</code> añade el color de fondo - aquí es azul claro.</li><li><code>margin</code> que gestiona los espacios a ambos lados de la estructura de la página web.</li><li><code>text-aligned: center</code> significa que todo el contenido estará alineado al centro en este caso.</li></ul><p>Todo este CSS aplica a la página web, todos los elementos se enlazarán automáticamente estas propiedades generales CSS hasta que se especifiquen sus propias propiedades que difieran de estas globales.</p><h3 id="el-elemento-nav">El elemento nav</h3><figure class="kg-card kg-code-card"><pre><code class="language-css">nav {
 background-color: black;
 width: 100%;
 color: white;
 height: 50px;
 padding-top: 25px;
}</code></pre><figcaption>Elemento nav de la página web</figcaption></figure><p>El selector nav se refiere a la barra de navegación de la página web, la cual aplica propiedades de diseño.</p><p>Hemos establecido el color de fondo en negro, su anchura en <code>100%</code> para que ocupe todo el ancho, su <code>color</code> que representa el color del texto o enlaces dentro de la barra de navegación, su <code>height</code>(altura) en <code>50px</code> y le hemos dado un <code>padding-top</code> de <code>25px</code>.</p><p>El <code>padding</code> se refiere al espacio entre el contenido y el borde. Como queremos que el texto esté <code>alineado al centro</code>, tenemos que añadir un padding de la mitad de los píxeles de la altura real de la barra de navegación, es decir, <code>50px (altura de la barra de navegación) / 2 = 25px</code>. Esto asegurará que el texto dentro de la barra de navegación esté alineado al centro.</p><h3 id="elemento-h1">Elemento h1</h3><figure class="kg-card kg-code-card"><pre><code class="language-css">h1 {
 color: black;
}</code></pre><figcaption>Título h1</figcaption></figure><p>El selector <code>h1</code> aplica CSS a la etiqueta <code>h1</code> en el HTML. Por consiguiente la propiedad de <code>color</code> sea <code>black</code>(negro).</p><h3 id="elemento-footer">Elemento footer</h3><figure class="kg-card kg-code-card"><pre><code class="language-css">footer {
 background-color: gray;
 color: white;
 padding: 5px;
}</code></pre><figcaption>Pie de página en CSS</figcaption></figure><p>Este es el último selector que se refiere al pie de página de nuestra web. Aquí, hemos establecido un conjunto similar de propiedades que discutimos anteriormente para la <code>navbar</code>(barra de navegación), así que no hay nada realmente nuevo aquí.</p><p>¡Y eso es todo!</p><h1 id="qu-aspecto-tiene-la-p-gina-web-despu-s-de-a-adir-el-css">Qué aspecto tiene la página web después de añadir el CSS</h1><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2021/05/_C__Users_wel_Desktop_Tutorial.html_-1-.png" class="kg-image" alt="Understanding%20Web%20design%20Basics%20with%20HTML%20&amp;%20CSS%20f00187c06fae4c0582422f7947326b9b/_C__Users_wel_Desktop_Tutorial.html_(1).png" width="600" height="400" loading="lazy"><figcaption>Página web con CSS</figcaption></figure><p>Ahora puedes ver cuánta vida puede añadirle el CSS a nuestra estructura básica de HTML. ¿No es increíble?</p><p>Estos son solo los fundamentos del diseño web, pero en realidad es bastante divertido una vez que los aprendes.</p><h1 id="conclusi-n-">Conclusión:</h1><p>Ahora que aprendiste los fundamentos del diseño de páginas web, puede ver lo accesible que puede ser, lo práctico que es y cómo se relaciona con muchos conceptos de la vida real, como la construcción de una casa.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aprende las bases de HTML para principiantes en solo 15 minutos ]]>
                </title>
                <description>
                    <![CDATA[ Si quieres crear un sitio web, el primer lenguaje que necesitas aprender es HTML. Artículo original escrito por Thu Nghiem [https://www.freecodecamp.org/news/author/thu/] Artículo original Learn HTML Basics for Beginners in Just 15 Minutes [https://www.freecodecamp.org/news/html-basics-for-beginners/] Traducido y adaptado por Ezequiel Castellanos [/espanol/news/author/ezequiel_caste/] En este artículo vamos a repasar los conceptos básicos de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/aprende-las-bases-de-html-para-principiantes-en-solo-15-minutos/</link>
                <guid isPermaLink="false">60d609820703cb0926dc770c</guid>
                
                    <category>
                        <![CDATA[ Desarrollo Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ezequiel Castellanos ]]>
                </dc:creator>
                <pubDate>Mon, 09 Aug 2021 10:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/08/Ep10_html.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h2 id="si-quieres-crear-un-sitio-web-el-primer-lenguaje-que-necesitas-aprender-es-html-">Si quieres crear un sitio web, el primer lenguaje que necesitas aprender es HTML.</h2><p><br><strong>Artículo original escrito por</strong> <a href="https://www.freecodecamp.org/news/author/thu/">Thu Nghiem</a><br><strong>Artículo original </strong><a href="https://www.freecodecamp.org/news/html-basics-for-beginners/">Learn HTML Basics for Beginners in Just 15 Minutes</a><br><strong>Traducido y adaptado por</strong> <a href="https://www.freecodecamp.org/espanol/news/author/ezequiel_caste/">Ezequiel Castellanos</a></p><p>En este artículo vamos a repasar los conceptos básicos de HTML. Al final vamos a crear un sitio web básico utilizando únicamente HTML.</p><p>Aquí hay un video que puedes ver si quieres complementar este artículo:‌‌</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.17932432432432%;" class="fluid-width-video-wrapper">
            <iframe src="https://www.youtube.com/embed/pMJ0NI3OkYA?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; 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: 740px; height: 415.727px;"></iframe>
          </div>
        </div>
      </figure><p></p><h2 id="-qu-es-html"><strong>¿Qué es<strong> HTML?</strong></strong></h2><p>HTML, cuyas siglas significan Lenguaje de Marcado de Hipertexto (Hypertext Markup Languaje), es un lenguaje bastante simple. Consiste en distintos elementos que utilizamos para estructurar una página web.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/2_1_cr.png" class="kg-image" alt="2_1_cr" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/2_1_cr.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/2_1_cr.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/08/2_1_cr.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/08/2_1_cr.png 2400w" sizes="(min-width: 1200px) 1200px" width="2000" height="1250" loading="lazy"><figcaption>¿Qué es HTML?</figcaption></figure><h2 id="-qu-son-los-elementos-html"><strong>¿Qué son los elementos <strong>HTML?</strong></strong></h2><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/Elemento-HTML_cr.png" class="kg-image" alt="Elemento-HTML_cr" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/Elemento-HTML_cr.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/Elemento-HTML_cr.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/08/Elemento-HTML_cr.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/08/Elemento-HTML_cr.png 2400w" sizes="(min-width: 1200px) 1200px" width="2000" height="1257" loading="lazy"><figcaption>Elementos HTML</figcaption></figure><p>El elemento normalmente comienza con una etiqueta de apertura, la cual consiste en el nombre del elemento. Se rodean (Es contenida) por corchetes angulares de apertura y cierre. La etiqueta de apertura indica dónde comienza el elemento.</p><p>De igual manera que la etiqueta de apertura, la etiqueta de cierre también está contenida por corchetes angulares de apertura y cierre. Pero también incluye una barra antes del nombre del elemento.</p><p>Todo lo que está dentro de las etiquetas de apertura y cierre es el contenido.</p><p>Pero no todos los elementos siguen este patrón. Les decimos elementos vacíos a aquellos que no siguen este patrón. Estos únicamente consisten en una etiqueta simple o una etiqueta de apertura que no puede tener ningún contenido. Estos elementos se utilizan normalmente para insertar algo en el documento.</p><p>Por ejemplo, el elemento <code>&lt;img&gt;</code> es utilizado para insertar un archivo de imagen, o el elemento <code>&lt;input&gt;</code> es utilizado para insertar un campo de datos en la página.</p><pre><code class="language-html">&lt;img src="https://images.unsplash.com/photo-1610447847416-40bac442fbe6" width="50"&gt;</code></pre><p>En el ejemplo de arriba, el elemento <code>&lt;img&gt;</code> sólo consiste en una etiqueta que no tiene ningún contenido. Este elemento es usado para insertar en el documento un archivo de imagen desde <a href="https://unsplash.com/">Unsplash</a>.</p><h2 id="como-anidar-elementos-html"><strong>Como anidar elementos <strong>HTML</strong></strong></h2><pre><code class="language-html">&lt;div class="my-list"&gt;
  &lt;h4&gt;My list:&lt;/h4&gt;

  &lt;ul&gt;
     &lt;li&gt;Apple&lt;/li&gt;
     &lt;li&gt;Orange&lt;/li&gt;
     &lt;li&gt;Banana&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;
</code></pre><p>Los elementos pueden ser colocados dentro de otros elementos. Esto se llama Anidamiento. En el ejemplo de arriba, dentro del elemento <code>&lt;div&gt;</code> tenemos un elemento <code>&lt;h4&gt;</code> y un elemento <code>&lt;ul&gt;</code> o elemento de lista no ordenado. De manera similar dentro del elemento <code>&lt;ul&gt;</code> hay 3 elementos <code>&lt;li&gt;</code> o elemento de lista.</p><p>El anidamiento básico es bastante sencillo de entender. Pero cuando la página crece, el anidamiento puede complicarse.</p><p>Por lo tanto, antes de trabajar con HTML, piensa sobre la estructura de diseño que te gustaría tener. Puedes dibujarla en un papel o en tu mente. Será de mucha ayuda.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/3_1_cr.png" class="kg-image" alt="3_1_cr" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/3_1_cr.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/3_1_cr.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/08/3_1_cr.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/08/3_1_cr.png 2400w" sizes="(min-width: 1200px) 1200px" width="2000" height="1250" loading="lazy"></figure><h2 id="-qu-son-los-atributos-html"><strong>¿Qué son los atributos HTML<strong>?</strong></strong></h2><p>Los elementos también tienen atributos que contienen información adicional acerca del elemento que no aparecerá en el contenido.</p><pre><code class="language-html">&lt;img src="https://images.unsplash.com/photo" width="50"&gt;</code></pre><p>En el ejemplo de arriba, el elemento <code>&lt;img&gt;</code> tiene 2 atributos: <code>src</code> u origen para especificar la ruta de la imagen, y <code>width</code> para especificar el ancho de la imagen en pixeles.</p><figure class="kg-card kg-image-card kg-width-wide"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/4_1_cr.png" class="kg-image" alt="4_1_cr" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/4_1_cr.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/4_1_cr.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/08/4_1_cr.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/08/4_1_cr.png 2400w" sizes="(min-width: 1200px) 1200px" width="2000" height="1248" loading="lazy"></figure><p>Con este ejemplo, puedes ver las siguientes características o atributos:</p><ul><li>Hay un espacio entre atributo y el nombre del elemento</li><li>Los atributos se agregan en la etiqueta de apertura</li><li>Los elementos pueden tener varios atributos</li><li>Los atributos tienen un nombre y un valor: nombre=“valor”</li></ul><p>Pero no todos los atributos tienen el mismo patrón. Algunos pueden existir sin valores y les decimos Atributos Booleanos.</p><pre><code class="language-html">&lt;button onclick=“alert('Submit')" disabled&gt;Button&lt;/button&gt;</code></pre><p>En este ejemplo, si queremos desactivar el botón, lo único que tenemos que hacer es pasar un atributo <code>disabled</code> sin ningún valor. Esto significa que la presencia del atributo representa el valor verdadero, de lo contrario, la ausencia representa el valor falso.</p><h3 id="elementos-comunes-de-html"><strong>Elementos comunes de <strong>HTML</strong></strong></h3><p>Existen en total más de 100 elementos. Pero 90% del tiempo sólo vas a utilizar alrededor de 20 de los más comunes. Los he colocado en 5 grupos:</p><h4 id="elementos-de-secci-n"><strong>Elementos de sección</strong></h4><pre><code class="language-html">  &lt;div&gt;, &lt;span&gt;, &lt;header&gt;, &lt;footer&gt;, &lt;nav&gt;, &lt;main&gt;, &lt;section&gt; 
</code></pre><p>Estos elementos se utilizan para organizar el contenido en diferentes secciones. Por lo general son muy obvios, por ejemplo<code>&lt;header&gt;</code> representa a un grupo de la sección de introducción y navegación, <code>&lt;nav&gt;</code> representa la sección que contiene los enlaces de navegación, etcétera.</p><h4 id="contenido-de-texto"><strong>Contenido de texto</strong></h4><pre><code class="language-html">  &lt;h1&gt; to &lt;h6&gt;, &lt;p&gt;, &lt;div&gt;, &lt;span&gt;, &lt;ul&gt;, &lt;ol&gt;, &lt;li&gt;
</code></pre><p>Estos elementos se utilizan para organizar contenido o bloques de texto. Son importantes para la accesibilidad y posicionamiento en buscadores (SEO). Estos le comunican al navegador el propósito o estructura del contenido.</p><h4 id="formularios"><strong>Formularios</strong></h4><pre><code class="language-html">  &lt;form&gt;, &lt;input&gt;, &lt;button&gt;, &lt;label&gt;, &lt;textarea&gt;
</code></pre><p>Estos elementos pueden utilizarse juntos para crear formularios que los usuarios pueden completar y enviar. Los formularios pueden ser la parte más complicada de HTML.</p><h4 id="im-genes-y-enlaces">Imágenes<strong> y enlaces</strong></h4><pre><code class="language-html">  &lt;img&gt;, &lt;a&gt;
</code></pre><p>Estos elementos se utilizan para insertar una imagen o crear un hipervínculo.</p><h4 id="otros"><strong><strong>Otr</strong>o<strong>s</strong></strong></h4><pre><code class="language-html">  &lt;br&gt;, &lt;hr&gt;
</code></pre><p>Estos elementos se utilizan para agregar un quiebre a la página web.</p><p>Puedes encontrar todos los elementos en <a href="https://developer.mozilla.org/es/docs/Web/HTML/Element">developer.mozilla.org</a>. Pero para principiantes, sólo necesitas conocer los más comunes.</p><h2 id="elementos-html-de-nivel-bloque-vs-en-l-nea"><strong>Elementos <strong>HTML</strong> de nivel bloque vs en línea</strong></h2><p>De manera predeterminada un elemento puede ser un elemento de nivel bloqué o en línea.</p><p>Elementos de nivel bloqué son los elementos que siempre comienzan en una nueva línea y ocupan todo el ancho disponible.</p><p>Elementos en línea son los elementos que no comienzan en una nueva línea y sólo ocupan tanto ancho como sea necesario.‌‌</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/espanol/news/content/images/2021/08/5_cr.png" class="kg-image" alt="5_cr" srcset="https://www.freecodecamp.org/espanol/news/content/images/size/w600/2021/08/5_cr.png 600w, https://www.freecodecamp.org/espanol/news/content/images/size/w1000/2021/08/5_cr.png 1000w, https://www.freecodecamp.org/espanol/news/content/images/size/w1600/2021/08/5_cr.png 1600w, https://www.freecodecamp.org/espanol/news/content/images/size/w2400/2021/08/5_cr.png 2400w" sizes="(min-width: 1200px) 1200px" width="2000" height="1252" loading="lazy"><figcaption>Elementos de nivel Bloque vs En Línea</figcaption></figure><p>Dos elementos que representan elementos de nivel bloqué y elementos en línea, respectivamente, son <code>&lt;div&gt;</code> y <code>&lt;span&gt;</code>. En este ejemplo puedes ver que el elemento <code>&lt;div&gt;</code> ocupa 3 líneas, mientras que el elemento <code>&lt;span&gt;</code> solo ocupa 1 línea.</p><p>Pero la pregunta es: ¿Cómo sabemos cuáles son elementos a nivel de bloqué y cuáles son elementos en línea? Bueno, desafortunadamente necesitas recordarlos. La forma más sencilla es recordar cuáles son elementos en línea y el si resto son elementos de bloqué. </p><p>Si recordamos los elementos HTML más comunes, los elementos en línea incluyen: <code>&lt;span&gt;, &lt;input&gt;, &lt;button&gt;, &lt;label&gt;, &lt;textarea&gt;, &lt;img&gt;, &lt;a&gt;, &lt;br&gt;</code>.</p><h2 id="-c-mo-comentar-en-html"><strong>¿Cómo comentar en <strong>HTML</strong>?</strong></h2><pre><code class="language-html">&lt;p&gt;This is a paragraph.&lt;/p&gt;

&lt;!-- &lt;p&gt;I am not showing.&lt;/p&gt; --&gt;
</code></pre><p>El propósito de los comentarios es incluir notas en el código para explicar la lógica o simplemente para organizar tu código.</p><p>Los comentarios HTML están contenidos por marcadores especiales: <code>&lt;!-- y --&gt;</code> y son ignorados en el navegador.</p><h2 id="como-utilizar-entidades-html"><strong>Como utilizar entidades <strong>HTML</strong></strong></h2><p>¿Qué pasa si quieres mostrar el texto: <code>la etiqueta &lt;p&gt; define un párrafo.</code>, pero el navegador interpreta <code>&lt;p&gt;</code> como una etiqueta de apertura para un nuevo elemento? En este caso, podemos usar entidades de caracteres HTML como en el siguiente ejemplo:</p><pre><code class="language-html">&lt;p&gt;the &lt;p&gt; tag defines a paragraph.&lt;/p&gt;

&lt;p&gt;the &amp;lt;p&amp;gt; define a paragraph.&lt;/p&gt;
</code></pre><h2 id="c-mo-utilizar-emoji-en-html"><strong>Cómo utilizar emoji en <strong>HTML</strong></strong></h2><p>En la web moderna, podemos mostrar emoji en HTML de manera bastante fácil, así: ?</p><pre><code class="language-html">&lt;p&gt;? Cara Sonriente.&lt;/p&gt;

&lt;p&gt;? Cumpleaños&lt;/p&gt;
</code></pre><h2 id="errores-comunes-de-principiantes-en-html"><strong>Errores comunes de principiantes en <strong>HTML</strong></strong></h2><h3 id="1-nombres-de-etiquetas-elementos"><strong><strong>1. </strong>Nombres de Etiquetas/Elementos</strong></h3><p>Los nombres de las etiquetas/elementos no no distinguen entre mayúsculas y minúsculas. Esto significa que se pueden escribir en minúscula o mayúscula, pero se recomienda que escribas todo en minúscula: <code>&lt;button&gt;</code> no <code>&lt;ButTon&gt;</code>.</p><h3 id="2-etiqueta-de-cierre"><strong><strong>2. </strong>Etiqueta de cierre</strong></h3><p>No incluir la etiqueta de cierre es un error común de principiante. Por lo tanto, cuando estés creando una etiqueta de apertura, inmediatamente agrega la etiqueta de cierre.</p><h3 id="3-anidado"><strong><strong>3. </strong>Anidado</strong></h3><p>Esto está mal:</p><pre><code class="language-html">&lt;div&gt;Div 1 &lt;span&gt; Span 2 &lt;/div&gt;&lt;/span&gt;
</code></pre><p>Las etiquetas &nbsp;tienen que abrirse y cerrarse de tal forma que queden dentro o fuera de las otras.</p><h3 id="4-comillas-simples-o-comillas-dobles"><strong>4. Comillas simples o Comillas dobles</strong></h3><p>Esto está mal:</p><pre><code class="language-html">&lt;img src="https://images.unsplash.com/'&gt;
</code></pre><p>No se pueden mezclar comillas simples con comillas dobles. Siempre deberías usar comillas dobles y usar entidades HTML si fuera necesario.</p><h2 id="-c-mo-crear-un-sitio-web-simple-con-html"><strong>¿Cómo crear un sitio web simple con HTML?</strong></h2><p>Los elementos HTML individuales no son suficientes como para crear un sitio web. Entonces veamos qué más necesitamos para crear un sitio web simple desde cero.</p><h3 id="-c-mo-crear-un-documento-html"><strong>¿Cómo crear un documento HTML?</strong></h3><p>Primero, abramos <a href="https://code.visualstudio.com/">Visual Studio Code</a> (o tu editor de código favorito). En la carpeta que elijas, crea un nuevo archivo y dale el nombre de index.html.</p><p>En el archivo index.html, escribe! (signo de exclamación) y presiona enter. Vas a ver algo como esto:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
    &lt;meta charset="UTF-8"&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&gt;
    &lt;title&gt;Document&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
    
&lt;/body&gt;
&lt;/html&gt;
</code></pre><p>Esto es el código mínimo que un documento HTML debe tener para armar un sitio web. Aquí tenemos:</p><ol><li><code>&lt;!DOCTYPE html&gt;</code>: Primero tenemos Doctype. Por alguna extraña razón histórica tenemos que incluir el doctype para que todo funcione correctamente.</li><li><code>&lt;html lang="en"&gt;&lt;/html&gt;</code>: El elemento<code>&lt;html&gt;</code> envuelve todo el contenido de la página, también conocido como el elemento raíz. Siempre debemos incluir el atributo <code>lang</code> para declarar el idioma de la página.</li><li><code>&lt;head&gt;&lt;/head&gt;</code>: El elemento <code>&lt;head&gt;</code> es un contenedor para todo lo que quieras incluir pero no contenido que muestres a tus usuarios.</li><li><code>&lt;meta charset="UTF-8" /&gt;</code>: El primer elemento meta es utilizado para establecer el set de caracteres para que sea UTF-8, el cual incluye la mayoría de los caracteres del lenguaje escrito.</li><li><code>&lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt;</code>: El segundo elemento meta especifica el viewport del navegador. Esta configuración es para un sitio web optimizado para dispositivos móviles.</li><li><code>&lt;title&gt;Document&lt;/title&gt;</code>: Este es el elemento <code>&lt;title&gt;</code>. Establece el título de la página.</li><li><code>&lt;body&gt;&lt;/body&gt;</code>: El elemento <code>&lt;body&gt;</code> contiene todo el contenido en la página.</li></ol><h3 id="-c-mo-crear-una-p-gina-de-recetas-de-panqueques"><strong>¿Cómo crear una </strong>página de recetas de panqueques?</h3><p>Bien, ahora que tenemos el código inicial creemos la página de recetas de panqueques. Vamos a usar el contenido de la página <a href="https://www.allrecipes.com/recipe/21014/good-old-fashioned-pancakes/">AllRecipes</a>.</p><p>Primero, vamos a darle al elemento <code>&lt;title&gt;</code> contenido de la receta de panqueques. Vas a ver cambiar el texto en la pestaña de la página web. En el elemento <code>&lt;body&gt;</code>, creamos 3 elementos: <code>&lt;header&gt;</code>, <code>&lt;main&gt;</code> y <code>&lt;footer&gt;</code> que representan las 3 secciones.</p><h4 id="1-crear-la-secci-n-de-encabezado"><strong>1. Crear la sección de encabezado</strong></h4><p>En el encabezado, queremos tener el logo y la navegación. Por lo tanto, vamos a crear un <code>div</code> con el contenido <code>ALL RECIPE</code> para el logo.</p><p>Para la navegación, usemos el elemento <code>&lt;nav&gt;</code>. Dentro del elelmento <code>&lt;nav&gt;</code>, podemos usar <code>&lt;ul&gt;</code> para crear una lista desordenada. Queremos tener 3 elementos <code>&lt;li&gt;</code> para 3 enlaces: Ingredientes, Pasos, y Suscribirse. El código del encabezado se ve así:</p><pre><code class="language-html">...
    &lt;header&gt;
      &lt;div&gt;ALL RECIPE&lt;/div&gt;
      &lt;nav&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="#ingredients"&gt;Ingredientes&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="#steps"&gt;Pasos&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="#subsribe"&gt;Suscribirse&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/nav&gt;
    &lt;/header&gt;
...
</code></pre><h4 id="2-crear-la-secci-n-principal"><strong>2. Crear la sección principal</strong></h4><p>En la sección main, primero, queremos tener un título y una imagen. Podemos usar <code>h1</code> para el título y <code>&lt;img&gt;</code> para la imagen (podemos usar una imagen desde <a href="https://images.unsplash.com/">Unsplash</a> gratis):</p><pre><code class="language-html">...
    &lt;main&gt;
      &lt;h1&gt;Panqueques Clásicos&lt;/h1&gt;
      &lt;img
        src="https://images.unsplash.com/photo-1575853121743-60c24f0a7502"
        alt="pancake"
        width="250"
      /&gt;
    &lt;/main&gt;
...
</code></pre><p>Después, queremos listar todos los ingredientes. Podemos usar <code>&lt;ol&gt;</code> para crear una lista ordenada y <code>&lt;input type="checkbox" /&gt;</code> para crear una casilla de verificación.</p><p>Pero antes de esto, podemos usar <code>&lt;h2&gt;</code> para comenzar un nuevo bloque de contenido. También vamos a agregar el atributo <code>id</code> para el <code>&lt;h2&gt;</code> para que el enlace en la navegación sepa donde ir:</p><pre><code class="language-html">...
    &lt;main&gt;
    ...
      &lt;h2 id="ingredients"&gt;Ingredientes&lt;/h2&gt;
      &lt;ol&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 1 ½ tazas de harina para todo uso&lt;/li&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 3 ½ cucharaditas de levadura en polvo&lt;/li&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 1 cucharadita de sal&lt;/li&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 1 cucharada de azucar blanca&lt;/li&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 1 ¼ tazas de leche&lt;/li&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 1 huevo&lt;/li&gt;
      &lt;/ol&gt;
    &lt;/main&gt;
...
</code></pre><p>Después de los ingredientes, vamos a listar todos los pasos. Podemos usar <code>&lt;h4&gt;</code> para el encabezado de los pasos y <code>&lt;p&gt;</code> para el contenido de los pasos:</p><pre><code class="language-html">...
    &lt;main&gt;
    ...
      &lt;h2 id="steps"&gt;Pasos&lt;/h2&gt;
      
      &lt;h4&gt;Paso 1&lt;/h4&gt;
      &lt;p&gt;
        En un tazón grande, tamice la harina, el polvo de hornear, la sal y el azúcar.
        Hacer un hueco en el centro y verter la leche, el huevo y la mantequilla derretida;
        mezclar hasta que quede suave.
      &lt;/p&gt;
      
      &lt;h4&gt;Paso 2&lt;/h4&gt;
      &lt;p&gt;
        Caliente una plancha o sartén ligeramente engrasada a fuego medio-alto.
        Verter o coloque la masa en la plancha, usando aproximadamente 1/4 taza para cada panqueque.
          Dorar por ambos lados y servir caliente.
      &lt;/p&gt;
    &lt;/main&gt;
...
</code></pre><p>Bien, ahora que hemos terminado con la sección principal, sigamos con la sección pie de página.</p><h4 id="3-crear-la-secci-n-pie-de-p-gina"><strong>3. Crear la sección pie de página</strong></h4><p>En el pie de página queremos tener el formulario de suscripción y el texto de derechos de autor.</p><p>Para el formulario de suscripción, podemos usar el elemento <code>&lt;form&gt;</code>. Dentro podemos tener un <code>&lt;input type="text"&gt;</code> para la entrada de texto y un botón <code>&lt;button&gt;</code> para el botón de enviar.</p><p>Para el texto de derechos de autor, simplemente podemos usar un <code>&lt;div&gt;</code>. Tome nota aquí, podemos usar la entidad HTML <code>$copy;</code> para el símbolo de copyright.</p><p>Podemos incluir un <code>&lt;br&gt;</code> para agregar espacio entre el formulario de suscripción y el texto copyright:</p><pre><code class="language-html">...
    &lt;footer&gt;
      &lt;h6 id="subscribe"&gt;Suscribirse&lt;/h6&gt;
      &lt;form onsubmit="alert('Suscrito')"&gt;
        &lt;input type="text" placeholder="Ingrese Email" /&gt;
        &lt;button&gt;Enviar&lt;/button&gt;
      &lt;/form&gt;
      &lt;br /&gt;
      &lt;div&gt;&amp;copy; dakota kelly en Allrecipe.com&lt;/div&gt;
    &lt;/footer&gt;
...
</code></pre><p>Bien, ahora hemos terminado! Aquí está el código completo para referencia:</p><pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html lang="en"&gt;
  &lt;head&gt;
    &lt;meta charset="UTF-8" /&gt;
    &lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&gt;
    &lt;title&gt;Receta para Panqueques&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;header&gt;
      &lt;div&gt;ALL RECIPE&lt;/div&gt;
      &lt;nav&gt;
        &lt;ul&gt;
          &lt;li&gt;&lt;a href="#ingredients"&gt;Ingredientes&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="#steps"&gt;Pasos&lt;/a&gt;&lt;/li&gt;
          &lt;li&gt;&lt;a href="#subsribe"&gt;Suscribirse&lt;/a&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/nav&gt;
    &lt;/header&gt;
    &lt;main&gt;
      &lt;h1&gt;Panqueques Clásicos&lt;/h1&gt;
      &lt;img
        src="https://images.unsplash.com/photo-1575853121743-60c24f0a7502?ixid=MXwxMjA3fDB8MHxzZWFyY2h8MXx8cGFuY2FrZXxlbnwwfHwwfA%3D%3D&amp;ixlib=rb-1.2.1&amp;auto=format&amp;fit=crop&amp;w=700&amp;q=60"
        alt="pancake"
        width="250"
      /&gt;
      &lt;h2 id="ingredients"&gt;Ingredientes&lt;/h2&gt;
      &lt;ol&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 1 ½ tazas de harina para todo uso&lt;/li&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 3 ½ cucharaditas de levadura en polvo&lt;/li&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 1 cucharadita de sal&lt;/li&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 1 cucharada de azucar blanca&lt;/li&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 1 ¼ tazas de leche&lt;/li&gt;
        &lt;li&gt;&lt;input type="checkbox" /&gt; 1 huevo&lt;/li&gt;
      &lt;/ol&gt;    
      &lt;h2 id="steps"&gt;Pasos&lt;/h2&gt;
      
      &lt;h4&gt;Paso 1&lt;/h4&gt;
      &lt;p&gt;
        En un tazón grande, tamice la harina, el polvo de hornear, la sal y el azúcar.
        Hacer un hueco en el centro y verter la leche, el huevo y la mantequilla derretida;
        mezclar hasta que quede suave.
      &lt;/p&gt;
      
      &lt;h4&gt;Paso 2&lt;/h4&gt;
      &lt;p&gt;
        Caliente una plancha o sartén ligeramente engrasada a fuego medio-alto.
        Verter o coloque la masa en la plancha, usando aproximadamente 1/4 taza para cada panqueque.
          Dorar por ambos lados y servir caliente.
      &lt;/p&gt;
    &lt;/main&gt;
    &lt;hr /&gt;
    &lt;footer&gt;
      &lt;h6 id="subscribe"&gt;Suscribirse&lt;/h6&gt;
      &lt;form onsubmit="alert('Suscrito')"&gt;
        &lt;input type="text" placeholder="Ingrese Email" /&gt;
        &lt;button&gt;Enviar&lt;/button&gt;
      &lt;/form&gt;
      &lt;br /&gt;
      &lt;div&gt;&amp;copy; dakota kelly en Allrecipe.com&lt;/div&gt;
    &lt;/footer&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><h2 id="conclusi-n"><strong>Conclusión</strong></h2><p>Puedes crear un sitio web simple con solo HTML. Pero para poder construir sitios web hermosos y funcionales, necesitas estudiar CSS y JavaScript.</p><p>Me puedes seguir en redes sociales o Youtube para actualizaciones futuras sobre estos temas. Pero mientras tanto, puedes chequear el Plan de Estudios de <a href="https://www.freecodecamp.org/espanol/learn/">freeCodeCamp</a> para practicar HTML resolviendo pequeñas tareas.</p><p>Si no, puedes seguir codeando y nos vemos en futuros posts ?.<br><br>__________ ? Acerca de mí __________</p><ul><li>Soy el fundador de <a href="https://devchallenges.io/">DevChallenges</a></li><li>Suscríbete a <a href="https://www.youtube.com/c/thunghiem">mi Canal</a></li><li>Sigue mi<a href="https://twitter.com/thunghiemdinh"> Twitter</a></li><li>Únete al <a href="https://discord.com/invite/3R6vFeM">Discord</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Mejora tu Portafolio de desarrollador con GitHub Pages y Lighthouse ]]>
                </title>
                <description>
                    <![CDATA[ Para alguien que está intentando entrar en el desarrollo de software, no importa dónde busques — LinkedIn, tableros de asesoramiento profesional, tutoriales de YouTube — los consejos siempre son los mismos: necesitas un portafolio. freeCodeCamp conoce este consejo, y hacen que sea obligatorio crear uno para terminar su Certificación de ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/mejora-tu-portafolio-de-desarrollador-con-github-pages-y-lighthouse/</link>
                <guid isPermaLink="false">5fdd0c0b8c7cd154bb97a170</guid>
                
                    <category>
                        <![CDATA[ Desarrollo Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ricardo Conde ]]>
                </dc:creator>
                <pubDate>Wed, 24 Feb 2021 06:33:46 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2021/02/photo-1520532141146-da0ff89cae4b-1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Para alguien que está intentando entrar en el desarrollo de software, no importa dónde busques — LinkedIn, tableros de asesoramiento profesional, tutoriales de YouTube — los consejos siempre son los mismos: necesitas un portafolio. freeCodeCamp conoce este consejo, y hacen que sea obligatorio crear uno para terminar su Certificación de "Diseño Web Responsivo".</p><p>El portafolio debe ser un documento con vida. Terminas un proyecto, agregas ese proyecto a tu portafolio para enseñárselo al mundo. Añades cosas constantemente, demostrando tu trayectoria de crecimiento personal. Se lo das a potenciales reclutadores y gestores de contratación para añadir dimensión a tú resume.</p><p>De los cinco proyectos para conseguir esa certificación, he puesto sin lugar a dudas la mayor parte del trabajo en mi portafolio. Si iba a ser mi primera impresión digital, quería asegurarme de que fuera la mejor que pudiera hacer.</p><p>El método de facto para completar proyectos en freeCodeCamp es usar codepen.io. La versión gratis te deja hacer código en panel HTML, CSS y JavaScript, y ver los cambios según los escribes en la ventana. Puedes abrir la página en ventana completa, lo que elimina los paneles HTML, CSS y JavaScript, pero deja un cartel negro en la parte superior. La URL es un "hash", algo como <a href="https://codepen.io/cam-barts/full/ZPWpqo" rel="noopener">https://codepen.io/cam-barts/full/ZPWpqo</a>, lo que no es memorable, no da ninguna indicación sobre contenido de la dirección, y en mi opinión no impresiona en un resume.</p><p>Además, a no ser que pagues por una afiliación con CodePen, no puedes cambiarlo.</p><p>Al mismo tiempo que estaba terminando mi proyecto, las estrellas se alinearon y descubrí dos tecnologías que ayudarían a mi portafolio a sobresalir: GitHub Pages y Google Lighthouse.</p><p><a href="https://pages.github.com/" rel="noopener">Github Pages</a> te permite alojar una página web directamente desde un repositorio GitHub. Te ofrece un URL github.io bastante profesional que despertó mi interés para ponerlo en un resume. También me permite controlar por completo lo que mis usuarios pudieran ver cuando ellos naveguen a la página, y no tendría que lidiar con alojamiento propio o pagar por algún otro servicio de alojamiento.</p><p>Escuché sobre <a href="https://developers.google.com/web/tools/lighthouse/" rel="noopener">Google Lighthouse</a> en el Podcast de CodeNewbie con Frances Coronel. Google Lighthouse inspecciona tu página web directamente desde Chrome DevTools en cinco áreas: Rendimiento, Aplicación Web Progresiva, Accesibilidad, Mejores Prácticas y SEO. SEO, u Optimización de Motor de Búsqueda, ayuda a que tu página suba a lo alto de los motores de búsqueda como Google, lo que ayuda a que te encuentren. También, ahora que iba a alojar mi página en Pages, quería asumir la responsabilidad del rendimiento de mi página, y para hacerlo de manera eficiente necesitaba un punto de referencia.</p><p>Mi meta al escribir este artículo es ayudarte a crear un sitio de portafolio que se vea profesional y que sea rápido sin costo alguno para tí. Quiero que estés orgulloso en publicarlo en LinkedIn y enlistarlo como el primero en tú resume. Eso por eso que vamos a utilizar GitHub Pages y Google Lighthouse.</p><p>Antes de ir más lejos, he hecho algunas suposiciones. La primera es que tienes una cuenta GitHub. Si no tienes una ya, <a href="https://github.com/join">crear una es fácil</a>. La segunda es que tienes un conocimiento básico de git. Si eres nuevo, hay muchos <a href="https://www.freecodecamp.org/espanol/news/search/?query=git">artículos</a> excelentes sobre como dar el primer paso. Este artículo presupone que hayas completado tu portafolio en CodePen. Finalmente, deberías tener Google Chrome instalado.</p><p>Este artículo sigue mi portafolio personal. Puedes encontrar el pen <a href="https://codepen.io/cam-barts/pen/ZPWpqo">aquí</a>, el código <a href="https://github.com/cam-barts/cam-barts.github.io">aquí</a> y el producto final está en <a href="https://cam-barts.github.io/" rel="noopener">cam-barts.github.io</a>.</p><h3 id="primeros-pasos">Primeros pasos</h3><p>Montar tu página con GitHub Pages es bastante directo. La versión corta es:</p><ul><li>Crea un Repositorio siguiendo la convención de denominación [Usuario de GitHub].github.io</li><li>Clonar localmente</li><li>Crear los archivos <em>index.html</em>, <em>style.css</em>, <em>script.js </em>dentro del repositorio.</li><li>Añadir código a esos archivos</li><li>Commit y push a GitHub</li><li>¡Listo!</li></ul><p>Creas un repositorio con un título que siga la convención [Tu Usuario de GitHub].github.io. Aquí está el mío: cam-barts.github.io. Cualquier código que subas con push a ese repositorio se mostrará cuando navegues a esa página.</p><p>¿Así que, cuando hayas clonado el repositorio localmente, exactamente qué le pones?</p><p>Deberías empezar con estos tres archivos, un archivo <em>index.html</em>, un archivo <em>style.css y </em>un archivo <em>script.js</em>. En el editor que más te guste (yo uso <a href="https://atom.io/" rel="noopener">Atom</a>), deberías empezar con el siguiente fragmento de código en tu <em>index.html</em>:</p><p>Aquí hay bastantes cosas con las que quizás no estés familiarizado si solo has estado trabajando con codepen.io.</p><p>El atributo <em>dir </em>en la etiqueta HTML indica que el documento debería ser leído de derecha a izquierda (<strong>L</strong>eft <strong>T</strong>o <strong>R</strong>ight ). Eso simplemente se asegura de que cuando tu página se muestre, todos los elementos estén justificados a la izquierda, que es como normalmente se lee.</p><p>Las etiquetas meta en el <code>head</code> indican los metadatos de la página, lo que ayuda a los motores de búsqueda como a Google a indexar tu página.</p><p>Llegados a este punto, deberías rellenar las etiquetas de <code>meta</code> y <code>title</code>. Atento a que el contenido de la etiqueta meta <em>keywords </em>debe estar separado por comas, y debe incluir términos que quieras que la gente use para encontrar tu portafolio en Google.</p><p>El siguiente paso es copiar la sección HTML de tu portafolio pen en la sección de body de tu fragmento. Una vez completado, si has vinculado cualquier CSS o JS externos en la configuración de tu pen, como <a href="https://getbootstrap.com/" rel="noopener">Bootstrap</a> o <a href="https://fontawesome.com/?from=io" rel="noopener">Font Awesome</a>, tienes que vincularlos en tu <em>index.html</em>.</p><p>Crea más etiquetas link para CSS y etiquetas script para JavaScript y añade los vínculos que estén en la configuración a los atributos <em>href </em>y <em>src</em>, respectivamente. Para asegurarte de que tus estilos y scripts se muestren, asegúrate de ponerlos antes de las etiquetas de cierre de link y script del fragmento. Por ejemplo, vincular Boostrap a JQuery se vería así:</p><p>Luego, tienes que añadir tu propio CSS a tu <em>style.css</em>, y si tienes algún JavaScript, añade ese a tu <em>script.js</em>.</p><p>Después de eso, estás listo para hacer un commit a todo tu trabajo y subirlo a GitHub con push. ¡Inmediatamente después de hacer eso, puedes navegar a [Tu Usuario GitHub].github.io y echarle un vistazo a tu página!</p><h3 id="optimizar-la-p-gina-de-tu-portafolio">Optimizar la página de tu portafolio</h3><p>¡Enhorabuena por publicar tu portafolio!</p><p>Los siguientes pasos implican optimizar tu página. Para ello, vamos a usar <a href="https://developers.google.com/web/tools/lighthouse/" rel="noopener">Google Lighthouse</a>. Es mejor hacer esto en una ventana Privada de Navegador para que cualquier cache o extensión de Chrome que puedas tener no afecte al resultado. Cuando navegues por tu página, abre las Herramientas de Desarrollador Chrome (Ctrl + Shift+ i) y haz clic en la pestaña de <em>Audits</em>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://cdn-media-1.freecodecamp.org/images/1*7v572NCjU_EmmpcSfIzHdQ.png" class="kg-image" alt="1*7v572NCjU_EmmpcSfIzHdQ" width="800" height="845" loading="lazy"><figcaption>Panel de Google Lighthouse</figcaption></figure><p>Las Aplicaciones Progresivas Web están fuera del alcance de este tutorial, pero hacer todas las inspecciones no hace daño. Cuando las ejecutes, deberías tener una página que se parece a esta:</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/1*YJ54LEN5nN3AuoJ5VEVHYg.png" class="kg-image" alt="1*YJ54LEN5nN3AuoJ5VEVHYg" width="800" height="801" loading="lazy"></figure><p>Lo mejor de estos informes es que te da “Oportunidades” para mejorar tus puntuaciones.</p><p>En la sección de rendimiento, te dice que uses formatos de archivo de próxima generación como WebP frente a imágenes .PNG tradicionales, y sugiere cargar las imágenes con lazy loading.</p><p>En la sección de SEO, sugiere mejoras SEO como añadir una etiqueta meta de descripción y usar tamaños de font legibles. No solo nos da sugerencias, vincula a artículos con ejemplos prácticos y cosas que cambiar en tu código para optimizar esas áreas.</p><p>A mí, me llevó solo una hora para subir la puntuación de mi página a 90 y tantos para Rendimiento, Accesibilidad, Mejores Prácticas y SEO. Puedes ver todos los cambios que hice <a href="https://githistory.xyz/cam-barts/cam-barts.github.io/blob/master/index.html">aquí</a>.</p><h3 id="llendo-m-s-lejos">Llendo más lejos</h3><p>Tú decides los siguientes pasos para tu página. Podrías vincularlo a <a href="https://analytics.google.com/analytics/web/" rel="noopener">Google Analytics</a> para ver cuantas visitas está teniendo tu portafolio. Podrías añadir secciones para tus premios y para mostrar tus certificaciones de freeCodeCamp según las vayas consiguiendo. ¡La evolución de tu página está completamente en tus manos! </p><p>Traducido del artículo de <a href="https://www.freecodecamp.org/news/author/cam/">Cam Barts</a> - <a href="https://www.freecodecamp.org/news/boost-your-dev-portfolio-with-github-pages-and-lighthouse/">Boost your Developer Portfolio with GitHub Pages and Lighthouse</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ ¿Qué es un API? En Español, por favor. ]]>
                </title>
                <description>
                    <![CDATA[ Antes de aprender a desarrollar software, API sonaba como una especie de cerveza. Hoy en día utilizo el término tan a menudo que, de hecho, recientemente he intentado pedir un API en un bar. La respuesta del barman fue lanzar un 404: recurso no encontrado. Conocí a mucha gente, tanto ]]>
                </description>
                <link>https://www.freecodecamp.org/espanol/news/que-es-una-api-en-espanol-por-favor/</link>
                <guid isPermaLink="false">5fcee9338c7cd154bb9736d2</guid>
                
                    <category>
                        <![CDATA[ Desarrollo Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Juan Carrillo ]]>
                </dc:creator>
                <pubDate>Tue, 22 Dec 2020 13:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/espanol/news/content/images/2020/12/1-F8R-PEI9iVJ-sY3qFZemCg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Antes de aprender a desarrollar software, API sonaba como una especie de cerveza.</p><p>Hoy en día utilizo el término tan a menudo que, de hecho, recientemente he intentado pedir un API en un bar.</p><p>La respuesta del barman fue lanzar un 404: recurso no encontrado.</p><p>Conocí a mucha gente, tanto de la industria tecnológica como de otros sectores, que tiene una idea bastante vaga o incorrecta sobre lo que significa este término tan común.</p><p>Técnicamente, API significa Interfaz de Programación de Aplicaciones (<strong>Application Programming Interface)</strong>. En algún momento u otro, la mayoría de las grandes empresas han creado un API para sus clientes o para uso interno.</p><p>Pero, ¿Cómo se explica API en un Español simple? ¿Existe un significado más amplio que el que se utiliza en el desarrollo y en los negocios? En primer lugar, retrocedamos y veamos cómo funciona la propia web.</p><h2 id="www-y-los-servidores-remotos">WWW y los servidores remotos</h2><p>Cuando pienso en la Web, me imagino una gran red de <em>servidores</em> conectados.</p><p>Cada página de Internet está almacenada en algún lugar de un servidor remoto. Un servidor remoto no es tan místico después de todo — es sólo una parte de una computadora remota que está optimizada para procesar peticiones.</p><p>Para poner las cosas en perspectiva, puedes levantar un servidor en tu laptop capaz de servir un sitio web entero a la Web (de hecho, un servidor <em>local</em> es lo que los ingenieros utilizan para desarrollar sitios web antes de liberarlos al público).</p><p>Cuando escribes www.facebook.com en tu navegador, se envía una petición al servidor remoto de Facebook. Una vez que tu navegador recibe la respuesta, interpreta el código y muestra la página.</p><p>Para el navegador, también conocido como el <em>cliente</em>, el servidor de Facebook es un API. Esto significa que cada vez que visitas una página en la Web, interactúas con la API de algún servidor remoto.</p><p>Un API no es lo mismo que el servidor remoto — sino que <strong>es la parte del servidor que recibe las solicitudes y envía las respuestas.</strong></p><h2 id="las-apis-como-una-forma-de-servir-a-tus-clientes">Las APIs como una forma de servir a tus clientes</h2><p>Probablemente has oído hablar de empresas que empaquetan las APIs como productos. Por ejemplo, Weather Underground vende acceso a su API de datos meteorológicos.</p><p><strong>Ejemplo: </strong>El sitio web de tu pequeña empresa tiene un formulario que se utiliza para inscribir clientes a sus citas. Quieres dar a tus clientes la posibilidad de crear automáticamente un evento de calendario de Google con los detalles de esa cita.d</p><p><strong>Uso del API: </strong>La idea es que el servidor de tu página web hable directamente con el servidor de Google con una petición para crear un evento con los detalles datos. Tu servidor recibiría entonces la respuesta de Google, la procesaría y enviaría información relevante al navegador, como un mensaje de confirmación al usuario.</p><p>De forma alternativa, el navegador puede enviar a menudo una solicitud de API directamente al servidor de Google sin tener que pasar por tu servidor.</p><p><strong>¿En qué se diferencia la API de Google Calendar de la API de cualquier otro servidor remoto?</strong></p><p><strong>En término técnicos</strong>, la diferencia es el formato de la solicitud y la respuesta.</p><p>Para mostrar toda la página web, tu navegador espera una respuesta en <em>HTML</em>, que contiene código de presentación, mientras que la llamada al API de Google Calendar sólo devolvería los datos — probablemente en un formato como <em>JSON</em>.</p><p>Si el servidor de tu sitio web hace la solicitud del API, entonces el servidor de tu sitio web es el cliente (de manera similar a como tu navegador es el cliente cuando lo utilizas para navegar a un sitio web).</p><p><strong>Desde la perspectiva de los usuarios</strong>, las APIs les permiten completar la acción sin salir de tu sitio web.</p><p>La mayoría de los sitios web modernos consumen al menos algunas APIs de terceros.</p><p>Muchos problemas ya tienen una solución de terceros, ya sea en forma de librería o servicio. A menudo es más fácil y más fiable utilizar una solución existente.</p><p>No es raro que los equipos de desarrollo dividan su aplicación en varios servidores que se comunican entre sí a través de las APIs. Los servidores que realizan funciones de ayuda para el servidor principal de la aplicación se denominan comúnmente como <em>microservicios</em>.</p><p>En resumen, cuando una empresa ofrece un API a sus clientes, sólo significa que ha construido un conjunto de URLs dedicadas que devuelven respuestas de datos puros — lo que significa que <strong>las respuestas no contendrán el tipo de sobrecarga de presentación que se esperaría en una interfaz gráfica como un sitio web</strong>.</p><p>¿Puedes hacer estas solicitudes con tu navegador? A menudo, sí. Dado que la transmisión HTTP ocurre en texto, tu navegador siempre hará lo mejor que pueda para mostrar la respuesta.</p><p>Por ejemplo, puedes acceder al API de GitHub directamente con tu navegador sin necesidad de un token de acceso. Aquí tienes la respuesta JSON que obtienes cuando visitas la ruta API de un usuario de GitHub en tu navegador (<a href="https://api.github.com/users/petrgazarov" rel="noopener">https://api.github.com/users/petrgazarov</a>):</p><pre><code>{  "login": "petrgazarov",  "id": 5581195,  "avatar_url": "https://avatars.githubusercontent.com/u/5581195?v=3",  "gravatar_id": "",  "url": "https://api.github.com/users/petrgazarov",  "html_url": "https://github.com/petrgazarov",  "followers_url": "https://api.github.com/users/petrgazarov/followers",  "following_url": "https://api.github.com/users/petrgazarov/following{/other_user}",  "gists_url": "https://api.github.com/users/petrgazarov/gists{/gist_id}",  "starred_url": "https://api.github.com/users/petrgazarov/starred{/owner}{/repo}",  "subscriptions_url": "https://api.github.com/users/petrgazarov/subscriptions",  "organizations_url": "https://api.github.com/users/petrgazarov/orgs",  "repos_url": "https://api.github.com/users/petrgazarov/repos",  "events_url": "https://api.github.com/users/petrgazarov/events{/privacy}",  "received_events_url": "https://api.github.com/users/petrgazarov/received_events",  "type": "User",  "site_admin": false,  "name": "Petr Gazarov",  "company": "PolicyGenius",  "blog": "http://petrgazarov.com/",  "location": "NYC",  "email": "petrgazarov@gmail.com",  "hireable": null,  "bio": null,  "public_repos": 23,  "public_gists": 0,  "followers": 7,  "following": 14,  "created_at": "2013-10-01T00:33:23Z",  "updated_at": "2016-08-02T05:44:01Z"}</code></pre><p>El navegador parece haber hecho bien en mostrar una respuesta JSON. Una respuesta JSON como esta está lista para ser usada en tu código. Es fácil extraer datos de este texto. Entonces puedes hacer lo que quieras con los datos.</p><h3 id="a-es-de-aplicaci-n-">A es de “Aplicación”</h3><p>Para cerrar, vamos a añadir un par de ejemplos más de APIs..</p><p>"Aplicación" puede referirse a muchas cosas. Aquí hay algunos de ellos en el contexto de la API:</p><ol><li>Una pieza de software con una función distinta.</li><li>Todo el servidor, toda la aplicación o sólo una pequeña parte de una aplicación</li></ol><p>Básicamente, cualquier pieza de software que se pueda separar de forma distintiva de su entorno, puede ser una "A" en la API, y probablemente también tendrá algún tipo de API.</p><p>Digamos que estás usando una librería de terceros en tu código. Una vez incorporada a tu código, una librería se convierte en parte de tu aplicación general. Al ser una pieza de software distinta, la librería probablemente tenga una API que te permita interactuar con el resto de tu código.</p><p>Aquí tienes otro ejemplo: En el <strong>Diseño Orientado a Objetos</strong>, el código se organiza en objetos. Tu aplicación puede tener cientos de objetos definidos que pueden interactuar entre sí.</p><p>Cada objeto tiene un API: un conjunto de métodos y propiedades públicas que utiliza para interactuar con otros objetos de tu aplicación.</p><p>Un objeto también puede tener una lógica interna que es privada, lo que significa que está oculto al ámbito exterior (y no una API).</p><p>De lo que hemos cubierto, espero que elimine el significado más amplio de API, así como los usos más comunes del término hoy en día.</p><p>Traducido del artículo de <a href="https://twitter.com/PetrGazarov"></a><a href="https://twitter.com/PetrGazarov"><strong>Petr Gazarov</strong></a> - <a href="https://www.freecodecamp.org/news/what-is-an-api-in-english-please-b880a3214a82/"><strong>What is an API? In English, please</strong></a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
