<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es-ES"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://davidbuenov.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://davidbuenov.com/" rel="alternate" type="text/html" hreflang="es-ES" /><updated>2026-09-01T16:15:23+02:00</updated><id>https://davidbuenov.com/feed.xml</id><title type="html">David Bueno Vallejo</title><subtitle>Web personal de David Bueno Vallejo. Explorando la tecnología a través de la investigación, la consultoría, la docencia y la divulgación.</subtitle><entry><title type="html">Revisión anual de la web: modo noche, identidad propia y diez páginas rediseñadas</title><link href="https://davidbuenov.com/divulgaci%C3%B3n%20y%20reflexiones/programaci%C3%B3n%20y%20tecnolog%C3%ADa/2026/08/26/revision-anual-de-la-web-modo-noche-identidad-y-diez-paginas.html" rel="alternate" type="text/html" title="Revisión anual de la web: modo noche, identidad propia y diez páginas rediseñadas" /><published>2026-08-26T10:00:00+02:00</published><updated>2026-08-26T10:00:00+02:00</updated><id>https://davidbuenov.com/divulgaci%C3%B3n%20y%20reflexiones/programaci%C3%B3n%20y%20tecnolog%C3%ADa/2026/08/26/revision-anual-de-la-web-modo-noche-identidad-y-diez-paginas</id><content type="html" xml:base="https://davidbuenov.com/divulgaci%C3%B3n%20y%20reflexiones/programaci%C3%B3n%20y%20tecnolog%C3%ADa/2026/08/26/revision-anual-de-la-web-modo-noche-identidad-y-diez-paginas.html"><![CDATA[<p>Hace poco más de un año publiqué <a href="/divulgaci%C3%B3n%20y%20reflexiones/programaci%C3%B3n%20y%20tecnolog%C3%ADa/2025/07/09/victoria-ha-vuelto-la-metamorfosis-de-mi-web.html">Victoria ha vuelto: La Metamorfosis de una Web Personal</a>, donde contaba cómo había reordenado el menú, estrenado logotipo y devuelto a la vida a mi asistente de IA. Terminaba aquel artículo diciendo que “todavía quedan muchos detalles que mejorar”.</p>

<p>Pues bien: ha pasado un año, he vuelto a mirar la web con ojos críticos y resulta que seguían quedando detalles. Muchos. Así que aprovecho para institucionalizarlo y llamarlo <strong>revisión anual</strong>, que suena mucho mejor que “se me acumularon los arreglos pendientes”.</p>

<p>Esta vez el trabajo ha sido más profundo que el del año pasado, y creo que hay cosas que merece la pena contar, sobre todo las que salieron mal.</p>

<h2 id="por-qué-tocar-una-web-que-ya-funcionaba">Por qué tocar una web que ya funcionaba</h2>

<p>La web funcionaba. Cargaba rápido, tenía buenas puntuaciones en las auditorías, el chatbot respondía. Pero tenía un problema difícil de ver desde dentro: <strong>cada página parecía de un sitio distinto</strong>.</p>

<p>El motivo es histórico. La web nació sobre una plantilla comercial (Canvas), y cada vez que añadía una sección lo hacía con los componentes que la plantilla traía de serie. El resultado, acumulado durante años, era un mosaico: los proyectos en un formato, las conferencias en otro, los premios en tablas desnudas de Bootstrap, las publicaciones en cuatro tablas apiladas una detrás de otra, y las redes sociales en una rejilla con los filtros… en inglés. <em>Show All</em>, literalmente, en una web en español.</p>

<p>Ninguno de esos detalles rompía nada. Simplemente, todos juntos hacían que la web pareciera lo que era: capas de decisiones tomadas en momentos distintos.</p>

<h2 id="el-modo-noche-la-estrella-y-el-mayor-dolor-de-cabeza">El modo noche: la estrella y el mayor dolor de cabeza</h2>

<p>La novedad más visible es el <strong>botón de Sol/Luna</strong> en la cabecera. Pulsas y toda la web cambia entre modo claro y modo oscuro. La preferencia se guarda en <code class="language-plaintext highlighter-rouge">localStorage</code>, así que la web te recuerda en tu siguiente visita, y hay un script que se ejecuta antes de pintar nada para evitar el temido destello blanco al navegar entre páginas (lo que se conoce como FOUC).</p>

<p>Suena sencillo. No lo fue.</p>

<p><strong>Primer round: el tema que borraba mi configuración.</strong> Activaba el modo claro, empezaba a hacer scroll y de repente la página volvía a oscuro. Resulta que la plantilla Canvas tiene una función propia, <code class="language-plaintext highlighter-rouge">setBSTheme()</code>, que se dispara al desplazarse y elimina el atributo <code class="language-plaintext highlighter-rouge">data-bs-theme</code> que yo estaba usando. Solución: dejar de depender solo de ese atributo e inyectar además clases explícitas <code class="language-plaintext highlighter-rouge">html.light</code> / <code class="language-plaintext highlighter-rouge">html.dark</code>, que el tema no toca.</p>

<p><strong>Segundo round: texto blanco sobre fondo blanco.</strong> En los testimonios de la página de servicios, las tarjetas usan la clase <code class="language-plaintext highlighter-rouge">bg-light</code> de Bootstrap, que las mantiene blancas pase lo que pase. Pero Bootstrap 5.3 cambia sus variables de color (<code class="language-plaintext highlighter-rouge">--bs-body-color</code>, <code class="language-plaintext highlighter-rouge">--bs-secondary-color</code>) cuando detecta modo oscuro, poniéndolas en tonos claros pensados para fondos oscuros. Resultado: tarjeta blanca + texto casi blanco = testimonios invisibles.</p>

<p><strong>Tercer round: la banda gris.</strong> La franja del título en la página de servicios se quedaba de un gris cálido que chocaba brutalmente con el azul marino del resto. La causa era tonta: había una regla que forzaba el color de fondo correcto en el contenedor principal, el pie, el envoltorio… y me había dejado fuera precisamente esa franja.</p>

<p>Este último me costó tres intentos, porque las dos primeras veces diagnostiqué el elemento equivocado. Lección aprendida: <strong>cuando algo se ve mal, hay que abrir el inspector antes de tocar el CSS</strong>, no después.</p>

<p>Que quede dicho: retro-encajar un modo oscuro en una plantilla que no fue diseñada para tenerlo es bastante más trabajo del que parece desde fuera.</p>

<h2 id="una-identidad-con-sello-propio">Una identidad con sello propio</h2>

<p>El año pasado estrené logotipo “DBV”. Este año lo he llevado un paso más allá con un <strong>sello tridimensional en oro</strong>, en dos versiones —una para fondo claro y otra para fondo oscuro— que son precisamente las dos “monedas” que abren este artículo. Según el modo en que estés leyendo la web, en la cabecera verás una u otra.</p>

<p>El detalle del que estoy más satisfecho, sin embargo, es invisible para casi todo el mundo: <strong>el favicon</strong>. Tenía el sello circular completo, que a 16×16 píxeles —el tamaño real en la pestaña del navegador— se convertía en una manchita indistinguible. Lo regeneré usando solo la <strong>“D” facetada aislada</strong>, y ahora se reconoce de un vistazo entre veinte pestañas abiertas. Es un cambio de dos milímetros cuadrados que mejora el reconocimiento de marca más que muchas cosas grandes.</p>

<h2 id="diez-páginas-un-mismo-idioma-visual">Diez páginas, un mismo idioma visual</h2>

<p>El grueso del trabajo ha sido rediseñar página por página con un <strong>sistema de diseño común</strong>, en lugar de ir maquetando cada una a su aire:</p>

<ul>
  <li><strong>Tipografía:</strong> Space Grotesk para titulares, IBM Plex Sans para el cuerpo y JetBrains Mono para etiquetas y metadatos.</li>
  <li><strong>Color:</strong> paleta definida en <code class="language-plaintext highlighter-rouge">oklch</code>, con variantes coherentes para día y noche.</li>
  <li><strong>Patrones repetidos:</strong> cabecera con contadores calculados en tiempo real, filtros en forma de pastilla, tarjetas con borde sutil que se ilumina al pasar el ratón.</li>
</ul>

<p>Con ese vocabulario común han pasado por el taller la <strong>portada</strong>, el <strong>blog</strong> (que además ahora admite varias categorías por artículo), las <strong>fichas de proyecto</strong>, el <strong>catálogo de proyectos</strong>, <strong>conferencias</strong>, <strong>formación</strong>, la <strong>galería de imágenes</strong>, <strong>redes</strong>, <strong>experiencia</strong>, <strong>premios</strong> y <strong>publicaciones</strong>. También estrené una página de <strong>preguntas frecuentes</strong> con buscador en tiempo real.</p>

<p>Algunos cambios concretos que me gustan especialmente:</p>

<ul>
  <li>Los <strong>premios</strong> pasaron de tablas de Bootstrap a una línea de tiempo vertical filtrable por etapa. Son 40 reconocimientos repartidos en tres épocas, y en tabla resultaban absolutamente ilegibles.</li>
  <li>Las <strong>publicaciones</strong> pasaron de cuatro tablas apiladas a pestañas. Son 55 referencias; apiladas obligaban a un scroll interminable.</li>
  <li>La <strong>experiencia</strong> dejó atrás una lista donde todos los elementos tenían el mismo icono de <em>check</em> genérico, y ahora distingue visualmente entre puestos y titulaciones.</li>
  <li>Las <strong>conferencias</strong> tienen filtro por año y, cuando no hay ninguna programada, un mensaje cuidado en lugar de un hueco vacío.</li>
  <li>La <strong>galería</strong> es una rejilla tipo mosaico con filtro por época, cubriendo desde 2014.</li>
</ul>

<h2 id="el-contenido-manda-todo-sale-de-ficheros-de-datos">El contenido manda: todo sale de ficheros de datos</h2>

<p>Hay una decisión de fondo que no se ve pero que me ahorra tiempo cada semana: <strong>el contenido vive en ficheros de datos, no en el HTML</strong>.</p>

<p>Las conferencias, los cursos, los premios, las publicaciones, las redes, las fotos de la galería y las preguntas frecuentes están en ficheros <code class="language-plaintext highlighter-rouge">YAML</code> o en colecciones de Jekyll. Añadir una conferencia nueva es escribir seis líneas en un fichero de texto; la web se encarga sola de colocarla en su sitio, recalcular los contadores de la cabecera, añadir su año al filtro y actualizar el listado.</p>

<p>Antes, añadir cualquier cosa significaba duplicar un bloque de HTML y rezar por no romper la maquetación. Es la diferencia entre una web que mantienes y una web que te mantiene ocupado.</p>

<h2 id="dos-bugs-que-me-hicieron-gracia">Dos bugs que me hicieron gracia</h2>

<p>Como creo que de los errores se aprende más que de los aciertos, me quedo con dos:</p>

<p><strong>El mes en inglés.</strong> Las fechas de las conferencias salían como “07 de March de 2026”. El filtro <code class="language-plaintext highlighter-rouge">date</code> de Liquid con el formato <code class="language-plaintext highlighter-rouge">%B</code> devuelve el nombre del mes en el idioma del sistema, no en el del sitio. Al final lo resolví con una lista de los doce meses en español y un índice. Poco elegante, perfectamente funcional.</p>

<p><strong>Las insignias rebeldes.</strong> En el pie de página tengo nueve insignias de validación (accesibilidad, seguridad, rendimiento…). Se empeñaban en salir en tres filas. Las fusioné en un solo contenedor: seguían en tres. El problema no era cómo estaban agrupadas, sino que compartían fila con los iconos de redes sociales y solo disponían de dos tercios del ancho. Sacándolas a su propia fila, encajaron en dos. <strong>A veces el problema no está donde estás mirando.</strong></p>

<h2 id="lo-que-queda">Lo que queda</h2>

<p>No todo está terminado, y prefiero decirlo:</p>

<ul>
  <li>La página de <strong>aficiones</strong> sigue teniendo solo un vídeo de cabecera y nada debajo. Tengo la estructura pensada —una tarjeta por afición— pero antes de maquetar nada necesito decidir qué contar. Prefiero una página vacía a una página rellena de paja.</li>
  <li>Quedan por revisar algunas páginas secundarias heredadas de la plantilla original.</li>
  <li>Y seguro que aparecen detalles nuevos, porque siempre aparecen.</li>
</ul>

<h2 id="la-reflexión-de-rigor">La reflexión de rigor</h2>

<p>Una web personal no se termina nunca; se cuida. El año pasado toqué la estructura y la inteligencia (el menú, el chatbot). Este año ha tocado la coherencia visual y la mantenibilidad. El año que viene tocará otra cosa.</p>

<p>Y si algo he confirmado en este repaso es que <strong>la deuda técnica en una web se acumula igual que en cualquier otro proyecto de software</strong>: no en grandes catástrofes, sino en decenas de decisiones pequeñas y razonables tomadas en momentos distintos, que un día miras juntas y no se parecen en nada entre sí.</p>

<p>Te invito a darte una vuelta y, si te apetece, a probar el botón de la Luna. Y si ves algo raro —que lo habrá—, cuéntamelo: el año pasado varias de las mejoras salieron de sugerencias de quienes leyeron aquel artículo.</p>]]></content><author><name>David Bueno Vallejo</name></author><category term="Divulgación y Reflexiones" /><category term="Programación y Tecnología" /><category term="jekyll" /><category term="diseño-web" /><category term="modo-oscuro" /><category term="css" /><category term="bootstrap" /><category term="marca-personal" /><category term="refactorización" /><summary type="html"><![CDATA[Hace poco más de un año escribí sobre la metamorfosis de esta web. Por lo visto se me ha convertido en tradición: he vuelto a meterle mano, esta vez con modo día/noche, una identidad visual coherente y un rediseño página por página. Cuento lo que he hecho y, sobre todo, con qué me he peleado.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://davidbuenov.com/images/dbv/blog/revision-anual-web.webp" /><media:content medium="image" url="https://davidbuenov.com/images/dbv/blog/revision-anual-web.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">DBV Markdown Reader v0.13.1: el salto a un entorno completo de lectura y edición Markdown (árbol de archivos, barra de formato y cero coste de RAM)</title><link href="https://davidbuenov.com/herramientas%20y%20software/programaci%C3%B3n%20y%20tecnolog%C3%ADa/2026/08/19/dbv-markdown-reader-del-concepto-en-rust-a-la-microsoft-store.html" rel="alternate" type="text/html" title="DBV Markdown Reader v0.13.1: el salto a un entorno completo de lectura y edición Markdown (árbol de archivos, barra de formato y cero coste de RAM)" /><published>2026-08-19T00:00:00+02:00</published><updated>2026-08-19T00:00:00+02:00</updated><id>https://davidbuenov.com/herramientas%20y%20software/programaci%C3%B3n%20y%20tecnolog%C3%ADa/2026/08/19/dbv-markdown-reader-del-concepto-en-rust-a-la-microsoft-store</id><content type="html" xml:base="https://davidbuenov.com/herramientas%20y%20software/programaci%C3%B3n%20y%20tecnolog%C3%ADa/2026/08/19/dbv-markdown-reader-del-concepto-en-rust-a-la-microsoft-store.html"><![CDATA[<p>¿Alguna vez te has parado a pensar en cuántos recursos consume tu ordenador solo para mostrarte o dejarte hacer retoques sencillos en un archivo de texto plano?</p>

<p>Si trabajas en tecnología, programación o docencia, es probable que tu día a día esté repleto de archivos Markdown (<code class="language-plaintext highlighter-rouge">.md</code>): desde el <code class="language-plaintext highlighter-rouge">README.md</code> de un repositorio en GitHub, pasando por notas de proyectos o documentación técnica de APIs. Sin embargo, cuando haces doble clic en uno de estos archivos, la realidad suele ser una de estas dos:</p>

<ol>
  <li>Se abre el <strong>Bloc de Notas de Windows</strong> o un editor básico, rápido pero sin renderizado visual (sin negritas, sin tablas, sin diagramas Mermaid, sin resaltar código).</li>
  <li>Se abre un entorno pesado basado en Electron como <strong>VS Code</strong>, <strong>Obsidian</strong> o <strong>Logseq</strong>, lo que significa arrancar una instancia completa del navegador Chromium y Node.js. ¿El resultado? Un consumo de más de 300 MB de memoria RAM y varios segundos de espera solo para leer o corregir un texto de 2 KB.</li>
</ol>

<p>De esa frustración nació <strong>DBV Markdown Reader</strong>. Lo que comenzó como un visor nativo ultra-ligero en <strong>Rust</strong> y <strong>Tauri v2</strong> ha evolucionado rápidamente hasta su versión <strong>v0.13.1</strong>: convirtiéndose en un <strong>entorno nativo completo de lectura y edición sin perder un solo milisegundo de velocidad ni engordar la aplicación</strong>.</p>

<hr />

<h2 id="-la-evolución-a-la-v0131-modo-edición-árbol-de-archivos-y-barra-de-formato">🚀 La evolución a la v0.13.1: Modo Edición, Árbol de Archivos y Barra de Formato</h2>

<p>Muchos visores de solo lectura terminan obligándote a cerrar la app y abrir VS Code en cuanto quieres corregir una errata, explorar una carpeta o añadir una sección. Por otro lado, incluir un editor pesado como Monaco (el motor de VS Code) habría triplicado el tamaño del ejecutable y arruinado la filosofía del proyecto.</p>

<p>La solución en <strong>DBV Markdown Reader</strong> fue reutilizar un <code class="language-plaintext highlighter-rouge">&lt;textarea&gt;</code> plano y el mismo pipeline optimizado de renderizado (<code class="language-plaintext highlighter-rouge">markdown-it</code>) y sanitización (<code class="language-plaintext highlighter-rouge">DOMPurify</code>) que ya existía, enriqueciéndolo progresivamente:</p>

<ul>
  <li><strong>✏️ Panel Dividido y Vista en Vivo (Ctrl/Cmd+E):</strong> Código Markdown a la izquierda y la vista renderizada en tiempo real a la derecha con debounce optimizado.</li>
  <li><strong>🛠️ Barra de Formato (16 acciones) e Indentación Inteligente:</strong> Barra flotante para dar formato con un clic (negrita, cursiva, listas, tablas, enlaces…) con atajos <code class="language-plaintext highlighter-rouge">Ctrl/Cmd+B</code> / <code class="language-plaintext highlighter-rouge">Ctrl/Cmd+I</code> y soporte completo de <code class="language-plaintext highlighter-rouge">Tab</code> y <code class="language-plaintext highlighter-rouge">Shift+Tab</code> para indentar listas sin salir del editor.</li>
  <li><strong>📂 Explorador de Árbol de Directorios y Quick Open (Ctrl/Cmd+K):</strong> Pestaña “Archivos” con árbol expandible de la carpeta actual, apertura en nueva ventana con <code class="language-plaintext highlighter-rouge">Ctrl+clic</code>, posibilidad de arrastrar carpetas para fijar la raíz y diálogo flotante <em>Quick Open</em> para saltar entre notas al instante.</li>
  <li><strong>🔗 Sincronización a 3 Paneles (Editor ↔ Preview ↔ Tabla de Contenidos):</strong> Al desplazarte por el código, la previsualización y el índice lateral (TOC) siguen la misma posición mediante interpolación inteligente de encabezados. Los divisores entre paneles son arrastrables y recuerdan su tamaño.</li>
  <li><strong>💬 Alertas y Callouts estilo GitHub:</strong> Soporte nativo para bloques <code class="language-plaintext highlighter-rouge">&gt; [!NOTE]</code>, <code class="language-plaintext highlighter-rouge">[!TIP]</code>, <code class="language-plaintext highlighter-rouge">[!IMPORTANT]</code>, <code class="language-plaintext highlighter-rouge">[!WARNING]</code> y <code class="language-plaintext highlighter-rouge">[!CAUTION]</code> con iconos y colores integrados en cada tema visual.</li>
  <li><strong>🛡️ Gestión Inteligente de Conflictos y Guardián Anti-Pérdida de Datos:</strong>
    <ul>
      <li>Si no has hecho cambios locales y el archivo se modifica desde otro programa externo, se actualiza automáticamente en los 3 paneles (Modo Espejo).</li>
      <li>Si habías modificado el documento localmente y se detecta un cambio externo, la app te avisa mediante un modal/franja de conflicto permitiéndote elegir entre <em>“Conservar mis cambios”</em> o <em>“Recargar desde disco”</em>.</li>
      <li>Indicador de <em>“Modificado”</em> en la cabecera y diálogo de confirmación antes de descartar cambios sin guardar.</li>
    </ul>
  </li>
</ul>

<p><img src="/images/dbv/blog/dbv-md-reader/comparacioneficiencia.png" alt="Comparativa de Eficiencia y Consumo de Memoria" /></p>

<hr />

<h2 id="-benchmark-oficial-cuánto-cuesta-añadir-el-modo-edición-y-el-árbol">📊 Benchmark oficial: ¿Cuánto cuesta añadir el Modo Edición y el Árbol?</h2>

<p>Una pregunta clave en cualquier desarrollo es si añadir características nuevas perjudica el rendimiento. Para comprobarlo, ejecutamos un benchmark reproducible (<code class="language-plaintext highlighter-rouge">scripts/benchmark.ps1</code>) comparando la versión inicial de solo lectura frente a las versiones completas:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Medición</th>
      <th style="text-align: left">v0.10.0 (solo lectura)</th>
      <th style="text-align: left">v0.13.1 (+ Editor, Árbol y Formato)</th>
      <th style="text-align: left">Diferencia</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>Tamaño ejecutable (.exe)</strong></td>
      <td style="text-align: left">16,35 MB</td>
      <td style="text-align: left">16,36 MB</td>
      <td style="text-align: left"><strong>+0,06 % (insignificante)</strong></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Consumo de Memoria RAM</strong></td>
      <td style="text-align: left">~20 - 30 MB</td>
      <td style="text-align: left">~20 - 30 MB</td>
      <td style="text-align: left"><strong>Inalterado (dentro de ruido)</strong></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Tiempo de apertura</strong></td>
      <td style="text-align: left">&lt; 200 ms</td>
      <td style="text-align: left">&lt; 200 ms</td>
      <td style="text-align: left"><strong>Instantáneo</strong></td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="-todo-lo-que-incluye-dbv-markdown-reader">🎨 Todo lo que incluye DBV Markdown Reader</h2>

<p>Además de las herramientas de edición y exploración, la aplicación reúne un arsenal de características para la productividad técnica:</p>

<ol>
  <li><strong>Diagramas Mermaid SVG interactivos:</strong> Los diagramas de secuencia, flujo o arquitectura se renderizan como gráficos vectoriales SVG, con botón para abrir en <em>mermaid.live</em>.</li>
  <li><strong>Ecuaciones Matemáticas con KaTeX:</strong> Notación LaTeX ($…$ y \(...\)) procesada al instante.</li>
  <li><strong>Resaltado de sintaxis real:</strong> +24 lenguajes de programación con colores adaptados a tres temas de lectura (Claro, Oscuro y Sepia) y números de línea.</li>
  <li><strong>Soporte GFM:</strong> Checkboxes de tareas (<code class="language-plaintext highlighter-rouge">- [ ]</code>/<code class="language-plaintext highlighter-rouge">- [x]</code>) y notas al pie (<code class="language-plaintext highlighter-rouge">[^1]</code>).</li>
  <li><strong>📁 20 Plantillas Markdown Bilingües (ES/EN):</strong> Colección de plantillas listas para usar en proyectos de software, docencia universitaria, seguimiento de TFG, actas de reuniones y gestión personal.</li>
  <li><strong>Modo “Always on Top”:</strong> Botón en la barra superior para fijar la ventana por encima de otras aplicaciones.</li>
  <li><strong>Sanitización Anti-XSS con DOMPurify:</strong> Filtrado estricto de cualquier HTML embebido en el Markdown, aplicado sobre el HTML ya renderizado en el frontend.</li>
</ol>

<p><img src="/images/dbv/blog/dbv-md-reader/mermaid.png" alt="Renderizado de diagramas Mermaid en DBV Markdown Reader" /></p>

<hr />

<h2 id="-publicación-en-microsoft-store-uptodown-macos-linux-y-powertoys">🏬 Publicación en Microsoft Store, Uptodown (macOS), Linux y PowerToys</h2>

<p>El proyecto es 100% Open Source (licencia MIT) y cuenta con distribución multiplataforma oficial:</p>
<ul>
  <li>🏬 <strong>Microsoft Store:</strong> Publicado y certificado oficialmente para Windows 11 (sin avisos de SmartScreen, auto-actualizable).</li>
  <li>🍏 <strong>Uptodown (macOS):</strong> Publicado oficialmente en el catálogo de Uptodown con <code class="language-plaintext highlighter-rouge">.dmg</code> universal (Intel / Apple Silicon).</li>
  <li>🐧 <strong>Linux:</strong> Paquetes nativos <code class="language-plaintext highlighter-rouge">.deb</code> y <code class="language-plaintext highlighter-rouge">.AppImage</code> generados por CI.</li>
  <li>💡 <strong>Candidato a Microsoft PowerToys:</strong> Debido a su ligereza e integración transparente con el sistema operativo, se posiciona como una propuesta natural para la suite PowerToys.</li>
</ul>

<hr />

<h2 id="-vídeo-de-demostración-en-youtube">📹 Vídeo de Demostración en YouTube</h2>

<p>Si quieres ver la herramienta en funcionamiento, la fluidez del renderizado y el cambio dinámico entre temas visuales, aquí tienes la presentación en vídeo:</p>

<div class="fluid-width-video-wrapper mb-4" style="padding-top: 56.25%; position: relative; width: 100%;">
    <iframe src="https://www.youtube-nocookie.com/embed/dZ8KrU35LQ4" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border: 0; border-radius: 8px;" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>
</div>

<hr />

<h2 id="-pruébalo-y-descarga-la-aplicación">📥 Pruébalo y descarga la aplicación</h2>

<p>DBV Markdown Reader es <strong>100% gratuito, libre de publicidad, sin telemetría ni cuentas de usuario</strong>.</p>

<ul>
  <li>🏬 <strong><a href="https://apps.microsoft.com/detail/9n7bmdzgcp0s">Consíguelo en la Microsoft Store</a></strong> (Recomendado para Windows 11)</li>
  <li>🍏 <strong><a href="https://dbv-markdown-reader.uptodown.com/mac">Consíguelo en Uptodown para macOS</a></strong> (Recomendado para Mac)</li>
  <li>💻 <strong><a href="https://github.com/davidbuenov/dbv-md-reader/releases">Descarga la versión v0.13.1 (.exe, .deb, .AppImage, .dmg) en GitHub</a></strong></li>
  <li>🌟 <strong><a href="https://github.com/davidbuenov/dbv-md-reader">Explora el código fuente y apoya el proyecto en GitHub</a></strong></li>
  <li>📁 <strong><a href="/proyectos/dbv-markdown-reader/">Ver la ficha completa del proyecto en davidbuenov.com</a></strong></li>
</ul>

<p>¿Has probado a navegar y editar tus notas Markdown en vista dividida y árbol de directorios? ¡Estaré encantado de conocer tus impresiones o sugerencias en GitHub!</p>]]></content><author><name></name></author><category term="Herramientas y Software" /><category term="Programación y Tecnología" /><category term="markdown" /><category term="rust" /><category term="tauri" /><category term="modo-edicion" /><category term="microsoft-store" /><category term="uptodown" /><category term="open-source" /><category term="dbv-specs-ops" /><summary type="html"><![CDATA[¿Alguna vez te has parado a pensar en cuántos recursos consume tu ordenador solo para mostrarte o dejarte hacer retoques sencillos en un archivo de texto plano?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://davidbuenov.com/images/dbv/proyectos/dbv-md-reader/hero-dark.png" /><media:content medium="image" url="https://davidbuenov.com/images/dbv/proyectos/dbv-md-reader/hero-dark.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Y yo que estaba orgulloso…</title><link href="https://davidbuenov.com/programaci%C3%B3n%20y%20tecnolog%C3%ADa/inteligencia%20artificial/2026/08/19/y-yo-que-estaba-orgulloso.html" rel="alternate" type="text/html" title="Y yo que estaba orgulloso…" /><published>2026-08-19T00:00:00+02:00</published><updated>2026-08-19T00:00:00+02:00</updated><id>https://davidbuenov.com/programaci%C3%B3n%20y%20tecnolog%C3%ADa/inteligencia%20artificial/2026/08/19/y-yo-que-estaba-orgulloso</id><content type="html" xml:base="https://davidbuenov.com/programaci%C3%B3n%20y%20tecnolog%C3%ADa/inteligencia%20artificial/2026/08/19/y-yo-que-estaba-orgulloso.html"><![CDATA[<h2 id="-la-falsa-ilusión-de-tener-una-web-perfecta">💡 La falsa ilusión de tener una web “perfecta”</h2>

<p>Todos nos sentimos orgullosos cuando lanzamos o rediseñamos nuestra web personal: un diseño cuidado, buenos contenidos, tipografía elegante y un par de animaciones sutiles. Todo parece perfecto hasta que decides someter tu web a las auditorías exigentes de la web moderna: velocidad móvil, accesibilidad WCAG 2.1, cabeceras de seguridad HTTP y, sobre todo, <strong>la nueva frontera: la preparación para Agentes de Inteligencia Artificial (Agent Readiness)</strong>.</p>

<p>En este artículo muestro el proceso real, paso a paso y con código en mano, de cómo transformé <code class="language-plaintext highlighter-rouge">davidbuenov.com</code> sometiéndola a 6 auditorías independientes, los problemas reales que surgieron en el camino (¡incluido un desplome visual completo por exceso de celo en seguridad!) y los aprendizajes que deja este viaje.</p>

<hr />

<h2 id="-el-cuadro-de-mandos-antes-y-después">📊 El cuadro de mandos: antes y después</h2>

<p>Porque solo mostrar los buenos resultados finales sería hacer trampa. Aquí el punto de partida real, <strong>capturas del estado de la web antes de las optimizaciones de este artículo</strong>:</p>

<table>
  <thead>
    <tr>
      <th>Auditoría</th>
      <th style="text-align: center">🔴 Antes</th>
      <th style="text-align: center">🟢 Después</th>
      <th style="text-align: center">Δ</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>🤖 IsItAgentReady</td>
      <td style="text-align: center"><strong>88/100</strong> <em>(Discoverability 75%)</em></td>
      <td style="text-align: center"><strong>95/100</strong> <em>(Discoverability 100%)</em></td>
      <td style="text-align: center">+7 pts</td>
    </tr>
    <tr>
      <td>⚡ PageSpeed · Rendimiento (escritorio)</td>
      <td style="text-align: center"><strong>88/100</strong></td>
      <td style="text-align: center"><strong>92/100</strong></td>
      <td style="text-align: center">+4 pts</td>
    </tr>
    <tr>
      <td>⚡ PageSpeed · Rendimiento (móvil)</td>
      <td style="text-align: center"><strong>68/100</strong></td>
      <td style="text-align: center"><strong>85/100</strong></td>
      <td style="text-align: center">+17 pts</td>
    </tr>
    <tr>
      <td>♿ PageSpeed · Accesibilidad</td>
      <td style="text-align: center"><strong>97/100</strong></td>
      <td style="text-align: center"><strong>97/100</strong></td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td>📋 PageSpeed · Prácticas Rec.</td>
      <td style="text-align: center"><strong>92/100</strong></td>
      <td style="text-align: center"><strong>92/100</strong></td>
      <td style="text-align: center">✅</td>
    </tr>
    <tr>
      <td>🔍 PageSpeed · SEO</td>
      <td style="text-align: center"><strong>92/100</strong></td>
      <td style="text-align: center"><strong>93/100</strong></td>
      <td style="text-align: center">+1 pt</td>
    </tr>
    <tr>
      <td>🛡️ Security Headers</td>
      <td style="text-align: center"><strong>Grado D</strong></td>
      <td style="text-align: center"><strong>Grado A</strong></td>
      <td style="text-align: center">↑</td>
    </tr>
    <tr>
      <td>🔭 Mozilla Observatory</td>
      <td style="text-align: center"><strong>45/100 (C-)</strong></td>
      <td style="text-align: center"><strong>75/100 (B)</strong></td>
      <td style="text-align: center">↑</td>
    </tr>
    <tr>
      <td>🔍 SEOptimer</td>
      <td style="text-align: center"><strong>B+</strong> <em>(Usabilidad C, Enlaces D)</em></td>
      <td style="text-align: center"><strong>No Medido</strong></td>
      <td style="text-align: center">≈</td>
    </tr>
    <tr>
      <td>♿ WAVE Accessibility</td>
      <td style="text-align: center"><strong>4.9/10</strong> <em>(10 errores)</em></td>
      <td style="text-align: center"><strong>5.8/10</strong></td>
      <td style="text-align: center">+0.9 pts</td>
    </tr>
    <tr>
      <td>🌐 HubSpot Website Grader</td>
      <td style="text-align: center"><strong>82/100</strong> <em>(Performance 12/30)</em></td>
      <td style="text-align: center"><strong>—</strong> <em>(pendiente)</em></td>
      <td style="text-align: center">↑</td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p>💡 <em>¿Por qué el punto de partida ya es razonablemente bueno? Porque el grueso del trabajo de Agent Readiness (de 0 a 94) se documentó en el <a href="https://davidbuenov.com/tecnologia/innovacion/2026/06/11/esta-tu-web-lista-para-la-ia-mi-viaje-adaptando-davidbuenov-com-a-los-llms">artículo anterior</a>. Este artículo narra la siguiente capa: seguridad HTTP, accesibilidad profunda y los detalles que marcan la diferencia entre “casi bien” y “bien de verdad”.</em></p>
</blockquote>

<hr />

<h2 id="-1-la-nueva-frontera-agent-readiness-95100-ard-y-webmcp">🤖 1. La Nueva Frontera: Agent Readiness (95/100), ARD y WebMCP</h2>

<p>Adaptar una web para la era de los agentes de IA (ChatGPT, Claude, Gemini, Perplexity) va mucho más allá de colgar un simple archivo <code class="language-plaintext highlighter-rouge">llms.txt</code>.</p>

<blockquote>
  <p><strong>📖 ¿Quieres el paso a paso completo?</strong> En mi artículo anterior, <a href="https://davidbuenov.com/tecnologia/innovacion/2026/06/11/esta-tu-web-lista-para-la-ia-mi-viaje-adaptando-davidbuenov-com-a-los-llms"><em>¿Está tu web lista para la IA? Mi viaje adaptando davidbuenov.com a los LLMs</em></a>, cuento desde cero todo el proceso: qué es el descubrimiento semántico para LLMs, cómo implementé <code class="language-plaintext highlighter-rouge">llms.txt</code>, el manifiesto ARD y WebMCP, y por qué el 95/100 de Agent Readiness no fue un golpe de suerte sino el resultado de semanas de trabajo.</p>
</blockquote>

<h3 id="a-evaluaciones-agentready-95100-a-e-isitagentready-95100">A. Evaluaciones AgentReady (95/100 A) e IsItAgentReady (95/100)</h3>
<p>Sometí la web a dos auditores agénticos independientes:</p>
<ul>
  <li><strong>AgentReady.md:</strong> Calificación <strong>95/100 (Grado A)</strong>.</li>
  <li><strong>IsItAgentReady.com:</strong> Calificación <strong>95/100</strong> y <strong>3/3 en Navegación Agéntica</strong>.</li>
</ul>

<h3 id="b-descubrimiento-semántico-ard-100-agentic-resource-discovery">B. Descubrimiento Semántico ARD 1.0.0 (Agentic Resource Discovery)</h3>
<p>Implementé la especificación oficial ARD creando el manifiesto <code class="language-plaintext highlighter-rouge">/.well-known/ai-catalog.json</code>:</p>
<ul>
  <li>Formato URN estandarizado.</li>
  <li>Tipos IANA explícitos.</li>
  <li><strong>Consultas representativas:</strong> 2 a 5 ejemplos de preguntas reales por recurso para embeddings semánticos.</li>
  <li>Cabecera HTTP explícita y CORS abierto.</li>
</ul>

<h3 id="c-webmcp-herramientas-para-el-navegador-del-agente">C. WebMCP: Herramientas para el navegador del Agente</h3>
<p>Integré la API <strong>WebMCP</strong> registrando <code class="language-plaintext highlighter-rouge">window.webMCP</code> y <code class="language-plaintext highlighter-rouge">navigator.modelContext.provideContext()</code>. La web expone dos herramientas ejecutables para los agentes:</p>
<ol>
  <li><code class="language-plaintext highlighter-rouge">getProfileData</code>: Devuelve el perfil profesional estructurado, publicaciones y líneas de investigación.</li>
  <li><code class="language-plaintext highlighter-rouge">searchContent</code>: Permite al agente buscar artículos, proyectos o conferencias por palabras clave.</li>
</ol>

<hr />

<h2 id="-2-google-pagespeed-insights-desglosando-el-85--97--92--93">⚡ 2. Google PageSpeed Insights: Desglosando el 85 / 97 / 92 / 93</h2>

<p>Someter una página con rich media y animaciones a Google PageSpeed Insights suele ser un golpe de realidad. Tras una profunda optimización de activos:</p>

<ul>
  <li><strong>Rendimiento:</strong> <strong>85 / 100</strong></li>
  <li><strong>Accesibilidad:</strong> <strong>97 / 100</strong> 🟢</li>
  <li><strong>Prácticas Recomendadas:</strong> <strong>92 / 100</strong></li>
  <li><strong>SEO:</strong> <strong>93 / 100</strong></li>
</ul>

<p>Las claves: carga diferida de CSS no crítico, precarga de imagen LCP con <code class="language-plaintext highlighter-rouge">fetchpriority="high"</code>, y atributos <code class="language-plaintext highlighter-rouge">defer</code> y <code class="language-plaintext highlighter-rouge">loading="lazy"</code> en todos los recursos secundarios.</p>

<hr />

<h2 id="️-3-seguridad-http-cabeceras-estrictas-y-el-dilema-del-100100">🛡️ 3. Seguridad HTTP: Cabeceras Estrictas y el Dilema del 100/100</h2>

<p>Conseguir un <strong>Grado A en SecurityHeaders.com</strong> requiere configurar en <code class="language-plaintext highlighter-rouge">firebase.json</code>: HSTS, <code class="language-plaintext highlighter-rouge">X-Frame-Options</code>, <code class="language-plaintext highlighter-rouge">X-Content-Type-Options</code>, <code class="language-plaintext highlighter-rouge">Referrer-Policy</code> y <code class="language-plaintext highlighter-rouge">Permissions-Policy</code>.</p>

<h3 id="️-la-anécdota-del-exceso-de-celo">⚠️ La anécdota del “exceso de celo”</h3>
<p>Buscando el 100/100 en Mozilla Observatory, eliminé <code class="language-plaintext highlighter-rouge">'unsafe-inline'</code> del CSP… y <strong>la web murió visualmente</strong>. El tema Canvas/jQuery necesita esos scripts inline para calcular layouts.</p>

<p><strong>El aprendizaje:</strong> la ciberseguridad real es equilibrar protección con usabilidad. Un <strong>Grado A</strong> con 75/100 en Mozilla y web funcional al 100% es mejor que un 100/100 teórico con la web rota.</p>

<hr />

<h2 id="-4-accesibilidad-universal-wcag-21--97100">♿ 4. Accesibilidad Universal (WCAG 2.1) — 97/100</h2>

<ul>
  <li><code class="language-plaintext highlighter-rouge">aria-label</code> completo en buscador, chatbot y botones de envío.</li>
  <li>Todos los iconos sociales y controles incluyen texto accesible para lectores de pantalla y agentes de IA.</li>
</ul>

<hr />

<h2 id="-5-auditoría-seo-seoptimer-b">🔍 5. Auditoría SEO (SEOptimer B+)</h2>

<ul>
  <li>Metadatos canónicos, sitemap XML y robots.txt indexables.</li>
  <li>JSON-LD Schema.org con entidad personal, publicaciones y trayectoria.</li>
  <li>Open Graph y Twitter Cards completos.</li>
</ul>

<hr />

<h2 id="-6-transparencia-total-dashboard-de-badges">📊 6. Transparencia Total: Dashboard de Badges</h2>

<p>Para predicar con el ejemplo, el pie de página de <code class="language-plaintext highlighter-rouge">davidbuenov.com</code> muestra un dashboard de badges vivos (Shields.io) enlazados a cada auditoría pública: IsItAgentReady, AgentReady.md, Mozilla Observatory, SecurityHeaders, SEOptimer y las 4 métricas de PageSpeed.</p>

<hr />

<h2 id="-conclusión-orgulloso-pero-con-datos-en-la-mano">📌 Conclusión: Orgulloso, pero con datos en la mano</h2>

<p>Adaptar una web personal a los estándares de 2026 no va de vanidad ni de coleccionar badges; se trata de garantizar que tu contenido sea <strong>rápido, seguro, accesible y comprensible para la nueva ola de IA Agéntica</strong>.</p>

<p>Si tienes una web de la que te sientes orgulloso, pásale estos 6 análisis. Descubrirás que siempre hay margen para mejorar. 🚀</p>

<hr />

<h2 id="-referencias-y-herramientas-de-evaluación">🔗 Referencias y herramientas de evaluación</h2>

<h3 id="-agent-readiness">🤖 Agent Readiness</h3>
<ul>
  <li><a href="https://isitagentready.com/davidbuenov.com">IsItAgentReady — Resultado para davidbuenov.com</a></li>
  <li><a href="https://agentready.md/r/24ea9eef-c821-430f-aab3-e64dab4a9ab7">AgentReady.md — Informe completo (95/100 · Grado A)</a></li>
  <li><a href="https://agentic-resource-discovery.org/">Especificación ARD 1.0 — Agentic Resource Discovery</a></li>
  <li><a href="https://webmcp.org/">WebMCP — Model Context Protocol for the Web</a></li>
</ul>

<h3 id="-rendimiento">⚡ Rendimiento</h3>
<ul>
  <li><a href="https://pagespeed.web.dev/analysis/https-davidbuenov-com/9yodmfuasr?form_factor=desktop">Google PageSpeed Insights — davidbuenov.com (escritorio)</a></li>
</ul>

<h3 id="️-seguridad-http">🛡️ Seguridad HTTP</h3>
<ul>
  <li><a href="https://securityheaders.com/?q=davidbuenov.com&amp;followRedirects=on">Security Headers — Análisis de davidbuenov.com</a></li>
  <li><a href="https://developer.mozilla.org/en-US/observatory/analyze?host=davidbuenov.com">Mozilla HTTP Observatory (MDN) — davidbuenov.com</a></li>
</ul>

<h3 id="-accesibilidad">♿ Accesibilidad</h3>
<ul>
  <li><a href="https://wave.webaim.org/report#/davidbuenov.com">WAVE Web Accessibility Evaluation — davidbuenov.com</a></li>
</ul>

<h3 id="-seo">🔍 SEO</h3>
<ul>
  <li><a href="https://www.seoptimer.com/davidbuenov.com">SEOptimer — Auditoría SEO de davidbuenov.com</a></li>
</ul>]]></content><author><name></name></author><category term="Programación y Tecnología" /><category term="Inteligencia Artificial" /><category term="agent-readiness" /><category term="pagespeed" /><category term="seguridad-http" /><category term="accesibilidad" /><category term="seo" /><category term="webmcp" /><summary type="html"><![CDATA[Mi viaje sometiendo davidbuenov.com a 6 auditorías implacables: Agent Readiness (95/100), PageSpeed (85/97/92/93), Seguridad HTTP (Grado A), ARD 1.0, WebMCP y el dilema real del 100/100.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://davidbuenov.com/images/dbv/blog/orgulloso_web.jpg" /><media:content medium="image" url="https://davidbuenov.com/images/dbv/blog/orgulloso_web.jpg" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">🕵️ ¿Qué dice Internet de ti? Audita tu reputación online con IA, gratis y en dos minutos</title><link href="https://davidbuenov.com/inteligencia%20artificial/herramientas%20y%20software/2026/07/31/dbv-reputation-index-audita-tu-reputacion-online-con-ia.html" rel="alternate" type="text/html" title="🕵️ ¿Qué dice Internet de ti? Audita tu reputación online con IA, gratis y en dos minutos" /><published>2026-07-31T09:00:00+02:00</published><updated>2026-07-31T09:00:00+02:00</updated><id>https://davidbuenov.com/inteligencia%20artificial/herramientas%20y%20software/2026/07/31/dbv-reputation-index-audita-tu-reputacion-online-con-ia</id><content type="html" xml:base="https://davidbuenov.com/inteligencia%20artificial/herramientas%20y%20software/2026/07/31/dbv-reputation-index-audita-tu-reputacion-online-con-ia.html"><![CDATA[<p>Antes de contratarte, de firmar contigo o de invitarte a una charla, alguien va a escribir tu nombre en un buscador — o, cada vez más, se lo va a preguntar a una IA. <strong>¿Sabes qué le va a responder?</strong></p>

<p>Acabo de publicar <strong><a href="https://github.com/davidbuenov/dbv-reputation-index">dbv-reputation-index</a></strong>, un skill de IA gratuito y de código abierto que audita tu reputación online con el rigor de una consultoría estratégica: presencia digital, autoridad, SEO, visibilidad en asistentes de IA, riesgos, exposición de datos personales… y te devuelve un plan de acción concreto. Se instala en menos de un minuto y funciona dentro de la IA que ya usas.</p>

<hr />

<h2 id="-la-pregunta-incómoda">😬 La pregunta incómoda</h2>

<p>Haz la prueba ahora mismo: busca tu nombre. ¿Domina la primera página tu perfil profesional, o un homónimo, un perfil abandonado de hace ocho años, o nada en absoluto?</p>

<p>Y la pregunta que casi nadie se hace todavía: <strong>si le preguntas a ChatGPT o a Gemini “¿quién es [tu nombre]?”, ¿te identifican bien, o te confunden con otra persona?</strong> Cada vez más primeras impresiones profesionales se forman en la respuesta de un asistente de IA, no en una página de resultados — y esa capa casi nadie la audita.</p>

<h2 id="-qué-es-dbv-reputation-index">🚀 Qué es dbv-reputation-index</h2>

<p>Un <strong>skill portátil</strong>: sin servidores, sin registro, sin más coste que el de la IA que ya uses. Le das un nombre y la IA:</p>

<ol>
  <li>investiga la presencia digital real de esa persona (LinkedIn, web propia, GitHub, Google Scholar, medios, buscadores),</li>
  <li>elige automáticamente el benchmark adecuado a su sector,</li>
  <li>puntúa 10 dimensiones ponderadas con una rúbrica anclada, nada de números inventados,</li>
  <li>y devuelve un informe ejecutivo con un plan de acción priorizado.</li>
</ol>

<p>Todo con protocolo antialucinación: si no puede verificar algo, lo dice explícitamente en vez de inventárselo.</p>

<h2 id="-se-instala-en-un-solo-comando">⚡ Se instala en un solo comando</h2>

<p>Si usas Claude, esto es literalmente todo lo que hace falta:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip <span class="nb">install </span>git+https://github.com/davidbuenov/dbv-reputation-index.git
dbv-reputation-index-install
</code></pre></div></div>

<p>Reinicias tu sesión y pides: <em>“Analiza la reputación online de [nombre completo]”</em>. Ya está — sin servidor que levantar, sin API key propia del proyecto, sin cuenta que crear.</p>

<p>¿Usas ChatGPT, Gemini u otro chat con navegación web? También funciona pegando un único fichero de texto en las instrucciones — misma metodología, mismo resultado. Todos los detalles, en el <a href="https://github.com/davidbuenov/dbv-reputation-index">repositorio de GitHub</a>.</p>

<h2 id="-un-informe-de-15-puntos-no-un-número-al-azar">📋 Un informe de 15 puntos, no un número al azar</h2>

<p>La mayoría de “auditorías de reputación” que he visto son un score sin justificar. Esta cubre 15 secciones completas:</p>

<ol>
  <li>Executive summary</li>
  <li>Auditoría de presencia digital (incluidos perfiles zombie que no sabías que seguían activos)</li>
  <li>Autoridad y credibilidad</li>
  <li>SEO personal y visibilidad</li>
  <li><strong>Visibilidad y representación en sistemas de IA</strong> — ¿te reconoce ChatGPT? ¿te confunde con un homónimo?</li>
  <li>Narrativa y consistencia de marca</li>
  <li>Prueba social</li>
  <li><strong>Exposición de datos personales</strong> — qué encuentran de ti los agregadores de datos y cómo retirarlo</li>
  <li>Riesgos reputacionales</li>
  <li>Puntuación por dimensiones, con benchmark sectorial real y comparables nombrados</li>
  <li>Recomendaciones estratégicas por horizonte (0-30 / 30-90 / 90-180 días)</li>
  <li>Plan de acción resumido</li>
  <li>Cuadro de KPIs y fecha de reauditoría</li>
  <li>Narrativa recomendada — la frase, el posicionamiento, los mensajes de apoyo</li>
  <li>Anexo de evidencias, con fuente y fecha de cada afirmación</li>
</ol>

<h2 id="-no-es-genérico--y-eso-es-lo-importante">🎯 No es genérico — y eso es lo importante</h2>

<p>Aquí está la parte que más me interesa que se entienda: <strong>este skill no evalúa a todo el mundo con la misma vara.</strong> Un catedrático no construye autoridad igual que un futbolista, un político o un abogado — y decirle a un investigador “publica más en LinkedIn” es un consejo tan inútil como decirle a un futbolista que mejore su SEO.</p>

<p>Por eso, antes de puntuar nada, el skill elige uno de estos <strong>13 benchmarks sectoriales</strong> y recalibra qué cuenta como señal fuerte o débil en cada dimensión:</p>

<table>
  <thead>
    <tr>
      <th>Categoría</th>
      <th>A quién incluye</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Ejecutivos</strong></td>
      <td>CEOs, C-Level, directivos con liderazgo público</td>
    </tr>
    <tr>
      <td><strong>Emprendedores</strong></td>
      <td>Founders, cofounders, startup builders</td>
    </tr>
    <tr>
      <td><strong>Docencia</strong></td>
      <td>Profesores, formadores, divulgadores educativos</td>
    </tr>
    <tr>
      <td><strong>Investigación</strong></td>
      <td>Académicos, científicos, perfiles con publicaciones</td>
    </tr>
    <tr>
      <td><strong>Tecnología</strong></td>
      <td>CTOs, expertos en IA, product builders</td>
    </tr>
    <tr>
      <td><strong>Salud</strong></td>
      <td>Médicos, healthtech, innovación sanitaria</td>
    </tr>
    <tr>
      <td><strong>Política</strong></td>
      <td>Cargos electivos, liderazgo partidista</td>
    </tr>
    <tr>
      <td><strong>Deporte</strong></td>
      <td>Deportistas profesionales de cualquier disciplina</td>
    </tr>
    <tr>
      <td><strong>Creadores de contenido</strong></td>
      <td>Influencers, streamers, marcas personales de audiencia</td>
    </tr>
    <tr>
      <td><strong>Arte y cultura</strong></td>
      <td>Músicos, actores, artistas visuales</td>
    </tr>
    <tr>
      <td><strong>Consultoría</strong></td>
      <td>Consultores, coaches, asesores con método propio</td>
    </tr>
    <tr>
      <td><strong>Servicios profesionales</strong></td>
      <td><strong>Abogados, arquitectos, auditores, economistas</strong> y otras profesiones liberales que no encajan en las anteriores</td>
    </tr>
    <tr>
      <td><strong>Genérico</strong></td>
      <td>El resto — sin ajuste sectorial</td>
    </tr>
  </tbody>
</table>

<p>Para un político, la “prueba social” son votos, no clientes. Para un deportista, la autoridad es el palmarés, no un cargo. Para un investigador, son citas, no seguidores. Ese matiz marca la diferencia entre un diagnóstico útil y un informe que podría valer para cualquiera.</p>

<h2 id="-así-se-ve-un-informe-real">👀 Así se ve un informe real</h2>

<p>Para que no te quedes solo con la promesa, así de concreto es el resultado. Este es un extracto <strong>ficticio</strong>, a modo de ejemplo, de cómo se vería el informe de “Elena Martín”, consultora estratégica imaginaria:</p>

<blockquote>
  <p><strong>Executive Summary</strong> — Autoridad demostrada (proyectos, casos, resultados) superior a la autoridad percibida: su rastro digital no comunica lo que su trabajo real justifica. Fortaleza principal: prueba social sólida en LinkedIn. Debilidad crítica: sin web propia, toda su narrativa depende de plataformas de terceros. Oportunidad de mayor impacto: publicar 3 casos de éxito documentados en un activo propio antes de 30 días.</p>
</blockquote>

<table>
  <thead>
    <tr>
      <th>Dimensión</th>
      <th style="text-align: right">Peso</th>
      <th>Puntuación</th>
      <th>Confianza</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Autoridad percibida</td>
      <td style="text-align: right">18%</td>
      <td>6.200 / 10.000</td>
      <td>Alta</td>
    </tr>
    <tr>
      <td>Visibilidad y representación en IA</td>
      <td style="text-align: right">12%</td>
      <td>4.100 / 10.000</td>
      <td>Media</td>
    </tr>
    <tr>
      <td>Prueba social</td>
      <td style="text-align: right">9%</td>
      <td>7.400 / 10.000</td>
      <td>Alta</td>
    </tr>
    <tr>
      <td>Higiene de datos personales</td>
      <td style="text-align: right">4%</td>
      <td>8.900 / 10.000</td>
      <td>Alta</td>
    </tr>
  </tbody>
</table>

<p><strong>Puntuación global: 6.180 — Sólida.</strong> Benchmark usado: <code class="language-plaintext highlighter-rouge">consultant</code> (principal). Comparables: 3 nombres reales de referencia en el sector.</p>

<p>Así, sección por sección, hasta las 15 completas — con evidencias, fuentes y fecha de consulta en cada afirmación.</p>

<h2 id="-diseñado-con-criterio-ético">🔒 Diseñado con criterio ético</h2>

<p>La sección de exposición de datos personales nunca reproduce datos completos (ni tu teléfono ni tu email aparecen en el informe): documenta el tipo de dato y dónde está, que es lo que necesitas para pedir que lo retiren. Pensado para autoevaluación o para usarlo con consentimiento expreso, no para perfilar a terceros a sus espaldas.</p>

<h2 id="-pruébalo-y-cuéntame-qué-te-ha-parecido">💬 Pruébalo y cuéntame qué te ha parecido</h2>

<p>Instálalo, pide tu propio informe y cuéntame en los comentarios (o en <a href="https://linkedin.com/in/davidbuenov">LinkedIn</a>): ¿qué puntuación te ha dado? ¿Ha detectado algo que no esperabas? ¿Estás de acuerdo con el diagnóstico, o crees que se equivoca?</p>

<p>👉 <strong>Código, instrucciones completas y licencia MIT en <a href="https://github.com/davidbuenov/dbv-reputation-index">github.com/davidbuenov/dbv-reputation-index</a></strong></p>

<p>Si además quieres exportarlo en Word con buen formato, combínalo con mi otro proyecto, <a href="https://github.com/davidbuenov/dbv-md2word">dbv-md2word</a> — el propio skill lo detecta y lo usa automáticamente si lo tienes instalado.</p>]]></content><author><name>David Bueno Vallejo</name></author><category term="Inteligencia Artificial" /><category term="Herramientas y Software" /><category term="reputación online" /><category term="marca personal" /><category term="claude" /><category term="skills" /><category term="código abierto" /><category term="seo" /><category term="ia" /><summary type="html"><![CDATA[Publico dbv-reputation-index: un skill de IA gratuito y de código abierto que audita tu reputación online con el rigor de una consultoría estratégica, en un informe de 15 secciones adaptado a tu sector. Se instala en un comando.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://davidbuenov.com/images/dbv/blog/dbv-reputation-index.webp" /><media:content medium="image" url="https://davidbuenov.com/images/dbv/blog/dbv-reputation-index.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Claude Cowork: la guía de los conceptos que bloquean a cualquier principiante</title><link href="https://davidbuenov.com/inteligencia%20artificial/herramientas%20y%20software/2026/07/12/claude-cowork-guia-conceptos-que-bloquean-principiantes.html" rel="alternate" type="text/html" title="Claude Cowork: la guía de los conceptos que bloquean a cualquier principiante" /><published>2026-07-12T10:00:00+02:00</published><updated>2026-07-12T10:00:00+02:00</updated><id>https://davidbuenov.com/inteligencia%20artificial/herramientas%20y%20software/2026/07/12/claude-cowork-guia-conceptos-que-bloquean-principiantes</id><content type="html" xml:base="https://davidbuenov.com/inteligencia%20artificial/herramientas%20y%20software/2026/07/12/claude-cowork-guia-conceptos-que-bloquean-principiantes.html"><![CDATA[<p>¿Has abierto Claude Cowork por primera vez, has leído la pantalla de inicio y has pensado “vale… ¿y todo esto qué significa”? Tranquilo, no eres el único: es la reacción más habitual que veo cuando alguien lo prueba por primera vez. En cuestión de minutos aparecen media docena de palabras nuevas: proyectos, artefactos, planificación, skills, conectores, plugins… Y encima te pide acceso a tus carpetas.</p>

<p>Es exactamente el tipo de fricción que hace que alguien cierre la pestaña y no vuelva. Y es una pena, porque una vez entiendes qué es cada pieza, Cowork deja de ser un panel confuso y se convierte en una herramienta que de verdad delega trabajo por ti. Así que vamos a desmontarlo pieza a pieza, con un caso real que iremos siguiendo de principio a fin.</p>

<h2 id="el-caso-preparar-la-reunión-trimestral-del-lunes">El caso: preparar la reunión trimestral del lunes</h2>

<p>Imagina que llevas un pequeño equipo y el lunes tienes la reunión de seguimiento trimestral. En una carpeta de tu ordenador tienes contratos, actas de reuniones anteriores, un Excel de presupuesto y notas sueltas de las últimas semanas. Le escribes a Claude Cowork algo así:</p>

<blockquote>
  <p>“Organiza esta carpeta, sácame un resumen ejecutivo de dos páginas y prepárame los puntos clave para la reunión del lunes.”</p>
</blockquote>

<p>Una petición sencilla en apariencia. Pero para cumplirla, Cowork va a tocar, sin que te des ni cuenta, ocho conceptos distintos. Vamos a verlos en el orden en el que realmente entran en juego.</p>

<h2 id="-1-carpetas-el-primer-permiso-que-das-y-el-más-delicado">📁 1. Carpetas: el primer permiso que das (y el más delicado)</h2>

<p>Antes de que Claude pueda tocar un solo archivo, tienes que <strong>conectar</strong> la carpeta donde están tus documentos. Esto no es un detalle menor: Claude solo ve y puede modificar lo que hay dentro de las carpetas que tú conectas explícitamente, nada más de tu ordenador.</p>

<p>En nuestro caso, conectas la carpeta del proyecto con los contratos, el Excel y las actas. A partir de ese momento, Cowork puede leerla y escribir en ella (crear el resumen, reorganizar archivos, etc.).</p>

<p>La recomendación que da la propia documentación de Anthropic es clara: usa una <strong>carpeta dedicada</strong> en lugar de dar acceso a todo tu disco o a tu carpeta de Documentos entera, y mantén copias de seguridad de lo importante. Cuanto más limitado sea el acceso, menor es el riesgo si algo sale mal.</p>

<h2 id="-2-planificación-cómo-claude-organiza-el-trabajo-antes-de-moverse">🧭 2. Planificación: cómo Claude organiza el trabajo antes de moverse</h2>

<p>En cuanto envías la petición, Cowork no se lanza a ejecutar sin más. Primero <strong>analiza la tarea y crea un plan</strong>: qué pasos va a dar, en qué orden, y si necesita dividir el trabajo en subtareas que puede resolver en paralelo.</p>

<p>En nuestro caso, ese plan podría verse así: “1) Revisar los archivos de la carpeta y clasificarlos por tipo, 2) Extraer los datos clave del Excel de presupuesto, 3) Redactar el resumen ejecutivo, 4) Generar la lista de puntos para la reunión.” Tú ves ese plan antes de que se ejecute y puedes corregirlo sobre la marcha.</p>

<p>Además, decides cuánta supervisión quieres ejercer, porque Cowork tiene tres modos de trabajo:</p>

<ul>
  <li><strong>Aprobar manualmente</strong>: Claude se detiene y te pide permiso antes de cada acción relevante. El más lento, el más seguro.</li>
  <li><strong>Aprobar automáticamente</strong>: Claude sigue trabajando sin pararse a preguntar en cada paso, pero revisa internamente la seguridad de cada acción antes de ejecutarla y bloquea lo que considera arriesgado.</li>
  <li><strong>Saltar todas las aprobaciones</strong>: Claude no pregunta nada y nada lo revisa. Solo tiene sentido si confías al cien por cien en todo lo que puede tocar esa tarea.</li>
</ul>

<p>Para una tarea con contratos y presupuestos de por medio como la nuestra, lo razonable es quedarte en modo manual, o como mucho automático, y revisar antes de que actúe sobre algo que no puedas deshacer fácilmente.</p>

<h2 id="-3-artefactos-los-documentos-que-no-desaparecen">📄 3. Artefactos: los documentos que no desaparecen</h2>

<p>El resumen ejecutivo que te genera Claude no es un simple bloque de texto que se pierde al cerrar la conversación: es un <strong>artefacto</strong>. Un documento vivo que queda guardado, que puedes previsualizar, descargar y seguir editando.</p>

<p>Lo interesante es que puedes seleccionar un párrafo concreto del resumen, pedirle a Claude que lo reescriba solo ahí, y el resto del documento se queda intacto. Nada de “genera todo el documento otra vez porque quiero cambiar un párrafo”.</p>

<p>Si trabajas en equipo con un plan Team o Enterprise, hay un matiz más: esos artefactos se pueden compartir como “artefactos en vivo” dentro de tu organización, de forma que un compañero puede abrir el mismo resumen y verlo actualizarse sin que tengas que reenviarle nada por correo.</p>

<h2 id="️-4-proyectos-cuando-la-tarea-suelta-se-convierte-en-rutina">🗂️ 4. Proyectos: cuando la tarea suelta se convierte en rutina</h2>

<p>Si esta reunión trimestral se repite cada tres meses, no tiene sentido explicarle a Claude desde cero cada vez dónde están los archivos y cómo quieres el resumen. Para eso existen los <strong>Proyectos</strong> dentro de Cowork: un espacio de trabajo persistente que agrupa tareas relacionadas, con sus propios archivos, su propio contexto y su propia memoria.</p>

<p>Creas un proyecto “Reunión Trimestral” una vez, y las siguientes veces Claude ya sabe cómo trabajas, qué formato prefieres para el resumen y dónde están las carpetas relevantes. Un matiz que conviene tener en cuenta: hoy por hoy, la memoria de Claude en Cowork solo funciona dentro de un proyecto. Si le pides algo suelto, fuera de un proyecto, no recordará nada de una sesión a la siguiente.</p>

<h2 id="️-5-skills-enséñale-a-claude-así-lo-hacemos-aquí">⚙️ 5. Skills: enséñale a Claude “así lo hacemos aquí”</h2>

<p>Puede que quieras que el resumen ejecutivo siga siempre la misma estructura corporativa: título, tres bullets de highlights, tabla de presupuesto, riesgos. En lugar de repetir esas instrucciones cada vez, las guardas como una <strong>skill</strong>: un procedimiento reutilizable que añade a Claude un conocimiento concreto y una forma de trabajar.</p>

<p>Una vez la tienes, basta con invocarla (escribiendo “/” en el chat o desde el menú) y Claude aplica exactamente ese formato, sin que tengas que volver a explicarlo.</p>

<h2 id="-6-conectores-y-mcp-puentes-hacia-tus-otras-herramientas">🔌 6. Conectores (y MCP): puentes hacia tus otras herramientas</h2>

<p>El resumen quedará cojo si solo mira los archivos de la carpeta. Puede que también quieras que Claude lea el canal de Slack del proyecto, o los últimos correos sobre el presupuesto. Eso son los <strong>conectores</strong>: integraciones con servicios externos como Gmail, Slack, Google Drive o Notion, que Claude puede consultar (con tu permiso) durante la tarea.</p>

<p>Aquí conviene aclarar algo que se confunde mucho con las skills del punto anterior, porque resuelven problemas distintos. <strong>MCP (Model Context Protocol)</strong> es el protocolo abierto que hace posible la conexión: el “enchufe universal” que permite a Claude hablar con un sistema externo, ya sea Slack, tu CRM o una API interna de tu empresa. Los conectores que ves en el catálogo de Claude son, en el fondo, servidores MCP ya construidos y listos para usar sobre ese protocolo; si necesitas conectar una herramienta que no está en el catálogo, también puedes añadir tu propio servidor MCP remoto. La skill, en cambio, no da acceso a nada nuevo: le enseña a Claude qué hacer con el acceso que ya tiene, en qué orden consultar los datos y cómo presentarlos. Dicho de otro modo: el conector/MCP abre la puerta, la skill sabe qué hacer una vez dentro.</p>

<p>En Cowork, los conectores llegan a esos servicios a través de la nube de Anthropic, no directamente desde tu red local, así que conviene revisar con calma qué conector activas y cuánto acceso le das. Tú decides, servicio a servicio, si Claude puede usarlo siempre sin preguntar, si debe pedirte permiso cada vez, o si lo bloqueas directamente. Esa decisión es independiente del modo de aprobación general de la tarea: puedes tener la tarea en modo automático y aun así mantener un conector concreto bloqueado.</p>

<h2 id="-7-plugins-el-paquete-completo-listo-para-usar">🧩 7. Plugins: el paquete completo, listo para usar</h2>

<p>Configurar tú mismo cada skill y cada conector uno a uno puede ser tedioso. Los <strong>plugins</strong> resuelven eso: son paquetes que agrupan skills, conectores y sub-agentes pensados para un rol o función concreta (ventas, finanzas, legal, marketing…). Instalas uno y ya tienes un punto de partida configurado, en lugar de montarlo pieza a pieza.</p>

<p>Si tu reunión trimestral es de finanzas, por ejemplo, un plugin de esa categoría ya podría traer preconfigurado el conector a tu hoja de cálculo y las skills de formato de informe habituales en ese campo. Anthropic mantiene una biblioteca creciente de plugins por función (ventas, finanzas, legal, marketing, RRHH, ingeniería, diseño…), y si tu empresa tiene un plan Team o Enterprise, es habitual que el administrador ya os haya instalado o recomendado algunos a nivel de organización, para que todo el equipo trabaje con la misma configuración.</p>

<p>Una advertencia que merece la pena repetir: un plugin puede traer consigo servidores MCP locales que se ejecutan en tu propio ordenador, con los mismos permisos que cualquier otro programa que instales. Instala solo plugins de fuentes en las que confíes.</p>

<h2 id="-8-el-peligro-de-la-información-confidencial-aunque-tengas-cuenta-enterprise">🔐 8. El peligro de la información confidencial (aunque tengas cuenta Enterprise)</h2>

<p>Y aquí llega el punto que más me interesa que te lleves de este artículo, porque es el que menos se explica.</p>

<blockquote>
  <p><strong>Aviso importante:</strong> aunque tu organización tenga un plan Enterprise con todas las garantías contractuales, la actividad de Cowork <strong>no está capturada, hoy por hoy, en el Compliance API</strong> de Anthropic. Eso significa que no puedes sacar un informe de auditoría mostrando exactamente qué archivos leyó Claude en una sesión de Cowork, con las mismas garantías con las que sí puedes hacerlo en el chat normal.</p>
</blockquote>

<p>En nuestro caso, esa carpeta tiene contratos y un Excel de presupuesto: información que, en la mayoría de empresas, se consideraría confidencial. Antes de dársela a Cowork sin más, conviene tener claro:</p>

<ul>
  <li>✅ Usa una carpeta dedicada solo para lo que Claude necesita, nunca tu disco entero ni carpetas con documentos financieros o credenciales mezclados con lo demás.</li>
  <li>✅ Para tareas con datos sensibles, usa el modo de aprobación manual, para revisar cada acción antes de que ocurra.</li>
  <li>✅ Si usas los complementos de Claude para Excel o PowerPoint junto con Cowork, ten en cuenta que Claude puede pasar contexto de una aplicación a otra automáticamente (por ejemplo, mover un dato de una hoja de cálculo a una presentación) sin que se lo pidas explícitamente en ese momento.</li>
  <li>❌ No conectes carpetas completas de “Documentos” o unidades compartidas enteras “por si acaso”.</li>
  <li>❌ No uses el modo “Saltar todas las aprobaciones” en tareas que toquen archivos delicados o cuentas reales.</li>
  <li>❌ No des por hecho que el plan Enterprise cubre automáticamente los requisitos de auditoría de tu sector para lo que ocurre dentro de Cowork.</li>
</ul>

<p>Esto no es alarmismo: es simplemente entender que <strong>aislamiento de ejecución no es lo mismo que control sobre lo que Claude puede leer o hacer</strong>. El entorno donde corre el código de Claude está aislado de tu red, sí, pero eso no cambia qué carpetas, conectores o cuentas le has dado permiso de usar. Esa parte sigue siendo responsabilidad tuya, carpeta a carpeta, conector a conector.</p>

<h2 id="-por-dónde-empezar-tú-sin-agobiarte">🚀 Por dónde empezar tú, sin agobiarte</h2>

<p>No hace falta que domines los ocho conceptos antes de tu primera tarea. Mi recomendación, después de meses de prueba y error, es ir subiendo de nivel poco a poco:</p>

<ol>
  <li><strong>Primera tarea: solo carpetas.</strong> Crea una carpeta de prueba, mete un par de archivos sin nada delicado, conéctala y pídele algo sencillo (organizar, resumir). Así entiendes el flujo básico sin ningún riesgo.</li>
  <li><strong>Segunda tarea: fíjate en el plan.</strong> No lo ignores. Léelo antes de dejarlo avanzar, y prueba a corregirlo. Es la mejor forma de entender cómo “piensa” Cowork.</li>
  <li><strong>Cuando repitas una tarea dos o tres veces, conviértela en proyecto.</strong> Ahí es cuando de verdad se nota el ahorro de tiempo.</li>
  <li><strong>Deja las skills, conectores y plugins para cuando ya te sientas cómodo.</strong> Son multiplicadores de potencia, pero también de superficie de riesgo: mejor añadirlos uno a uno, entendiendo qué hace cada uno, que instalarlo todo el primer día.</li>
  <li><strong>Y con archivos confidenciales, empieza siempre en modo manual.</strong> Ya tendrás tiempo de pasar a automático cuando conozcas bien qué hace Claude con ese tipo de tarea.</li>
</ol>

<h2 id="chuleta-rápida">Chuleta rápida</h2>

<table>
  <thead>
    <tr>
      <th>Concepto</th>
      <th>Qué es</th>
      <th>En nuestro caso</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Carpetas</td>
      <td>Acceso explícito a archivos locales</td>
      <td>La carpeta del proyecto con contratos y presupuesto</td>
    </tr>
    <tr>
      <td>Planificación</td>
      <td>El plan que Claude traza antes de ejecutar</td>
      <td>Los 4 pasos para montar el resumen</td>
    </tr>
    <tr>
      <td>Artefactos</td>
      <td>Documentos vivos, editables y persistentes</td>
      <td>El resumen ejecutivo de dos páginas</td>
    </tr>
    <tr>
      <td>Proyectos</td>
      <td>Espacio persistente para tareas recurrentes</td>
      <td>“Reunión Trimestral” reutilizado cada 3 meses</td>
    </tr>
    <tr>
      <td>Skills</td>
      <td>Procedimientos reutilizables</td>
      <td>El formato corporativo del resumen</td>
    </tr>
    <tr>
      <td>Conectores / MCP</td>
      <td>Puentes hacia apps externas, construidos sobre el protocolo MCP</td>
      <td>Slack y correo para completar el contexto</td>
    </tr>
    <tr>
      <td>Plugins</td>
      <td>Paquete de skills + conectores + sub-agentes</td>
      <td>Un plugin de finanzas preconfigurado</td>
    </tr>
    <tr>
      <td>Confidencialidad</td>
      <td>Tu responsabilidad sobre qué lee y hace Claude</td>
      <td>Contratos y presupuesto: carpeta dedicada y modo manual</td>
    </tr>
  </tbody>
</table>

<h2 id="y-qué-hay-de-design">¿Y qué hay de Design?</h2>

<p>Hay un concepto que he dejado fuera a propósito: <strong>Claude Design</strong>, la herramienta con la que puedes convertir ese resumen ejecutivo en una presentación con la identidad visual de tu empresa, o diseñar directamente sobre un lienzo mientras hablas con Claude. Es lo suficientemente complejo (sistema de diseño, exportación, integración con Office) como para merecer su propia entrada.</p>

<p>¿Te gustaría que la próxima entrada fuera precisamente esa: cómo sacarle partido a Claude Design y a su integración con Word, Excel y PowerPoint? Cuéntamelo en los comentarios o en <a href="https://linkedin.com/in/davidbuenov">LinkedIn</a>.</p>]]></content><author><name>David Bueno Vallejo</name></author><category term="Inteligencia Artificial" /><category term="Herramientas y Software" /><category term="claude" /><category term="cowork" /><category term="ia" /><category term="productividad" /><category term="conectores" /><category term="plugins" /><category term="seguridad" /><summary type="html"><![CDATA[Proyectos, artefactos, planificación, skills, conectores, plugins, carpetas... Te explico cada concepto con un caso real, para que no abandones Claude Cowork en el primer intento.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://davidbuenov.com/images/dbv/blog/claude-cowork-conceptos.webp" /><media:content medium="image" url="https://davidbuenov.com/images/dbv/blog/claude-cowork-conceptos.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">¿Está tu web lista para la IA? Mi viaje adaptando davidbuenov.com a los LLMs</title><link href="https://davidbuenov.com/inteligencia%20artificial/programaci%C3%B3n%20y%20tecnolog%C3%ADa/2026/06/11/esta-tu-web-lista-para-la-ia-mi-viaje-adaptando-davidbuenov-com-a-los-llms.html" rel="alternate" type="text/html" title="¿Está tu web lista para la IA? Mi viaje adaptando davidbuenov.com a los LLMs" /><published>2026-06-11T00:00:00+02:00</published><updated>2026-06-11T00:00:00+02:00</updated><id>https://davidbuenov.com/inteligencia%20artificial/programaci%C3%B3n%20y%20tecnolog%C3%ADa/2026/06/11/esta-tu-web-lista-para-la-ia-mi-viaje-adaptando-davidbuenov-com-a-los-llms</id><content type="html" xml:base="https://davidbuenov.com/inteligencia%20artificial/programaci%C3%B3n%20y%20tecnolog%C3%ADa/2026/06/11/esta-tu-web-lista-para-la-ia-mi-viaje-adaptando-davidbuenov-com-a-los-llms.html"><![CDATA[<p>El mundo de las búsquedas en Internet está cambiando a una velocidad de vértigo.<br />
Ya no solo buscamos en Google introduciendo palabras clave; ahora le preguntamos a ChatGPT, Claude, Gemini o Copilot para que busquen por nosotros, resuman información y nos den una respuesta directa.</p>

<p>Esto nos lleva a una pregunta inevitable para cualquier profesional, empresa o institución:<br />
<strong>¿Está tu sitio web preparado para que una Inteligencia Artificial lo lea, lo entienda y te recomiende?</strong></p>

<p>Hace unos días decidí poner a prueba mi propia web.<br />
Y el resultado fue un auténtico baño de realidad.</p>

<hr />

<h2 id="el-diagnóstico-inicial-21100">El diagnóstico inicial: 21/100</h2>

<p>Para medir el nivel de compatibilidad de mi web con la IA, utilicé herramientas de auditoría especializadas en <strong>Agent Readiness</strong> y <strong>GEO (Generative Engine Optimization)</strong>.</p>

<p>Al pasar el primer escáner, la puntuación fue de <strong>21 sobre 100</strong>:</p>

<p><img src="/images/dbv/blog/agentready/isagentready21.webp" alt="Diagnóstico inicial de Agent Readiness: 21/100" /></p>

<p>Mi web funcionaba de maravilla para humanos. Tenía un buen SEO tradicional, cargaba rápido y los enlaces funcionaban.<br />
Pero para un agente de IA, era un laberinto.</p>

<p>Los bots se topaban con páginas de error en HTML cuando buscaban APIs, no entendían qué directivas de entrenamiento tenían permitidas y no encontraban una estructura de datos clara a la que consultar directamente. Estaba perdiendo la oportunidad de que los modelos de lenguaje me indexaran y recomendaran adecuadamente.</p>

<hr />

<h2 id="qué-es-el-agent-readiness-y-el-geo">¿Qué es el “Agent Readiness” y el GEO?</h2>

<p>Básicamente, consiste en optimizar tu web para que los agentes autónomos de IA y los crawlers de LLM puedan interactuar con ella de forma eficiente. Si el SEO tradicional posicionaba páginas para humanos, el <strong>GEO</strong> prepara la infraestructura para que los bots extraigan conocimiento.</p>

<p>Para solucionar esto, tracé una estrategia de adaptación dividida en <strong>cinco grandes pilares</strong> (sin entrar en el código complejo, pero sí en la lógica estratégica):</p>

<h3 id="1-facilitar-el-mapa-del-tesoro-contenido-para-llms">1. Facilitar el “mapa del tesoro” (Contenido para LLMs)</h3>
<p>Los bots no leen el diseño visual. Necesitan texto limpio.</p>
<ul>
  <li>Implementé un archivo de descubrimiento semántico (<code class="language-plaintext highlighter-rouge">llms.txt</code>) en la raíz de la web. Es un mapa en Markdown limpio que resume quién soy y dónde está cada sección clave.</li>
  <li>Configuramos una directiva clara de señales de contenido (Content Signals) en el archivo <code class="language-plaintext highlighter-rouge">robots.txt</code> para indicar qué permitimos entrenar y qué no.</li>
</ul>

<h3 id="2-infraestructura-dns-y-servidor">2. Infraestructura DNS y Servidor</h3>
<p>Los bots de IA buscan metadatos en rutas específicas de red antes de rastrear el sitio.</p>
<ul>
  <li>Intentamos configurar el descubrimiento a nivel DNS mediante registros de descubrimiento de agentes (DNS-AID), aunque en mi caso me topé con limitaciones del proveedor (1&amp;1/IONOS no da soporte nativo al tipo de registro <code class="language-plaintext highlighter-rouge">HTTPS</code> en DNS, que es el requerido para esto).</li>
  <li>Ajustamos las cabeceras HTTP de respuesta del servidor (en mi caso, configuradas en Firebase) para que los bots identifiquen nuestras capacidades semánticas en una sola petición ultrarrápida.</li>
</ul>

<h3 id="3-protocolos-de-ia-mcp-y-webmcp">3. Protocolos de IA (MCP y WebMCP)</h3>
<p>La IA no solo lee, también puede interactuar localmente.</p>
<ul>
  <li>Configuramos un “MCP Server Card” compatible con el estándar de Anthropic (Model Context Protocol).</li>
  <li>Integramos WebMCP a nivel de cliente mediante scripts que exponen herramientas directamente al navegador del agente de IA cuando este visita el sitio.</li>
</ul>

<h3 id="4-flujo-de-identidad-y-apis">4. Flujo de Identidad y APIs</h3>
<p>Para que los motores semánticos verifiquen los datos sin registrarse o fallar por temas de seguridad:</p>
<ul>
  <li>Definimos metadatos claros de acceso y autorización (<code class="language-plaintext highlighter-rouge">auth.md</code>) compatibles con especificaciones modernas de flujo de bots.</li>
  <li>Estructuramos un índice de capacidades y un catálogo de APIs en formatos estandarizados.</li>
</ul>

<h3 id="5-seo-semántico-y-grafo-de-entidades-schemaorg-json-ld">5. SEO Semántico y Grafo de Entidades (Schema.org JSON-LD)</h3>
<p>Para que los LLMs interconecten la información y puedan verificar hechos de forma inequívoca en su base de conocimiento:</p>
<ul>
  <li>Implementamos datos estructurados de tipo <code class="language-plaintext highlighter-rouge">Person</code> para consolidar mi identidad y asociarla con mi alias <code class="language-plaintext highlighter-rouge">@davidbuenov</code> y perfiles sociales.</li>
  <li>Añadimos metadatos dinámicos de tipo <code class="language-plaintext highlighter-rouge">BlogPosting</code> para los artículos del blog y de tipo <code class="language-plaintext highlighter-rouge">Event</code> para la sección de conferencias.</li>
  <li>Clasificamos de forma híbrida nuestros proyectos para diferenciar las herramientas interactivas (<code class="language-plaintext highlighter-rouge">SoftwareApplication</code>) de las consultorías e investigaciones (<code class="language-plaintext highlighter-rouge">CreativeWork</code>).</li>
</ul>

<hr />

<h2 id="el-éxito-final-puntuaciones-de-matrícula-100100-93100-y-95100">El Éxito Final: Puntuaciones de Matrícula (100/100, 93/100 y 95/100)</h2>

<p>Tras aplicar esta arquitectura híbrida y desplegar las mejoras de negociación de contenido, compatibilidad de agentes e inyección de datos estructurados, volvimos a pasar las auditorías con resultados espectaculares:</p>

<ul>
  <li><strong>Luminary Lane A2A Checker</strong>: Conseguimos una puntuación perfecta de <strong>100/100</strong> (matrícula de honor).</li>
  <li><strong>IsItAgentReady</strong>: Logramos alcanzar un sobresaliente <strong>93/100</strong>, quedándonos a las puertas del 100% únicamente porque mi actual proveedor de dominio (1&amp;1/IONOS) no permite añadir registros de tipo <code class="language-plaintext highlighter-rouge">HTTPS</code> en su panel DNS (necesario para el autodescubrimiento DNS-AID).</li>
  <li><strong>AgentReady.md</strong>: Escalamos la puntuación hasta un excelente <strong>95/100</strong> tras la última integración de datos estructurados de Schema.org, lo que nos permitió integrar su distintivo oficial en el pie de página de la web.</li>
</ul>

<p><img src="/images/dbv/blog/agentready/luminaryLane100.webp" alt="Puntuación perfecta de 100/100 en Luminary Lane" /></p>

<hr />

<h2 id="y-ahora-qué">¿Y ahora qué?</h2>

<p>El “Agent Readiness” ya no es una opción de futuro; es una necesidad del presente. Si tu web no está adaptada, los nuevos buscadores basados en chat simplemente no te encontrarán ni te recomendarán en sus respuestas.</p>

<p>Hacer esta transición requiere entender no solo de desarrollo web y servidores, sino de los estándares emergentes que los gigantes de la IA (Google, OpenAI, Anthropic) están definiendo mes a mes.</p>

<p><strong>¿Quieres preparar la web de tu empresa, universidad o marca personal para los agentes de IA?</strong><br />
Si necesitas un experto para auditar, diseñar o implementar esta adaptación en tu sitio web, no dudes en ponerte en contacto conmigo a través de mi <a href="/contacto.html">formulario de contacto</a>. Estaré encantado de ayudarte a dar el salto a la web del futuro.</p>]]></content><author><name></name></author><category term="Inteligencia Artificial" /><category term="Programación y Tecnología" /><category term="agent-readiness" /><category term="seo" /><category term="geo" /><category term="inteligencia-artificial" /><category term="jekyll" /><summary type="html"><![CDATA[El mundo de las búsquedas en Internet está cambiando a una velocidad de vértigo. Ya no solo buscamos en Google introduciendo palabras clave; ahora le preguntamos a ChatGPT, Claude, Gemini o Copilot para que busquen por nosotros, resuman información y nos den una respuesta directa.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://davidbuenov.com/images/dbv/blog/optimizacionwebIA.webp" /><media:content medium="image" url="https://davidbuenov.com/images/dbv/blog/optimizacionwebIA.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">PDF2Deck: cuando una frustración vuelve a despertar algo que creía dormido</title><link href="https://davidbuenov.com/herramientas%20y%20software/divulgaci%C3%B3n%20y%20reflexiones/2026/04/06/pdf2deck-cuando-una-frustracion-vuelve-a-despertar-algo-que-creia-dormido.html" rel="alternate" type="text/html" title="PDF2Deck: cuando una frustración vuelve a despertar algo que creía dormido" /><published>2026-04-06T00:00:00+02:00</published><updated>2026-04-06T00:00:00+02:00</updated><id>https://davidbuenov.com/herramientas%20y%20software/divulgaci%C3%B3n%20y%20reflexiones/2026/04/06/pdf2deck-cuando-una-frustracion-vuelve-a-despertar-algo-que-creia-dormido</id><content type="html" xml:base="https://davidbuenov.com/herramientas%20y%20software/divulgaci%C3%B3n%20y%20reflexiones/2026/04/06/pdf2deck-cuando-una-frustracion-vuelve-a-despertar-algo-que-creia-dormido.html"><![CDATA[<p>Hay momentos en los que la tecnología te hace sentir poderoso… y otros en los que te hace sentir engañado.<br />
Esta historia empieza en uno de esos segundos momentos.</p>

<p>Hace unas semanas estaba trabajando con unas presentaciones generadas por NotebookLM.<br />
El resultado visual era impecable, sí, pero también completamente inútil para editar:<br />
<strong>PDFs de solo imagen, cero texto seleccionable, cero posibilidad de corregir, mover o mejorar nada</strong>.</p>

<p>Pensé lo que pensaría cualquiera:</p>
<blockquote>
  <p>“Seguro que hay una herramienta que convierta esto a PowerPoint editable, y gratis.”</p>
</blockquote>

<p>Busqué. Encontré varias.<br />
Prometían justo lo que necesitaba.<br />
Esa palabra mágica: <strong>gratis</strong>.</p>

<p>Subes el PDF.<br />
Ves la barra de progreso.<br />
Empiezas a imaginar la solución.<br />
Y entonces, al llegar al botón final, aparece esa frase que ya casi duele verla:</p>

<p><strong>“Para continuar, necesitas la versión de pago.”</strong></p>

<p>No era cuestión de dinero.<br />
Era la <strong>sensación</strong>.<br />
Ese pequeño golpe en el estómago cuando descubres que has perdido el tiempo.<br />
Ese “para qué me ilusiono” que conocemos tan bien los que llevamos toda la vida trabajando con tecnología.</p>

<p>Y, lo confieso, no era la primera vez que sentía eso.</p>

<hr />

<h2 id="un-déjà-vu-tecnológico-málaga-2019">Un déjà vu tecnológico: Málaga, 2019</h2>

<p>De repente, esa frustración me llevó de vuelta a otro momento.<br />
A 2019, cuando era CIO del Ayuntamiento de Málaga.</p>

<p>En aquel entonces empezaban a llegar empresas ofreciendo los primeros chatbots. Usaban tecnologías como Dialogflow, que todavía estaban verdes. Y lo que veía en todas las propuestas era siempre lo mismo:</p>

<ul>
  <li>“Te reconocemos 20 intenciones por X dinero.”</li>
  <li>“Cada nueva intención cuesta tanto.”</li>
  <li>“Mantenimiento mensual por si acaso.”</li>
</ul>

<p><strong>Un saco sin fondo.</strong><br />
Un modelo que hacía que cualquier proyecto fuese carísimo desde el minuto uno.<br />
Y me recuerdo perfectamente pensando:</p>

<blockquote>
  <p>“¿De verdad hace falta que sea así?<br />
¿Y si lo hacemos nosotros?<br />
¿Y si dejamos de depender de modelos cerrados y montamos algo propio, transparente y escalable?”</p>
</blockquote>

<p>Y así nació <a href="https://googlechatbots.es/victoria/index.html"><strong>Victoria la Malagueña</strong></a>, el chatbot del Ayuntamiento de Málaga.<br />
Una solución hecha en casa, que terminó reconociendo más de <strong>150 intenciones</strong>, más de <strong>600 respuestas</strong>, conectada a sistemas en tiempo real, y que nos llevó a ganar premios importantes como <strong>CIONET 2019</strong> y <strong>Mejor Chatbot de Destino Turístico en FITUR 2019</strong>.</p>

<p>Esa experiencia me marcó profundamente.<br />
Me enseñó que <strong>cuando el mercado no ofrece lo que necesitas, a veces lo correcto es construirlo tú</strong>.<br />
Con honestidad.<br />
Con transparencia.<br />
Sin letra pequeña.</p>

<hr />

<h2 id="volviendo-a-2026-la-chispa-que-volvió-a-encenderse">Volviendo a 2026: la chispa que volvió a encenderse</h2>

<p>Así que, allí estaba yo, con un PDF imposible de editar y varias pestañas abiertas de herramientas que prometían milagros pero que escondían barreras al final del camino.</p>

<p>Y sentí EXACTAMENTE lo mismo que en 2019.</p>

<p>Esa mezcla tan mía de:</p>

<ul>
  <li>frustración,</li>
  <li>incredulidad,</li>
  <li>y esa determinación tranquila que aparece cuando algo no es justo.</li>
</ul>

<p>Me dije:</p>

<blockquote>
  <p>“No puede ser tan difícil.<br />
No puede ser que no exista una herramienta simple, local, sin engaños, sin cuentas, sin subir archivos, sin muros de pago.<br />
¿Y si la hago yo?”</p>
</blockquote>

<p>Y entonces nació <strong>PDF2Deck</strong>.</p>

<hr />

<h2 id="una-herramienta-hecha-desde-la-honestidad">Una herramienta hecha desde la honestidad</h2>

<p>PDF2Deck no es un producto.<br />
No es un negocio.<br />
No es una estrategia.</p>

<p>Es una respuesta.</p>

<p>Una respuesta a esa sensación tan desagradable de haber confiado en algo que no era lo que decía ser.<br />
Una respuesta a la falta de herramientas <strong>locales, privadas y realmente gratuitas</strong>.<br />
Una respuesta al problema concreto de convertir PDFs de imagen en presentaciones editables sin sacrificar tu privacidad ni tu tiempo.</p>

<p>PDF2Deck es:</p>

<ul>
  <li><strong>100% local</strong>, nada sale de tu ordenador.</li>
  <li><strong>Gratis de verdad</strong>, sin muros de pago.</li>
  <li><strong>Código abierto</strong>, porque la transparencia importa.</li>
  <li><strong>Práctico</strong>, porque nació para resolver un problema real.</li>
  <li><strong>Tuyo</strong>, si lo necesitas.</li>
</ul>

<p>Repositorio aquí:<br />
<strong><a href="https://github.com/davidbuenov/dbv-pdf2deck">https://github.com/davidbuenov/dbv-pdf2deck</a></strong></p>

<hr />

<h2 id="por-qué-cuento-todo-esto">Por qué cuento todo esto</h2>

<p>Porque esto no va de software.<br />
Va de propósito.</p>

<p>Va de ese pequeño hilo invisible que une mi trabajo de 2019 con lo que sigo construyendo hoy:<br />
la convicción de que la tecnología debe ser útil, honesta y accesible.</p>

<p>Va de no aceptar que las cosas “tienen que ser así” cuando no lo son.<br />
Va de crear alternativas cuando las existentes no son justas.<br />
Va de aportar un granito de arena al ecosistema digital desde la transparencia y el compromiso.</p>

<p>PDF2Deck no cambiará el mundo.<br />
Pero sí ha cambiado mi manera de trabajar.<br />
Y quizá, con un poco de suerte, también cambie la de alguien más.</p>

<p>Gracias por leerme.<br />
Gracias por estar ahí.<br />
Y ojalá esta herramienta te ahorre la misma frustración que me ahorró a mí.</p>]]></content><author><name></name></author><category term="Herramientas y Software" /><category term="Divulgación y Reflexiones" /><category term="pdf2deck" /><category term="innovación" /><category term="código abierto" /><category term="productividad" /><summary type="html"><![CDATA[Hay momentos en los que la tecnología te hace sentir poderoso… y otros en los que te hace sentir engañado. Esta historia empieza en uno de esos segundos momentos.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://davidbuenov.com/images/dbv/blog/pdf2deck.webp" /><media:content medium="image" url="https://davidbuenov.com/images/dbv/blog/pdf2deck.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">🚀 Guía Maestra 2026: Cómo Conseguir IA Premium Gratis si eres Universitario o Docente</title><link href="https://davidbuenov.com/docencia%20y%20universidad/inteligencia%20artificial/2026/03/08/guia-maestra-2026-ia-premium-gratis-universitarios-docentes.html" rel="alternate" type="text/html" title="🚀 Guía Maestra 2026: Cómo Conseguir IA Premium Gratis si eres Universitario o Docente" /><published>2026-03-08T07:00:00+01:00</published><updated>2026-08-26T10:00:00+02:00</updated><id>https://davidbuenov.com/docencia%20y%20universidad/inteligencia%20artificial/2026/03/08/guia-maestra-2026-ia-premium-gratis-universitarios-docentes</id><content type="html" xml:base="https://davidbuenov.com/docencia%20y%20universidad/inteligencia%20artificial/2026/03/08/guia-maestra-2026-ia-premium-gratis-universitarios-docentes.html"><![CDATA[<blockquote>
  <p>📅 <strong>Recopilación actualizada a 26 de agosto de 2026.</strong> Esta guía se publicó en marzo y la he revisado entera: he verificado cada oferta una por una, he actualizado lo que ha mejorado y he <strong>tachado lo que ya no existe</strong> para que no pierdas el tiempo. Si algo te ha caducado desde marzo, aquí está el porqué.</p>
</blockquote>

<p>¿Eres estudiante o profesor y sigues usando las versiones gratuitas y limitadas de la Inteligencia Artificial? <strong>Estás perdiendo una oportunidad de oro.</strong> En 2026, las grandes tecnológicas (Google, Microsoft, Adobe, Oracle, Anthropic y más) han abierto sus puertas al sector académico con ofertas que incluyen desde años completos de suscripción <strong>Pro</strong> hasta créditos en la nube y certificaciones gratuitas.</p>

<p>Aquí tienes la lista definitiva, actualizada y con enlaces directos. ¡Aprovéchalo antes de que caduquen!</p>

<hr />

<h2 id="-cómo-leer-esta-guía-importante">🔍 Cómo leer esta guía (importante)</h2>

<p>No todas las “ofertas gratis” son lo mismo. Antes de registrarte, mira siempre a qué categoría pertenece:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Etiqueta</th>
      <th style="text-align: left">Significado</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">✅ <strong>Activo</strong></td>
      <td style="text-align: left">Verificado y funcionando a 26/08/2026.</td>
    </tr>
    <tr>
      <td style="text-align: left">⚠️ <strong>Cambiado</strong></td>
      <td style="text-align: left">La oferta sigue existiendo, pero en peores condiciones o con nuevos límites.</td>
    </tr>
    <tr>
      <td style="text-align: left">❌ <strong>Caducado</strong></td>
      <td style="text-align: left">Ya no se puede solicitar. Lo dejo tachado para que sepas que lo he comprobado.</td>
    </tr>
  </tbody>
</table>

<p>Y distingue entre: <strong>gratis para estudiantes verificados</strong> (dura mientras seas alumno), <strong>promoción temporal</strong> (caduca en una fecha), <strong>plan gratuito general</strong> (lo tiene cualquiera, no es un privilegio académico) y <strong>licencia institucional</strong> (depende de que tu centro esté adherido).</p>

<hr />

<h2 id="-1-ia-generativa-y-productividad-redacción-análisis-y-estudio">💡 1. IA Generativa y Productividad (Redacción, Análisis y Estudio)</h2>

<p>Estas herramientas son tus mejores aliadas para resumir textos complejos, generar borradores de investigación o analizar grandes bases de datos.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Plataforma</th>
      <th style="text-align: left">Oferta para Educación</th>
      <th style="text-align: left">Requisito</th>
      <th style="text-align: left">Estado / Vigencia</th>
      <th style="text-align: left">Registro / Más Info</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>Google Gemini</strong></td>
      <td style="text-align: left"><strong>1 año gratis de Google AI Plus</strong>: Gemini avanzado, generación de vídeo y 400 GB de almacenamiento</td>
      <td style="text-align: left">Universitario mayor de edad (18-25 años) + verificación</td>
      <td style="text-align: left">✅ <strong>Activo</strong> · alta hasta el <strong>31 dic. 2026</strong></td>
      <td style="text-align: left"><a href="https://gemini.google/es/students/">👉 Registrarse</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Microsoft Copilot</strong></td>
      <td style="text-align: left"><strong>12 meses gratis</strong> (Microsoft 365 Personal)</td>
      <td style="text-align: left">Cuenta institucional</td>
      <td style="text-align: left">✅ <strong>Activo</strong></td>
      <td style="text-align: left"><a href="https://www.microsoft.com/es-es/microsoft-365/college-student-pricing">👉 Obtener oferta</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Adobe Creative Cloud / Firefly</strong></td>
      <td style="text-align: left"><strong>85 % de descuento</strong> en Creative Cloud Pro: de 79,30 € a <strong>19,66 €/mes</strong> (IVA incluido, plan anual con facturación mensual, <strong>el primer año</strong>). Más de 20 aplicaciones y las funciones de IA de Firefly</td>
      <td style="text-align: left">Estudiante <strong>o docente</strong> verificado</td>
      <td style="text-align: left">✅ <strong>Mejorado</strong> · antes era un 64-75 %</td>
      <td style="text-align: left"><a href="https://www.adobe.com/es/education.html">👉 Ver precios Edu</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Notion</strong></td>
      <td style="text-align: left"><strong>Plan Education Plus gratis</strong> (antes solo un 50 % en el add-on de IA)</td>
      <td style="text-align: left">Correo institucional universitario</td>
      <td style="text-align: left">✅ <strong>Mejorado</strong></td>
      <td style="text-align: left"><a href="https://www.notion.com/product/notion-for-education">👉 Notion for Education</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Canva</strong></td>
      <td style="text-align: left"><strong>Canva para Educación gratis</strong> para docentes de primaria/secundaria y su alumnado. En universidad: plan Free, y funciones premium solo si tu centro contrata <strong>Canva Campus</strong></td>
      <td style="text-align: left">Verificación docente o dominio del centro</td>
      <td style="text-align: left">✅ <strong>Activo</strong> (con matices)</td>
      <td style="text-align: left"><a href="https://www.canva.com/es_es/educacion/">👉 Canva Educación</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Perplexity AI</strong></td>
      <td style="text-align: left"><del>1 año de Pro gratis</del> → ahora <strong>Education Pro al 50 % (≈10 $/mes)</strong> + 1 mes gratis vía SheerID</td>
      <td style="text-align: left">Verificación SheerID (nivel universitario)</td>
      <td style="text-align: left">⚠️ <strong>Cambiado</strong> · el año gratis cerró en enero de 2026 y el programa de referidos acabó el 31 may. 2026</td>
      <td style="text-align: left"><a href="https://www.perplexity.ai/pro">👉 Verificar cuenta</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>ChatGPT (OpenAI)</strong></td>
      <td style="text-align: left"><strong>No hay descuento académico global.</strong> Solo acceso vía <strong>ChatGPT Edu</strong> si tu universidad tiene convenio. La oferta <em>Back to School</em> (4 meses de Plus, hasta el 31 oct. 2026) es <strong>solo para EE. UU.</strong></td>
      <td style="text-align: left">Licencia de tu universidad</td>
      <td style="text-align: left">⚠️ <strong>Limitado / regional</strong></td>
      <td style="text-align: left"><a href="https://chatgpt.com/education">👉 Consultar programa</a></td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p>💳 <strong>Ojo con Gemini:</strong> Google pide tarjeta al registrarte y cobra automáticamente al terminar el año si no cancelas antes. Ponte un recordatorio en el calendario el mismo día que lo actives.</p>

  <p>💳 <strong>Ojo con Adobe:</strong> el 85 % aplica al <strong>primer año</strong>. A partir del segundo se renueva a la tarifa de estudiante sin la promoción, así que compruébalo antes de que se cumpla el año.</p>
</blockquote>

<hr />

<h2 id="-2-ia-para-programación-y-ciencia-de-datos">💻 2. IA para Programación y Ciencia de Datos</h2>

<p>Si estudias ingeniería, informática o simplemente quieres crear tus propias herramientas, estas licencias son imprescindibles.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Herramienta</th>
      <th style="text-align: left">Beneficio Académico</th>
      <th style="text-align: left">Estado / Vigencia</th>
      <th style="text-align: left">Registro / Más Info</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>GitHub Copilot</strong></td>
      <td style="text-align: left"><strong>GitHub Copilot Student gratis</strong>: autocompletado ilimitado, asignación mensual de créditos de IA y uso limitado de chat y agentes con selección automática de modelo</td>
      <td style="text-align: left">✅ <strong>Activo</strong> · mientras seas alumno</td>
      <td style="text-align: left"><a href="https://education.github.com/pack">👉 GitHub Education</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>JetBrains AI</strong></td>
      <td style="text-align: left"><strong>Gratis</strong> para estudiantes, incluido el AI Assistant en PyCharm, IntelliJ y el resto de IDEs</td>
      <td style="text-align: left">✅ <strong>Activo</strong> · renovación anual</td>
      <td style="text-align: left"><a href="https://www.jetbrains.com/es-es/community/education/#students">👉 JetBrains Pack</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Oracle Academy</strong></td>
      <td style="text-align: left"><strong>300 $ en créditos</strong> + servicios Always Free</td>
      <td style="text-align: left">✅ <strong>Activo</strong></td>
      <td style="text-align: left"><a href="https://academy.oracle.com/en/solutions-cloud-program.html">👉 Oracle Academy</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>AWS Academy</strong></td>
      <td style="text-align: left">Programa <strong>institucional</strong>: tu centro se adhiere y entonces el alumnado obtiene <strong>12 meses gratis de AWS Skill Builder</strong> y el profesorado <strong>100 % de descuento en los exámenes de certificación</strong>. Incluye cursos de <em>Generative AI Foundations</em> y <em>Machine Learning Foundations</em></td>
      <td style="text-align: left">✅ <strong>Activo</strong> · no es un alta individual</td>
      <td style="text-align: left"><a href="https://aws.amazon.com/es/training/awsacademy/">👉 AWS Academy</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Cursor AI</strong></td>
      <td style="text-align: left"><del>1 año gratis / 50 % de descuento</del> → cerró nuevas altas el <strong>25 jun. 2026</strong>. Queda el <strong>plan Free</strong>, promociones en eventos de campus y <strong>créditos académicos</strong> solicitables para máster, doctorado, investigación y docencia</td>
      <td style="text-align: left">⚠️ <strong>Cambiado</strong> · quien ya lo canjeó lo mantiene hasta que venza</td>
      <td style="text-align: left"><a href="https://cursor.com/students">👉 Cursor Students</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Amazon Q Developer</strong></td>
      <td style="text-align: left">Nivel <strong>gratuito</strong> para desarrolladores, con asistencia en el IDE y en AWS. No es una oferta académica, pero es gratis y potente</td>
      <td style="text-align: left">✅ <strong>Plan gratuito general</strong></td>
      <td style="text-align: left"><a href="https://aws.amazon.com/es/q/developer/">👉 Amazon Q Developer</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><del><strong>Tabnine</strong></del></td>
      <td style="text-align: left"><del>Licencia Pro gratuita para estudiantes</del></td>
      <td style="text-align: left">❌ <strong>Caducado</strong> · Tabnine ya no tiene programa educativo y también retiró su plan gratuito</td>
      <td style="text-align: left">—</td>
    </tr>
  </tbody>
</table>

<h3 id="-el-comodín-github-student-developer-pack">🎁 El comodín: GitHub Student Developer Pack</h3>

<p>Si solo vas a hacer <strong>un</strong> registro de toda esta lista, que sea este. Verificándote una sola vez desbloqueas decenas de herramientas:</p>

<ul>
  <li><strong>GitHub Copilot Student</strong> y <strong>GitHub Pro</strong>.</li>
  <li><strong>GitHub Codespaces</strong>, tu entorno de desarrollo en el navegador.</li>
  <li><strong>100 $ de crédito en Azure</strong> y más de 25 servicios cloud (mayores de 18 años).</li>
  <li>Todos los <strong>IDEs de JetBrains</strong>, incluido PyCharm.</li>
  <li><strong>DataCamp</strong> (3 meses), <strong>Boot.dev</strong> (3 meses) y <strong>Scrimba</strong> (3 meses).</li>
  <li><strong>Codédex Club</strong>, <strong>Frontend Masters</strong> y <strong>Educative</strong> (6 meses cada uno).</li>
  <li>Créditos de <strong>MongoDB Atlas</strong> y acceso a MongoDB University con su certificación gratuita.</li>
  <li><strong>Camber Student</strong>, muy interesante para IA y datos: 40 h de CPU, 5 h de GPU, 50 GB de almacenamiento, 50 mensajes mensuales de agentes, conectores PostgreSQL/Trino/S3 e integración con Cursor o Claude Code vía MCP.</li>
  <li>Preparación y examen gratuitos de la certificación <strong>GitHub Foundations</strong>.</li>
</ul>

<p>👉 <a href="https://education.github.com/pack">education.github.com/pack</a></p>

<hr />

<h2 id="-3-certificaciones-y-formación-en-ia-gratuitas-bonus">🎓 3. Certificaciones y Formación en IA Gratuitas (Bonus)</h2>

<p>No solo uses la IA, demuéstralo en tu CV. Este es el apartado que más ha crecido desde marzo: he añadido <strong>Anthropic</strong>, <strong>Google Skills</strong> e <strong>IBM SkillsBuild</strong>.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Entidad</th>
      <th style="text-align: left">Qué ofrece</th>
      <th style="text-align: left">Tipo de acreditación</th>
      <th style="text-align: left">Enlace</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left"><strong>Anthropic Academy</strong> 🆕</td>
      <td style="text-align: left">Más de 20 cursos gratuitos: <em>Claude 101</em>, <em>Claude Platform 101</em>, <em>Building with the Claude API</em>, <em>Introduction to Model Context Protocol</em> y la serie <strong>AI Fluency</strong>, con versiones específicas <strong>para docentes y para estudiantes</strong></td>
      <td style="text-align: left">Certificado de finalización</td>
      <td style="text-align: left"><a href="https://anthropic.skilljar.com/">👉 anthropic.skilljar.com</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Google Skills</strong> 🆕</td>
      <td style="text-align: left">Cursos y laboratorios prácticos sobre Vertex AI, Gemini, diseño de prompts, ML y MLOps. El programa <strong>GEAR</strong> da <strong>35 créditos mensuales sin coste</strong> para los laboratorios</td>
      <td style="text-align: left"><em>Skill badges</em> verificables</td>
      <td style="text-align: left"><a href="https://www.skills.google/">👉 skills.google</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Oracle University</strong></td>
      <td style="text-align: left">Certificación <strong>OCI AI Foundations Associate</strong> sin coste, dentro de la campaña <em>Race to Certification</em> prorrogada a 2026</td>
      <td style="text-align: left">Certificación oficial gratuita</td>
      <td style="text-align: left"><a href="https://education.oracle.com/es/oracle-certification-path/product_129">👉 Inscríbete</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Microsoft Learn</strong></td>
      <td style="text-align: left">Rutas de autoformación gratuitas de IA. <strong>Atención: la serie AI-900 ha sido sustituida por el examen <a href="https://learn.microsoft.com/es-es/credentials/certifications/exams/ai-901/">AI-901</a></strong> (Azure AI Fundamentals, actualizado el 15 abr. 2026, ya con Microsoft Foundry y agentes)</td>
      <td style="text-align: left">Formación gratis; examen de pago salvo voucher o descuento estudiante</td>
      <td style="text-align: left"><a href="https://learn.microsoft.com/es-es/credentials/certifications/azure-ai-fundamentals/">👉 Azure AI Fundamentals</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>IBM SkillsBuild</strong> 🆕</td>
      <td style="text-align: left">Itinerarios gratuitos de fundamentos de IA, IA generativa, <em>prompt engineering</em>, machine learning e IA responsable, en más de 20 idiomas y varios en español</td>
      <td style="text-align: left">Credenciales digitales verificables</td>
      <td style="text-align: left"><a href="https://skillsbuild.org/">👉 skillsbuild.org</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Elements of AI</strong></td>
      <td style="text-align: left">El clásico de la Universidad de Helsinki, en español y sin necesidad de programar</td>
      <td style="text-align: left">Certificado de finalización</td>
      <td style="text-align: left"><a href="https://www.elementsofai.com/es/">👉 elementsofai.com</a></td>
    </tr>
    <tr>
      <td style="text-align: left"><strong>Samsung Innovation Campus</strong> 🇪🇸</td>
      <td style="text-align: left">Cursos gratuitos de Python, IA e IA generativa en España junto a la UPV, la UPM y la UMA. Dirigido preferentemente a jóvenes de 18 a 25 años y a mujeres de 18 a 35</td>
      <td style="text-align: left">Diploma universitario + microcredenciales</td>
      <td style="text-align: left"><a href="https://news.samsung.com/es/">👉 Samsung News España</a></td>
    </tr>
  </tbody>
</table>

<blockquote>
  <p>🧭 <strong>¿Te abruma tanta formación?</strong> Para eso creé el <strong><a href="https://davidbuenov.com/proyectos/ai-courses-catalog/">AI Courses Catalog</a></strong>, un catálogo inteligente donde filtrar y comparar cursos de IA (y de Unreal Engine) sin perderte en el laberinto de plataformas. Es gratuito y lo voy actualizando.</p>
</blockquote>

<h3 id="️-no-confundas-conceptos">⚖️ No confundas conceptos</h3>

<ul>
  <li><strong>Gratis con certificado:</strong> IBM SkillsBuild, insignias de Google Skills, cursos de Anthropic Academy.</li>
  <li><strong>Gratis sin certificado:</strong> modo auditoría de Coursera, edX y MOOCs universitarios.</li>
  <li><strong>Certificado de pago:</strong> los certificados verificados de Coursera y edX.</li>
  <li><strong>Certificación profesional:</strong> examen supervisado de Microsoft, Google Cloud o AWS. Suele costar dinero… salvo las campañas gratuitas de Oracle o el 100 % de descuento de AWS Academy para docentes.</li>
</ul>

<hr />

<h2 id="️-consejos-para-que-no-te-rechacen-la-solicitud">🛠️ Consejos para que no te rechacen la solicitud</h2>

<ol>
  <li><strong>Usa siempre tu correo institucional:</strong> el dominio de tu universidad (.edu, .es, .mx, etc.) es tu llave maestra.</li>
  <li><strong>Verificación manual:</strong> si el sistema automático falla, sube un PDF de tu <strong>matrícula vigente</strong> o una foto de tu <strong>carnet universitario</strong>. Asegúrate de que se vea bien el año académico actual (2026-2027).</li>
  <li><strong>Docentes:</strong> para Canva y similares suele valer la cabecera de la nómina (tapando lo que no interese), el nombramiento o un justificante firmado por la dirección del centro.</li>
  <li><strong>Consulta a tu facultad o al servicio de IT:</strong> muchas universidades tienen convenios directos (ChatGPT Edu, Canva Campus, AWS Academy…). Antes de pagar nada, pregunta si ya tienes una licencia asignada a tu usuario.</li>
  <li><strong>Apunta la fecha de caducidad:</strong> varias de estas ofertas piden tarjeta y se renuevan solas a precio completo.</li>
</ol>

<hr />

<blockquote>
  <p>⚠️ <strong>Aviso:</strong> las ofertas de IA para estudiantes cambian a una velocidad brutal —en cinco meses han caducado dos de las de esta lista—. Antes de registrarte comprueba siempre la página oficial, la fecha de validez, los requisitos de verificación y si te piden método de pago. Y no confundas un plan gratuito con una prueba temporal, ni una insignia de finalización con una certificación profesional. Las condiciones también varían según la región geográfica.</p>
</blockquote>

<hr />

<p><strong>¿Te ha sido útil esta lista? ¡Compártela con tus compañeros y colegas para que nadie se quede atrás en la era de la IA y si conoces más ofertas dímelo para incluirlas en la lista!</strong></p>]]></content><author><name>David Bueno Vallejo</name></author><category term="Docencia y Universidad" /><category term="Inteligencia Artificial" /><category term="AI" /><category term="Educación" /><category term="Estudiantes" /><category term="Docentes" /><category term="HerramientasIA" /><category term="Productividad" /><category term="Programación" /><category term="Certificaciones" /><summary type="html"><![CDATA[Recopilación actualizada a 26 de agosto de 2026: herramientas de IA con planes gratuitos o descuentos para estudiantes y docentes, con las ofertas caducadas marcadas y formación con certificación.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://davidbuenov.com/images/dbv/blog/guia2026iapremium.webp" /><media:content medium="image" url="https://davidbuenov.com/images/dbv/blog/guia2026iapremium.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Buenas Prácticas de Programación para IA: Un Recurso Colaborativo y en Constante Evolución</title><link href="https://davidbuenov.com/docencia%20y%20universidad/programaci%C3%B3n%20y%20tecnolog%C3%ADa/inteligencia%20artificial/2025/10/25/buenas-practicas-de-programacion-para-ia-un-recurso-colaborativo-y-en-constante-evolucion.html" rel="alternate" type="text/html" title="Buenas Prácticas de Programación para IA: Un Recurso Colaborativo y en Constante Evolución" /><published>2025-10-25T10:00:00+02:00</published><updated>2025-10-25T10:00:00+02:00</updated><id>https://davidbuenov.com/docencia%20y%20universidad/programaci%C3%B3n%20y%20tecnolog%C3%ADa/inteligencia%20artificial/2025/10/25/buenas-practicas-de-programacion-para-ia-un-recurso-colaborativo-y-en-constante-evolucion</id><content type="html" xml:base="https://davidbuenov.com/docencia%20y%20universidad/programaci%C3%B3n%20y%20tecnolog%C3%ADa/inteligencia%20artificial/2025/10/25/buenas-practicas-de-programacion-para-ia-un-recurso-colaborativo-y-en-constante-evolucion.html"><![CDATA[<p>En la era de la inteligencia artificial generativa, donde herramientas como GitHub Copilot, ChatGPT y otros asistentes de código están revolucionando la forma en que desarrollamos software, surge una pregunta fundamental: <strong>¿cómo asegurarnos de que el código generado por IA siga las mejores prácticas de la industria?</strong></p>

<h2 id="el-propósito-del-repositorio">El Propósito del Repositorio</h2>

<p>He creado <strong><a href="https://github.com/davidbuenov/ai-coding-best-practices">ai-coding-best-practices</a></strong>, un repositorio público que recopila buenas prácticas de programación específicamente diseñadas para ser utilizadas como contexto y guía cuando trabajamos con herramientas de IA para generar código.</p>

<p>Este proyecto nace de una necesidad real: cuando le pedimos a una IA que genere código, el resultado depende en gran medida del contexto que le proporcionamos. Si no especificamos claramente nuestras expectativas sobre estilo, patrones de diseño, seguridad y rendimiento, obtendremos código funcional, pero no necesariamente código de calidad profesional.</p>

<h2 id="qué-encontrarás-en-el-repositorio">¿Qué Encontrarás en el Repositorio?</h2>

<p>Actualmente, el repositorio incluye guías de buenas prácticas para:</p>

<h3 id="lenguajes-de-propósito-general">Lenguajes de Propósito General</h3>

<ul>
  <li><strong>Python</strong>: Patrones, tipado, manejo de errores y buenas prácticas pythónicas</li>
  <li><strong>Java</strong>: Principios SOLID, patrones de diseño y convenciones empresariales</li>
  <li><strong>C++</strong>: Gestión de memoria, RAII y buenas prácticas modernas (C++11/14/17/20)</li>
  <li><strong>C#</strong>: Convenciones .NET, async/await y patrones empresariales</li>
  <li><strong>TypeScript</strong>: Tipado fuerte, interfaces y buenas prácticas en el ecosistema JavaScript</li>
</ul>

<h3 id="tecnologías-especializadas">Tecnologías Especializadas</h3>

<ul>
  <li><strong>SQL y Oracle PL/SQL</strong>: Optimización de consultas, normalización y seguridad</li>
  <li><strong>Web</strong>: HTML semántico, accesibilidad, CSS moderno y JavaScript</li>
  <li><strong>Unity (C#)</strong>: Patrones específicos para desarrollo de videojuegos</li>
  <li><strong>Unreal Engine (C++)</strong>: Buenas prácticas en el framework de Epic Games</li>
</ul>

<p>Cada documento está estructurado para ser <strong>fácilmente copiable como contexto</strong> cuando trabajas con asistentes de IA, permitiéndote obtener código que ya cumple con estándares profesionales desde el primer momento.</p>

<h2 id="la-filosofía-colaboración-abierta">La Filosofía: Colaboración Abierta</h2>

<p>Este repositorio <strong>no pretende ser la verdad absoluta</strong> ni un manual cerrado. Al contrario, es un proyecto vivo que debe evolucionar con:</p>

<ul>
  <li>Las nuevas versiones de lenguajes y frameworks</li>
  <li>Las tendencias emergentes en desarrollo de software</li>
  <li>Las experiencias y conocimientos de la comunidad</li>
  <li>Los casos de uso reales que encuentran los desarrolladores</li>
</ul>

<h3 id="tu-opinión-importa">Tu Opinión Importa</h3>

<p>Estoy completamente abierto a:</p>

<p>✅ <strong>Sugerencias de mejora</strong>: ¿Crees que falta algo importante? ¿Hay alguna práctica que debería añadirse o modificarse?</p>

<p>✅ <strong>Nuevos lenguajes o frameworks</strong>: ¿Trabajas con tecnologías que no están incluidas? Me encantaría expandir el repositorio.</p>

<p>✅ <strong>Correcciones</strong>: Si encuentras algo incorrecto o desactualizado, por favor házmelo saber.</p>

<p>✅ <strong>Casos de uso</strong>: Comparte cómo estás utilizando estas guías y qué resultados estás obteniendo.</p>

<p>✅ <strong>Pull requests</strong>: El repositorio está abierto a contribuciones directas. Si quieres añadir contenido o mejorar algo, ¡adelante!</p>

<h2 id="cómo-puedes-contribuir">Cómo Puedes Contribuir</h2>

<p>Hay varias formas de participar:</p>

<ol>
  <li><strong>Abre un issue</strong> en GitHub con tus sugerencias o comentarios</li>
  <li><strong>Crea un pull request</strong> con tus mejoras o nuevas guías</li>
  <li><strong>Comparte tu experiencia</strong> sobre cómo estás usando estas guías con herramientas de IA</li>
  <li><strong>Dale una estrella</strong> ⭐ al repositorio si te parece útil</li>
  <li><strong>Difunde el proyecto</strong> para que llegue a más desarrolladores</li>
</ol>

<h2 id="el-futuro-del-desarrollo-asistido-por-ia">El Futuro del Desarrollo Asistido por IA</h2>

<p>Creo firmemente que el futuro del desarrollo de software no es “IA vs humanos”, sino <strong>humanos potenciados por IA</strong>. Para que esta colaboración sea efectiva, necesitamos:</p>

<ul>
  <li>Guías claras y compartidas sobre qué es código de calidad</li>
  <li>Contextos bien definidos para las herramientas de IA</li>
  <li>Una comunidad activa que comparta conocimiento</li>
  <li>Adaptación constante a nuevas tecnologías y paradigmas</li>
</ul>

<p>Este repositorio es mi aporte a ese futuro. Pero solo será verdaderamente útil si es un <strong>esfuerzo colectivo</strong>.</p>

<h2 id="únete-al-proyecto">Únete al Proyecto</h2>

<p>Visita el repositorio en: <strong><a href="https://github.com/davidbuenov/ai-coding-best-practices">github.com/davidbuenov/ai-coding-best-practices</a></strong></p>

<p>Ya seas un desarrollador experimentado con años de experiencia, o alguien que está empezando a explorar el desarrollo asistido por IA, tu perspectiva es valiosa.</p>

<p>¿Qué te parece el proyecto? ¿Qué añadirías? ¿Qué cambiarías?</p>

<p>Espero tus comentarios, sugerencias y contribuciones. Juntos podemos crear un recurso verdaderamente útil para toda la comunidad de desarrollo.</p>

<hr />

<p><em>Este es un proyecto de código abierto bajo licencia MIT. Siéntete libre de usar, modificar y compartir estas guías.</em></p>]]></content><author><name>David Bueno Vallejo</name></author><category term="Docencia y Universidad" /><category term="Programación y Tecnología" /><category term="Inteligencia Artificial" /><category term="AI" /><category term="BestPractices" /><category term="Python" /><category term="Java" /><category term="CPlusPlus" /><category term="CSharp" /><category term="TypeScript" /><category term="SQL" /><category term="GitHubCopilot" /><category term="ChatGPT" /><category term="OpenSource" /><summary type="html"><![CDATA[Un repositorio colaborativo de buenas prácticas de programación diseñado específicamente para trabajar con IA generativa. Guías para Python, Java, C++, TypeScript y más, listas para usar como contexto con GitHub Copilot, ChatGPT y otras herramientas de desarrollo asistido por IA.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://davidbuenov.com/images/dbv/blog/buenasPracticas.webp" /><media:content medium="image" url="https://davidbuenov.com/images/dbv/blog/buenasPracticas.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Si Tu Código Python Tiene 7 `return`, Tu IA Te Odia</title><link href="https://davidbuenov.com/docencia%20y%20universidad/programaci%C3%B3n%20y%20tecnolog%C3%ADa/inteligencia%20artificial/2025/10/19/si-tu-codigo-python-tiene-7-return-tu-ia-te-odia.html" rel="alternate" type="text/html" title="Si Tu Código Python Tiene 7 `return`, Tu IA Te Odia" /><published>2025-10-19T10:00:00+02:00</published><updated>2025-10-19T10:00:00+02:00</updated><id>https://davidbuenov.com/docencia%20y%20universidad/programaci%C3%B3n%20y%20tecnolog%C3%ADa/inteligencia%20artificial/2025/10/19/si-tu-codigo-python-tiene-7-return-tu-ia-te-odia</id><content type="html" xml:base="https://davidbuenov.com/docencia%20y%20universidad/programaci%C3%B3n%20y%20tecnolog%C3%ADa/inteligencia%20artificial/2025/10/19/si-tu-codigo-python-tiene-7-return-tu-ia-te-odia.html"><![CDATA[<blockquote>
  <p><strong>TL;DR:</strong> Deja de aceptar código Python mediocre de ChatGPT, Copilot o cualquier IA. Este prompt de sistema te garantiza código profesional con Python 3.10+, type hints modernos, y las mejores prácticas que tus compañeros (y tu yo del futuro) agradecerán.</p>
</blockquote>

<hr />

<h2 id="-el-problema-tu-ia-genera-código-como-si-fuera-2015">🤔 El Problema: Tu IA Genera Código Como Si Fuera 2015</h2>

<p>Acabas de pedirle a ChatGPT que te genere una función Python. Te devuelve esto:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">procesar_usuario</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">None</span>
    <span class="k">if</span> <span class="n">data</span> <span class="o">==</span> <span class="sh">""</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">None</span>
    <span class="k">if</span> <span class="sh">"</span><span class="s">nombre</span><span class="sh">"</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">error</span><span class="sh">"</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">usuario</span> <span class="o">=</span> <span class="n">data</span><span class="p">[</span><span class="sh">"</span><span class="s">nombre</span><span class="sh">"</span><span class="p">]</span>
        <span class="k">if</span> <span class="n">usuario</span> <span class="o">==</span> <span class="sh">""</span><span class="p">:</span>
            <span class="k">return</span> <span class="sh">"</span><span class="s">vacio</span><span class="sh">"</span>
        <span class="k">return</span> <span class="n">usuario</span><span class="p">.</span><span class="nf">upper</span><span class="p">()</span>
    <span class="k">except</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">error</span><span class="sh">"</span>
</code></pre></div></div>

<p><strong>Problemas evidentes:</strong></p>

<ul>
  <li>❌ 6 <code class="language-plaintext highlighter-rouge">return</code> statements (debugging imposible)</li>
  <li>❌ Cero type hints</li>
  <li>❌ <code class="language-plaintext highlighter-rouge">except:</code> sin especificar excepción</li>
  <li>❌ Lógica duplicada de validación</li>
  <li>❌ Sin documentación</li>
</ul>

<p><strong>¿Te suena familiar?</strong> Pues no eres el único. Estudios recientes muestran que la mayoría del código Python generado por IA presenta problemas de calidad significativos:</p>

<ul>
  <li>📊 Un análisis de GitHub Copilot mostró que <strong>~40% del código generado requiere correcciones importantes</strong> antes de ser utilizable en producción (<a href="https://github.blog/2023-06-13-survey-reveals-ais-impact-on-the-developer-experience/">GitHub, 2023</a>)</li>
  <li>📊 Investigación de la Universidad de Stanford encontró que el código generado por LLMs <strong>rara vez sigue convenciones modernas</strong> de tipo y documentación (<a href="https://arxiv.org/abs/2107.03374">Chen et al., 2021</a>)</li>
  <li>📊 En mi experiencia como profesor universitario revisando códigos desde 1997: <strong>la mayoría del código IA carece de type hints, manejo de errores apropiado, y patrones de control de flujo limpios</strong></li>
</ul>

<p><strong>¿Por qué?</strong> Los modelos se entrenan principalmente con código legacy de GitHub, donde las mejores prácticas modernas (Python 3.10+) aún son minoría.</p>

<hr />

<h2 id="-la-solución-un-prompt-de-sistema-profesional">🎯 La Solución: Un Prompt de Sistema Profesional</h2>

<p>Después de analizar muchas lineas de código de alumnos, creé este <strong>prompt de sistema</strong> que obliga a cualquier modelo de lenguaje a generar código Python de calidad profesional.</p>

<h3 id="-cómo-usarlo">📋 Cómo Usarlo</h3>

<h4 id="1-con-chatgpt">1. <strong>Con ChatGPT:</strong></h4>

<ul>
  <li>Ve a <strong>Settings</strong> → <strong>Personalization</strong> → <strong>Custom Instructions</strong></li>
  <li>Pega el prompt en el campo “How would you like ChatGPT to respond?”</li>
  <li>O simplemente pégalo al inicio de cada conversación</li>
</ul>

<h4 id="2-con-google-gemini">2. <strong>Con Google Gemini:</strong></h4>

<ul>
  <li><strong>En Gemini Web/App:</strong> Inicia tu conversación pegando el prompt como primer mensaje, luego ancla la conversación (📌) para reutilizarla</li>
  <li><strong>En Google AI Studio:</strong> Crea un “System instruction” con el prompt</li>
  <li><strong>Via API:</strong> Usa el parámetro <code class="language-plaintext highlighter-rouge">system_instruction</code> al crear el cliente:</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">google.generativeai</span> <span class="k">as</span> <span class="n">genai</span>

<span class="n">model</span> <span class="o">=</span> <span class="n">genai</span><span class="p">.</span><span class="nc">GenerativeModel</span><span class="p">(</span>
    <span class="n">model_name</span><span class="o">=</span><span class="sh">"</span><span class="s">gemini-2.0-flash-001</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">system_instruction</span><span class="o">=</span><span class="sh">"</span><span class="s">[PEGA AQUÍ EL PROMPT COMPLETO]</span><span class="sh">"</span>
<span class="p">)</span>
</code></pre></div></div>

<h4 id="3-con-claude-anthropic">3. <strong>Con Claude (Anthropic):</strong></h4>

<ul>
  <li><strong>En Claude Web:</strong> Crea un “Project” y agrega el prompt como “Project Instructions”</li>
  <li><strong>Via API:</strong> Usa el parámetro <code class="language-plaintext highlighter-rouge">system</code> en tus llamadas</li>
</ul>

<h4 id="4-con-github-copilot">4. <strong>Con GitHub Copilot:</strong></h4>

<ul>
  <li>Agrégalo en un comentario al inicio de tu archivo Python:</li>
</ul>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># CODING STANDARDS:
# [versión resumida del prompt]
</span></code></pre></div></div>

<h4 id="5-con-tu-ide-vs-code-pycharm-etc">5. <strong>Con tu IDE (VS Code, PyCharm, etc.):</strong></h4>

<ul>
  <li>Configúralo como snippet o template de archivo</li>
  <li>O usa extensiones como “Project Templates”</li>
</ul>

<hr />

<h2 id="-el-prompt-definitivo">🔥 El Prompt Definitivo</h2>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Eres un experto desarrollador Python especializado en código de producción con máxima calidad y disciplina de tipado. Al generar código Python, DEBES seguir ESTRICTAMENTE estos principios:

<span class="gu">### 📋 REGLAS OBLIGATORIAS</span>

<span class="gu">#### 1️⃣ Type Hints Modernos (Python 3.10+)</span>
<span class="p">-</span> ✅ USA: <span class="sb">`str | None`</span>, <span class="sb">`int | None`</span>, <span class="sb">`list[str]`</span>, <span class="sb">`dict[str, int]`</span>
<span class="p">-</span> ❌ NUNCA: <span class="sb">`Optional[str]`</span>, <span class="sb">`Union[str, None]`</span>, <span class="sb">`List[str]`</span>, <span class="sb">`Dict[str, int]`</span>
<span class="p">-</span> ✅ Declara tipos en TODAS las variables, parámetros y returns
<span class="p">-</span> ✅ Usa <span class="sb">`TypeAlias`</span> para tipos complejos reutilizables
<span class="p">-</span> ✅ Usa <span class="sb">`Literal["valor1", "valor2"]`</span> para valores restringidos

<span class="gu">#### 2️⃣ Funciones Limpias</span>
<span class="p">-</span> ✅ UN SOLO <span class="sb">`return`</span> al final (máximo 2 justificados con guard clauses)
<span class="p">-</span> ✅ Guard clauses al inicio para validaciones (fail fast)
<span class="p">-</span> ✅ Funciones auxiliares privadas con prefijo <span class="sb">`_`</span> para lógica compleja
<span class="p">-</span> ✅ Máximo 30 líneas por función
<span class="p">-</span> ❌ NUNCA múltiples returns dispersos que confundan el flujo

<span class="gu">#### 3️⃣ Documentación Completa</span>
<span class="p">-</span> ✅ Docstrings en TODAS las funciones con formato Google/Sphinx:
  <span class="p">```</span><span class="nl">python
</span>  <span class="k">def</span> <span class="nf">funcion</span><span class="p">(</span><span class="n">param</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
      <span class="sh">"""</span><span class="s">Descripción breve de una línea.
      
      Args:
          param: Descripción del parámetro
          
      Returns:
          Descripción del valor de retorno
          
      Raises:
          ValueError: Cuándo y por qué se lanza
      </span><span class="sh">"""</span>
  <span class="p">```</span>

<span class="gu">#### 4️⃣ Manejo de Recursos</span>
<span class="p">-</span> ✅ Usa <span class="sb">`try/except/finally`</span> para cerrar recursos (cursores, archivos, conexiones)
<span class="p">-</span> ✅ Inicializa recursos en <span class="sb">`None`</span> antes del <span class="sb">`try`</span>
<span class="p">-</span> ✅ Cierra en <span class="sb">`finally`</span> con validación <span class="sb">`if recurso is not None:`</span>
<span class="p">-</span> ✅ Captura excepciones específicas antes que <span class="sb">`Exception`</span>

<span class="gu">#### 5️⃣ Variables y Estado</span>
<span class="p">-</span> ✅ Variables locales con tipos explícitos: <span class="sb">`resultado: str = ""`</span>
<span class="p">-</span> ✅ Evita variables globales; pasa datos por parámetros
<span class="p">-</span> ✅ Usa <span class="sb">`TypedDict`</span> para estructuras de datos compartidas
<span class="p">-</span> ❌ NUNCA uses <span class="sb">`global`</span> dentro de funciones (salvo casos MUY justificados)

<span class="gu">#### 6️⃣ Validación y Errores</span>
<span class="p">-</span> ✅ Valida precondiciones con guard clauses al inicio
<span class="p">-</span> ✅ Lanza excepciones específicas (<span class="sb">`ValueError`</span>, <span class="sb">`TypeError`</span>, etc.)
<span class="p">-</span> ✅ Mensajes de error descriptivos y útiles
<span class="p">-</span> ✅ Logging de errores para debugging

<span class="gu">### 🎯 PATRÓN DE FUNCIÓN IDEAL</span>

<span class="p">```</span><span class="nl">python
</span><span class="k">def</span> <span class="nf">procesar_datos</span><span class="p">(</span><span class="n">entrada</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">opciones</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="bp">None</span> <span class="o">=</span> <span class="bp">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
    <span class="sh">"""</span><span class="s">Procesa los datos de entrada según las opciones.
    
    Args:
        entrada: Datos a procesar
        opciones: Configuración opcional del procesamiento
        
    Returns:
        Tupla con (éxito, mensaje_resultado)
        
    Raises:
        ValueError: Si entrada está vacía
    </span><span class="sh">"""</span>
    <span class="c1"># Guard clauses primero
</span>    <span class="k">if</span> <span class="ow">not</span> <span class="n">entrada</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">La entrada no puede estar vacía</span><span class="sh">"</span><span class="p">)</span>
    
    <span class="k">if</span> <span class="n">opciones</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">opciones</span> <span class="o">=</span> <span class="p">{}</span>
    
    <span class="c1"># Variables con tipos explícitos
</span>    <span class="n">resultado</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="sh">""</span>
    <span class="n">exito</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="bp">False</span>
    
    <span class="c1"># Lógica principal (extraída a funciones auxiliares si es compleja)
</span>    <span class="k">try</span><span class="p">:</span>
        <span class="n">resultado</span> <span class="o">=</span> <span class="nf">_procesar_interno</span><span class="p">(</span><span class="n">entrada</span><span class="p">,</span> <span class="n">opciones</span><span class="p">)</span>
        <span class="n">exito</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="n">resultado</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">Error: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span>
        <span class="n">exito</span> <span class="o">=</span> <span class="bp">False</span>
    
    <span class="c1"># UN SOLO return al final
</span>    <span class="k">return</span> <span class="n">exito</span><span class="p">,</span> <span class="n">resultado</span>


<span class="k">def</span> <span class="nf">_procesar_interno</span><span class="p">(</span><span class="n">entrada</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">opciones</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">Función auxiliar privada con lógica específica.</span><span class="sh">"""</span>
    <span class="c1"># Implementación aislada y testable
</span>    <span class="k">return</span> <span class="n">entrada</span><span class="p">.</span><span class="nf">upper</span><span class="p">()</span>
<span class="p">```</span>

<span class="gu">### ✅ CHECKLIST PRE-COMMIT</span>
Antes de mostrar código, verifica:
<span class="p">-</span> [ ] Todos los parámetros y returns tienen type hints
<span class="p">-</span> [ ] Todas las variables locales tienen tipos explícitos
<span class="p">-</span> [ ] Usa sintaxis moderna (<span class="sb">`|`</span> en lugar de <span class="sb">`Optional`</span>)
<span class="p">-</span> [ ] Máximo 2 returns por función
<span class="p">-</span> [ ] Guard clauses al inicio
<span class="p">-</span> [ ] Docstrings completos
<span class="p">-</span> [ ] Recursos se cierran en <span class="sb">`finally`</span>
<span class="p">-</span> [ ] Sin variables globales innecesarias

<span class="gu">### 🚫 ANTI-PATRONES A EVITAR</span>
<span class="p">```</span><span class="nl">python
</span><span class="c1"># ❌ MAL - Sin tipos, múltiples returns, sin docs
</span><span class="k">def</span> <span class="nf">procesar</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">x</span><span class="p">:</span> <span class="k">return</span> <span class="bp">None</span>
    <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="sh">"</span><span class="s">a</span><span class="sh">"</span><span class="p">:</span> <span class="k">return</span> <span class="mi">1</span>
    <span class="k">if</span> <span class="n">x</span> <span class="o">==</span> <span class="sh">"</span><span class="s">b</span><span class="sh">"</span><span class="p">:</span> <span class="k">return</span> <span class="mi">2</span>
    <span class="k">return</span> <span class="mi">0</span>

<span class="c1"># ✅ BIEN - Con tipos, un return, documentado
</span><span class="k">def</span> <span class="nf">procesar</span><span class="p">(</span><span class="n">entrada</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">int</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">Convierte entrada en código numérico.
    
    Args:
        entrada: String a convertir
        
    Returns:
        Código numérico correspondiente
    </span><span class="sh">"""</span>
    <span class="c1"># Guard clause
</span>    <span class="k">if</span> <span class="ow">not</span> <span class="n">entrada</span><span class="p">:</span>
        <span class="k">return</span> <span class="mi">0</span>
    
    <span class="c1"># Mapeo claro
</span>    <span class="n">codigos</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">a</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="sh">"</span><span class="s">b</span><span class="sh">"</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>
    <span class="n">resultado</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="n">codigos</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">entrada</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    
    <span class="k">return</span> <span class="n">resultado</span>
<span class="p">```</span>

Si no puedes seguir TODAS estas reglas, explica por qué antes de generar el código.
</code></pre></div></div>

<p><strong>👆 FIN DEL PROMPT - Copia todo desde “Eres un experto…” hasta aquí 👆</strong></p>

<hr />

<h2 id="-versión-corta-para-usar-rápidamente">🚀 Versión Corta (Para Usar Rápidamente)</h2>

<p>Si tienes límite de tokens en tu contexto, usa esta versión comprimida:</p>

<div class="language-markdown highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Genera código Python 3.10+ profesional siguiendo:
<span class="p">1.</span> Type hints modernos: <span class="sb">`str | None`</span> (no <span class="sb">`Optional`</span>), tipos en TODO
<span class="p">2.</span> UN return por función, guard clauses al inicio
<span class="p">3.</span> Docstrings completos (Args, Returns, Raises)
<span class="p">4.</span> Funciones privadas <span class="sb">`_auxiliar()`</span> para lógica compleja
<span class="p">5.</span> Recursos cerrados en <span class="sb">`finally`</span>
<span class="p">6.</span> Variables locales tipadas: <span class="sb">`resultado: str = ""`</span>
<span class="p">7.</span> Sin globales, validaciones tempranas, excepciones específicas
</code></pre></div></div>

<hr />

<h2 id="-antes-y-después-ejemplos-reales">💡 Antes y Después: Ejemplos Reales</h2>

<h3 id="-código-generado-sin-el-prompt">❌ Código Generado SIN el Prompt</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">get_user_data</span><span class="p">(</span><span class="n">user_id</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">user_id</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">None</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">conn</span> <span class="o">=</span> <span class="nf">get_db_connection</span><span class="p">()</span>
        <span class="n">cursor</span> <span class="o">=</span> <span class="n">conn</span><span class="p">.</span><span class="nf">cursor</span><span class="p">()</span>
        <span class="n">cursor</span><span class="p">.</span><span class="nf">execute</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">SELECT * FROM users WHERE id = </span><span class="si">{</span><span class="n">user_id</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        <span class="n">data</span> <span class="o">=</span> <span class="n">cursor</span><span class="p">.</span><span class="nf">fetchone</span><span class="p">()</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">None</span>
        <span class="k">return</span> <span class="n">data</span>
    <span class="k">except</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">None</span>
</code></pre></div></div>

<p><strong>Problemas:</strong></p>

<ul>
  <li>SQL injection vulnerable</li>
  <li>No cierra recursos</li>
  <li><code class="language-plaintext highlighter-rouge">except:</code> genérico</li>
  <li>4 returns</li>
  <li>Sin tipos</li>
</ul>

<h3 id="-código-generado-con-el-prompt">✅ Código Generado CON el Prompt</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">get_user_data</span><span class="p">(</span><span class="n">user_id</span><span class="p">:</span> <span class="nb">int</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="bp">None</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">Obtiene datos de usuario desde la base de datos.
    
    Args:
        user_id: ID único del usuario
        
    Returns:
        Diccionario con datos del usuario o None si no existe
        
    Raises:
        ValueError: Si user_id es inválido
        DatabaseError: Si hay problemas de conexión
    </span><span class="sh">"""</span>
    <span class="c1"># Guard clause
</span>    <span class="k">if</span> <span class="n">user_id</span> <span class="o">&lt;=</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">user_id debe ser positivo</span><span class="sh">"</span><span class="p">)</span>
    
    <span class="n">cursor</span><span class="p">:</span> <span class="n">Cursor</span> <span class="o">|</span> <span class="bp">None</span> <span class="o">=</span> <span class="bp">None</span>
    <span class="n">resultado</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="bp">None</span> <span class="o">=</span> <span class="bp">None</span>
    
    <span class="k">try</span><span class="p">:</span>
        <span class="n">conn</span><span class="p">:</span> <span class="n">Connection</span> <span class="o">=</span> <span class="nf">get_db_connection</span><span class="p">()</span>
        <span class="n">cursor</span> <span class="o">=</span> <span class="n">conn</span><span class="p">.</span><span class="nf">cursor</span><span class="p">()</span>
        
        <span class="c1"># Usar parámetros preparados (previene SQL injection)
</span>        <span class="n">cursor</span><span class="p">.</span><span class="nf">execute</span><span class="p">(</span><span class="sh">"</span><span class="s">SELECT * FROM users WHERE id = ?</span><span class="sh">"</span><span class="p">,</span> <span class="p">(</span><span class="n">user_id</span><span class="p">,))</span>
        <span class="n">data</span><span class="p">:</span> <span class="nb">tuple</span> <span class="o">|</span> <span class="bp">None</span> <span class="o">=</span> <span class="n">cursor</span><span class="p">.</span><span class="nf">fetchone</span><span class="p">()</span>
        
        <span class="k">if</span> <span class="n">data</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">resultado</span> <span class="o">=</span> <span class="nf">_parse_user_data</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
            
    <span class="k">except</span> <span class="n">DatabaseError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="n">logger</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Error de BD al obtener usuario </span><span class="si">{</span><span class="n">user_id</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">raise</span>
        
    <span class="k">finally</span><span class="p">:</span>
        <span class="k">if</span> <span class="n">cursor</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
            <span class="n">cursor</span><span class="p">.</span><span class="nf">close</span><span class="p">()</span>
    
    <span class="k">return</span> <span class="n">resultado</span>


<span class="k">def</span> <span class="nf">_parse_user_data</span><span class="p">(</span><span class="n">raw_data</span><span class="p">:</span> <span class="nb">tuple</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
    <span class="sh">"""</span><span class="s">Función auxiliar: Convierte tupla de BD a diccionario.</span><span class="sh">"""</span>
    <span class="k">return</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">id</span><span class="sh">"</span><span class="p">:</span> <span class="nf">str</span><span class="p">(</span><span class="n">raw_data</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span>
        <span class="sh">"</span><span class="s">nombre</span><span class="sh">"</span><span class="p">:</span> <span class="n">raw_data</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span>
        <span class="sh">"</span><span class="s">email</span><span class="sh">"</span><span class="p">:</span> <span class="n">raw_data</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>
    <span class="p">}</span>
</code></pre></div></div>

<p><strong>Mejoras:</strong></p>

<ul>
  <li>✅ Type hints completos</li>
  <li>✅ Prevención de SQL injection</li>
  <li>✅ Recursos cerrados en <code class="language-plaintext highlighter-rouge">finally</code></li>
  <li>✅ Excepciones específicas</li>
  <li>✅ UN solo return</li>
  <li>✅ Documentación completa</li>
  <li>✅ Función auxiliar para parsing</li>
</ul>

<hr />

<h2 id="-por-qué-importa-lecciones-de-un-profesor">🎓 Por Qué Importa: Lecciones de un Profesor</h2>

<p>Enseño Python a nivel universitario y veo estos errores <strong>todos los días</strong>:</p>

<h3 id="1️⃣-el-problema-de-los-múltiples-returns">1️⃣ <strong>El Problema de los Múltiples Returns</strong></h3>

<p>Cuando tienes 7 <code class="language-plaintext highlighter-rouge">return</code> en una función:</p>

<ul>
  <li>🐛 El debugging es una pesadilla (¿cuál return se ejecutó?)</li>
  <li>🧪 Testing es complejo (necesitas 7 casos de prueba mínimo)</li>
  <li>📖 Leer el código requiere mental gymnastics</li>
</ul>

<p><strong>Solución:</strong> UN return al final con una variable de resultado.</p>

<h3 id="2️⃣-python-310-existe-desde-2021">2️⃣ <strong>Python 3.10+ Existe Desde 2021</strong></h3>

<p>Si tu código todavía usa <code class="language-plaintext highlighter-rouge">Optional[str]</code> en lugar de <code class="language-plaintext highlighter-rouge">str | None</code>, <strong>estás 4 años atrasado</strong>:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ❌ Sintaxis antigua (Python 3.5-3.9)
</span><span class="kn">from</span> <span class="n">typing</span> <span class="kn">import</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span>
<span class="n">nombre</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">edades</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">25</span><span class="p">,</span> <span class="mi">30</span><span class="p">]</span>
<span class="n">config</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>

<span class="c1"># ✅ Sintaxis moderna (Python 3.10+)
</span><span class="n">nombre</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="bp">None</span> <span class="o">=</span> <span class="bp">None</span>
<span class="n">edades</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">25</span><span class="p">,</span> <span class="mi">30</span><span class="p">]</span>
<span class="n">config</span><span class="p">:</span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
</code></pre></div></div>

<p><strong>Ventajas:</strong></p>

<ul>
  <li>Más legible (se parece a TypeScript/Kotlin)</li>
  <li>Menos imports</li>
  <li>Menos verboso</li>
  <li>Es el estándar actual</li>
</ul>

<h3 id="3️⃣-type-hints-no-son-opcionales">3️⃣ <strong>Type Hints No Son Opcionales</strong></h3>

<p>Python es dinámico, pero eso no significa que debas escribir código sin tipos:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ❌ Nadie sabe qué diablos hace esto
</span><span class="k">def</span> <span class="nf">procesar</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">z</span><span class="p">):</span>
    <span class="k">return</span> <span class="nf">x</span><span class="p">(</span><span class="n">y</span><span class="p">)</span> <span class="k">if</span> <span class="n">z</span> <span class="k">else</span> <span class="n">y</span>

<span class="c1"># ✅ Ahora está cristalino
</span><span class="k">def</span> <span class="nf">procesar</span><span class="p">(</span>
    <span class="n">transformador</span><span class="p">:</span> <span class="n">Callable</span><span class="p">[[</span><span class="nb">str</span><span class="p">],</span> <span class="nb">str</span><span class="p">],</span>
    <span class="n">entrada</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
    <span class="n">aplicar</span><span class="p">:</span> <span class="nb">bool</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">Aplica transformador a entrada si aplicar es True.</span><span class="sh">"""</span>
    <span class="k">return</span> <span class="nf">transformador</span><span class="p">(</span><span class="n">entrada</span><span class="p">)</span> <span class="k">if</span> <span class="n">aplicar</span> <span class="k">else</span> <span class="n">entrada</span>
</code></pre></div></div>

<hr />

<h2 id="️-casos-de-uso-reales">🛠️ Casos de Uso Reales</h2>

<h3 id="1-para-estudiantes">1. <strong>Para Estudiantes</strong></h3>

<p>Usa este prompt cuando ChatGPT te ayude con tareas. Tu profesor notará la diferencia (y tu nota también).</p>

<h3 id="2-para-desarrolladores-junior">2. <strong>Para Desarrolladores Junior</strong></h3>

<p>Configura este prompt en tu IDE y aprende las mejores prácticas mientras codificas.</p>

<h3 id="3-para-code-reviews">3. <strong>Para Code Reviews</strong></h3>

<p>Comparte este prompt con tu equipo. Menos comentarios en PRs = más café time ☕</p>

<h3 id="4-para-proyectos-legacy">4. <strong>Para Proyectos Legacy</strong></h3>

<p>Usa este prompt para refactorizar código antiguo con ayuda de IA.</p>

<hr />

<h2 id="-comparación-con-vs-sin-prompt">📊 Comparación: Con vs Sin Prompt</h2>

<table>
  <thead>
    <tr>
      <th>Métrica</th>
      <th>Sin Prompt</th>
      <th>Con Prompt</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Type hints</td>
      <td>20%</td>
      <td>100%</td>
    </tr>
    <tr>
      <td>Docstrings</td>
      <td>10%</td>
      <td>100%</td>
    </tr>
    <tr>
      <td>Returns por función</td>
      <td>3-7</td>
      <td>1-2</td>
    </tr>
    <tr>
      <td>Manejo de recursos</td>
      <td>❌ <code class="language-plaintext highlighter-rouge">finally</code> olvidado</td>
      <td>✅ Siempre cerrado</td>
    </tr>
    <tr>
      <td>Excepciones</td>
      <td><code class="language-plaintext highlighter-rouge">except:</code> genérico</td>
      <td>Específicas</td>
    </tr>
    <tr>
      <td>Funciones auxiliares</td>
      <td>Monolitos</td>
      <td>Modular</td>
    </tr>
    <tr>
      <td>Legibilidad</td>
      <td>😖</td>
      <td>😊</td>
    </tr>
    <tr>
      <td>Mantenibilidad</td>
      <td>💀</td>
      <td>✅</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="-conclusión">🎯 Conclusión</h2>

<p><strong>Tu IA no te odia, simplemente no sabe que existen mejores prácticas.</strong></p>

<p>Usa este prompt y:</p>

<ul>
  <li>✅ Tu código pasará cualquier code review</li>
  <li>✅ Tus compañeros te respetarán</li>
  <li>✅ Tu GitHub no gritará “LO HIZO CHATGPT”</li>
  <li>✅ Aprenderás Python moderno en el proceso</li>
</ul>

<p><strong>Bonus:</strong> Este prompt también funciona con JavaScript/TypeScript, Java, y C# con pequeñas modificaciones.</p>

<hr />

<h2 id="-descarga-el-prompt">💾 Descarga el Prompt</h2>

<p>Guarda este prompt en:</p>

<ul>
  <li>Un archivo <code class="language-plaintext highlighter-rouge">.md</code> en tu repo</li>
  <li>Las instrucciones personalizadas de ChatGPT</li>
  <li>Un snippet de tu IDE favorito</li>
  <li>Un comentario en la primera línea de tus archivos</li>
</ul>

<hr />

<h2 id="-recursos-adicionales">📚 Recursos Adicionales</h2>

<ul>
  <li><a href="https://peps.python.org/pep-0604/">PEP 604: Union Type Syntax</a> - La razón detrás de <code class="language-plaintext highlighter-rouge">str | None</code></li>
  <li><a href="https://peps.python.org/pep-0586/">PEP 586: Literal Types</a> - Para valores restringidos</li>
  <li><a href="https://mypy.readthedocs.io/en/stable/cheat_sheet_py3.html">Python Type Hints Cheat Sheet</a></li>
</ul>

<hr />

<h2 id="-créditos">🤝 Créditos</h2>

<p>Este prompt fue desarrollado después de muchos años de docencia universitaria enseñando buenas prácticas a estudiantes y refactorizar proyectos profesionales que usaban IA para generar código.</p>

<p><strong>Agradecimientos especiales:</strong></p>

<ul>
  <li>A <strong>GitHub Copilot</strong> por ayudarme a refinar y estructurar este contenido durante múltiples iteraciones</li>
  <li>A mis estudiantes, cuyo código generado por IA me inspiró a crear esta guía</li>
  <li>A la comunidad de Python por mantener vivos los estándares de calidad</li>
</ul>

<p>Si te sirvió, <strong>compártelo con tu equipo</strong>. Entre todos podemos mejorar la calidad del código Python en el mundo. 🌍</p>

<hr />

<p><strong>P.D.:</strong> Si después de usar este prompt tu IA sigue generando código con 7 returns, probablemente estés usando GPT-2. Actualiza. Es 2025. 😉</p>]]></content><author><name>David Bueno Vallejo</name></author><category term="Docencia y Universidad" /><category term="Programación y Tecnología" /><category term="Inteligencia Artificial" /><category term="Python" /><category term="ChatGPT" /><category term="AI" /><category term="CleanCode" /><category term="TypeHints" /><category term="BestPractices" /><category term="Python310" /><category term="GitHubCopilot" /><category term="CodeQuality" /><category term="Refactoring" /><summary type="html"><![CDATA[Deja de aceptar código Python mediocre de ChatGPT, Copilot o cualquier IA. Este prompt de sistema te garantiza código profesional con Python 3.10+, type hints modernos, y las mejores prácticas que tus compañeros (y tu yo del futuro) agradecerán.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://davidbuenov.com/images/dbv/blog/python-ai-code-quality.webp" /><media:content medium="image" url="https://davidbuenov.com/images/dbv/blog/python-ai-code-quality.webp" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>