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í
IA LimpiaLos seis principios para programar con IALa base de todo lo que se publica aquí: que el código se entienda, esté probado y sea fácil de cambiar.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
216 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
- ¿Qué es una kata y un koan? Significado y ejemplos
- Pasos para aplicar TDD en tus proyectos, 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 y emergente: las 4 reglas de código limpio
- Pruebas de unidad en código limpio: tests limpios y FIRST
- 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
- 10 reglas heurísticas de usabilidad de Jakob Nielsen
- 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: hola, código QR vCard
- Direcciones de correo para humanos: fáciles de dictar
- Digitalización vs transformación digital: la diferencia
- 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
- Técnicas para un equipo ágil: cómo trabaja día a día
- Agilismo: qué es, de dónde viene y cómo se trabaja
- Manifiesto por el Desarrollo Ágil de Software
- Los 12 principios del Manifiesto Ágil, explicados
- Newsletter especializado en BDD y guía rápida de BDD
- 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
- 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
- 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 (Linux)
- Matar un proceso en Linux: kill, pkill y killall
- Añadir la búsqueda de WordPress a Google Analytics
- 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
- Utilidades para expresiones regulares online
- Viñeta de expresiones regulares (xkcd traducida)
- Gist de GitHub: compartir código, notas y fragmentos
- Git Commitizen: estandarizar mensajes de commit
- Mapa de ruta de desarrollador React
- Distribución del teclado Querty, 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: cómo abrirlas y para qué sirven
- Manifiesto The Twelve-Factor App, explicado
- 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 vía SSH desde Linux
- 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: no encuentra el token import en los tests
- Exportar e importar funciones en JavaScript
- 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: tres formas probadas
- Recursos de JavaScript en español
- BEM en CSS: convención de nombres para clases
- Clonar objetos en JavaScript sin copiar la referencia
- Clonado de arrays en JavaScript: 5 formas
- Paso por referencia y paso por valor en JavaScript
- This en JavaScript, Carlos Blé
- ¿Qué es un objeto en JavaScript? Explicado con ejemplos
- Métodos de arrays en JavaScript con ejemplos
- Vídeo explicativo de conceptos de JavaScript en inglés
- 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 25
- 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: métodos y propiedades
- 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: diferencias y ventajas
- ¿Por qué usar Kotlin? Razones para Android
- 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
- Gradle en Android Studio: qué es y cómo se configura
- Hola Mundo con Android Studio y Kotlin (Jetpack Compose)
- ¿Qué es Kotlin? El lenguaje recomendado para Android
- Versiones de Android: nombres, números y nivel de API
- Fallo de KVM al instalar Android Studio en Ubuntu
- Kotlin frente a Java: diferencias principales
Ruby 49
- 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, subir archivos en Ruby on Rails
- 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
- Introducción al testing en Ruby: Minitest 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
- Formatos para validar campos en Ruby on Rails
- Asociaciones en Ruby on Rails: belongs_to y has_many
- Active Record Validations: validar campos en Rails
- Diferencia entre text y string en Ruby on Rails
- Diferencia entre <% %> y <%= %> en Ruby on Rails
- 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: include, extend 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: llaves, do…end y yield
- 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: asignación, comparación 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
- Instalación de Ruby en Ubuntu con rbenv (y Rails)
- ¿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: 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.