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.
Empieza aquí
NuevoQué 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.- ZOMBIES en TDD: qué tests escribir primero, con ejemploNivel inicial
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.
- Qué es un isograma: significado, ejemplos y la kataNivel inicial
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
- HerramientasMatar Proceso en un Puerto determinado en Windows
- HerramientasAtajos de Teclado, ShortCuts para IntelliJ IDEA
- HerramientasRefrescar web sin caché
- HerramientasGit Flow
Archivo 2018–2025
213 artículos escritos antes de este enfoque. Algunos pueden estar desactualizados.
TDD y katas 16
- Algoritmo TDD: el ciclo rojo, verde, refactor y sus reglas
- Qué es TDD (Test Driven Development): ciclo y ejemplo
- Kata Stubs y Spies de Carlos Blé: dobles de prueba en Java
- Kotlin Koans: aprende Kotlin haciendo pasar tests
- Katas para pruebas y TDD: lista por niveles
- Inside-out TDD y outside-in TDD: arquitectura y diseño
- Kata Codewars: el cuadrado de cada dígito de un número
- Codewars: qué es y cómo empezar a resolver katas
- Koan y kata: qué son y qué significan (zen y programación)
- Metodología TDD: pasos para aplicarla, con un ejemplo
- Kata Roman Numerals en JavaScript con TDD paso a paso
- Koans y katas de ES6: JavaScript moderno con tests
- Composición de un test en TDD y sus métodos, con ejemplos
- Instalar Jest en un proyecto de JavaScript (npm y ESM)
- Libro TDD de Carlos Blé: Diseño Ágil con TDD
- Instalación de Jasmine Standalone (a pelo) paso a paso
Código limpio y diseño 13
- Diseño simple: las 4 reglas de Kent Beck, con un ejemplo
- Pruebas de unidad: qué son y reglas FIRST de código limpio
- Clases en código limpio: responsabilidad única y cohesión
- Objetos y estructuras de datos en Código Limpio
- Formato del código en código limpio: reglas y herramientas
- Comentarios en código limpio: cuándo sí y cuándo no
- Funciones en Código Limpio: reglas y un ejemplo
- Heurísticas de Nielsen: 10 reglas heurísticas de usabilidad
- Validación inline en formularios: qué es y cómo hacerla
- Números mágicos en programación: qué son y cómo evitarlos
- God Object: qué es este antipatrón y cómo evitarlo
- Usabilidad y el dedo gordo en teléfonos móviles
- Nombres con sentido en código limpio (Clean Code)
Agilidad y equipos 18
- Adiós tarjetas de visita: crea tu código QR vCard
- Direcciones de correo para humanos: fáciles de dictar
- Digitalización vs transformación digital: la diferencia
- Qué es ATDD: desarrollo dirigido por tests de aceptación
- ¿Es ágil lo que hago? Mitos del agilismo
- Flow de desarrollo en diseño ágil: la pantalla, al final
- Roles dentro de un equipo ágil: quién hace qué en Scrum
- Prácticas ágiles: técnicas de un equipo ágil día a día
- 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
- Qué es BDD: guía rápida con Gherkin y newsletter BDD Addict
- Juego de las ranas Flexbox CSS: Flexbox Froggy
- Desarrollo continuo de software: CI y CD explicados
- Plataformas de cursos de programación
- Historias de usuario en Scrum: formato, INVEST y ejemplos
- CSS Grid Layout: vídeo y primeros pasos
- Practicar Grid en CSS: juegos y herramientas
Herramientas 53
- Diodon. Programa Historial de Portapapeles Ubuntu
- Configurar importación y optimización automática en IntelliJ
- Ejecutar todos los test JUnit del proyecto Java en IntelliJ
- Matar Proceso en un Puerto determinado en Windows
- Generador de código mailto: enlaces con asunto y cuerpo
- Añadir a la barra de Ubuntu el Consumo de CPU y Memoria RAM
- PWA, aplicaciones web progresivas: qué son y cómo crear una
- Refrescar web sin caché
- cloc: contador de líneas de código, instalación y uso
- Juego para aprender Vim: VIM Adventures
- EditiX: editor XML gratuito para Ubuntu, Windows y Mac
- Ejecución de comandos del sistema desde Ruby
- Conexión a base de datos MySQL desde consola (Linux)
- Git Flow
- Google sabe mucho sobre nosotros: cómo verlo y borrarlo
- Símbolos en Ruby: qué son y en qué se diferencian de String
- CRUD desde consola en Ruby on Rails
- Reparación de la base de la bisagra del Acer E1-571
- Error al conectar con USB en PlatformIO (/dev/ttyUSB0)
- Matar un proceso en Linux: kill, pkill y killall
- Medir la búsqueda de WordPress en Google Analytics 4
- Página de inicio y página de entradas en WordPress
- Evolución del escritorio (1980-2014) en un vídeo
- Mocktail Mixer: coctelera robótica open source
- Open Source Ecology, el pueblo Open Source
- Probar expresiones regulares online: regex101 y RegExr
- Viñeta de expresiones regulares (xkcd traducida)
- Gist de GitHub: compartir código, notas y fragmentos
- Git Commitizen: qué es y cómo usar git cz en tus commits
- Roadmap React: qué aprender para ser desarrollador React
- Distribución del teclado Querty, Azerty, Dvorak y Colemak
- ¿Qué es la deuda técnica? Definición y ejemplos
- ¿Qué es un QA tester? Qué hace y en qué se diferencia
- Complejidad ciclomática: qué es y cómo medirla
- Chrome DevTools (Developer Tools): guía, atajos y paneles
- The Twelve-Factor App: los 12 factores explicados
- Qué es Material Design: el sistema de diseño de Google
- Nos espían desde la CIA: Vault 7 y las Smart TV
- Push API: notificaciones web con Service Workers
- Probar apps en dispositivos virtualizados: Firebase Test Lab
- Blog Emezeta de José Román (Manz)
- MVC (Modelo Vista Controlador) y sus derivados: MVP y MVVM
- Blog de Martin Fowler: qué leer y por dónde empezar
- Algoritmos de ordenación: vídeo, comparativa y quicksort
- Canal de YouTube del profesor Tiburcio Cruz Ravelo
- Permisos en Linux: tabla rwx, chmod y chown
- Conectarse por SSH desde Linux: comando, claves y alias
- Cambiar el número de entradas por página en WordPress
- Reparar el botón Editar de Shutter en Ubuntu
- Añadir Node, Jest y Chai a IntelliJ IDEA
- Atajos de Teclado, ShortCuts para IntelliJ IDEA
- Git Kraken (GitKraken): qué es, precio e instalación
- Activar Zoom con Ctrl+Rueda Ratón en IntelliJ Idea y Android Studio
JavaScript y web 26
- NVM (Node Version Manager): qué es y cómo se usa
- Learn CSS Layout the pedantic way, de Mikito Takada
- Máxima performance de pintado en el front, JS y CSS
- Cheatsheet JavaScript en español (ES6 y siguientes)
- Códigos de teclas para eventos en JavaScript
- Programación asíncrona en JavaScript y AJAX, Carlos Blé
- Refactoring Legacy CSS, charla de Carmen Ansio
- Asignación por destructuring en JavaScript
- Jest: Cannot use import statement outside a module
- Exportar e importar funciones en JavaScript (import/export)
- Los 10 mayores errores en proyectos de JavaScript
- Reinicio automático del servidor Node al cambiar código
- Instalación de Express.js y primer Hola mundo
- Instalar Node.js en Ubuntu, actualizarlo y desinstalarlo
- Recursos de JavaScript en español
- BEM CSS: convención de nombres para clases, con ejemplos
- Clonar objetos en JavaScript sin copiar la referencia
- Copiar un array en JavaScript: 5 formas de clonarlo
- Paso por referencia y paso por valor en JavaScript
- this en JavaScript: la clase de Carlos Blé, resumida
- ¿Qué es un objeto en JavaScript? Explicado con ejemplos
- Métodos de arrays en JavaScript: map, filter, reduce, some
- Prototipos y herencia en JavaScript: el vídeo de James Shore
- Comportamiento de un array en JavaScript: huecos
- Diferencias entre == y === en JavaScript (y Object.is)
- Juego de selectores CSS: aprende con CSS Diner
Java, Android y Kotlin 23
- Java Stream: guía práctica con ejemplos (Java 25)
- Ciclo de vida de Activities en Android, con Kotlin
- Picasso: librería de imágenes para Android y Kotlin
- Interfaces en Kotlin: interface vs clase abstracta
- Eventos click en Android: onClick y setOnClickListener
- Botón Back y Handler en Android: pulsar dos veces
- Modificadores de acceso Kotlin: public, protected, private
- Control Flow, flujo de control en Kotlin
- ¿Ha quedado Java obsoleto con Kotlin?
- Kotlin vs Java: ventajas de Kotlin sobre Java y cuál elegir
- Companion object en Kotlin: qué es y cómo se usa
- Igualdad referencial (===) y estructural (==) en Kotlin
- Kotlin Android Extensions: qué fue y cómo migrar
- ScrollView en Android: cómo hacer scroll en una pantalla
- Toast y Snackbar en Android: cuándo usar cada uno
- Versiones de las librerías de soporte en Android
- Variables y tipos en Kotlin: val, var y tipos básicos
- Ligatures en Android Studio: mejora la legibilidad
- Qué es Gradle en Android Studio y cómo se configura
- Hola mundo en Kotlin: con Android Studio y sin él
- ¿Qué es Kotlin? Para qué sirve y cómo empezar
- Versiones de Android: nombres, números y nivel de API
- Fallo de KVM al instalar Android Studio en Ubuntu
Ruby 48
- Paginación en Ruby on Rails con will_paginate y Pagy
- Scopes en Ruby on Rails: consultas con nombre
- Gema AASM: máquina de estados en Ruby on Rails
- Concerns en Ruby on Rails
- Paperclip gem en Ruby on Rails y Active Storage
- Callbacks en Ruby on Rails: before_action y before_save
- Gema Devise: gestión de usuarios en Ruby on Rails
- Validación de un campo booleano en Ruby on Rails
- Strong params en Ruby on Rails: seguridad de parámetros
- Diferencias entre link_to, redirect_to y render en Rails
- Testing en Ruby: tests con Minitest, RSpec y Test::Unit
- Incluir otros archivos en Ruby: require y load
- Excepciones en Ruby: begin, rescue, ensure y raise
- Métodos de clase en Ruby: self.metodo y class << self
- Variables de clase en Ruby (@@)
- Expresiones regulares en Ruby: =~, match, scan y gsub
- Asociaciones en Ruby on Rails: belongs_to, has_many y joins
- Active Record Validations: validar campos en Rails
- Diferencia entre text y string en Ruby on Rails
- Diferencia entre <% %> y <%= %> en Rails (ERB)
- Ejemplos de mixin en Ruby: include, extend y prepend
- Trabajar con ficheros en Ruby: leer y escribir con File
- Time en Ruby: fechas, horas y strftime
- Ejercicio práctico de módulos en Ruby: un logger
- Módulos en Ruby: qué son, para qué sirven y mixins
- Configurar la BBDD en Ruby on Rails: database.yml
- Crear modelos en Ruby on Rails
- Edición de vistas en Ruby on Rails: ERB y parciales
- Migraciones en Ruby on Rails: crear, ejecutar y deshacer
- Consola de Ruby on Rails: rails console y consultas
- Resource o recursos en Rails: CRUD con scaffold
- Crear y arrancar un nuevo proyecto en Ruby on Rails
- Sinatra para Ruby: qué es y tu primera aplicación
- Clases en Ruby: atributos, métodos, herencia y acceso
- Bloques en Ruby: yield, do…end, proc y lambda
- Bucles e Iteradores en Ruby
- Hashes en Ruby: crear, consultar y recorrer
- Arrays en Ruby: crear, leer, añadir y borrar
- Condicionales en Ruby: if, unless, case y ternario
- Operadores en Ruby: módulo %, <=>, &., ||= y más
- Métodos en Ruby: definición, parámetros y return
- Obtener información del usuario en Ruby con gets
- Interpolación de cadenas en Ruby: #{} y format
- Configurar IntelliJ IDEA con Ruby: plugin y primer programa
- Variables en Ruby: tipos, referencias, dup y freeze
- Hello Word en Ruby: tu Hola Mundo con irb
- Instalar Ruby y Ruby on Rails en Ubuntu con rbenv
- ¿Qué es Ruby? El lenguaje de programación explicado
Más temas 16
- La meta es ser mejor que ayer, no mejor que nadie
- IDENTIFICATION DIVISION en COBOL: PROGRAM-ID y párrafos
- Usos y reglas de COBOL: palabras, literales y constantes
- Estructura de un programa COBOL: las 4 divisiones
- Hoja de Codificación Programa Cobol
- Frase sobre COBOL atribuida a Bill Gates
- Historia de COBOL: qué es y cómo nació, de 1959 a hoy
- 1.ª formación Lean Mind en el ITER (julio de 2018)
- 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
- Multitarea con máquina de estados en Arduino
- Regla del Boy Scout en el código limpio, con ejemplo
- ESP8266 con tira LED WS2812B: conexión y código
- Comprobar un transformador de corriente con el polímetro
- Libros de consulta JavaScript: You Don't Know JS
- Libro JavaScript Allongé: qué es y dónde leerlo gratis
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.