Artículos
Cómo programar con IA sin que el código se vuelva imposible de mantener: tests, buen diseño y revisión humana, explicados para que se entiendan.
Lo último
Programar con IAQué es la IA LimpiaIA Limpia es usar la IA para programar más rápido con código que se entienda, esté probado y sea fácil de cambiar. Qué es y cómo aplicarla.- Programar con IAAGENTS.md y CLAUDE.md: qué son, diferencias y qué ponerNivel avanzado
Qué son AGENTS.md y CLAUDE.md, en qué se diferencian, si Claude Code lee AGENTS.md y qué poner en cada uno, con un ejemplo y un hook probado.
- Programar con IAQué es un agente de IA para programar y cómo funciona
Qué es un agente de IA para programar y cómo funciona: modelo, herramientas, bucle y contexto. Cómo crear uno mínimo, ejecutado, y qué hizo mal.
- TDD y testingTipos de pruebas de software (testing) y pirámide de tests
Qué es el testing de software y sus tipos de pruebas: unitarias, de integración, end to end, funcionales, automatizadas y manuales, y la pirámide de tests.
- TDD y testingZOMBIES en TDD: qué tests escribir primero, con ejemplo
ZOMBIES, la técnica de TDD de James Grenning para saber qué test escribir primero: cero, uno, muchos, límites, interfaz y errores. Con ejemplo ejecutado.
- TDD y testingQué es un isograma: significado, ejemplos y la kata
Un isograma es una palabra en la que cada letra aparece las mismas veces, aunque a menudo se llama así a la que no repite letras. Ejemplos y la kata con TDD.
Lo más leído
- Git, Linux y herramientasMatar un proceso en un puerto en Windows (CMD y PowerShell)
- Git, Linux y herramientasAtajos de teclado (shortcuts) de IntelliJ IDEA
- Git, Linux y herramientasCómo refrescar una página web sin caché (recarga forzada)
- Git, Linux y herramientasGit Flow: qué es, ramas y comandos (y cuándo no usarlo)
Programar bien, con y sin IA
Programar con IA
Agentes de código, instrucciones, revisión del código generado y lo que dicen los estudios.
Empieza aquí
TDD y testing
Escribir primero el test, tipos de pruebas, dobles de prueba y katas para practicar.
Empieza aquí
- Tipos de pruebas de software (testing) y pirámide de tests
- Qué es TDD (Test Driven Development): ciclo y ejemplo
- Algoritmo TDD: el ciclo rojo, verde, refactor y sus reglas
Ver los 23 artículos de TDD y testing
Ver la lista
- Algoritmo TDD: el ciclo rojo, verde, refactor y sus reglas
- Codewars: qué es y cómo empezar a resolver katas
- Composición de un test en TDD: partes, métodos y ejemplos
- Inside-out TDD y outside-in TDD: arquitectura y diseño
- Instalación de Jasmine Standalone (a pelo) paso a paso
- Instalar Jest en un proyecto de JavaScript (npm y ESM)
- Jest: Cannot use import statement outside a module
- Kata Roman Numerals en JavaScript con TDD paso a paso
- Kata Stubs y Spies de Carlos Blé: dobles de prueba en Java
- Katas para pruebas y TDD: lista por niveles
- Koan y kata: qué son y qué significan (zen y programación)
- Libro TDD de Carlos Blé: Diseño Ágil con TDD
- Metodología TDD: pasos para aplicarla, con un ejemplo
- Pruebas unitarias o de unidad: qué son, ejemplo y FIRST
- Qué es ATDD: desarrollo dirigido por tests de aceptación
- Qué es BDD: guía rápida con Gherkin y newsletter BDD Addict
- Qué es TDD (Test Driven Development): ciclo y ejemplo
- Qué es un isograma: significado, ejemplos y la kata
- ¿Qué es un QA tester? Qué hace y en qué se diferencia
- Square Every Digit (Codewars): el cuadrado de cada dígito
- Testing en Ruby: tests con Minitest, RSpec y Test::Unit
- Tipos de pruebas de software (testing) y pirámide de tests
- ZOMBIES en TDD: qué tests escribir primero, con ejemplo
Código limpio y refactoring
Nombres, funciones, diseño simple y deuda técnica: código que se entiende y se cambia sin miedo.
Empieza aquí
- Nombres con sentido en código limpio (Clean Code)
- Funciones en Código Limpio: reglas y un ejemplo
- Diseño simple: las 4 reglas de Kent Beck, con un ejemplo
Ver los 12 artículos de Código limpio y refactoring
Ver la lista
- Clases en código limpio: responsabilidad única y cohesión
- Comentarios en código limpio: cuándo sí y cuándo no
- Complejidad ciclomática: qué es y cómo medirla
- Diseño simple: las 4 reglas de Kent Beck, con un ejemplo
- Formato del código en código limpio: reglas y herramientas
- Funciones en Código Limpio: reglas y un ejemplo
- God Object: qué es este antipatrón y cómo evitarlo
- Nombres con sentido en código limpio (Clean Code)
- Números mágicos en programación: qué son y cómo evitarlos
- Objetos y estructuras de datos en Código Limpio
- ¿Qué es la deuda técnica? Definición y ejemplos
- Regla del Boy Scout en el código limpio, con ejemplo
Arquitectura y patrones de diseño
SOLID, arquitectura hexagonal, DDD, patrones y decisiones de arquitectura.
Empieza aquí
Agilidad y equipos
Manifiesto Ágil, XP, pair programming, Scrum y entrega continua.
Empieza aquí
- Agilismo: qué es, de dónde viene y cómo se trabaja
- Manifiesto Ágil: los 4 valores, explicados y en español
- Los 12 principios del Manifiesto Ágil, explicados
Ver los 10 artículos de Agilidad y equipos
Ver la lista
- Agilismo: qué es, de dónde viene y cómo se trabaja
- Desarrollo continuo de software: integración continua, CI/CD
- Digitalización vs transformación digital: la diferencia
- ¿Es ágil lo que hago? Mitos del agilismo
- Flow de desarrollo en diseño ágil: la pantalla, al final
- Historias de usuario en Scrum: formato, INVEST y ejemplos
- Los 12 principios del Manifiesto Ágil, explicados
- Manifiesto Ágil: los 4 valores, explicados y en español
- Prácticas ágiles: técnicas de un equipo ágil día a día
- Roles dentro de un equipo ágil: quién hace qué en Scrum
Lenguajes y herramientas
Desarrollo web: JavaScript, CSS y UX
JavaScript moderno, Node, CSS, usabilidad y el navegador.
Empieza aquí
- Cheatsheet JavaScript en español (ES6 y siguientes)
- Métodos de arrays en JavaScript: map, filter, reduce, some
- Diferencias entre == y === en JavaScript (y Object.is)
Ver los 40 artículos de Desarrollo web: JavaScript, CSS y UX
Ver la lista
- Array con huecos en JavaScript (sparse array)
- BEM CSS: convención de nombres para clases, con ejemplos
- Cambiar el número de entradas por página en WordPress
- Cheatsheet JavaScript en español (ES6 y siguientes)
- Chrome DevTools (Developer Tools): guía, atajos y paneles
- Códigos de teclas para eventos en JavaScript
- CSS Grid Layout: primeros pasos, vídeo y dónde practicar
- Destructuring o desestructuración en JavaScript
- Diferencias entre == y === en JavaScript (y Object.is)
- Exportar e importar funciones en JavaScript (import/export)
- Generador de código mailto: enlaces con asunto y cuerpo
- Heurísticas de Nielsen: 10 reglas heurísticas de usabilidad
- Instalación de Express.js y primer Hola mundo
- Instalar Node.js en Ubuntu, actualizarlo y desinstalarlo
- Juego de las ranas Flexbox CSS: Flexbox Froggy
- Juego de selectores CSS: aprende con CSS Diner
- Koans y katas de ES6: JavaScript moderno con tests
- Learn CSS Layout the pedantic way, de Mikito Takada
- Libro JavaScript Allongé: qué es y dónde leerlo gratis
- Libros de consulta JavaScript: You Don't Know JS
- Los 10 errores más comunes en proyectos de JavaScript
- Máxima performance de pintado en el front, JS y CSS
- Medir la búsqueda de WordPress en Google Analytics 4
- Métodos de arrays en JavaScript: map, filter, reduce, some
- NVM (Node Version Manager): qué es y cómo se usa
- Página de inicio y página de entradas en WordPress
- Paso por referencia y paso por valor en JavaScript: copias
- Programación asíncrona en JavaScript y AJAX, Carlos Blé
- Prototipos y herencia en JavaScript: el vídeo de James Shore
- Push API: notificaciones web con Service Workers
- PWA, aplicaciones web progresivas: qué son y cómo crear una
- Qué es Material Design: el sistema de diseño de Google
- ¿Qué es un objeto en JavaScript? Explicado con ejemplos
- Recursos de JavaScript en español
- Refactoring Legacy CSS, charla de Carmen Ansio
- Reinicio automático en Node: node --watch y nodemon
- Roadmap React: qué aprender para ser desarrollador React
- this en JavaScript: la clase de Carlos Blé, resumida
- Validación inline en formularios: qué es y cómo hacerla
- Zona del pulgar en móviles: usabilidad y el dedo gordo
Java, Kotlin y Android
Kotlin desde cero, Java moderno y desarrollo de apps Android.
Empieza aquí
- ¿Qué es Kotlin? Para qué sirve y cómo empezar
- Kotlin vs Java: ventajas de Kotlin sobre Java y cuál elegir
- Java Stream: guía práctica con ejemplos (Java 25)
Ver los 24 artículos de Java, Kotlin y Android
Ver la lista
- Android Studio en Ubuntu: /dev/kvm permission denied
- Botón Back y Handler en Android: pulsar dos veces
- Ciclo de vida de Activities en Android, con Kotlin
- Companion object en Kotlin: qué es y cómo se usa
- Control flow (flujo de control) en Kotlin: if y when
- Eventos click en Android: onClick y setOnClickListener
- ¿Ha quedado Java obsoleto con Kotlin?
- Hola mundo en Kotlin: con Android Studio y sin él
- Igualdad referencial (===) y estructural (==) en Kotlin
- Interfaces en Kotlin: interface vs clase abstracta
- Java Stream: guía práctica con ejemplos (Java 25)
- Kotlin Android Extensions: qué fue y cómo migrar
- Kotlin Koans: aprende Kotlin haciendo pasar tests
- Kotlin vs Java: ventajas de Kotlin sobre Java y cuál elegir
- Modificadores de acceso Kotlin: public, protected, private
- Picasso Android: librería de imágenes con Kotlin
- Probar apps en dispositivos virtualizados: Firebase Test Lab
- Qué es Gradle en Android Studio y cómo se configura
- ¿Qué es Kotlin? Para qué sirve y cómo empezar
- ScrollView en Android: cómo hacer scroll en una pantalla
- Toast y Snackbar en Android: cuándo usar cada uno
- Variables y tipos de datos en Kotlin: val y var
- Versiones de Android: nombres, números y nivel de API
- Versiones de la Support Library de Android y AndroidX
Ruby y Ruby on Rails
El lenguaje Ruby paso a paso y cómo construir aplicaciones con Rails.
Empieza aquí
- ¿Qué es Ruby? El lenguaje de programación explicado
- Instalar Ruby y Ruby on Rails en Ubuntu con rbenv
- Hello Word en Ruby: tu Hola Mundo con irb
Ver los 50 artículos de Ruby y Ruby on Rails
Ver la lista
- Active Record Validations: validar campos en Rails
- Arrays en Ruby: crear, leer, añadir y borrar
- Asociaciones en Ruby on Rails: belongs_to, has_many y joins
- Bloques en Ruby: yield, do…end, proc y lambda
- Bucles e iteradores en Ruby: each, times, while y for
- Callbacks en Ruby on Rails: before_action y before_save
- Clases en Ruby: atributos, métodos, herencia y acceso
- Concerns en Ruby on Rails: qué son y cuándo usarlos
- Condicionales en Ruby: if, unless, case y ternario
- Configurar IntelliJ IDEA con Ruby: plugin y primer programa
- Configurar la BBDD en Ruby on Rails: database.yml
- Consola de Ruby on Rails: rails console y consultas
- Crear modelos en Ruby on Rails
- Crear y arrancar un nuevo proyecto en Ruby on Rails
- CRUD desde consola en Ruby on Rails
- Diferencia entre <% %> y <%= %> en Rails (ERB)
- Diferencia entre text y string en Ruby on Rails
- Diferencias entre link_to, redirect_to y render en Rails
- Edición de vistas en Ruby on Rails: ERB y parciales
- Ejecutar comandos del sistema desde Ruby: system, %x y Open3
- Ejemplos de mixin en Ruby: include, extend y prepend
- Ejercicio práctico de módulos en Ruby: un logger
- Excepciones en Ruby: begin, rescue, ensure y raise
- Expresiones regulares en Ruby: =~, match, scan y gsub
- Gema AASM: máquina de estados en Ruby on Rails
- Gema Devise: gestión de usuarios en Ruby on Rails
- Hashes en Ruby: crear, consultar y recorrer
- Hello Word en Ruby: tu Hola Mundo con irb
- Incluir otros archivos en Ruby: require y load
- Instalar Ruby y Ruby on Rails en Ubuntu con rbenv
- Interpolación de cadenas en Ruby: #{} y format
- Métodos de clase en Ruby: self.metodo y class << self
- Métodos en Ruby: definición, parámetros y return
- Migraciones en Ruby on Rails: crear, ejecutar y deshacer
- Módulos en Ruby: qué son, para qué sirven y mixins
- Obtener información del usuario en Ruby: gets y chomp
- Operadores en Ruby: módulo %, <=>, &., ||= y más
- Paginación en Ruby on Rails con will_paginate y Pagy
- Paperclip gem en Ruby on Rails y Active Storage
- ¿Qué es Ruby? El lenguaje de programación explicado
- Resource o recursos en Rails: CRUD con scaffold
- Scopes en Ruby on Rails: consultas con nombre
- Símbolos en Ruby: qué son y en qué se diferencian de String
- Sinatra para Ruby: qué es y tu primera aplicación
- Strong params en Ruby on Rails: strong parameters y expect
- Time en Ruby: fechas, horas y strftime
- Trabajar con ficheros en Ruby: leer y escribir con File
- Validación de un campo booleano en Ruby on Rails
- Variables de clase en Ruby (@@)
- Variables en Ruby: tipos, referencias, dup y freeze
Git, Linux y herramientas
Git, IntelliJ IDEA, la terminal de Linux y utilidades del día a día.
Empieza aquí
- Git Flow: qué es, ramas y comandos (y cuándo no usarlo)
- Atajos de teclado (shortcuts) de IntelliJ IDEA
- Conectarse por SSH desde Linux: comando, claves y alias
Ver los 23 artículos de Git, Linux y herramientas
Ver la lista
- Añadir a la barra de Ubuntu el consumo de CPU y memoria RAM
- Añadir Node.js, Jest y Chai a IntelliJ IDEA
- Atajos de teclado (shortcuts) de IntelliJ IDEA
- cloc: contador de líneas de código, instalación y uso
- Cómo refrescar una página web sin caché (recarga forzada)
- Conectarse por SSH desde Linux: comando, claves y alias
- Conexión a base de datos MySQL desde consola (Linux)
- Configurar importación y optimización automática en IntelliJ
- Diodon: programa de historial de portapapeles en Ubuntu
- EditiX: editor XML gratuito para Ubuntu, Windows y Mac
- Ejecutar todos los test JUnit del proyecto Java en IntelliJ
- Gist de GitHub: compartir código, notas y fragmentos
- Git Commitizen y Conventional Commits: cómo usar git cz
- Git Flow: qué es, ramas y comandos (y cuándo no usarlo)
- Git Kraken (GitKraken): qué es, precio e instalación
- Hacer zoom en IntelliJ IDEA y Android Studio con Ctrl+rueda
- Juego para aprender Vim: VIM Adventures
- Ligatures en Android Studio: mejora la legibilidad
- Matar un proceso en Linux: kill, pkill y killall
- Matar un proceso en un puerto en Windows (CMD y PowerShell)
- Permisos en Linux: tabla rwx, chmod y chown
- Probar expresiones regulares online: regex101 y RegExr
- Reparar el botón Editar de Shutter en Ubuntu
COBOL, hardware y curiosidades
COBOL, Raspberry Pi, Arduino y electrónica, y curiosidades y recursos de programación.
COBOL
6
- Estructura de un programa COBOL: las 4 divisiones
- Frase sobre COBOL atribuida a Bill Gates
- Historia de COBOL: qué es y cómo nació, de 1959 a hoy
- Hoja de codificación de un programa COBOL: columnas y áreas
- IDENTIFICATION DIVISION en COBOL: PROGRAM-ID y párrafos
- Usos y reglas de COBOL: palabras, literales y constantes
Raspberry Pi, Arduino y electrónica
9
- Alimentación para discos de 2,5" en la Raspberry Pi
- Botón de encendido y apagado para Raspberry Pi 2, 3, 4 y 5
- Comprobar un transformador de corriente con el polímetro
- Error al conectar con USB en PlatformIO (/dev/ttyUSB0)
- ESP8266 con tira LED WS2812B: conexión y código
- Mocktail Mixer: coctelera robótica open source
- Multitarea en Arduino sin delay: millis y máquina de estados
- Open Source Ecology, el pueblo Open Source
- Reparar la base de la bisagra del Acer E1-571 (desmontaje)
Curiosidades y recursos
13
- 1.ª formación Lean Mind en el ITER (julio de 2018)
- Adiós tarjetas de visita: crea tu código QR vCard
- Algoritmos de ordenación: vídeo, comparativa y quicksort
- Blog Emezeta de José Román (Manz)
- Canal de YouTube del profesor Tiburcio Cruz Ravelo
- Direcciones de correo para humanos: fáciles de dictar
- Distribución del teclado Querty, Azerty, Dvorak y Colemak
- Evolución del escritorio (1980-2014) en un vídeo
- La meta es ser mejor que ayer, no mejor que nadie
- Nos espían desde la CIA: Vault 7 y las Smart TV
- Plataformas de cursos de programación
- ¿Qué sabe Google de mí? Cómo verlo y borrarlo
- Viñeta de expresiones regulares (xkcd traducida)
Quién escribe
Rubén Tejera, desarrollador de software en Lean Mind. Ha trabajado en proyectos para Inditex, Wolters Kluwer y Voxel, una empresa de Amadeus.