<?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" version="2.0"><channel><title><![CDATA[conoce.dev]]></title><description><![CDATA[Soy programador de JavaScript con más de 10 años de experiencia. Escribo aquí para enseñar habilidades útiles, que te ayudaran conseguir éxito en tus proyectos ]]></description><link>https://conoce.dev</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 11:55:07 GMT</lastBuildDate><atom:link href="https://conoce.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Cómo empezar a hablar un nuevo idioma]]></title><description><![CDATA[Hay una situación muy habitual en el aprendizaje de un idioma: lo estudias durante un tiempo, meses o años, pero te cuesta hablar hasta de lo más sencillo.  Pero si tenemos en cuenta cómo es una clase típica, no debería sorprendernos.
La mayoría de l...]]></description><link>https://conoce.dev/como-empezar-a-hablar-un-nuevo-idioma</link><guid isPermaLink="true">https://conoce.dev/como-empezar-a-hablar-un-nuevo-idioma</guid><category><![CDATA[spanish]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 24 Aug 2022 05:22:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1661328125559/L9kMlWeWZ.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hay una situación muy habitual en el aprendizaje de un idioma: lo estudias durante un tiempo, meses o años, pero te cuesta hablar hasta de lo más sencillo.  Pero si tenemos en cuenta cómo es una clase típica, no debería sorprendernos.</p>
<p>La mayoría de las clases en el colegio se centraban en:</p>
<ul>
<li>leer artículos sobre temas aleatorios, rara vez sobre algo que me interesara lo más mínimo</li>
<li>estudiar teoría gramatical</li>
<li>hacer ejercicios en los que se "practicaba" de una forma muy poco natural. Las conversaciones eran casi siempre con otros estudiantes, que eran tan incompetentes como yo en el idioma en cuestión.</li>
</ul>
<p>La mayoría de las clases particulares eran más de lo mismo: una pérdida de tiempo, pero al menos estabas más expuesto al idioma.</p>
<h2 id="heading-mi-trayectoria-en-el-estudio-de-idiomas">Mi trayectoria en el estudio de idiomas</h2>
<p>Empecé a aprender idiomas de forma típica: estudiando inglés en un colegio público, con un poco de ayuda en casa, y luego con clases en una escuela de idiomas. Sacaba buenas notas en el colegio, pero apenas era capaz de hablarlo.</p>
<p>Todo cambió cuando me pasé de una escuela de idiomas convencional a una que utilizaba un método directo, un enfoque en el que los alumnos <em>hablaban</em> durante la clase. Esto me ayudó a "soltarme" y por primera vez me desenvolví en el uso del vocabulario y las construcciones gramaticales en una conversación.</p>
<p>Por aquella época descubrí el software de repetición espaciada, una forma eficaz de entrenarme con el vocabulario.
Me impresionó tanto la eficacia de aprender idiomas "a mi manera" que se convirtió en una afición; en una faceta que duró unos cuantos años. En esa temporada dejé de centrarme en el inglés y aprendí primero el francés partiendo de cero, y luego empecé de nuevo con el alemán, esta vez dispuesto a aprenderlo. En mi mejor momento hablaba bastante bien el alemán y el francés, y el uso de estos idiomas conformaba una parte importante de mi vida social, a pesar de que vivía en Cracovia (Polonia).</p>
<p>El último idioma en el que me apliqué seriamente fue el español, tras mudarme a España. Aunque ya no me fascinaba tanto aprender idiomas, el estar inmerso en una lengua y en una cultura nueva, me animó a aprenderlo y me motivó.</p>
<h2 id="heading-como-aprenderia-otro-idioma-ahora">¿Cómo aprendería otro idioma ahora?</h2>
<p>Aprendí a manejar los idiomas mientras estudiaba inglés, y luego pulí la técnica al estudiar francés, alemán y español. ¿Qué haría ahora si volviera a aprender idiomas?</p>
<h3 id="heading-unas-cuantas-clases-online-a-la-semana">Unas cuantas clases online a la semana</h3>
<p>Ahora mismo hay tantas plataformas de enseñanza online - por ejemplo, <a target="_blank" href="https://bit.ly/italki11">italki</a>, con las que tienes acceso a nativos de tu idioma de destino, donde quiera que vivas. Yo optaría por unas <em>pocas</em> clases a la semana. En caso de tener limitaciones de tiempo o dinero, las mantendría en 30 ó 45 minutos, pero espaciadas a lo largo de la semana para tener contacto con el idioma cada pocos días.</p>
<p>Como sé que no necesito muchas explicaciones teóricas, me decantaría por profesores más asequibles y no profesionales. No sólo es más barato, sino que ayuda a evitar que el profesor traiga manías de fábrica, como las que quería eludir en el colegio. Por ejemplo, pasar mucho tiempo comentando sutilezas gramaticales. Me encanta aprender bien la gramática, pero de manera intuitiva, no analítica.</p>
<h3 id="heading-centrarse-en-la-conversacion">Centrarse en la conversación</h3>
<p>Mis clases serían únicamente de conversación. Las primeras frases que se aprenden son:</p>
<ul>
<li>"¿Cómo se dice ... ?"</li>
<li>"¿Qué significa ...?"</li>
</ul>
<p>De esta manera podemos empezar a dar clases en el nuevo idioma desde el primer día.</p>
<p>¿De qué hablaría? Lo ideal sería que tuviese suficientes intereses en común con mi profesor para que la conversación fluyera de forma natural. De no ser así, siempre habría temas relevantes:</p>
<ul>
<li>quién soy</li>
<li>a qué me dedico</li>
<li>qué planes tengo para el próximo fin de semana</li>
<li>lo que he hecho recientemente</li>
<li>las noticias que han acaparado las conversaciones últimamente - no cualquier noticia, sino aquéllas de las que no se puede evitar hablar</li>
</ul>
<p>Éstos son precisamente los temas de los que hablarías si conocieses a alguien con quien pudieses practicar un nuevo idioma; la gente con la que te relacionas durante las vacaciones, tus suegros, las personas con las que socializas en el extranjero, etc.</p>
<h3 id="heading-tomar-notas">Tomar notas</h3>
<p>Siempre que mi profesor me enseñaba palabras o frases, las anotaba para poder repetirlas al salir de clase. Cuando aprendía español intensivamente, tenía una colección de notas pegadas en la pared que procuraba volver a leer varias veces al día. Éstas eran incluso útiles durante la clase en sí: si me olvidaba de una palabra nueva, podía simplemente identificarla entre mis notas.</p>
<h3 id="heading-repetir-con-otro-profesor">Repetir con otro profesor</h3>
<p>Lo ideal era que cada clase que tuviera a lo largo de la semana fuera con un profesor diferente. Así podía aprender algunos términos relativos a los temas que estaba estudiando con una persona y al día siguiente utilizar esas palabras  al contarle la misma historia a otro profesor. Además, es menos probable que te quedes sin temas de conversación con alguien a quien ves una vez en semana en lugar de varias veces a la semana.</p>
<h2 id="heading-utilizar-software-de-vocabulario">Utilizar software de vocabulario</h2>
<p>La repetición espaciada es una forma estupenda de mejorar el rendimiento a la hora de aprender. La idea es repetir la palabra a medida que la memoria empieza a fallar; así, por un lado la retienes, pero a la vez no le dedicas demasiado tiempo.  Este sistema se podría adaptar con fichas de cartulina, pero lo más eficaz es contar con una aplicación que lo haga por ti. Algunos ejemplos de programas son:</p>
<ul>
<li><a target="_blank" href="https://bit.ly/SuperMemo11">SuperMemo</a> - un programa de pago que utilicé mucho cuando aprendía inglés francés y alemán, o</li>
<li><a target="_blank" href="bit.ly/Anki11">Anki</a> - un programa gratuito y de código abierto, práctico sobre todo si quieres crear tus propias listas de vocabulario</li>
</ul>
<p>En ambos casos, la aplicación te pregunta por palabras que ya deberías conocer, permitiéndote poder comprobarlo por ti mismo y autoevaluarte. En función del resultado, programará la repetición de ese término antes si has fallado, o más tarde si lo has acertado.</p>
<p>Las cosas que más me gustaron de aprender con SuperMemo fueron:</p>
<ul>
<li>los archivos de audio para todas las palabras y frases expuestas de ejemplo - para yo poder repetirlas, en lugar de tener que descifrar el alfabeto fonético</li>
<li>el tamaño de sus bases de datos: las aplicaciones contenían miles de palabras para todos los niveles.</li>
<li>la repetición espaciada</li>
</ul>
<p>Desgraciadamente, hay menos material disponible para los idiomas menos comunes: así que para inglés o francés tendríamos innumerables recursos, pero para el polaco o el vasco no tanto.</p>
<h2 id="heading-que-trucos-tienes-para-aprender-idiomas">¿Qué trucos tienes para aprender idiomas?</h2>
<p>¿Cuál ha sido tu experiencia aprendiendo idiomas? ¿Tienes algún truco que quieras compartir con otros lectores? ¡Me encantaría leerlos en los comentarios!</p>
]]></content:encoded></item><item><title><![CDATA[Cómo escribir pruebas unitarias]]></title><description><![CDATA[Como programador principiante, a menudo escucharás que es conveniente probar tu código. Es un buen consejo - ¡veamos cómo puedes empezar a hacerlo!
Qué son las pruebas unitarias
Las pruebas son una forma de fijar explícitamente expectativas sobre el ...]]></description><link>https://conoce.dev/como-escribir-pruebas-unitarias</link><guid isPermaLink="true">https://conoce.dev/como-escribir-pruebas-unitarias</guid><category><![CDATA[Testing]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[spanish]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 27 Apr 2022 04:54:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1651040800751/Wi837LIol.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Como programador principiante, a menudo escucharás que es conveniente probar tu código. Es un buen consejo - ¡veamos cómo puedes empezar a hacerlo!</p>
<h2 id="heading-que-son-las-pruebas-unitarias">Qué son las pruebas unitarias</h2>
<p>Las pruebas son una forma de fijar explícitamente expectativas sobre el código. Las estableces para que la máquina compruebe si tu código cumple con las expectativas. </p>
<p>Es un programa que verifica tu programa.
Normalmente, en los proyectos de JavaScript, usarás alguna biblioteca de pruebas, como:</p>
<ul>
<li>Jest,</li>
<li>Jasmine, o</li>
<li>Chai</li>
</ul>
<p>Pero éstas son sólo herramientas. Lo que importa es que tengas alguna forma de validar automáticamente tu aplicación.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1651040725829/LUfMdvmsD.jpeg" alt="Image description" /></p>
<h2 id="heading-como-te-ayudan-las-pruebas-unitarias">Cómo te ayudan las pruebas unitarias</h2>
<p>Hay cuatro razones por las que escribir pruebas te facilitará la vida a la hora de codificar:</p>
<ol>
<li>Es una forma rápida y fiable de comprobar si el código funciona como se esperaba. No tienes que pensar en casos límite para tenerlos todos cubiertos por pruebas unitarias.</li>
<li>Una buena cobertura de pruebas es una red de seguridad que te permite refactorizar el código con más arrojo. Así es más probable que tomes las medidas necesarias para mantener tu código base en buenas condiciones.</li>
<li>Escribir pruebas <em>unitarias</em> te obliga a pensar en las unidades y en cómo se debe repartir la carga entre ellas, lo que hace que tu código sea más modular y más fácil de mantener.</li>
<li>Las pruebas unitarias pueden convertirte en un programador más rápido. Al principio, tienes que invertir tiempo en crear el caso de prueba, pero una vez que está listo, puedes volver a ejecutarlo de forma muy económica. La inversión puede pagar dividendos incluso durante el desarrollo inicial.</li>
</ol>
<h2 id="heading-construir-un-andamiaje">Construir un andamiaje</h2>
<p>Antes de probar la funcionalidad, asegúrate de que puedes probar <em>cualquier cosa</em>. Instala la biblioteca de pruebas y crea tu script de pruebas. Una vez que tengas algo en marcha, puedes empezar a configurar el andamiaje para algunas de tus pruebas. Tienes que tomar una decisión sobre la nomenclatura. Por ejemplo, si tu código es <code>mi-proyecto/plane-ticket.js</code>, tu código de pruebas puede ubicarse en <code>mi-proyecto/plane-ticket.spec.js</code>. </p>
<p>Construye todo lo necesario para probar una clase cualquiera y luego comprueba algunos aspectos comunes:</p>
<ul>
<li>si un objeto es un objeto, o</li>
<li>si una función es una función</li>
</ul>
<p>De esta manera, demostrarás que puedes probar cosas.</p>
<h2 id="heading-configurar-los-mocks">Configurar los mocks</h2>
<p>Los mocks son objetos creados para reemplazar las dependencias de la unidad que estás probando. Por ejemplo, si pruebas la función <code>saveBlogPost</code>, querrás interceptar la petición HTTP antes de que la función la envíe. Querrás averiguar qué utiliza tu función para enviar la petición y sustituirlo por un mock. Esto debería ser fácil si construyes tu código usando un patrón de inyección de dependencia.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1651040727645/TaQ9kKiGJ.jpeg" alt="Image description" /></p>
<h2 id="heading-mantener-una-estructura">Mantener una estructura</h2>
<p>Como podrás ver, en cada prueba ocurren muchas cosas. Se pueden distinguir tres fases principales:</p>
<ol>
<li>Configuración de los mocks</li>
<li>Ejecución del código que se quiere comprobar</li>
<li>Comprobación de las expectativas</li>
</ol>
<p>Es lógico mantener esta separación en tu código; será más fácil de leer de esta manera. Una forma fácil de organizarlo es agrupando todas las líneas y quizás añadiendo un comentario especificando de qué parte se trata.</p>
<h2 id="heading-desarrollo-guiado-por-pruebas">Desarrollo guiado por pruebas</h2>
<p>El desarrollo guiado por pruebas es un procedimiento común para crear un buen código con una buena cobertura de pruebas. Empiezas añadiendo una prueba para una función antes de que se implemente. Ejecutadas las pruebas, debería de fallar - si no es así, algo grave estará pasando y tendrás que investigar qué es. Las pruebas fallan y agregas al código la implementación que falta. Una vez más, se espera que esto por sí solo solucione el fallo. Si todo va bien, inviertes un poco de tiempo en optimizar tu solución, tanto en el código como en las pruebas, sin cambiar la lógica. Esta forma de proceder te permite <a target="_blank" href="https://how-to.dev/how-to-make-small-steps-go-a-long-way">iterar</a> rápidamente en la creación del código y sus pruebas.</p>
<p>Si sigues esta práctica, nunca se te podrá escapar ninguna prueba para tu lógica. No tendrás la tentación de saltarte la escritura de pruebas, un problema común cuando se deja la escritura de pruebas para el final.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1651040729512/aPRCEHyZE.jpeg" alt="Image description" /></p>
<h3 id="heading-contra-recomendacion">Contra-recomendación</h3>
<p>Para ser un líder, hay que saber a dónde vas. Deja de lado las pruebas durante un tiempo si necesitas explorar qué soluciones son factibles. Una vez que tengas claro el camino, puedes  agregar pruebas o abordar el problema de nuevo de una manera guiada por pruebas.</p>
<h2 id="heading-pruebas-que-faltan">Pruebas que faltan</h2>
<p>Si tienes mala suerte, puede que estés trabajando con código heredado sin pruebas ni otras medidas de calidad, algo así como <a target="_blank" href="https://how-to.dev/how-to-manage-fragile-legacy-code">lo que describo aquí</a>. En tal caso, más vale tarde que nunca; puedes empezar a escribir pruebas a medida que trabajas con el código base. De esta manera, mejoras la situación de cara a un futuro y en algunos casos excepcionales, tal vez encuentres algún error oculto.</p>
<h2 id="heading-y-tu">¿Y tú?</h2>
<p>¿Cómo de difícil te parece aprender a probar? He visto quejas en Internet de personas a las que les cuesta encontrar buenos recursos para ello. Cuéntame qué experiencias has tenido hasta ahora.</p>
]]></content:encoded></item><item><title><![CDATA[Trucos para impresionar con tu tarea para una entrevista]]></title><description><![CDATA[Echemos un vistazo a cómo hacer que la interfaz de tu próxima tarea para una entrevista tenga la mejor pinta posible. 
Cíñete a lo que conoces mejor
Puede resultar tentador matar dos pájaros de un tiro e intentar aprender o practicar alguna tecnologí...]]></description><link>https://conoce.dev/trucos-para-impresionar-con-tu-tarea-para-una-entrevista</link><guid isPermaLink="true">https://conoce.dev/trucos-para-impresionar-con-tu-tarea-para-una-entrevista</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 20 Apr 2022 05:30:16 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1650451120145/AE7YEXWU4.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Echemos un vistazo a cómo hacer que la interfaz de tu próxima tarea para una entrevista tenga la mejor pinta posible. </p>
<h2 id="heading-cinete-a-lo-que-conoces-mejor">Cíñete a lo que conoces mejor</h2>
<p>Puede resultar tentador matar dos pájaros de un tiro e intentar aprender o practicar alguna tecnología nueva mientras solicitas un empleo. Sin duda a mí me ha resultado tentador en algún momento. Pero no es así como generarás el mejor código. Es mejor ceñirse a lo que mejor conoces y aprender cosas nuevas en un proyecto diferente.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650451071219/Xud-vOH_D.jpeg" alt="Image description" /></p>
<p>Ya sabes qué opción te resultará en una mejor oferta.</p>
<h2 id="heading-hazlo-facil-de-revisar">Hazlo fácil de revisar</h2>
<p>Asegúrate de que lo que entregas es fácil de revisar. El flujo ideal desde el punto de vista del revisor sería:</p>
<ul>
<li>obtener un enlace que funcione</li>
<li>constatar por sí mismo que la aplicación funciona como se espera</li>
<li>profundizar en el código para ver cómo has conseguido lo que has hecho</li>
</ul>
<p>Revisar el código sin constatar si funciona carece de sentido. No me va a importar mucho el aspecto de tu código antes de comprobar si cumple con lo que se espera. Y si no está claro que funcione bien, puede que nunca me moleste en revisarlo en profundidad.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650451073545/lkzhCTObY.jpeg" alt="Image description" /></p>
<p>Dales todo en bandeja de plata</p>
<h3 id="heading-ofrece-algo-interactivo">Ofrece algo interactivo</h3>
<p>Para una aplicación de interfaz, la solución más fácil es desplegarla en uno de los servidores gratuitos que están al alcance:</p>
<ul>
<li>Páginas de GitHub, </li>
<li>Páginas de GitLab, o</li>
<li>Netlify.</li>
</ul>
<h3 id="heading-nunca-envies-archivos-zip">Nunca envíes archivos ZIP</h3>
<p>El envío de archivos ZIP tiene dos desventajas que por sí solas podrían romper el acuerdo:</p>
<ul>
<li>es un inconveniente</li>
<li>abrir un archivo ZIP supone un riesgo de seguridad</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650451075398/UQW0Dg7cp.jpeg" alt="Image description" /></p>
<p>¡Puede ser divertido abrirlo!</p>
<h2 id="heading-asegurate-de-que-funciona">Asegúrate de que funciona</h2>
<p>Y que funcione en varios navegadores y dispositivos. No tiene que ser súper bonito, pero debe ser funcional, independientemente de que los revisores estén sentados frente al ordenador o en un autobús con su teléfono.</p>
<h2 id="heading-agrega-readmemd">Agrega README.md</h2>
<p>Cualquier proyecto que tengas precisa de un <code>README</code>, y con mayor razón si se trata de una tarea para una entrevista. Debes presentar brevemente el ejercicio que pones en marcha y enlazarlo a una aplicación utilizable. A continuación, puedes añadir algo de documentación de alto nivel: qué marco de trabajo has usado y cómo construir o probar tu código.</p>
<h3 id="heading-muestra-como-piensas">Muestra cómo piensas</h3>
<p>Comparte con el revisor tu proceso de razonamiento. Si utilizas algunos patrones o mejores prácticas, haz referencia a ellos explícitamente en la documentación. Si has tenido alguna disyuntiva, descríbela y explica por qué has elegido la forma que has usado para realizar tu trabajo. </p>
<h2 id="heading-hazlo-brillar">Hazlo brillar</h2>
<p>Si quieres destacar, puedes considerar añadir algunas de las siguientes cosas. Probablemente se salga un poco del objetivo de lo que requería la tarea, pero demuestra que conoces las labores que vas a realizar cada día en tu trabajo.</p>
<h3 id="heading-haz-que-sea-atractivo">Haz que sea atractivo</h3>
<p>Agrega algunas rutas a tu proyecto. Puedes conseguir la atención del revisor durante un poco más de tiempo si tienes páginas adicionales. ¿Tal vez un breve <code>/sobre</code> para que puedan relacionar fácilmente <em>esta</em> aplicación de demostración con tu CV?</p>
<h3 id="heading-pruebas-unitarias">Pruebas unitarias</h3>
<p>La puesta en marcha de pruebas unitarias puede ser un gran ejemplo que indica que eres un desarrollador centrado en la calidad. No tienes que apuntar a una cobertura completa de pruebas de código: debería de ser suficiente con unas pocas pruebas que demuestren que sabes lo que es.</p>
<h3 id="heading-configurar-lint-y-prettier">Configurar lint y prettier</h3>
<p>Muchos equipos profesionales utilizan linters y herramientas automatizadas para imponer el estilo de código elegido. En el caso de la interfaz, lo más común es que se trate de ESLint y Prettier. Puedes darle un toque bonito si presumes de lo mismo en tu proyecto - si en el equipo hay algún desarrollador centrado en la consistencia, seguro que se dará cuenta.</p>
<h3 id="heading-realizar-commits-significativos">Realizar commits significativos</h3>
<p>Git (o en general, el control de versiones) es una herramienta fundamental para el trabajo en conjunto en proyectos de TI. El equipo colabora en el repositorio de Git, por lo que es primordial tener buenos mensajes de commit. Si creas un historial que tenga sentido para un borrador de proyecto, puede ser un buen indicativo del aspecto de tus contribuciones para la empresa.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1650451077216/05nDrxxO2.jpeg" alt="Image description" /></p>
<h2 id="heading-y-tu">¿Y tú?</h2>
<p>¿Cuál es tu mejor proyecto de demostración? ¡Comparte los enlaces en los comentarios!</p>
]]></content:encoded></item><item><title><![CDATA[Cómo trabajar con tu mentor de programación]]></title><description><![CDATA[El acceso a un programador más experimentado que quiera ayudarte a crecer profesionalmente puede acelerar tu progreso. Puede ser:

un amable compañero de trabajo con más experiencia
un amigo servicial
un mentor externo—gratuito o de pago

¿Cómo puede...]]></description><link>https://conoce.dev/como-trabajar-con-tu-mentor-de-programacion</link><guid isPermaLink="true">https://conoce.dev/como-trabajar-con-tu-mentor-de-programacion</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 13 Apr 2022 05:41:17 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1649833744585/PU-Ayc7Kj.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>El acceso a un programador más experimentado que quiera ayudarte a crecer profesionalmente puede acelerar tu progreso. Puede ser:</p>
<ul>
<li>un amable compañero de trabajo con más experiencia</li>
<li>un amigo servicial</li>
<li>un mentor externo—gratuito o de pago</li>
</ul>
<p>¿Cómo puedes asegurarte de aprovechar al máximo esta ayuda?</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649833696001/Uluj520Bd.jpeg" alt="Image description" /></p>
<p>Desarrollador Senior de JS</p>
<h2 id="heading-trae-tus-verdaderos-problemas">Trae tus verdaderos problemas</h2>
<p>Tu mentor tiene mucha más experiencia laboral que tú. Puede compartir sus conocimientos contigo, siempre que plantees los problemas que te preocupan. Por ejemplo:</p>
<ul>
<li>si te enfrentas a algún reto técnico, puede recomendarte otro enfoque, o</li>
<li>si chocas con algún compañero de trabajo, puede evaluar la situación y ayudarte a averiguar cómo abordarla en el futuro, o</li>
<li>si estás abrumado con opciones para una biblioteca, puede ayudarte a elegir y comprometerte con una de las opciones, o</li>
<li>si tu situación laboral no es óptima, puede ayudarte a preparar una negociación salarial o a buscar un trabajo nuevo. Para esto, probablemente lo mejor es que tu mentor sea alguien ajeno a tu empresa actual.</li>
</ul>
<h2 id="heading-haz-tus-deberes">Haz tus deberes</h2>
<p>La mentoría es divertida si el aprendiz -tú- es receptivo. Presta atención a las sugerencias de tu mentor. Si te recomienda un artículo, léelo. Si te recomienda un libro o un curso, hazte con un ejemplar y síguelo. Si recibes comentarios sobre la revisión del código, como mínimo involúcrate en la propuesta: comenta sobre sus ventajas y desventajas, aunque no tengas tiempo de seguirla.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1649833697595/WIIjGbqXh.jpeg" alt="Image description" /></p>
<p>Trata a tu mentor como tratarías a un búho.</p>
<h2 id="heading-mientras-estudias">Mientras estudias</h2>
<p>Si no tienes problemas reales de trabajo, puedes inventarte algunos. Mientras trabajas en un <a target="_blank" href="https://conoce.dev/como-aprender-mientras-se-trabaja-en-proyectos-personales">proyecto personal</a>, puedes pedirle a tu mentor que revise tu código. Lo mejor sería trabajar en público. El flujo de trabajo que podrías utilizar es:</p>
<ol>
<li>Realizas la primera implementación por tu cuenta</li>
<li>Tu mentor te da sugerencias y comentarios</li>
<li>Pones en práctica lo anterior</li>
</ol>
<p>Al hacerlo en público, se transmiten tres fuertes indicios a un posible empleador:</p>
<ul>
<li>estás lo suficientemente comprometido para ejecutar un proyecto </li>
<li>cuentas con ayuda externa y no dependes sólo de los recursos del empleador para progresar.</li>
<li>demuestras lo bien que aceptas y pones en marcha los comentarios y sugerencias</li>
</ul>
<h2 id="heading-y-tu">¿Y tú?</h2>
<p>¿Cuál ha sido tu relación con la mentoría hasta ahora? ¡Comparte tu experiencia en los comentarios!</p>
]]></content:encoded></item><item><title><![CDATA[Cómo hacer que los pequeños pasos recorran un largo camino]]></title><description><![CDATA[A veces, intentamos asumir tareas más importantes de las que podemos cumplir—esto se deriva directamente a nuestra incapacidad humana para evaluar tareas complejas correctamente. Veamos cómo puedes abordar esto en tu viaje de TI.
Iterar
Avanzar en pa...]]></description><link>https://conoce.dev/como-hacer-que-los-pequenos-pasos-recorran-un-largo-camino</link><guid isPermaLink="true">https://conoce.dev/como-hacer-que-los-pequenos-pasos-recorran-un-largo-camino</guid><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 09 Mar 2022 08:13:47 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1646821959452/qn_V4e6gg.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A veces, intentamos asumir tareas más importantes de las que podemos cumplir—esto se deriva directamente a nuestra incapacidad humana para evaluar tareas complejas correctamente. Veamos cómo puedes abordar esto en tu viaje de TI.</p>
<h2 id="heading-iterar">Iterar</h2>
<p>Avanzar en pasos pequeños y manejables es una piedra angular en muchas metodologías comunes en nuestra industria:</p>
<ul>
<li>agile– se trata de iterar con los cambios en el producto para descubrir qué necesitan los clientes, mientras que</li>
<li>producto mínimo viable (MVP) – tiene como objetivo crear la primera versión que se puede comparar con el mercado, y luego se itera desde allí.</li>
</ul>
<p>Veamos cómo usar un enfoque similar en su vida diaria.</p>
<h3 id="heading-mientras-aprende">Mientras aprende</h3>
<p>La mejor idea sería:</p>
<ul>
<li>aprender una parte del material, y luego</li>
<li>usarlo.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646821914230/bOq231LK6.jpeg" alt="Image description" /></p>
<p>El material de trabajo te presentará regularmente desafíos para aplicar y probar tu conocimiento en un curso o libro bien organizado. Si aprendes sin ese lujo, necesitarás crear esos ejercicios por ti mismo. En ambos casos, la mejor respuesta que puedes obtener es que tu código funciona como se espera—por lo que debes usar lo que estás  aprendiendo en tu proyecto paralelo o comenzar uno nuevo.</p>
<h3 id="heading-mientras-trabaja-en-un-ticket">Mientras trabaja en un ticket</h3>
<p>¿A menudo te quedas atascado en un ticket? Lo más probable es que estés tratando de hacer demasiadas cosas al mismo tiempo. Por lo general, puedes dividir una tarea en:</p>
<ul>
<li>refactorizar el código en el que estás a punto de trabajar</li>
<li>Agregar infraestructura de código—métodos auxiliares, tipos de actualización, etc.</li>
<li>hacer los cambios en la lógica de la aplicación</li>
<li>agregando pruebas de extremo a extremo para la nueva función</li>
</ul>
<p>En la mayoría de los casos, tiene más sentido hacer cada parte en commit separados: no quieres revisar o revertir las refactorizaciones con una nueva implementación. Dividir las cosas en commit separados , y tal vez incluso en pull request , le permite obtener una revisión de su código más rápido, lo que acelera su progreso.</p>
<p>¿Qué debes hacer si no conoces el código lo suficientemente bien como para planificar tus acciones con anticipación, o simplemente lo olvidaste y tienes todos los cambios realizados simultáneamente? No te preocupes , el conocimiento que obtuviste durante el primer intento no se desperdiciará—ahora, puedes dar un paso atrás, comenzar una nueva rama y aplicar o rehacer parte del  gran commit que comenzaste.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646821915953/gv7_3FFnP.jpeg" alt="Image description" /></p>
<h3 id="heading-mientras-haces-proyectos">Mientras haces proyectos</h3>
<p>No importa si trabajas en proyectos comerciales o de código abierto—escucha el mismo mantra en todas partes:</p>
<ul>
<li>"Publicar temprano, publicar  a menudo."</li>
<li>"Muévete rápido y rompe cosas."</li>
</ul>
<p>Incluso si estás trabajando en algún proyecto de aprendizaje personal, puedes aplicar esta mentalidad. En lugar de planificar una gran versión final de tu proyecto, intenta simplificar lo que estás construyendo al mínimo. Puedes encontrar algunos ejemplos en mi artículo <a target="_blank" href="https://conoce.dev/como-aprender-mientras-se-trabaja-en-proyectos-personales">sobre el aprendizaje con proyectos personales</a>.</p>
<h2 id="heading-evita-caer-en-la-madriguera-del-conejo">Evita caer en la madriguera del conejo</h2>
<p>Su principal objetivo al hacer las cosas en iteraciones es evitar caer en una madriguera de conejo. Es bueno pasar tiempo investigando cosas; y como desarrollador, debes ser resistente a la frustración de no saber cómo funciona algo o cómo corregir un error. Lo malo es que la misma fuerza ante la frustración a veces juega en tu contra. En algún momento, los rendimientos de la inversión de pasar más tiempo disminuyen hasta el punto en que solo estarás perdiendo el tiempo. Estarás muy involucrado en el problema y ya estarás involucrado en solucionarlo cuando suceda, por lo que dejarlo ir no será fácil. ¡Veamos cómo puedes evitar estas trampas!</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646821918272/BtRGbfyji.jpeg" alt="Image description" /></p>
<h3 id="heading-no-estas-solo">No estás  solo</h3>
<p>En la mayoría de los casos, no estás trabajando solo: hay otras personas a tu alrededor que pueden ayudarte. Como principiante, tienes dos posibles maneras de fallar:</p>
<ul>
<li>buscar ayuda demasiado rápido</li>
<li>buscar ayuda demasiado tarde</li>
</ul>
<p>¿Qué es demasiado tarde o demasiado rápido? Bueno, eso depende de la situación en la que se encuentre tu equipo. Puedo imaginar fácilmente dos extremos:</p>
<ul>
<li>tu equipo está bajo mucha presión—una emergencia de algún tipo, por lo que no hay ningún desarrollador experimentado disponible para ayudarlo</li>
<li>está reemplazando a un desarrollador que se va en 2 semanas, por lo que la prioridad es obtener el mayor conocimiento posible de ellos</li>
</ul>
<p>Mi consejo es encontrar reglas explícitas con su equipo y luego apegarse a ellas. Entonces, si estás de acuerdo en que cuatro horas de golpearse la cabeza contra la pared con un ticket es demasiado, después de cuatro horas, busca ayuda.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646821920403/teZdTyoct.jpeg" alt="Image description" /></p>
<h3 id="heading-aprende-como-dejarlo">Aprende cómo dejarlo</h3>
<p>No es una idea mejor solo porque pasaste tantas horas implementándola. En todo caso, demostró que el enfoque no es factible o no es tan fácil como se esperaba. Evita la falacia del costo irrecuperable: la estrategia excelente es estimar, antes de comenzar, cuánto tiempo desea dedicar a una tarea antes de dejarla atrás, y luego apegarse a esa estimación. Dependiendo del ticket, dejarlo puede significar dejar que otro desarrollador lo recoja o no hacerlo todo junto, al menos ahora.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646821922005/91lIJLxya.jpeg" alt="Image description" /></p>
<h2 id="heading-busca-siempre-retroalimentacion">Busca siempre retroalimentación</h2>
<p>Cada paso de la interacción es un punto en el que podemos y debemos recibir retroalimentación. Nos permitirá hacer algunas correcciones de rumbo y asegurarnos de que estamos en el camino correcto. Hay muchos tipos de comentarios que podríamos buscar:</p>
<ul>
<li>pruebas automatizadas que pasan localmente o en CI</li>
<li>colega más experimentado o su mentor revisando el código</li>
<li>presentar nuestro producto externamente y recopilar comentarios</li>
</ul>
<p>¿Quieres aprender más? Consulta mi otro artículo <a target="_blank" href="https://conoce.dev/como-acelerar-tu-progreso-con-retroalimentacion">sobre retroalimentación</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Cómo acelerar tu progreso con retroalimentación]]></title><description><![CDATA[Un bucle de retroalimentación es una parte esencial de todos los sistemas de control, excepto los más sencillos. Y si te preocupas por conseguir algún objetivo, como, por ejemplo

aprender,
la creación de una aplicación de trabajo, o
ganar dinero,

e...]]></description><link>https://conoce.dev/como-acelerar-tu-progreso-con-retroalimentacion</link><guid isPermaLink="true">https://conoce.dev/como-acelerar-tu-progreso-con-retroalimentacion</guid><category><![CDATA[Beginner Developers]]></category><category><![CDATA[learning]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 02 Mar 2022 06:34:27 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1646212794787/lWW_5wEJw.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Un bucle de retroalimentación es una parte esencial de todos los sistemas de control, excepto los más sencillos. Y si te preocupas por conseguir algún objetivo, como, por ejemplo</p>
<ul>
<li>aprender,</li>
<li>la creación de una aplicación de trabajo, o</li>
<li>ganar dinero,</li>
</ul>
<p>entonces se trata de un sistema de control no trivial. Echemos un vistazo a las características clave de un ciclo de retroalimentación efectivo y cómo puedes  usarlo en tu  carrera de TI.</p>
<h2 id="heading-cuanto-mas-rapido-mejor">Cuanto más rápido, mejor</h2>
<p>Cuanto antes sepas si las cosas van bien o mal, mejor. No hay ninguna ventaja en avanzar en la oscuridad. Si ya estás en un buen camino, la retroalimentación reforzará tu  compromiso con lo que haces  ahora. Si estás haciendo algo mal, puedes corregir tu curso cuando recibas comentarios. Imaginate lo complejo que sería conducir o andar en bicicleta si tu visión se retrasara incluso una fracción de segundo. Sería suficiente para producir efectos similares a conducir ebrio.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646212754342/_pogSuG1I.jpeg" alt="Image description" /></p>
<p>Dependiendo de la complejidad del sistema, actuar sobre ese conocimiento aún puede requerir tiempo. Si notas  que tu  carrera actual no es para ti , aún necesitarás  algunos años para obtener una nueva. Pero preferirías saber esto durante tu primer semestre en la universidad en lugar de después de graduarte.</p>
<h2 id="heading-tus-bucles-de-retroalimentacion-diarios">Tus bucles de retroalimentación diarios</h2>
<p>Pensemos por un momento en todos los ciclos de retroalimentación de los que formas  parte todos los días como desarrollador.</p>
<h3 id="heading-cambios-en-el-codigo">Cambios en el código</h3>
<p>A medida que trabajas  en el código, debes  verificar el impacto de tus  cambios en el comportamiento del código. Las pruebas automatizadas son una forma rápida y sólida de obtener retroalimentación. Escribir pruebas lleva tiempo al principio, pero te permite ser más productivo a largo plazo. Eso es incluso sin considerar el impacto de calidad a largo plazo de mantenerlos cerca.</p>
<p>Con lógica compleja, a menudo prefiero comenzar con pruebas. Simplemente entender todos los detalles internos es difícil, y preferiría hacerlo una vez mientras escribo las pruebas y no cada vez que cambio algo en el código.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646212756905/vNXEediiq.jpeg" alt="Image description" /></p>
<h3 id="heading-trabajo-diario-en-un-ticket">Trabajo diario en un ticket</h3>
<p>Si estás trabajando en un equipo bien organizado, algunos otros miembros del equipo revisarán tu trabajo. Tener tu  trabajo revisado es una excelente manera de aprender la forma en que el equipo hace las cosas, así como aprender más sobre el arte de la programación. Pero puede ser frustrante si pasas uno o dos días trabajando en un ticket y luego recibes más de 40 comentarios en la solicitud de extracción.</p>
<p>Puedes acelerar los comentarios que recibes dividiendo el trabajo en pequeños pasos y solicitando comentarios después de cada uno de ellos:</p>
<ol>
<li>Después de leer un ticket, explicalo a alguien que entienda bien de qué se trata. Si no lo entendiste bien, podrán corregirte.</li>
<li>Escribe cómo planeas abordar la solución—y haz que otro desarrollador la revise antes de dedicar tiempo a implementarla. Tal vez te señalen algo que no sabías.</li>
<li>Sin embargo, lo más importante es la retroalimentación sobre la lógica del programa. Solicita una revisión mientras aún estás realizando las pruebas.</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646212760130/RPiqIfam8.jpeg" alt="Image description" /></p>
<h3 id="heading-version-de-la-aplicacion">Versión de la aplicación</h3>
<p>A medida que avanza el sprint, hay una pila creciente de cambios inéditos que esperan ser publicados. Tendría sentido esperar solo si tiene un protocolo de prueba elaborado y si este tiempo está bien empleado. Si no se realizan pruebas significativas, solo está retrasando los comentarios de los usuarios. Cuando sea posible, intente implementar con la mayor frecuencia posible. De esta manera, en lugar de un gran lanzamiento con todos los cambios (y errores) que realizó su equipo en unas pocas semanas de sprint, publica una pequeña parte cada pocos días.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1646212762691/KNFkU8p4e.jpeg" alt="Image description" /></p>
<h3 id="heading-adecuacion-al-mercado-del-producto">Adecuación al mercado del producto</h3>
<p>Incluso en una escala mayor, esto todavía se aplica. Con metodologías como Agile o Lean Startup, el objetivo es sacar tu producto lo antes posible y obtener retroalimentación del mercado.</p>
<h2 id="heading-que-pasa-con-la-calidad-de-la-retroalimentacion">¿Qué pasa con la calidad de la retroalimentación?</h2>
<p>No toda la retroalimentación es igual. Siempre está en algún lugar del espectro—desde los resultados precisos de las pruebas, hasta la opinión subjetiva de la persona que la escribió. En el caso de información objetiva, como</p>
<ul>
<li>las pruebas fallan o las funciones fallan,</li>
<li>las aplicaciones son perceptiblemente lentas, u</li>
<li>otros indicadores de desempeño están fuera de los valores esperados,</li>
</ul>
<p>a menudo es una buena idea comenzar a abordarlo de inmediato.</p>
<p>En caso de opinión subjetiva:</p>
<ul>
<li>manera de codificación</li>
<li>denominación de variables o métodos</li>
<li>cualquier otra cosa que diferentes desarrolladores puedan arreglar de una manera diferente</li>
</ul>
<p>Aquí las cosas son más sutiles. Podría estar yendo en contra de una convención bien establecida en el proyecto, o su nombre podría ser confuso—cosas que es mejor arreglar pronto. Por otro lado, a veces las personas comparten cómo harían las cosas, pero más teniendo una conversación sobre cómo se deberían hacer las cosas en el proyecto.</p>
<h2 id="heading-y-tu">¿Y tu?</h2>
<p>¿Alguna vez has recibido comentarios que dieron forma a tu carrera? Por favor comparte tu historia en los comentarios; ¡Me encantaría oírlo!</p>
]]></content:encoded></item><item><title><![CDATA[Cómo usar Netlify como tu integración continua]]></title><description><![CDATA[Netlify es un proveedor de alojamiento que puedes  utilizar para sitios web estáticos o aplicaciones web. El plan gratuito viene con 300 minutos de tiempo de compilación, lo que debería ser suficiente para configurar la implementación continua (CD) p...]]></description><link>https://conoce.dev/como-usar-netlify-como-tu-integracion-continua</link><guid isPermaLink="true">https://conoce.dev/como-usar-netlify-como-tu-integracion-continua</guid><category><![CDATA[ci-cd]]></category><category><![CDATA[Netlify]]></category><category><![CDATA[NetlifyHackathon]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 23 Feb 2022 05:59:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1645601911977/S1RW_OVdt.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Netlify es un proveedor de alojamiento que puedes  utilizar para sitios web estáticos o aplicaciones web. El plan gratuito viene con 300 minutos de tiempo de compilación, lo que debería ser suficiente para configurar la implementación continua (CD) para un proyecto que no recibe muchas confirmaciones. Te mostraré cómo usar esos recursos para agregar una integración continua (CI) simple a su compilación.</p>
<h2 id="heading-la-aplicacion-de-ejemplo">La aplicación de ejemplo</h2>
<p>Para que sea sencillo , usaré una aplicación generada con Create React App (CRA) como aplicación de ejemplo. De esta forma, obtenemos una aplicación no trivial que:</p>
<ul>
<li>es similar a casos simples del mundo real,</li>
<li>tiene algunas dependencias npm, y</li>
<li>la mayor parte de lo que necesitamos ya está configurado.</li>
</ul>
<p>La aplicación resultante se ve así:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645601904653/CTtSiSSoI.png" alt="Image description" /></p>
<h2 id="heading-pasos-de-verificacion">Pasos de verificación</h2>
<p>Anteriormente escribí sobre qué <a target="_blank" href="https://conoce.dev/integracion-continua-ci-y-como-puede-ayudarte">pasos</a> puede ejecutar con su CI. Veamos cómo puede configurarlo para nuestra aplicación de ejemplo.</p>
<h3 id="heading-construccion">Construcción</h3>
<p>Para construir, el código generado por CRA hace todo lo que necesitamos:</p>
<pre><code class="lang-SH">$ npm run build

&gt; netlify-ci@0.1.0 build
&gt; react-scripts build

Creating an optimized production build...
Compiled successfully.

File sizes after gzip:

  43.71 kB  build/static/js/main.1fb16459.js
  1.78 kB   build/static/js/787.c84d5573.chunk.js
  541 B     build/static/css/main.073c9b0a.css
…
</code></pre>
<p>Netlify selecciona automáticamente la secuencia de comandos <code>construir</code> de nuestro repositorio generado por CRA como un comando de compilación, y funciona perfectamente:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645601907167/72TOry3hj.png" alt="Image description" /></p>
<h3 id="heading-pruebas">Pruebas</h3>
<p>El código generado por CRA viene con una configuración completa para pruebas unitarias y una prueba de ejemplo. El script <code>npm test</code> está hecho para desarrollo; se ejecuta en modo interactivo y observa los archivos de forma predeterminada. Para ejecutar en CI, necesitamos una sola ejecución:</p>
<pre><code class="lang-SH">$ npm <span class="hljs-built_in">test</span> -- --watchAll=<span class="hljs-literal">false</span>

&gt; netlify-ci@0.1.0 <span class="hljs-built_in">test</span>
&gt; react-scripts <span class="hljs-built_in">test</span> <span class="hljs-string">"--watchAll=false"</span>

 PASS  src/App.test.js
  ✓ renders learn react link (16 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.644 s, estimated 1 s
Ran all <span class="hljs-built_in">test</span> suites.
</code></pre>
<p>Para tenerlo disponible, definamos un nuevo script en <code>package.json</code>:</p>
<pre><code class="lang-JSON">{
  …
  <span class="hljs-attr">"scripts"</span>: {
    …
    <span class="hljs-attr">"test"</span>: <span class="hljs-string">"react-scripts test"</span>,
    <span class="hljs-attr">"test:ci"</span>: <span class="hljs-string">"react-scripts test --watchAll=false"</span>,
    …
  },
</code></pre>
<h3 id="heading-analisis-estatico">Análisis estático</h3>
<p>Una cosa que nos gustaría agregar al código es el análisis estático. La configuración básica debería ser bastante sencilla, pero la dejaré fuera del alcance de este artículo. Si quieres hacer un seguimiento de esto, te recomiendo que lo pruebes con:</p>
<ul>
<li>ESLint – ya que advierte  sobre posibles problemas en el código, o</li>
<li>Prettier  – para hacer cumplir automáticamente el estilo del código.</li>
</ul>
<h2 id="heading-nueva-secuencia-de-comandos-ci">Nueva secuencia de comandos CI</h2>
<p>Con el código que tenemos ahora, necesitamos los siguientes pasos para una ejecución exitosa de CI/CD:</p>
<ul>
<li><code>npm install</code> – obtiene las dependencias del paquete, hecho por defecto por Netlify</li>
<li><code>npm run test:ci</code> – nuestro comando de prueba modificado</li>
<li><code>npm run build</code> – el comando de compilación original</li>
<li><strong>implementación</strong> – realizada por Netlify</li>
</ul>
<p>Ahora, queremos que la compilación sea condicional en función de las pruebas: si fallan, la ejecución debería detenerse, y por eso use ‘&amp;&amp;’. Al mismo tiempo, la configuración de Netlify solo tiene una entrada para ejecutar el comando. Podemos abordar esas dos cosas creando un nuevo script dedicado a este caso de uso:</p>
<pre><code class="lang-JSON">{
  …
  <span class="hljs-attr">"scripts"</span>: {
    …
    <span class="hljs-attr">"test:ci"</span>: <span class="hljs-string">"react-scripts test --watchAll=false"</span>,
    <span class="hljs-attr">"ci"</span>: <span class="hljs-string">"npm run test:ci &amp;&amp; npm run build"</span>,
    …
  },
  …
}
</code></pre>
<h3 id="heading-ejemplo-de-ejecucion">Ejemplo de ejecución</h3>
<p>Al final, los scripts se comportan como se esperaba:</p>
<ul>
<li>si fallan las pruebas de compilación, obtendrá una ejecución fallida en su tablero de Netlify</li>
<li>si todo funciona como se esperaba, la aplicación se implementa</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1645601909857/ycXQVBxaj.png" alt="Image description" /></p>
<h3 id="heading-el-uso-de-recursos">El uso de recursos</h3>
<p>En las pocas ejecuciones que hice, apenas hubo impacto de las pruebas en el tiempo de compilación—el recurso que Netlify verifica para controlar el uso del sistema. Por supuesto, esto cambiará cuando su proyecto crezca y añadirá más pruebas a su proyecto. En algún momento, tendrá más sentido invertir en configurar una solución de CI dedicada y usar Netlify solo como alojamiento.</p>
<h2 id="heading-enlaces">Enlaces</h2>
<ul>
<li><a target="_blank" href="https://netlify-ci.netlify.app/">aplicación implementada</a></li>
<li><a target="_blank" href="https://github.com/how-to-js/netlify-ci">repositorio de ejemplo</a></li>
</ul>
<h2 id="heading-que-harias-despues">¿Qué harías después?</h2>
<p>Ejecutar CI en Netlify es solo una solución temporal. Estoy interesado en saber de ti —¿qué herramienta te gustaría usar a continuación? Házmelo saber en esta <a target="_blank" href="https://strawpoll.com/co8pv72pr">encuesta</a>:</p>
<div class="hn-embed-widget" id="strawpoll-ci-2"></div>]]></content:encoded></item><item><title><![CDATA[Integración continua (CI) y cómo puede ayudarte]]></title><description><![CDATA[La integración continua (CI) es un proceso mediante el cual verificamos nuestro proyecto en cada cambio que ocurre en la base de código. ¿Qué es exactamente la integración? Depende de cómo se configure el proceso: puede ser tan simple como instalar l...]]></description><link>https://conoce.dev/integracion-continua-ci-y-como-puede-ayudarte</link><guid isPermaLink="true">https://conoce.dev/integracion-continua-ci-y-como-puede-ayudarte</guid><category><![CDATA[Continuous Integration]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 16 Feb 2022 05:48:41 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1644995924997/na1UgKEFl.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>La integración continua (CI) es un proceso mediante el cual verificamos nuestro proyecto en cada cambio que ocurre en la base de código. ¿Qué es exactamente la integración? Depende de cómo se configure el proceso: puede ser tan simple como instalar las dependencias y compilar el proyecto o tan complicado como ejecutar muchos scripts diferentes para determinar si el código base está en un estado aceptable.</p>
<h2 id="heading-companera-de-trabajo-diligente">Compañera de trabajo diligente</h2>
<p>Puedes pensar en CI como un compañero de trabajo diligente que siempre está ahí, esperando para verificar tus cambios antes de fusionarlos con la rama principal. Es una buena idea incluir solicitudes de combinación en su flujo de trabajo cuando CI está en su lugar, incluso si trabaja solo en el proyecto. Sus cambios serán <em>revisados</em> por la máquina, y dejarlos en una rama separada le permite solucionar cualquier problema antes de fusionarse con la rama principal.</p>
<p>Sin CI, todos y cada uno de los desarrolladores son responsables de verificar todos sus propios cambios. Por supuesto, de vez en cuando alguien lo olvidará —tal vez los cambios originales estaban bien, pero ¿qué pasa si después de una reorganización o fusión tienes un problema? Sin CI, permites que tus colegas menos cuidadosos empujen y se olviden de sus cambios, y otros se ven obligados a limpiar después de ellos.</p>
<h2 id="heading-como-esta-estructurado-ci">Cómo está estructurado CI</h2>
<p>La integración continua comprueba tus confirmaciones. Por cada cambio de código, CI generalmente ejecuta algunas tareas diferentes en un orden definido. Puedes utilizar la salida de un trabajo como entrada en otro; por ejemplo, puedes crear una aplicación en un paso y luego usar el paquete resultante en otro para realizar pruebas. Por lo general, administra CI con un archivo de configuración que se encuentra dentro del repositorio; por lo tanto, tu CI puede evolucionar junto con tu base de código.</p>
<p>Si todas las tareas pasan, entonces el commit será  <em>aprobado</em> ; si alguno de ellos falla, entonces el commit  será <em>fallo</em> . En una situación ideal, el contenido de confirmación por sí solo determina el resultado de CI: no depende de servicios externos y no hay ningún elemento aleatorio que pueda hacer que falle.</p>
<p>Para cada rama, CI muestra el resultado de la confirmación superior. La rama principal debe estar casi siempre de paso; cualquier problema afectará a todos en el equipo, por lo que solucionarlo debería ser una prioridad si ocurre alguna regresión. Para una rama de características, debe fusionarla solo si ha sido aprobado por el CI.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644995890029/_0YcLBgRf.jpeg" alt="Image description" /></p>
<h2 id="heading-tareas-que-puede-delegar-a-su-ci">Tareas que puede delegar a su CI</h2>
<p>Puedes configurar cualquier script que se ejecute en tu entorno local en CI. La lista puede ser larga en proyectos grandes, pero echemos un vistazo a las tareas de CI que puede esperar en proyectos de cualquier tamaño.</p>
<h3 id="heading-construccion">Construcción</h3>
<p>La verificación más básica que puede realizar en su base de código: ¿compila? Es un paso que detectará cualquier dependencia que se instaló, pero no se guardó, cualquier discrepancia de tipo de script mecanografiado que se coló en el commit. Estas son soluciones fáciles mientras el desarrollador está en la tarea, pero esos errores pueden volverse confusos o molestos si se comparten con otros.</p>
<h3 id="heading-analisis-estatico">Análisis estático</h3>
<p>El análisis estático implica verificar su código sin ejecutarlo. En los proyectos frontend, a menudo puede ver herramientas como:</p>
<ul>
<li>ESLint</li>
<li>HTMLHint</li>
<li>Stylelint</li>
</ul>
<p>Esos programas son los más útiles cuando se integran con el editor de código. Ejecutarlos en CI es una verificación adicional que puede ayudarlo de dos maneras:</p>
<ul>
<li>identificará a cualquier desarrollador que se olvide de ejecutarlos localmente —por lo que se les puede pedir que lo hagan antes de que arruinen una gran cantidad de código</li>
<li>identificará cualquier desajuste de versión o configuración que pueda ocurrir entre los diferentes entornos de desarrollo</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644995892407/ZWmJBvCr1.jpeg" alt="Image description" /></p>
<h3 id="heading-ejecutando-pruebas">Ejecutando pruebas</h3>
<p>Tener un CI implementado y ejecutar pruebas en él es esencial si se toma en serio las pruebas automatizadas en su aplicación. El objetivo de las pruebas automatizadas es ejecutarlas con mucha frecuencia —¿Qué mejor momento para hacerlo que cuando algunos cambios en el código están a punto de hacerse públicos? No hacerlo es una invitación a un escenario en el que:</p>
<ul>
<li>un desarrollador introduce la regresión en el código</li>
<li>otros agregan cambios no relacionados encima</li>
<li>alguien finalmente ejecuta las pruebas que capturan la regresión original</li>
<li>pierden el tiempo resolviendo problemas que no causaron, relacionados con cambios de los que potencialmente no están al tanto</li>
</ul>
<p>En este escenario, el problema principal es que a medida que solucionas el problema, ni siquiera sabes cuándo se presentó; podrías estar en un compromiso anterior, o hace una semana. Podrías usar <code>git blame</code> o <code>git bisect</code> para salir de eso, pero es mucho más fácil saber simplemente el punto en el que las pruebas dejaron de funcionar.</p>
<p>Permíteme enfatizar otra cosa: escribir pruebas es una inversión en garantía de calidad. Es un esfuerzo del día a día. Si estás realizando este esfuerzo diario, tiene sentido dedicar tiempo, solo una vez, a configurar CI para aprovechar al máximo las pruebas que desarrolla.</p>
<h3 id="heading-desplegando">Desplegando</h3>
<p>A menudo verá CI junto con implementación continua (CD), abreviados juntos como CI/CD. Esto se debe a que mientras compila y verifica su código, tiene todo listo para implementar —al menos en el servidor de prueba. Un verdadero CD requeriría que lo entregues a producción, pero esto puede ser más desafiante, especialmente porque expone a los usuarios del proyecto a posibles regresiones.</p>
<h2 id="heading-desventajas">Desventajas</h2>
<p>¿Cuáles son las desventajas de CI?</p>
<h3 id="heading-configuracion-complicada">Configuración complicada</h3>
<p>La configuración puede llevar mucho tiempo, especialmente si nunca lo has hecho antes. Incluso los cambios más sencillos en la configuración pueden tardar un tiempo considerable en verificarse, ya que debe ejecutarlos en un servidor externo al que no tienes acceso directo.</p>
<h3 id="heading-dependencia-de-un-proveedor-externo">Dependencia de un proveedor externo</h3>
<p>Si integras Ci en tu flujo de trabajo, dependerás de tu proveedor de CI. Si están caídos, no puede fusionarse —al menos no con toda la red de seguridad a la que estás acostumbrado. Puede ser frustrante, especialmente si sucede con cierta frecuencia.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644995895028/2LP8AjFhK.jpeg" alt="Image description" /></p>
<h3 id="heading-costo">Costo</h3>
<p>Muchos proveedores de CI tienen un plan gratuito que debería ser más que suficiente para ejercicios simples o proyectos de demostración. Para un proyecto en el que las personas trabajan a tiempo completo, es casi seguro que necesitarás un plan de pago, más tiempo adicional para que las máquinas de CI ejecuten sus scripts. El costo probablemente valdrá la pena, incluso si asume que el CI ahorra solo unos minutos por día para cada desarrollador de su equipo.</p>
<h2 id="heading-y-tu">¿Y tú?</h2>
<p>¿Estás interesado en obtener más información sobre cómo configurar CI? ¡Cuéntamelo en la encuesta! Estoy pensando en escribir algunas publicaciones más detalladas sobre la configuración de las herramientas de CI. Al saber qué herramienta te interesa más, puedo crear contenido que coincida con tus expectativas.
¡Así que, por favor, vota en la [encuesta] (https://strawpoll.com/co8pv72pr) a continuación! ⬇️⬇️⬇️️ Tu opinión es muy importante para mí. ¡Gracias!</p>
<div class="hn-embed-widget" id="strawpoll-ci-2"></div><h2 id="heading-que-sigue">¿Qué sigue?</h2>
<p>Para obtener aún más valor de tu CI, ejecuta pruebas de extremo a extremo (E2E) en él. Configurar E2E en CI es un desafío y lo trataré en otro artículo. Mientras tanto, puedes ver cómo [comenzar con E2E] (https://conoce.dev/como-agregar-pruebas-de-extremo-a-extremo-a-un-proyecto).</p>
]]></content:encoded></item><item><title><![CDATA[¿Por qué usamos empaquetadores de JavaScript?]]></title><description><![CDATA[JavaScript es un lenguaje intérprete y no necesita compilación. Su navegador puede ejecutar el mismo código que escribes. Entonces, ¿por qué usamos empaquetadores de JavaScript?
Menos archivos JS
Históricamente, la cantidad de archivos JS utilizados ...]]></description><link>https://conoce.dev/por-que-usamos-empaquetadores-de-javascript</link><guid isPermaLink="true">https://conoce.dev/por-que-usamos-empaquetadores-de-javascript</guid><category><![CDATA[JavaScript]]></category><category><![CDATA[javascript modules]]></category><category><![CDATA[Beginner Developers]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 09 Feb 2022 06:18:06 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1644399598240/bYsrxeVCB.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>JavaScript es un lenguaje intérprete y no necesita compilación. Su navegador puede ejecutar el mismo código que escribes. Entonces, ¿por qué usamos empaquetadores de JavaScript?</p>
<h2 id="heading-menos-archivos-js">Menos archivos JS</h2>
<p>Históricamente, la cantidad de archivos JS utilizados por un sitio web era crucial debido a la penalización en el rendimiento de tener muchos archivos pequeños. Los navegadores cargaron cada archivo con una solicitud HTTP separada. Cada solicitud necesitaba una conexión entre el navegador y el servidor, y se necesitaba tiempo para establecerla. Gracias a HTTP/2, la cantidad de archivos es un problema mucho menor ahora. Aun así, tener archivos agrupados tiene sentido. Cada solicitud se almacena en caché por separado, por lo que tener muchos archivos hace que sea más difícil garantizar que el navegador no obtenga código obsoleto del caché.</p>
<p>Además de eso, hasta 2018, muchos navegadores no admitían módulos ES. Simplemente estaba cargando muchos archivos desde el HTML, y todos compartían el mismo alcance global. Los paquetes de JS abordan ambos problemas, ya que</p>
<ul>
<li>te permite mantener tu código base en muchos archivos bien definidos y</li>
<li>agrupar el código en archivos grandes para su implementación.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644397590197/7GhuArC_bB.jpeg" alt="Image description" /></p>
<h2 id="heading-facil-importacion-desde-nodemodules">Fácil importación desde <code>node_modules</code></h2>
<p>Los paquetes te brindan una forma de importar dependencias, que es mucho mejor que cargarlos como módulos ES. Para usar paquetes de node desde el navegador, necesitarías</p>
<ul>
<li>implementar <code>node_modules</code> en su servidor de producción, y</li>
<li>use una ruta relativa desde tuarchivo al archivo que desea importar
La ruta relativa es un gran dolor de cabeza porque te obliga a escribir la importación de forma ligeramente diferente dependiendo de qué tan profundo estés en la estructura de carpetas. Entonces, para usar Lodash, tendrías que:</li>
</ul>
<pre><code class="lang-JS"><span class="hljs-comment">// en ./src/core.js </span>
<span class="hljs-keyword">var</span> _ = <span class="hljs-built_in">require</span>(<span class="hljs-string">'../node_modules/lodash/lodash.js'</span>);

<span class="hljs-comment">// en ./src/app/main.js</span>
<span class="hljs-keyword">var</span> _ = <span class="hljs-built_in">require</span>(<span class="hljs-string">'../../node_modules/lodash/lodash.js'</span>);
</code></pre>
<p>Los empaquetadores te permiten escribir simplemente:</p>
<pre><code class="lang-JS"><span class="hljs-comment">// en cualquier lugar</span>
<span class="hljs-keyword">var</span> _ = <span class="hljs-built_in">require</span>(<span class="hljs-string">'lodash'</span>);
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644397592406/qjvB5ydc4N.jpeg" alt="Image description" /></p>
<h2 id="heading-importar-otros-tipos-de-archivos">Importar otros tipos de archivos</h2>
<p>Tu código base  no es solo JavaScript. Cuando organices tu código por componentes o rutas, cada uno vendrá con su propia plantilla y estilo. Los módulos nativos de ES no le permiten importar tipos de recursos que no sean JS. Esta limitación le haría importar el CSS del HTML, mientras que el resto del componente se importa en JavaScript —lo que le obligaría a mantener sincronizados dos archivos no relacionados. Los paquetes JS solucionan este problema al permitirle administrar todas esas dependencias directamente desde sus archivos JS:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">import</span> ‘./core.js’;
<span class="hljs-keyword">import</span> ‘./style.css’;

<span class="hljs-keyword">const</span> template = <span class="hljs-built_in">require</span>(‘./view.html’);
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644397594880/8sU3jGzk3v.jpeg" alt="Image description" /></p>
<h2 id="heading-transpilar-codigo">Transpilar código</h2>
<p>Una gran cantidad de JavaScript no es JavaScript simple; está escrito en lenguajes como TypeScript y luego compilado en JavaScript. Esta compilación de código a código se llama transpilación. La mayor parte del JavaScript se transpila por varias razones.</p>
<h3 id="heading-minificacion-de-codigo">Minificación de código</h3>
<p>Si estás escribiendo tu código como deberías, estás haciendo lo siguiente:</p>
<ul>
<li>dar nombres significativos a las variables</li>
<li>sangrado del código</li>
<li>dejando comentarios para otros desarrolladores</li>
</ul>
<p>Esto agrega desorden que no significa nada para el intérprete. La minificación es el primer paso para reducir el tamaño de la carga útil. Elimina todo lo que no tiene impacto en su aplicación.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644397597222/tdfVgqv26s.jpeg" alt="Image description" /></p>
<h3 id="heading-version-anterior-para-navegadores-mas-antiguos">Versión anterior para navegadores más antiguos</h3>
<p>A medida que el lenguaje recibe nuevas características, existe este período durante el cual</p>
<ul>
<li>los desarrolladores ya quieren usarlo, y</li>
<li>no todos los navegadores lo admiten.</li>
</ul>
<p>Afortunadamente, este período se está acortando significativamente gracias a los evergreen browsers, pero aún existe la necesidad de un proyecto como Babel. Babel te permite usar la versión de idioma más reciente mientras codifica y transpilarla a una versión que entenderá el navegador anterior.</p>
<h3 id="heading-sabores-de-javascript">Sabores de JavaScript</h3>
<p>Además del JavaScript simple, puede usar muchos de sus sabores:</p>
<ul>
<li>TypeScript </li>
<li>PureScript</li>
<li>Elm</li>
<li>CoffeeScript</li>
</ul>
<p>Los paquetes de JavaScript pueden manejar incluso la mezcla de diferentes sabores en un proyecto —lo que parece una mala idea hasta que terminas trabajando con código heredado y necesitas mucha flexibilidad para elegir las prioridades correctas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1644397599444/en55M1exf.jpeg" alt="Image description" /></p>
<h2 id="heading-construccion-separada-para-diferentes-casos-de-uso">Construcción separada para diferentes casos de uso</h2>
<p>Una vez que comienzas a compilar tu código con un paquete, surgen nuevas posibilidades. Desde el principio, lo más probable es que compiles el código de una forma para la producción y de otra para el desarrollo local. Si escribes pruebas unitarias, tal vez te interese saber qué tan bien cubren tu código. Hay herramientas de cobertura de código que hacen exactamente esto. Requieren una compilación dedicada que incluya herramientas que cuenten las visitas a cada línea de código durante la ejecución de la prueba.</p>
<h2 id="heading-y-tu">¿Y tú?</h2>
<p>¿Qué paquete JS planeasusar en tu próximo proyecto? Házmelo saber en la <a target="_blank" href="https://strawpoll.com/2gpdcr2g3">encuesta</a>, para saber a cuál debería prestar más atención en este blog:</p>
<div class="hn-embed-widget" id="strawpoll-bundler"></div><h2 id="heading-que-sigue">¿Qué sigue?</h2>
<p>Puedesconsultar mi artículo sobre el uso de <a target="_blank" href="https://conoce.dev/como-utilizar-los-modulos-nativos-de-es">módulos ES nativos</a>, o:</p>
<ul>
<li><a target="_blank" href="https://bit.ly/esbuild-course">mi video curso para esbuild</a></li>
<li><a target="_blank" href="https://bit.ly/WebpackCourse">mi video curso para webpack</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Cómo agregar pruebas de extremo a extremo a un proyecto]]></title><description><![CDATA[Felicidades. La configuración de extremo a extremo (E2E) es un tema bastante avanzado y puede aportar mucho valor a su proyecto. Tiene la posibilidad de detectar posibles problemas antes de fusionar los cambios en la rama principal—mucho antes de ace...]]></description><link>https://conoce.dev/como-agregar-pruebas-de-extremo-a-extremo-a-un-proyecto</link><guid isPermaLink="true">https://conoce.dev/como-agregar-pruebas-de-extremo-a-extremo-a-un-proyecto</guid><category><![CDATA[JavaScript]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 02 Feb 2022 05:23:11 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1643786170704/4y8h8NBfx.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Felicidades. La configuración de extremo a extremo (E2E) es un tema bastante avanzado y puede aportar mucho valor a su proyecto. Tiene la posibilidad de detectar posibles problemas antes de fusionar los cambios en la rama principal—mucho antes de acercarse a la implementación en producción. Cuanto antes encuentre el error, más fácil será solucionarlo. E2E le permite realizar pruebas exhaustivas tan pronto como los cambios estén disponibles.</p>
<h2 id="heading-que-son-las-pruebas-de-extremo-a-extremo">¿Qué son las pruebas de extremo a extremo?</h2>
<p>Las pruebas E2E son scripts que interactúan con una aplicación de manera similar a como lo haría un usuario. Abren un navegador, cargan una URL, hacen clic en los elementos de la interfaz de usuario (IU), como los botones, y esperan algunos resultados. Las máquinas los ejecutan, y son mucho más rápidos y confiables que los humanos. Nunca se aburren.</p>
<p>El único inconveniente —necesitan instrucciones precisas y, a veces, pueden ser más complicados de programar que la función que intentan probar. Escribir las pruebas es programación, y está acoplado con la aplicación que se prueba, pero es una tarea que a muchos programadores no les entusiasma especialmente. Si te vuelves bueno en eso, podría convertirse en tu habilidad única que te ayude a brillar en el trabajo.</p>
<h2 id="heading-elige-tu-herramienta">¡Elige tu herramienta!</h2>
<p>Hay muchas opciones disponibles para construir una suite E2E:</p>
<ul>
<li>Cypress</li>
<li>Playwright</li>
<li>Protractor</li>
<li>Selenium</li>
<li>TestCafe</li>
</ul>
<p>Aquí, es lo mismo que con otras decisiones tecnológicas: es bueno investigar bien tus opciones. Cada prueba que escribe está estrechamente relacionada con la plataforma que elija. Es posible migrar de una herramienta de prueba a otra, pero eso sería un proyecto tan grande como reemplazar el marco frontal.</p>
<p>Mi experiencia es principalmente con Protractor, una solución obsoleta centrada en Angular. Actualmente estoy migrando pruebas a Cypress y estoy impresionado con el progreso en las herramientas de prueba en esos años. ¿Qué herramienta E2E le gustaría utilizar en su próximo proyecto? Házmelo saber en la <a target="_blank" href="https://strawpoll.com/zc6v2fkff">encuesta</a>:</p>
<div class="hn-embed-widget" id="strawpoll-e2e"></div><p> </p>
<h2 id="heading-pruebas-simples-en-la-maquina-local">Pruebas simples en la máquina local</h2>
<p>Con sus primeras pruebas, manténgalas triviales. Use cualquier URL de prueba local que tenga y simplemente acceda a ella con sus scripts. Ni siquiera necesita verificar ningún flujo de trabajo de la aplicación. Simplemente escriba algunas pruebas, cada una para diferentes rutas, y verifique que los elementos de la interfaz de usuario aparezcan en la página. Por ejemplo, puedes comprobar:</p>
<ul>
<li>en <code>/login</code>, si hay campos de entrada para nombre de usuario y contraseña</li>
<li>en <code>/product/12</code>, si se muestra el nombre del producto</li>
<li>etc</li>
</ul>
<p>Incluso con pruebas tan fáciles, puedes probar:</p>
<ol>
<li>que la aplicación se está iniciando y todas las rutas se muestran con elementos clave de la interfaz de usuario</li>
<li>que puedes desarrollar pruebas E2E</li>
</ol>
<p>Y con eso, el E2E está despegando —el equipo tiene algunas pruebas y un miembro (usted) está dispuesto y es capaz de escribir más pruebas.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643786106989/puq-nTY6n.jpeg" alt="Image description" /></p>
<h2 id="heading-pon-a-tu-equipo-a-bordo">Pon a tu equipo a bordo</h2>
<p>Probablemente no necesitará ser insistente al principio. Solo asegúrese de que todos sepan que hay pruebas E2E disponibles y genere la expectativa de que cada desarrollador debe ejecutarlas antes de fusionar cosas con la rama principal. En esta etapa, notará todas las diferencias entre las configuraciones locales de sus colegas—diferentes dominios o puertos que la gente usa localmente. Puede solucionarlo haciendo que todos usen la misma URL o haciendo que la URL de prueba sea fácilmente configurable, no codificada. Ambos enfoques están BIEN. Simplemente hice que todos usaran la misma URL localhost; en mi caso, casi no hubo rechazo por parte del equipo.</p>
<p>El siguiente paso es probar el camino feliz de un flujo de trabajo—lo que debe hacer la aplicación cuando todo funciona como se esperaba. Escribe pruebas que verifican si el botón "agregar al carrito" realmente agrega productos al carrito, y ese "pago" va a la página del proveedor de pago. Esas pruebas son más complicadas de escribir, pero prueban partes críticas de la aplicación. Deberían ayudar a convencer a sus colegas sobre la utilidad de E2E. Y sus pruebas se están volviendo un poco más sofisticadas.</p>
<h2 id="heading-que-sigue">¿Qué sigue?</h2>
<p>Si tiene alguna pregunta o duda sobre E2E, ¡no dude en publicarla en los comentarios! Lo leeré y haré lo mejor que pueda para responder. Puede continuar leyendo sobre <a target="_blank" href="https://conoce.dev/como-administrar-el-codigo-heredado-fragil">administrar código heredado frágil</a> en mi blog.</p>
]]></content:encoded></item><item><title><![CDATA[¿Cómo administrar el código heredado frágil?]]></title><description><![CDATA[¡Bienvenido al mundo real! Después de hacer todos los ejemplos de aprendizaje simplificados, ha comenzado su primer trabajo de TI. Es muy probable que después de realizar algunas tareas de preparación, te des cuenta de que hay un código antiguo desag...]]></description><link>https://conoce.dev/como-administrar-el-codigo-heredado-fragil</link><guid isPermaLink="true">https://conoce.dev/como-administrar-el-codigo-heredado-fragil</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 26 Jan 2022 06:06:50 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1643180895655/uWSaU0AsV.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>¡Bienvenido al mundo real! Después de hacer todos los ejemplos de aprendizaje simplificados, ha comenzado su primer trabajo de TI. Es muy probable que después de realizar algunas tareas de preparación, te des cuenta de que hay un código antiguo desagradable en el proyecto en el que estás trabajando. Si tienes suerte, hay alguien en tu equipo que intenta protegerte para que no te aventures demasiado en esa zona oscura, pero puedes estar seguro de que no durará para siempre. Deberá enfrentarse a la realidad en algún momento—gran parte de su trabajo diario consistirá en mantener una base de código heredada. Veamos cómo puedes hacer que esta experiencia sea lo más manejable posible.</p>
<h2 id="heading-hojear-el-codigo">Hojear el código</h2>
<p>Obtén el código y sumérgete un poco en él. Es probable que el código existente sea confuso, que los archivos sean demasiado grandes y que todo parezca un desastre. Al principio, podría concentrarse en la estructura del archivo para encontrar patrones. En un proyecto con una larga historia y poco enfoque en la consistencia, es probable que encuentre diseños de la competencia utilizados de manera aparentemente aleatoria. En este caso, solo trate de averiguar qué tan malo fue y deje la sistematización para más adelante.</p>
<h2 id="heading-readme-actualizacion">README actualización</h2>
<p>Después de revisar el código, evaluemos el estado de la documentación. Debería haber algún tipo de archivo README. Tal vez esté criminalmente desactualizado, pero al menos menciona las ideas utilizadas en la creación del código base. Puede intentar actualizar la información a medida que encuentre algunas piezas obsoletas. Un buen lugar para comenzar es integrar lo que recibió en los correos electrónicos y otras comunicaciones sobre el proyecto y asegurarse de que esté reflejado y vinculado desde el README. Además, asegúrese de actualizarlo regularmente para que la próxima persona en el proyecto tenga un comienzo más fácil.</p>
<h2 id="heading-descubre-el-proceso-de-construccion">Descubre el proceso de construcción</h2>
<p>Recientemente trabajé en un curso de actualización de Angular que recibió su última actualización hace tres años. Los primeros videos estaban en Angular 4—una versión tan antigua que tiene problemas de compatibilidad con las Node.js y procesadores mas actuales. Pasé por una cascada de actualizaciones forzadas antes de poder construirlo en mis máquinas—y eso fue solo en un pequeño proyecto de ejemplo. Un proyecto que heredes en el mundo real probablemente estará en un estado mucho peor.</p>
<p>Con suerte, todo lo que necesita para construir el proyecto con éxito será</p>
<ol>
<li>cubierto por LÉEME u otra documentación,</li>
<li>todavía al día, y</li>
<li>trabajando como se esperaba.</li>
</ol>
<p>Lo más probable es que su proyecto no cumpla con esos puntos en el camino, lo que le permitirá resolverlo por su cuenta. Si está fallando, puede buscar el error y ver qué lo está causando.</p>
<p>Si no hay nada útil en la documentación, el siguiente lugar para verificar es <code>package.json</code>. Puede haber algún comando similar a una compilación entre <code>”scripts”</code>. En el peor de los casos, puede buscar rastros de herramientas de compilación que fueron populares en el pasado y participar en una especie de arqueología de JavaScript:</p>
<ul>
<li>grunt</li>
<li>gulp</li>
<li>webpack</li>
<li>browserify</li>
<li>require.js</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643180845074/iYqEJ0m2jR.jpeg" alt="Image description" /></p>
<h2 id="heading-y-el-despliegue">Y el despliegue</h2>
<p>Eso también puede ser divertido. No saber dónde se ejecutan sus sistemas es bastante frustrante: hace que se preocupe por lo que podría pasar si se estropean. Teníamos un chatbot interno y no pudimos averiguar dónde vivía durante unos meses. Esta información debería estar disponible más fácilmente para más sistemas de misión crítica, pero esas cosas a menudo toman más tiempo de lo esperado.</p>
<p>Descubrir todos los detalles sobre su implementación de producción puede llevar mucho tiempo. Podría detenerse por no tener el usuario correcto, perder credenciales para algunas áreas y tener que verificar todo dos veces para evitar romper cosas. ¡Felicidades! Puede hacer un cambio de código en su máquina que llegue a producción. Tu trabajo puede tener un impacto.</p>
<h2 id="heading-investigue-las-medidas-de-garantia-de-calidad-qa-existentes">Investigue las medidas de garantía de calidad (QA) existentes:</h2>
<p>De manera similar a lo que hizo para la compilación, intente encontrar lo que sea que esté disponible para</p>
<ul>
<li>Pruebas de integración,</li>
<li>Pruebas unitarias, y</li>
<li>Lint.</li>
</ul>
<p>Si no está documentado y no está definido en los scripts de <code>package.json</code>, puede buscar algunas herramientas que eran comunes en el pasado.</p>
<ul>
<li>Pruebas de integración:<ul>
<li>protractor</li>
<li>selenium</li>
</ul>
</li>
<li>Pruebas unitarias:<ul>
<li>jasmine</li>
<li>mocha</li>
<li>sinon</li>
</ul>
</li>
<li>Lint:<ul>
<li>jslint</li>
<li>jshint</li>
<li>tlint</li>
</ul>
</li>
</ul>
<p>Si hay rastros de medidas de control de calidad automatizadas configuradas en el pasado, intente reutilizarlas tanto como sea posible. Puede haber un valor real en todas las cosas que configuraron los desarrolladores anteriores, y sería una pena tirarlo todo.</p>
<h2 id="heading-establecer-una-prueba-de-humo">Establecer una prueba de humo</h2>
<p>Si está restaurando un motor antiguo, en el primer intento, lo encenderá sin carga para ver si funciona sin quemarse. Esto se llama prueba de humo—todo está bien, siempre y cuando no veamos humo. Lo mismo ocurre con el código heredado: cuando no tiene nada con lo que probar la aplicación a fondo, al menos puede compilarla y ver si la aplicación se inicia correctamente. Hasta que pueda ejecutar pruebas más sofisticadas automáticamente, es mejor que se limite a cambios directos y utilice este mismo procedimiento básico para asegurarse de que todo funcione como se espera.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643180847623/PBpEDNxXO.jpeg" alt="Image description" /></p>
<h2 id="heading-comience-con-pequenos-cambios">Comience con pequeños cambios</h2>
<p>El proceso de reactivación del proyecto va bastante bien; ahora está listo para comenzar a realizar cambios en el código. Comience con algo pequeño, con cosas que nadie notará. Usted puede</p>
<ul>
<li>actualizar la versión del parche de alguna biblioteca,</li>
<li>cambiar el nombre de algunas variables locales, o</li>
<li>refactorizar algunos antipatrones molestos en un solo lugar.</li>
</ul>
<p>Recuerde que su meta es hacer un cambio que casi seguro no tendrá efectos secundarios.</p>
<h2 id="heading-implementar-en-produccion">Implementar en producción</h2>
<p>Cree el código con sus cambios triviales e impleméntelo en todos los entornos hasta la producción. Su objetivo es hacer un ejemplo de este proceso restaurado—hacer que los cambios de código pasen de su cabeza a las máquinas de los clientes. Es lo suficientemente desafiante por sí solo; es por eso por lo que mantuvimos el alcance de nuestros cambios al mínimo. Su objetivo es brindarle a usted y a las partes interesadas confianza en el proceso.</p>
<h2 id="heading-agregar-pruebas-de-integracion">Agregar pruebas de integración</h2>
<p>Lo más probable es que tenga que crear pruebas de integración desde cero. Me refiero a esas pruebas que comprueban que todo está integrado y funciona en conjunto. Otro nombre es extremo a extremo (e2e) porque a menudo se prueban tanto el frontend como el backend juntos. Debes comenzar aquí porque no importa si calculas el IVA correctamente si la aplicación falla cuando inicias una nueva transacción. Al principio, puede tener más sentido desarrollar pruebas simples para muchas páginas en lugar de pruebas precisas solo para unas pocas. Una prueba tan simple como visitar una ruta y verificar si los elementos clave de la interfaz aún están presentes puede proporcionar mucho valor—esto detecta instancias en las que alguna página se rompe por completo.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1643180849967/xJjN-0kgF.jpeg" alt="Image description" /></p>
<h2 id="heading-configure-y-comience-a-agregar-pruebas-unitarias">Configure y comience a agregar pruebas unitarias</h2>
<p>Una vez que sepa que la aplicación se está iniciando como se esperaba, puede entrar en los detalles y ver si todas las unidades—clases, funciones, etc.—funcionan como se esperaba. Puede probarlos desde el nivel de la interfaz de usuario, pero las pruebas de extremo a extremo son:</p>
<ul>
<li>lento para escribir—obtener los datos correctos en el lugar correcto lleva mucho tiempo</li>
<li>lento para ejecutar—tener una base de datos, un backend y un navegador en ejecución consume muchos recursos</li>
</ul>
<p>En lugar de incluir todos los casos extremos imaginables en su configuración de integración, desea tener una configuración de prueba separada para obtener más detalles esenciales. Quiere pruebas unitarias. Ellos:</p>
<ul>
<li>son órdenes de magnitud más rápidos de ejecutar que e2e</li>
<li>están desconectados del backend y la base de datos</li>
<li>permite probar partes atómicas de su aplicación, independientemente del código y los flujos de trabajo circundantes</li>
</ul>
<p>¿Quieres aprender más? Aquí puede encontrar mi <a target="_blank" href="https://conoce.dev/cual-es-el-objetivo-de-las-pruebas-unitarias">razón para escribir pruebas unitarias</a>.</p>
<h2 id="heading-verficar-el-codigo-con-lint">Verficar el código con lint</h2>
<p>Los linters son análisis estáticos del código destinados a señalar las fuentes de problemas comunes. Es bueno tener un control regular que revise su código y le diga que todo está bien aquí. <a target="_blank" href="https://eslint.org/">eslint</a>, un linter popular para JavaScript y TypeScript, permite una gran cantidad de configuraciones. Puede configurar la configuración para detectar solo los problemas más problemáticos, arreglar todo el código base e integrarlo con su editor de código. Para seguir obteniendo más valor de la configuración, puede continuar iterando sobre la configuración, activando o desactivando diferentes reglas y agregando complementos específicos del marco. De esta manera, podrá hacer que su código mejore con el tiempo; y al mismo tiempo, cada paso será pequeño y no te llevará demasiado tiempo a la vez.</p>
<h2 id="heading-hacer-cumplir-el-estilo-de-codificacion">Hacer cumplir el estilo de codificación</h2>
<p>Cumplir con el mismo formato facilita la lectura del código: de esta manera, no hay lugares con formatos extraños que atraigan su atención por la razón equivocada. La coherencia en el código base aporta una sensación de orden y facilita la confianza en el estado actual del proyecto. El estilo de codificación puede generar muchas discusiones acaloradas. No me importa mucho el formato en particular; Solo quiero hacer lo mismo, sin importar quién y cuándo escribió el código, y me gusta que el estilo se aplique automáticamente. Afortunadamente, en este momento contamos con herramientas obstinadas, como <a target="_blank" href="https://prettier.io/">prettier</a>, que pueden formatear proyectos completos en un momento y dejar solo unas pocas opciones para discutir dentro de su equipo. ¡Así que puede subcontratar tanto el formato en sí como las interminables discusiones al respecto a una herramienta externa!</p>
<h2 id="heading-ir-a-traves-de-actualizaciones-faciles-de-librerias">Ir a través de actualizaciones fáciles de librerías</h2>
<p>Ahora, hagamos algunas tareas finales de calentamiento. Puede intentar actualizar alguna dependencia de una versión de parche a una más nueva—por ejemplo, de la versión 1.2.3 a la 1.2.4. Su código probablemente esté usando versiones antiguas de todas las bibliotecas de terceros que usa. Actualizarlos requerirá mucho trabajo y es una buena inversión hacerlo: las nuevas versiones generalmente tienen algunas características nuevas, correcciones de seguridad y más materiales disponibles en línea. Incluso una actualización de parche no es un cambio trivial, y con todo el trabajo que hemos hecho aquí, deberíamos esperar uno de dos resultados:</p>
<ul>
<li>las cosas fallan después de la actualización, pero son detectadas por una de nuestras capas de verificación, o</li>
<li>todo funciona bien—tanto en las pruebas como en la producción después de la implementación.</li>
</ul>
<p>¡Asegúrate de no intentar apresurar esas actualizaciones! Haga uno a la vez, suelte y espere comentarios. Recuerde, le está enseñando a la gente a confiar en sus cambios, y lo último que necesita es una regresión.</p>
<h2 id="heading-realice-la-mejora-mas-pequena-y-sencilla-de-cara-al-usuario">Realice la mejora más pequeña y sencilla de cara al usuario</h2>
<p>Hasta ahora, su trabajo ha sido casi invisible para los usuarios—a menos que haya logrado interrumpir la producción en algún momento. Con toda la infraestructura en su lugar, ¡está listo para entregar algo de valor! Elija el problema más pequeño y simple que pueda encontrar—un error tipográfico en alguna página o un margen faltante en un botón. Su objetivo es demostrarse a sí mismo y a los demás que puede solucionar problemas y realizar cambios en el código sin romper nada más. No lo arruines tratando de hacer algo impresionante.</p>
<h2 id="heading-configurar-la-integracion-continua-ci">Configurar la integración continua (CI)</h2>
<p>Vendrán más solicitudes de cambio si el proyecto realmente está volviendo a la vida. En ese caso, tendrá sentido establecer una integración continua. Si está interesado en obtener más información, déjame saber en la encuesta:</p>
<div class="hn-embed-widget" id="strawpoll-ci"></div><h2 id="heading-que-sigue">¿Qué sigue?</h2>
<p>¡Felicidades! Usted es la nueva persona de referencia para el código heredado. Disfrute de la seguridad laboral recién adquirida—el trabajo debe hacerse y no hay cola de personas dispuestas a hacerlo. Puede ser un excelente momento para verificar dos veces si su compensación está a la altura del mercado y cubre el valor que brinda a la empresa——<a target="_blank" href="https://conoce.dev/como-obtener-un-aumento-de-sueldo-en-ti">lea más aquí</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Cómo obtener un aumento de sueldo en TI]]></title><description><![CDATA[Todos sabemos que la tecnología es una carrera bastante buena en cuanto a dinero. Aun así, puede perjudicarse a sí mismo al ceñirse a un salario más bajo que el que podría ofrecer una empresa. Incluso una pequeña diferencia en el pago se convierte en...]]></description><link>https://conoce.dev/como-obtener-un-aumento-de-sueldo-en-ti</link><guid isPermaLink="true">https://conoce.dev/como-obtener-un-aumento-de-sueldo-en-ti</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 19 Jan 2022 16:54:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1642611776827/MgP6v4U3-.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Todos sabemos que la tecnología es una carrera bastante buena en cuanto a dinero. Aun así, puede perjudicarse a sí mismo al ceñirse a un salario más bajo que el que podría ofrecer una empresa. Incluso una pequeña diferencia en el pago se convierte en una cantidad impresionante cuando la multiplicas por 12 meses en un año y todos los años que estarás trabajando. Asegurémonos de que no se pierda ninguna oportunidad financiera.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1642611705457/HLwMCFNaJ.jpeg" alt="Image description" /></p>
<h2 id="heading-hable-sobre-el-pago-con-sus-companeros">Hable sobre el pago con sus compañeros</h2>
<p>La forma en que se percibe hablar de dinero depende de la cultura. Crecí en Polonia y hablar de mis ingresos fue como presumir durante mucho tiempo. Podría ver que este es el caso si un especialista bien pagado hablara sobre sus ingresos a las personas que están atrapadas en trabajos de salario mínimo. Por otro lado, para las personas que trabajan en trabajos similares, los posibles resultados son:</p>
<ul>
<li>Hay una diferencia mínima en la compensación</li>
<li>Alguien —tal vez usted —podría darse cuenta de que está mal pagado. Hay algunas razones por las que esto podría suceder:<ul>
<li>Le falta alguna habilidad técnica que tiene un impacto significativo en el pago</li>
<li>Le faltan habilidades de negociación</li>
<li>La empresa en la que trabaja no tiene presupuesto para pagar mejor</li>
</ul>
</li>
</ul>
<p>¿Y las personas que aprenden que les pagan mejor? No pierden nada.</p>
<p>Además del tabú cultural, la única razón para no hablar de dinero sería si estás más interesado en los resultados de la empresa que en tu bienestar y el de tus compañeros. Por ejemplo, este podría ser el caso si su participación en la propiedad de la empresa es más significativa que su parte de la nómina total, o si cree plenamente en la misión de su empleador.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1642611707486/gFnTcIhm7G.jpeg" alt="Image description" /></p>
<h2 id="heading-evaluar-el-mercado-mas-amplio-regularmente">Evaluar el mercado más amplio regularmente</h2>
<p>Si eres como yo, tu enfoque en tu carrera fluctúa mucho a lo largo de los años. A veces paso mucho tiempo aprendiendo cosas nuevas, interactuando con comunidades tecnológicas y, a veces, tengo meses en los que no hago nada relacionado con TI además de mi trabajo diario. Siempre hay cambios en el mercado laboral: nuevas tecnologías que ganan popularidad, nuevas empresas en el mercado local que ofrecen mejores condiciones o empresas lejanas que se abren a candidatos remotos. Es una buena idea concertar una cita contigo mismo para comprobar periódicamente esos cambios. Como mínimo, reservar una tarde al año para buscar ofertas de trabajo debería hacerte consciente de cómo van las cosas fuera de tu empresa actual.</p>
<h2 id="heading-no-cuentes-con-la-iniciativa-de-la-empresa">No cuentes con la iniciativa de la empresa</h2>
<p>La empresa para la que trabaja está interesada en mantener sus operaciones sin interrupciones. Tal vez la evaluación de su gerente dependa de cuántos renuncien a su equipo, pero esto les da solo un pequeño incentivo para mantener su salario en línea con el mercado. Este incentivo será aún menor si les convences de que te gusta tu trabajo y que no estás buscando nada más en este momento. Si la empresa tiene una política de aumentos salariales regulares, lo más probable es que solo coincida con la inflación, no con los cambios del mercado laboral de TI. Si te ascienden a un tramo salarial diferente que viene con un aumento, parece una mejora, pero puede ser que te coloquen en la parte inferior de este nuevo tramo.</p>
<h2 id="heading-preparate-para-la-negociacion">Prepárate para la negociación</h2>
<p>En 2019 me compré <a target="_blank" href="https://bit.ly/FearlessSalaryNegotiation">Fearless Salary Negotiation</a> como regalo de cumpleaños. Fue el mejor regalo que he recibido y se pagó solo en poco tiempo. El libro brinda muchos consejos prácticos: guías paso a paso sobre qué hacer antes de negociar el salario. Tratar con una nueva empresa es una gran parte, pero hay muchas cosas que serán útiles en un contexto más general, y un capítulo está dedicado a las promociones y los aumentos de sueldo.</p>
<p>Si tiene un presupuesto limitado, el autor del libro lo ofrece generosamente [también gratis] (https://bit.ly/FearlessSalaryNegotiationFree). Puede obtener su consejo en su sitio web, en el breve artículo: [cómo escribir un correo electrónico a su gerente para iniciar la conversación] (https://bit.ly/FearlessSalaryNegotiationRaise).</p>
<h2 id="heading-pregunta-por-ello">¡Pregunta por ello!</h2>
<p>Hablar del tema de la compensación con su gerente puede ser estresante. La preparación adecuada debería ayudarlo a lograr su objetivo y ayudarlo con el estrés. Puede verlo desde otra perspectiva: un gerente razonable debería apreciar que hable primero con ellos sobre su problema con el salario, en lugar de ir directamente a la competencia. ¿Y si resultan ser irrazonables? Significará que hablar con otras empresas es una buena idea.</p>
<h2 id="heading-no-seas-timido-avisa-a-tus-colegas">No seas tímido; avisa a tus colegas</h2>
<p>Una vez que obtenga su aumento, ¡puede informar a sus colegas! La práctica estándar de la industria de saltar de un trabajo a otro para obtener una mejor compensación significa que su colega experimentado podría ser reemplazado algún día por alguien que no sabe nada sobre su proyecto, lo que le obliga a llevar una carga de trabajo más significativa. Compartir sus buenas noticias puede inspirar a otros miembros del equipo a intentar hacer lo mismo, mejorando la moral y asegurándose de permanecer más tiempo en el proyecto. Al final, esto hará que su trabajo sea más fácil y placentero.</p>
<h2 id="heading-que-sigue">¿Qué sigue?</h2>
<p>Es genial que estés reflexionando sobre tu carrera y tratando de conseguir el mejor trato para ti. Ya que llegaste hasta aquí, ¿qué tal averiguar si tu lugar de trabajo actual es adecuado para ti? Aquí tienes una <a target="_blank" href="https://conoce.dev/como-evaluar-su-lugar-de-trabajo-actual">guía para evaluar tu empresa actual</a>. Si tiene preguntas, sigo aceptando personas para <a target="_blank" href="https://how-to.dev/free-mentoring">tutoría gratuita en JS y programación</a>, ¡no dude en comunicarse conmigo!</p>
]]></content:encoded></item><item><title><![CDATA[Cómo aprender mientras se trabaja en proyectos personales]]></title><description><![CDATA[Un consejo estándar para los programadores principiantes es que aprendas más efectivamente cuando trabajes en tus proyectos personales. Es un buen consejo, pero es posible que tenga dificultades para seguirlo—especialmente si es muy nuevo en el ofici...]]></description><link>https://conoce.dev/como-aprender-mientras-se-trabaja-en-proyectos-personales</link><guid isPermaLink="true">https://conoce.dev/como-aprender-mientras-se-trabaja-en-proyectos-personales</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Thu, 13 Jan 2022 08:19:31 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1642062258637/NOpb6XAzz.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Un consejo estándar para los programadores principiantes es que aprendas más efectivamente cuando trabajes en tus proyectos personales. Es un buen consejo, pero es posible que tenga dificultades para seguirlo—especialmente si es muy nuevo en el oficio de TI. Este artículo actúa como una guía paso a paso que puede seguir para comenzar sus proyectos y aprender en el camino. Mis ejemplos son con la pila de desarrollo web frontend —HTML + CSS + JS, — pero puede adaptar este enfoque a cualquier tecnología que esté utilizando.</p>
<h2 id="heading-elija-un-caso-de-uso-simple">Elija un caso de uso simple</h2>
<p>El primer paso: no intentes morder más de lo que puedes masticar. Es común que las personas intenten crear cosas como clones de sitios web populares, pero esto da como resultado más funciones de las que uno puede desarrollar de manera realista. Si insiste en inspirarse en productos existentes, intente simplificarlo al extremo:</p>
<ul>
<li>si crea un clon de Reddit, cree una lista de enlaces codificados (por ejemplo, los mejores sitios web de programación) donde las personas pueden votar a favor o en contra, O una lista de enlaces donde simplemente agrega enlaces a una lista larga</li>
<li>si crea un clon de Airbnb, haga solo una lista de propiedades estática, sin reservar ni agregar nuevas propiedades</li>
<li>si crea un clon de Uber, cree una página de resumen del pedido: un viaje del punto A al punto B</li>
</ul>
<p>Otro enfoque es trabajar en algunos ejemplos de clichés: una aplicación TODO o una página de blog. Esos pueden parecer repetitivos y aburridos, pero al menos el caso de uso se entiende bien y no debería abrumarlo.</p>
<h2 id="heading-dibujar-la-interfaz">Dibujar la interfaz</h2>
<p>Cuando haya seleccionado su caso de uso, tome lápiz y papel y dibuje su interfaz. Debe comenzar con una página o un máximo de dos páginas. Al principio, un boceto en papel es perfecto; su objetivo es iterar rápidamente, y una solución de baja tecnología funciona muy bien para ello. En proyectos colaborativos, las personas usan aplicaciones sofisticadas para los diseños, pero presentan algunos dolores de cabeza—debe instalar es aplicación, aprender su interfaz, etc., lo que lo ralentiza. Su boceto aquí aclara sus pensamientos, y una vez que esté hecho, lo usará para nada más que echarle un vistazo mientras construye la interfaz.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1642062208682/j9f4_N_-O.png" alt="Image description" /></p>
<h2 id="heading-disenar-el-esquema-de-datos">Diseñar el esquema de datos</h2>
<p>Según lo que esté mostrando en las distintas pantallas, necesitará tener algunos datos en su aplicación. Asigne cada valor que muestre o use a un campo que tendrá en la estructura de datos. Para nuestros ejemplos anteriores:</p>
<ul>
<li>'Reddit' tendrá publicaciones o enlaces, con 'título', 'URL' y tal vez 'votos' o 'voteCount'.</li>
<li>'Airbnb' tendrá propiedades con 'nombre', 'foto', 'descripción', 'precio' y 'ubicación'.</li>
<li>'Uber' tendrá viajes con 'desde', 'hasta' y 'costo estimado'.</li>
<li>La aplicación TODO tendrá tareas con <code>título</code>, <code>descripción</code>.</li>
<li>El blog tendrá publicaciones con <code>título</code>, <code>cuerpo</code> y <code>fecha de publicación</code>.</li>
</ul>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1642062210489/0zcUD7N90.png" alt="Image description" /></p>
<h2 id="heading-construye-la-interfaz">Construye la interfaz</h2>
<p>Con toda esa preparación completa, está listo para abrir el editor de código. La interfaz de usuario es la parte más tangible y probablemente la más sencilla del proyecto. Creará un archivo HTML y tal vez agregue CSS si tiene ganas de hacer que su aplicación sea algo bonita. Tu objetivo es crear lo que se redactó antes y mostrarlo de la forma más sencilla posible. Especialmente si está agregando estilo, tenga en cuenta que "hecho" es mejor que perfecto —no dedique demasiado tiempo a menos que CSS y el diseño sean sus prioridades de aprendizaje.</p>
<h2 id="heading-cree-datos-simulados-y-actualice-la-interfaz-para-usarlos">Cree datos simulados y actualice la interfaz para usarlos</h2>
<p>Cuando haya terminado con HTML con datos codificados, su siguiente paso es crear una interfaz dinámica. En esta etapa, agregará JS a su proyecto. Puede limitarse a Vanilla JS y recrear el HTML con DOM, o puede agregar un marco JS con el que esté familiarizado o quiera aprender. Deberá crear una estructura de datos temporal en una variable y volver a crear el formulario HTML JS en función de los datos de la variable.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1642062212097/tlH-LSZEY.png" alt="Image description" /></p>
<h2 id="heading-anade-algo-de-logica">Añade algo de lógica</h2>
<p>Una vez que muestra datos dinámicos, puede agregar algo de lógica para manipularlos. En nuestro ejemplo simplificado, la lógica será bastante simple —agregar un registro a la lista o actualizar uno o dos valores en los datos existentes. El objetivo principal aquí es asegurarse de que nuestra aplicación esté viva —de modo que el usuario pueda hacer clic en la interfaz y se realicen cambios en lo que aparece en la pantalla. Esto es principalmente una prueba de que puede manipular datos. A medida que continúe trabajando en el ejemplo, la lógica se volverá exponencialmente más complicada. En ese caso, cada función añadida tiene que funcionar con todas las existentes. ¡Disfruta el momento en que es tan simple que se siente sencillo!</p>
<h2 id="heading-almacene-sus-datos">Almacene sus datos</h2>
<p>El siguiente paso es configurar algún tipo de persistencia para los cambios en sus datos. Puedes considerar las siguientes cosas:</p>
<ul>
<li>localStorage o sessionStorage – para pruebas locales rápidas</li>
<li>almacenamiento simple de terceros – algo como Airtable o Google Sheets</li>
<li>almacenamiento sin backend – Firebase o un sistema similar</li>
<li>compilación de backend dedicada – usted mismo para más práctica</li>
</ul>
<p>Déjame saber en la <a target="_blank" href="https://strawpoll.com/1weph9f4x">encuesta</a> o en los comentarios si estás interesado en aprender más sobre cualquiera de esos enfoques. Estoy pensando en crear artículos con ejemplos, y si sé que hay demanda, estaré más motivado para trabajar en ellos.</p>
<h2 id="heading-iterar">¡Iterar!</h2>
<p>Una vez que siga todos estos pasos, debería tener una aplicación algo utilizable. Estará lejos de ser un producto mínimo viable, pero deberías tener algo que mostrar a las personas que te animan en tus estudios. Si desea continuar trabajando en su proyecto, el siguiente paso es averiguar qué otro caso de uso desea cubrir en su aplicación y comenzar a seguir los pasos nuevamente. Esta vez debería ser más accesible y debería poder omitir algunos pasos.</p>
<h2 id="heading-que-sigue">¿Qué sigue?</h2>
<p>¡Siéntete libre de compartir los resultados de tu experimento en los comentarios! Si le gustó el enfoque propuesto aquí, puede continuar con <a target="_blank" href="https://how-to.dev/how-to-learn-data-modeling">modelado de datos de aprendizaje</a></p>
]]></content:encoded></item><item><title><![CDATA[Cómo utilizar los módulos nativos de ES]]></title><description><![CDATA[Este artículo presentará ejemplos de módulos ECMAScript (ES)—que puede lograr con ellos y donde encontrara algunas limitaciones. Todos los navegadores lanzados después de mayo de 2018 admiten módulos ES, por lo que puede asumir que son seguros de usa...]]></description><link>https://conoce.dev/como-utilizar-los-modulos-nativos-de-es</link><guid isPermaLink="true">https://conoce.dev/como-utilizar-los-modulos-nativos-de-es</guid><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Thu, 06 Jan 2022 09:31:42 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1641462047012/G621gdeh5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Este artículo presentará ejemplos de módulos ECMAScript (ES)—que puede lograr con ellos y donde encontrara algunas limitaciones. Todos los navegadores lanzados después de mayo de 2018 admiten módulos ES, por lo que puede asumir que son seguros de usar en la mayoría de los casos.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641462037195/ftR0JyOKN.png" alt="Image description" />
 <a target="_blank" href="https://caniuse.com/es6-module">fuente</a></p>
<h2 id="heading-codificacion-sin-modulos-es">Codificación sin módulos ES</h2>
<p>Antes de que tuviéramos módulos Es, todo JS tenía que importarse globalmente. Cada archivo podría acceder a variables previamente definidas y dejar cosas para el código ejecutado mas tarde. El orden de las importaciones importaba, especialmente porque las cosas importadas mas tarde podrían anular los valores anteriores. Las importaciones de la vieja escuela en acción se veían así: </p>
<p><code>display-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-built_in">document</span>.body.innerHTML = <span class="hljs-string">"lorem ipsum"</span>;
</code></pre>
<p><code>log.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Some test info"</span>);
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>No modules<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./display-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./log.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641462039159/U6N3NYStP.png" alt="Image description" /></p>
<p><a target="_blank" href="https://how-to-js.github.io/es-modules/no-modules/">El ejemplo en acción</a>.</p>
<h3 id="heading-problemas">Problemas</h3>
<p>Hay dos problemas principales con esta propuesta:</p>
<ol>
<li><p>Contamina el ámbito global. Si tiene algunos archivos que definen el mismo valor, colisionaran y se anularan entre sí. Buena suerte para encontrar y corregir los errores que puede causar. Ejemplo: 
<code>data-1.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">var</span> data = “lorem ipsum”;
</code></pre>
<p><code>data-2.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">var</span> data = “sin dolor”;
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Name collision<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./data-1.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./data-2.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span>&gt;</span><span class="javascript">
   <span class="hljs-built_in">document</span>.body.innerHTML = data;
 </span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p><a target="_blank" href="https://how-to-js.github.io/es-modules/name-collision/">Esto código en vivo</a>.
La solución alternativa mas común fue utilizar una expresión de función invocada inmediatamente. Esto aisló bloques de código y evitó la contaminación del alcance global, pero al mismo tiempo, hizo que el código fuera más confuso.</p>
</li>
<li><p>Cualquier dependencia tenia que gestionarse y resolverse manualmente. Si tenía un archivo que dependía de otro, entonces tenía que asegurarse de importar esos archivos en el orden correcto. Por ejemplo:
<code>log-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-built_in">console</span>.log(data);
</code></pre>
<p><code>data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">const</span> data = ‘some data’;
</code></pre>
<p><code>display-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-built_in">document</span>.html = data;
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
<span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>File order<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

<span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./log-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
 <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./display-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Como puedes ver <a target="_blank" href="https://how-to-js.github.io/es-modules/file-order/">aquí</a>, la parte “display data” (mostrar datos) funciona como se esperaba, mientras que el “logging data” (registro de datos) falla.</p>
</li>
</ol>
<h2 id="heading-modulos-es-en-accion">Módulos ES en acción</h2>
<p>¿Cuál es la diferencia si hacemos lo mismo con los módulos ES? En primer lugar, define las dependencias a nivel de código. Entonces, si en un archivo desea valores de otro, simplemente especifíquelo en el mismo archivo. Este enfoque marca la diferencia, especialmente en la lectura de código: solo necesita abrir un archivo para tener una idea de todo el contexto que está usando con solo leerlo.</p>
<p>Entonces, ¿Cómo usamos los módulos ES?  </p>
<p><code>data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> data = <span class="hljs-string">"lorem ipsum"</span>;
</code></pre>
<p><code>display-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">import</span> { data } <span class="hljs-keyword">from</span> <span class="hljs-string">"./data.js"</span>;

<span class="hljs-built_in">document</span>.body.innerHTML = data;
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Simple modules<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"module"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./display-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p>Los principales cambios en este código:</p>
<ol>
<li>Agregando <code>type=”module”</code> a <code>&lt;script&gt;</code> importa en el archivo HTML.</li>
<li>Utilizando palabras clave de exportación e importación en los archivos JS para definir y cargar módulos.</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641462041078/86EITvsa-.png" alt="Image description" /></p>
<p><a target="_blank" href="https://how-to-js.github.io/es-modules/simple-modules/">Ejemplo de ejecución</a>.</p>
<h2 id="heading-varios-archivos-que-importan-el-mismo-archivo">Varios archivos que importan el mismo archivo</h2>
<p>Podemos hacer que nuestro ejemplo sea más interesante importando los mismos archivos dos veces. Debido a que necesitamos que cada archivo sea independiente del otro, la importación se agregará dos veces—en cada archivo por separado. Los navegadores gestionan la importación correctamente y cargan el archivo solo una vez.</p>
<p><code>data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">export</span> <span class="hljs-keyword">const</span> data = <span class="hljs-string">"lorem ipsum"</span>;
</code></pre>
<p><code>display-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">import</span> { data } <span class="hljs-keyword">from</span> <span class="hljs-string">"./data.js"</span>;

<span class="hljs-built_in">document</span>.body.innerHTML = data;
</code></pre>
<p><code>log-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-keyword">import</span> { data } <span class="hljs-keyword">from</span> <span class="hljs-string">"./data.js"</span>;

<span class="hljs-built_in">console</span>.log(data);
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Shared import<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"module"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./display-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"module"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./log-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641462043151/n3zmGVcZHe.png" alt="shared import" /></p>
<p><a target="_blank" href="https://how-to-js.github.io/es-modules/shared-import/">El ejemplo</a></p>
<h2 id="heading-carga-diferida">Carga diferida</h2>
<p>La carga diferida retrasa la parte de carga de la aplicación hasta que el código es necesario. Esta es una técnica de optimización más complicada que cargar todo a la vez, pero permite un mayor control sobre qué se carga y cuándo. En el siguiente ejemplo, cargo y visualizo datos después de un retraso de medio segundo:</p>
<p><code>display-data.js</code>:</p>
<pre><code class="lang-JS"><span class="hljs-built_in">setTimeout</span>(
  <span class="hljs-function">() =&gt;</span>
    <span class="hljs-keyword">import</span>(<span class="hljs-string">"./data.js"</span>).then(<span class="hljs-function">(<span class="hljs-params">{ data }</span>) =&gt;</span> {
      <span class="hljs-built_in">document</span>.body.innerHTML = data;
    }),
  <span class="hljs-number">500</span>
);
</code></pre>
<p><code>data.js</code>:</p>
<pre><code class="lang-JSON">export const data = <span class="hljs-string">"lorem ipsum"</span>;
</code></pre>
<p><code>index.html</code>:</p>
<pre><code class="lang-HTML"><span class="hljs-tag">&lt;<span class="hljs-name">html</span>&gt;</span>
  <span class="hljs-tag">&lt;<span class="hljs-name">head</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">meta</span> <span class="hljs-attr">http-equiv</span>=<span class="hljs-string">"content-type"</span> <span class="hljs-attr">content</span>=<span class="hljs-string">"text/html; charset=utf-8"</span> /&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">title</span>&gt;</span>Lazy load<span class="hljs-tag">&lt;/<span class="hljs-name">title</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">link</span> <span class="hljs-attr">rel</span>=<span class="hljs-string">"shortcut icon"</span> <span class="hljs-attr">href</span>=<span class="hljs-string">"#"</span> /&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">head</span>&gt;</span>

  <span class="hljs-tag">&lt;<span class="hljs-name">body</span>&gt;</span>
    <span class="hljs-tag">&lt;<span class="hljs-name">script</span> <span class="hljs-attr">type</span>=<span class="hljs-string">"module"</span> <span class="hljs-attr">src</span>=<span class="hljs-string">"./display-data.js"</span>&gt;</span><span class="hljs-tag">&lt;/<span class="hljs-name">script</span>&gt;</span>
  <span class="hljs-tag">&lt;/<span class="hljs-name">body</span>&gt;</span>
<span class="hljs-tag">&lt;/<span class="hljs-name">html</span>&gt;</span>
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1641462045363/4Igd8z7h9K.png" alt="lazy load" /></p>
<p><a target="_blank" href="https://how-to-js.github.io/es-modules/lazy-load/">Ejemplo de carga diferida</a></p>
<h2 id="heading-el-modulo-es-cubre-todo-lo-que-necesitamos-en-js-moderno">¿El módulo ES cubre todo lo que necesitamos en JS moderno?</h2>
<p>Aunque los módulos nativos de ES mejoran significativamente los modelos anteriores de inclusión de cosas, carecen de algunas características esenciales para el desarrollo moderno de JavaScript. En este momento, no puede hacer lo siguiente:</p>
<ol>
<li>Importar tipos distintos a JS. Algunos otros archivos están en proceso <a target="_blank" href="https://tc39.es/proposal-json-modules/">JSON</a>, pero pasará mucho tiempo antes de que lo tengamos en el navegador.</li>
<li>Importe bibliotecas de terceros al estilo de Node.js. Podrías copiar archivos durante la construcción e importarlos desde una ubicación dentro de <code>node_modules</code>, pero se siente mucho más complicado que simplemente<code>importar la "biblioteca"</code>.</li>
<li>No hay transpilación. Gran parte del JS moderno está escrito en otros lenguajes, por ejemplo, TypeScript. Incluso JS puro necesita transpilación para admitir navegadores más antiguos o utilizar las funciones de lenguaje más recientes.</li>
</ol>
<p>Por estas razones, en la mayoría de los proyectos, verá paquetes JS, una especie de compilador que prepara la compilación para las implementaciones. Si está interesado en los paquetes, hágamelo saber en los comentarios y consulte los enlaces.</p>
<h2 id="heading-enlaces">Enlaces</h2>
<ul>
<li>[repositorio de ejemplos] (https://github.com/how-to-js/es-modules)</li>
<li>[todos los ejemplos] (https://how-to-js.github.io/es-modules/)</li>
<li>[mi curso de video para esbuild] (https://bit.ly/esbuild-course)</li>
<li>[mi curso de video para paquete web] (https://bit.ly/WebpackCourse)</li>
</ul>
<h2 id="heading-resumen">Resumen</h2>
<p>En esta publicación, analizamos casos de uso críticos de módulos ES. El siguiente paso sería configurar algún paquete JS para repasar las limitaciones de los módulos nativos.</p>
]]></content:encoded></item><item><title><![CDATA[¿Cuál es el objetivo de las pruebas unitarias?]]></title><description><![CDATA[Como programador junior, es posible que las pruebas unitarias le confundan. Para empeorar las cosas, las pruebas que se utilizan como ejemplos a menudo hacen que su propósito sea menos claro. Cuando ves cosas como

tiene razón en dudar de que exista ...]]></description><link>https://conoce.dev/cual-es-el-objetivo-de-las-pruebas-unitarias</link><guid isPermaLink="true">https://conoce.dev/cual-es-el-objetivo-de-las-pruebas-unitarias</guid><category><![CDATA[unit testing]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Wed, 22 Dec 2021 08:59:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1640162920643/BLYmQK5gW.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Como programador junior, es posible que las pruebas unitarias le confundan. Para empeorar las cosas, las pruebas que se utilizan como ejemplos a menudo hacen que su propósito sea menos claro. Cuando ves cosas como
<img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1640162920643/BLYmQK5gW.png" alt="test example: expect(2+2).toBe(4); expect(dog.back()).toEqual('woof')" />
tiene razón en dudar de que exista una razón sólida para dedicar algún tiempo a escribirlos. A continuación, muestro mis razones para escribir pruebas unitarias.</p>
<h2 id="heading-que-son-las-pruebas-unitarias">Que son las pruebas unitarias</h2>
<p>Las pruebas unitarias son scripts simples que verifican si una unidad dada—clase, función, módulo, etc.—está funcionando como se esperaba. Están pensados para ser bastante simples, para cubrir el camino feliz del código más algunos casos extremos. Contribuyen al éxito a largo plazo de un proyecto por las razones que analizo a continuación.</p>
<h2 id="heading-acelere-las-pruebas-de-desarrollo">Acelere las pruebas de desarrollo</h2>
<p>Cuando empiezas a crear aplicaciones, lo más natural es probar el código con la interfaz de usuario. Puede hacer que este proceso sea más rápido y confiable escribiendo un script que verifique el código por usted. Con las pruebas en su lugar, volver a ejecutarlas todas no le quita energía mental; puede hacerlo con la frecuencia que desee. Esto también conduce a un ciclo de retroalimentación más corto, lo que lo ayudará a mantenerse concentrado y productivo.</p>
<h2 id="heading-descubra-casos-extremos">Descubra casos extremos</h2>
<p>Escribir pruebas unitarias me hace pensar en casos extremos: todas las situaciones que son raras, inesperadas o incorrectas. Cuando escribe la lógica, es normal concentrarse en el camino feliz, o en lo que es normal y se espera que suceda. Cuando escribe pruebas, puede configurar comprobaciones para los casos extremos y definir lo que debería suceder en cada uno de ellos. Esto hace que su código sea más resistente en casos de entradas inesperadas.</p>
<h2 id="heading-asegurese-de-que-su-codigo-este-compuesto-por-unidades">Asegúrese de que su código esté compuesto por unidades</h2>
<p>Cuando agrega pruebas unitarias a su código, ve qué es fácil de probar y qué no. A medida que su código crece en tamaño y complejidad, las pruebas lo obligarán a dividirlo en partes manejables. Esto es genial porque te ayudará a llevar la calidad de tu código al siguiente nivel. Cada segmento que recibió responsabilidades excesivas requerirá pruebas unitarias exponencialmente más complicadas. En esos casos, es una buena idea detenerse y repensar cómo organiza su lógica.</p>
<h2 id="heading-documentacion-interactiva">Documentación interactiva</h2>
<p>Tus pruebas se convertirán en un recurso adicional para que la próxima persona que trabaje en el código averigüe qué está haciendo y cómo se supone que funciona. Es una especie de documentación extra, con bonificaciones:</p>
<ol>
<li>A menudo es más preciso que las descripciones escritas en la documentación real.</li>
<li>Se pueden ejecutar pruebas con el código actual para asegurarse de que todas las declaraciones sigan siendo válidas; no depende de un humano para leer, comprender y verificar el código.</li>
</ol>
<h2 id="heading-red-de-seguridad-para-cambios-futuros">Red de seguridad para cambios futuros</h2>
<p>Las pruebas unitarias se ejecutan tan rápido que es una obviedad ejecutarlas en cualquier actualización, sin importar cuán pequeños parezcan los cambios. Puede configurar su repositorio para ejecutar la integración continua (CI) y aceptar solo los cambios que pasen todas las pruebas. De esta manera, puede garantizar una integración fluida de los cambios sin importar la actualización:</p>
<ul>
<li>actualización menor que "no debería romper nada".</li>
<li>actualización de biblioteca de terceros</li>
<li>intento rápido y sucio de alguna solución</li>
</ul>
<p>Las pruebas unitarias protegen la base de código contra todas las regresiones menores que cubren.</p>
<h2 id="heading-resumen">Resumen</h2>
<p>Las pruebas unitarias son una parte esencial para mantener un código de alta calidad. Puedes verlo como una de las patas de una mesa:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1640163268011/D6KDWDOBs.png" alt="una mesa con 'calidad del condigo' escrito en ella, mantenida por patas con 'codigo', 'documentation', 'pruebas manuales' y 'pruebas unitarias'" />
Claro, puede eliminarlo, pero hará que mantener el equilibrio sea más complicado. Escríbalos y le ayudarán a lograr una buena calidad de código y hacer que su aplicación sea más segura.</p>
<h2 id="heading-enlaces">Enlaces</h2>
<p>Publicado originalmente en <a target="_blank" href="https://how-to.dev/whats-the-point-of-unit-tests">inglés</a>.</p>
]]></content:encoded></item><item><title><![CDATA[Cómo evaluar su lugar de trabajo actual]]></title><description><![CDATA[Como puedes leer en muchos lugares, hay muchas oportunidades para que los especialistas en TI encuentren un nuevo trabajo en este momento. No importa lo que decidas - ya sea permaneciendo en la misma empresa o buscando algo más - tiene mucho sentido ...]]></description><link>https://conoce.dev/como-evaluar-su-lugar-de-trabajo-actual</link><guid isPermaLink="true">https://conoce.dev/como-evaluar-su-lugar-de-trabajo-actual</guid><category><![CDATA[Career]]></category><dc:creator><![CDATA[Marcin Wosinek]]></dc:creator><pubDate>Mon, 29 Nov 2021 16:28:08 GMT</pubDate><content:encoded><![CDATA[<p>Como puedes leer en muchos lugares, hay muchas oportunidades para que los especialistas en TI encuentren un nuevo trabajo en este momento. No importa lo que decidas - ya sea permaneciendo en la misma empresa o buscando algo más - tiene mucho sentido evaluar su lugar de trabajo actual. Aquí está mi lista de verificación para determinar si un trabajo es deseable o no.</p>
<h2 id="heading-factor-humano">Factor Humano</h2>
<p>Quizás pasamos mucho tiempo frente a nuestras computadoras, pero las interacciones humanas son una gran parte del trabajo. Es un factor esencial de por qué las personas se van o se quedan en la empresa. ¿A qué deberías prestar atención?</p>
<h3 id="heading-1-son-sus-colegas-amables-y-serviciales">1. ¿Son sus colegas amables y serviciales?</h3>
<p>Me parece triste que sea tan común en la industria no ser acogedoras para los recién llegados o no ser útil. La verdad es que incluso en proyectos pequeños, nadie podría hacer todo el trabajo de principio a fin - de averiguar los requisitos, mediante el desarrollo de la aplicación, para implementar y apoyar a los usuarios. Como todos los miembros del equipo necesitan que los demás sean productivos, su mejor contribución es a menudo ayudar a sus colegas.</p>
<h3 id="heading-2-hay-mucha-presion-proveniente-del-lado-comercial-o-de-la-administracion">2. ¿Hay mucha presión proveniente del lado comercial o de la administración?</h3>
<p>Otra parte vital de tu experiencia laboral - es su gerente protegiéndolo de factores externos o transmitiéndole la presión. No estoy seguro de cada desarrollador, pero soy más feliz y productivo sin estresarme demasiado - tiendo a comprometerme demasiado, y no necesito un entorno que fomente esto y que espere que las personas sigan cumpliendo con los plazos imposibles.</p>
<h3 id="heading-3-obtiene-una-buena-maquina-y-herramientas">3. ¿Obtiene una buena máquina y herramientas?</h3>
<p>Tu evaluación depende de tu productividad, y su productividad depende de su computadora, las herramientas de desarrollo en él y los proveedores de terceros que está utilizando. En la mayoría de los casos, el tiempo de ingeniería es más caro que las computadoras o las herramientas. Desde la perspectiva empresarial, es una obviedad que la empresa gaste todo lo necesario en esas herramientas y se asegure de que las personas puedan utilizar su tiempo de la forma más productiva posible. Si pierden esta oportunidad, tiene una buena razón para dudar del liderazgo en general.</p>
<h3 id="heading-4-cuanta-superposicion-hay-en-el-conocimiento-del-equipo">4. ¿Cuánta superposición hay en el conocimiento del equipo?</h3>
<p>Si nadie te respalda, lo pasarás mal. Si nadie hace las cosas que usted hace en el día a día, tan pronto como salga y algo se estropee, recibirá llamadas urgentes. Puede ser especialmente complicado si el equipo es demasiado pequeño para tener una superposición adecuada entre los miembros del equipo, pero esto no debería hacer que acepte ser irremplazable.</p>
<h3 id="heading-5-hay-revisiones-periodicas-de-codigo">5. ¿Hay revisiones periódicas de código?</h3>
<p>Las revisiones de código son lo mínimo necesario para mantener a las personas informadas sobre los cambios de código. Es un lugar excelente para discutir la dirección en la que el equipo está impulsando la base de código. Si no tiene esto en el proyecto, puede convertirse en el único desarrollador de un módulo determinado. Es un camino rápido para recibir más presión si es necesario hacer algo allí.</p>
<h3 id="heading-6-hay-retrospectivas-regulares-en-el-equipo">6. ¿Hay retrospectivas regulares en el equipo?</h3>
<p>Las retrospectivas son una forma excelente de mejorar la productividad del equipo y descubrir cómo los miembros del equipo pueden ayudarse entre sí. Es muy probable que a todos les falten algunos frutos maduros si su equipo no discute esas posibilidades con regularidad. O hay algunos problemas sin resolver entre los miembros del equipo que podrían solucionarse si hubiera un lugar para discutirlos de manera constructiva.</p>
<h2 id="heading-tecnico">Técnico</h2>
<p>Incluso en el sector de las Tecnologías de la Información, algunas empresas están detrás de las prácticas de vanguardia de nuestra industria. No seguir las mejores prácticas es un falso ahorro de tiempo, ya que muy pronto habrá una regresión que se deslizará a través del control de calidad y regresará como una emergencia. Los siguientes puntos son cruciales y facilitan la vida de su desarrollador.</p>
<h3 id="heading-1-manual-de-aseguramiento-de-la-calidad-quality-assurance-qa">1. Manual de aseguramiento de la calidad (Quality Assurance, QA)</h3>
<p>Las pruebas manuales son la primera línea de protección contra regresiones y requisitos incumplidos. Desde la perspectiva del desarrollador, es reconfortante que un colega revise la aplicación antes de que mis cambios pasen a producción. El QA es otro caso en el que los mejores intereses de la empresa están en línea con los suyos. - Simplemente es más barato encontrar y corregir errores antes de que lleguen a producción. Y es menos estresante para todos los desarrolladores involucrados.</p>
<h3 id="heading-2-analisis-estaticos">2. Análisis estáticos</h3>
<p>Garantía de calidad automatizada en el nivel fundamental. Herramientas como <a target="_blank" href="https://eslint.org/">eslint</a> y <a target="_blank" href="https://prettier.io/">prettier</a> en la interfaz; <a target="_blank" href="https://flake8.pycqa.org/en/latest/">Flake8</a> y <a target="_blank" href="https://black.readthedocs.io/en/stable/">black</a> Python lo ayuda a garantizar la coherencia del estilo del código y lo protege de los errores más simples que podría introducir en su base de código. Configurarlos y aplicar todos los cambios iniciales lleva tiempo, pero lo más difícil es lograr que todos los miembros del equipo participen y que utilicen esas herramientas de manera constante - especialmente antes de fusionar los cambios en la rama principal.</p>
<h3 id="heading-3-prueba-de-unidad">3. Prueba de unidad</h3>
<p>Otra herramienta automatizada y rápida para verificar el código. Las pruebas unitarias detectan regresiones menores debido a refactorizaciones, actualizaciones de bibliotecas o personas que cambian el código antes de comprender realmente cómo funciona. Si su lugar de trabajo carece de ellos, es muy probable que pierdan mucho tiempo arreglando errores que podrían haberse encontrado antes de que salgan a la luz.</p>
<h3 id="heading-4-pruebas-de-integracion-o-de-extremo-a-extremo-end-to-end-e2e">4. Pruebas de integración o de extremo a extremo (end-to-end, e2e)</h3>
<p>Las pruebas de integración son las pruebas más exigentes de escribir y mantener. Mientras que las pruebas unitarias están probando el código de forma aislada - con muchos simulacros y datos ficticios, aquí la idea es probar lo más cerca posible de la configuración de producción. Entonces, para un proyecto web, tienes herramientas como <a target="_blank" href="https://www.cypress.io/">cypress</a> para ejecutar pruebas en su aplicación frontend, servidor backend y base de datos. Con tantas partes móviles, es más complicado de configurar, pero puede detectar problemas en cualquiera de esas capas. Una advertencia para mencionar - una vez que encuentra un problema, se necesita tiempo para averiguar qué capa está causando el problema.</p>
<h3 id="heading-5-integracion-continua-continous-integration-ci">5. Integración continua (continous integration, CI)</h3>
<p>No sería práctico ejecutar todas esas comprobaciones en las máquinas de los desarrolladores antes de comprometerse. Pero si no ejecuta estos scripts con regularidad, la base de código se deteriorará y los problemas se acumularán. La solución es ejecutarlo en una máquina externa en cada confirmación o rama creada en el repositorio. Un beneficio adicional es que tenemos un registro oficial del estado del código - por lo que, si se logra algún cambio importante, podemos encontrar fácilmente el compromiso que lo introdujo.</p>
<h3 id="heading-6-documentacion">6. Documentación</h3>
<p>Lo único peor que escribir documentación es no tener una cuando la necesita. Y cualquier proyecto que no sea trivial necesita al menos algunas palabras de explicación sobre cómo iniciarlo y cómo está estructurado. Siempre pienso en la documentación como un regalo que tengo para mis futuros colegas, y es algo en lo que pueden apoyarse cuando intentan entender mi trabajo cuando ya no formo parte del equipo. O cuando estoy de vacaciones y lo último que necesito es una llamada del trabajo.</p>
<h2 id="heading-a-largo-plazo">A largo plazo</h2>
<p>Como en la pregunta de entrevista favorita de todos: "¿Dónde se ve en 5 años?", Asegúrese de que su empresa no lo empuje hacia el lugar donde no desea encontrarse.</p>
<h3 id="heading-1-cuanto-puedes-aprender">1. ¿Cuánto puedes aprender?</h3>
<p>Nunca dejas de aprender como desarrollador, pero no algunos lugares son mejores para aprender que otros. Si estás rodeado de personas con más experiencia y están felices de ayudarte - suena como un excelente lugar para desarrollar sus habilidades. Por otro lado, si trabaja solo o realiza tareas repetitivas, su aprendizaje en el trabajo se detendrá. En ese caso, puede aprender fuera del horario de atención, pero también podría estar preparándose para una entrevista.</p>
<h3 id="heading-2-la-empresa-le-paga-la-tarifa-del-mercado">2. ¿La empresa le paga la tarifa del mercado?</h3>
<p>A menos que trabaje en una NGO que coincida con sus valores, no hay razón para permanecer en una empresa que le paga por debajo de la tarifa del mercado. Para calcular su valor de mercado, puede utilizar [this resource] (https://fearlesssalarynegotiation.com/book/value/market-value-overview/) e invierta algunas horas al año para asegurarse de que se da cuenta de cuándo se le paga mal. De lo contrario, es como si trabajara como voluntario a tiempo parcial para esta empresa con fines de lucro para el que trabaja.</p>
<h3 id="heading-3-las-habilidades-que-la-empresa-necesita-se-superponen-con-sus-preferencias">3. ¿Las habilidades que la empresa necesita se superponen con sus preferencias?</h3>
<p>¿La empresa está decidida a migrar a Python, pero a usted le encantan los puntos y comas? ¿La garantía de calidad rota lo convierte en casi una persona de la mesa de servicio en lugar de un desarrollador? ¿O nunca habrá una persona de operaciones de desarrollo en el equipo y alguien tiene que aprenderlo? En todos esos casos puede ser que simplemente no seas compatible con el futuro que la empresa tiene para ti. Una buena razón para reevaluar si quiere continuar allí.</p>
<h3 id="heading-4-esta-la-empresa-atrapada-en-una-tecnologia-sin-salida">4. ¿Está la empresa atrapada en una tecnología sin salida?</h3>
<p>Soy un desarrollador de AngularJs en 2021, y al mismo tiempo:</p>
<ol>
<li>No recomiendo que la empresa migre a otro marco – demasiada inversión.</li>
<li>No recomendaría este stack de aplicaciones a los beginners.</li>
<li>Yo mismo no aprendería Angular en estos días, y mucho menos AngularJs.
Entonces, dependiendo de cómo ve su futuro en la industria, puede considerar pasar a herramientas más populares, o algo con un futuro más brillante que un stack que era popular en 2013.</li>
</ol>
<h3 id="heading-5-el-equipo-crece-o-se-contrae">5. ¿El equipo crece o se contrae?</h3>
<p>Existe esa cosa de crecer junto con su empresa o equipo. Solo porque comenzó temprano, por defecto, de alguna manera estarás a cargo de que la gente se una más adelante. Para que pueda pasar sin problemas de tareas de programador intermedio a tareas superiores o más. Lo mismo se aplica a la inversa - si su equipo se está reduciendo, puede encontrarse sin juniors a los que asesorar ni programadores que administrar. En resumen - un equipo pequeño, pero en crecimiento es un lugar perfecto para una persona orientada a una carrera.</p>
<h3 id="heading-6-apostaria-su-propio-dinero-al-proyecto">6. ¿Apostaría su propio dinero al proyecto?</h3>
<p>Independientemente de su modelo de compensación, incluso si el pagó es solo en efectivo, su éxito financiero depende de la empresa. Si a la empresa le está yendo bien y está creciendo, será más probable que se mantenga al día con el mercado, y su parte del pastel podría estar creciendo, incluso si su participación no aumenta. En otro extremo del espectro, si la empresa se está reduciendo, el dinero será escaso y puede causar cualquiera de los problemas discutidos anteriormente.</p>
<h2 id="heading-en-resumen">En resumen</h2>
<p>Es una buena idea evaluar la empresa para la que trabaja de vez en cuando. Debe asegurarse de no estar atrapado en un lugar peor de lo que podría estar, porque nadie más lo hará por usted. Hágame saber en los comentarios cómo le está yendo a su empresa y si hay otras cosas que consideraría acerca de su trabajo.</p>
<h2 id="heading-enlaces">Enlaces</h2>
<p>Originally posted in  <a target="_blank" href="https://how-to.dev/how-to-evaluate-your-current-workplace">English</a></p>
]]></content:encoded></item></channel></rss>