⏱️ Lectura: 14 min
Un ingeniero puede escribir SELECT 1 + 1; sin ninguna tabla detrás y Postgres responde igual, sin quejarse de la falta de un FROM. Will Keleher, desarrollador y autor de ese blog personal, publicó una lista de doce trucos de programación que usa a diario: atajos de terminal, comandos de git poco conocidos, particularidades de SQL y funciones nativas de JavaScript que casi nadie aprovecha.
📑 En este artículo
La idea central del artículo es simple: buena parte de la productividad de un ingeniero no viene de dominar arquitecturas complejas, sino de acumular pequeños trucos de programación que no requieren ninguna infraestructura mental previa. Cada uno, por separado, ahorra segundos. Juntos, cambian el ritmo de trabajo del día a día.
TL;DR
- Will Keleher publicó 12 trucos de programación de uso diario en will-keleher.com: terminal, git, SQL y JavaScript.
- fzf convierte Ctrl+R en búsqueda difusa del historial; atuin lo reemplaza por una base SQLite consultable.
- PostgreSQL y MySQL permiten usar SELECT sin FROM para probar una expresión suelta, como SELECT 1 + 1.
- EXPLAIN ANALYZE ejecuta la query real con tiempos por paso, a diferencia de EXPLAIN, que solo estima el plan.
- git log -S busca commits que agregaron o quitaron una cadena exacta del código (git pickaxe).
- JavaScript ya soporta de forma nativa Array.flatMap, Object.entries y Promise.withResolvers.
- En Node.js, reutilizar un https.Agent con keepAlive reduce la latencia entre requests al mismo host.
- En una empresa anterior, Keleher compartía un truco por día en Slack: la cadencia justa para no saturar al equipo.
Qué pasó
Keleher describe estos trucos de programación como pequeñas piezas de conocimiento autocontenidas, que no exigen entender todo un sistema para ser útiles. No hace falta saber Python para lanzar python3 -m http.server y levantar un servidor de archivos en segundos, ni entender un compilador para saber que rg (ripgrep) es más rápido que grep en un repositorio grande.
El post reúne doce ejemplos concretos, agrupados en cuatro categorías que aparecen todos los días en el trabajo de cualquier desarrollador: terminal y shell, git, SQL y JavaScript/Node.js. Ninguno exige leer documentación extensa; la mayoría se aprende en un minuto y se usa durante años.
Contexto e historia
Keleher cita como inspiración directa a Julia Evans, conocida por sus “zines” técnicos, y resume la filosofía del post con una frase de ella: “small bits of knowledge are powerful! and fun! and approachable!!”. La cita queda en inglés por ser textual, aunque el resto del párrafo respeta la ortografía del español.
Como ejemplo del tipo de conocimiento que motiva el post, Keleher menciona algo que a cualquier desarrollador backend le suena conocido: una demora inexplicada en una conexión TCP que en realidad es el algoritmo de Nagle interactuando con la opción TCP_NODELAY. Nadie enseña ese detalle en un curso formal, pero saberlo ahorra horas de depuración cuando aparece.
En una empresa anterior, Keleher compartía en Slack un truco por día para todo el equipo de ingeniería, tanto técnicos genéricos como específicos de la compañía (“para depurar tal problema, revisá tal fuente de datos”; “tal persona sabe mucho de tal área y le encanta ayudar”). Encontró que un truco diario era la cadencia justa: alguien podía conocer nueve de cada diez, pero ese décimo ahorraba tiempo real, sin saturar al equipo con información.
Detalles técnicos y rendimiento de los trucos de programación
Terminal y shell
El primer grupo de trucos de programación vive en la terminal. La combinación Ctrl+R para buscar en el historial de comandos es conocida por casi cualquier desarrollador, pero pocos la potencian. Instalar fzf convierte esa búsqueda en una búsqueda difusa: alcanza con escribir fragmentos en cualquier orden, sin recordar el comando exacto. Un paso más allá está atuin, que reemplaza el historial plano del shell por una base de datos SQLite indexada y buscable, con la opción de sincronizarla entre máquinas.
Para quienes alternan entre buscar comandos de un directorio específico y buscar en todo el historial, el plugin per-directory-history permite alternar entre ambos modos con una combinación de teclas, sin perder ninguno de los dos historiales.
| Herramienta | Cuándo usarla | Ventaja | Limitación |
|---|---|---|---|
| Ctrl+R nativo | Shell recién instalado, sin dependencias | No requiere instalar nada | Busca por coincidencia exacta de substring |
| fzf | Terminal de uso diario en cualquier máquina | Búsqueda difusa, se integra con más comandos además del historial | Hay que instalarlo y mantenerlo actualizado |
| atuin | Se trabaja en varias máquinas y se quiere historial compartido | Historial en SQLite, sincronizable, con estadísticas de uso | Agrega un binario extra y, si se sincroniza, depende de un servidor |
Otro cambio de hábito con impacto directo: reemplazar find por globs del propio shell. La mayoría de los usos de find . -name "*.md" se resuelven con un patrón como **/*.md, soportado de forma nativa por zsh y, en bash, activando la opción globstar:
shopt -s globstar
ls **/*.md
Y para buscar contenido dentro de archivos, ripgrep (rg) reemplaza a grep, ack y ag en la mayoría de los flujos de trabajo modernos, respetando por defecto los archivos ignorados en .gitignore.
💡 Tip: instalá fzf y probá Ctrl+R en tu shell habitual: la diferencia se nota en la primera búsqueda de historial que hagas.
Git
Dos trucos de git resuelven problemas frecuentes con una sola línea. El primero es git log -S, conocido como “git pickaxe”: devuelve todos los commits que agregaron o eliminaron una cadena exacta en el código, algo valioso en un repositorio con años de historia.
git log -S "MAX_RETRIES" --oneline
git log -G "MAX_RETRIES" --oneline
git log -G es similar pero usa una expresión regular y además muestra los commits donde esa línea se movió de lugar, no solo donde se agregó o se borró.
El segundo truco es git checkout -, análogo al cd - de bash: vuelve al commit o rama anterior sin necesidad de recordar su nombre.
SQL
En PostgreSQL y MySQL, SELECT no necesita un FROM. Sirve para probar cómo se comporta una expresión o una función sin montar una tabla de prueba:
SELECT 1 + 1;
SELECT TRUE <> NULL;
SELECT now();
El segundo comando es un buen recordatorio de una trampa clásica de SQL: comparar contra NULL no devuelve ni verdadero ni falso, devuelve NULL, porque en lógica de tres valores cualquier comparación contra un valor desconocido es en sí misma desconocida.
El otro truco de SQL es EXPLAIN ANALYZE, soportado tanto por PostgreSQL como por MySQL. A diferencia de un EXPLAIN simple, que solo estima el plan de ejecución, EXPLAIN ANALYZE ejecuta la query de verdad y devuelve tiempos reales por cada paso del plan:
EXPLAIN ANALYZE
SELECT u.id, count(o.id)
FROM usuarios u
JOIN pedidos o ON o.usuario_id = u.id
WHERE u.creado_en > now() - interval '30 days'
GROUP BY u.id;
Para confirmar que el plan usa un índice y no un recorrido secuencial completo, hay que revisar la línea Index Scan en la salida (o su ausencia, reemplazada por Seq Scan).
⚠️ Ojo: EXPLAIN ANALYZE ejecuta la query real, no solo la planifica. En un UPDATE o DELETE en producción, corré la prueba dentro de una transacción que puedas revertir con ROLLBACK.
JavaScript y Node.js
El JavaScript moderno ya trae funciones que reemplazan librerías completas de hace unos años: Array.prototype.flatMap, Object.entries y, más reciente, Promise.withResolvers, que expone el resolve y el reject de una promesa fuera de su constructor sin necesidad de variables externas.
const { promise, resolve, reject } = Promise.withResolvers();
setTimeout(() => resolve("listo"), 1000);
promise.then(console.log);
En Node.js, mantener una conexión HTTPS abierta entre requests hacia el mismo recurso externo reduce la latencia de forma directa, porque evita repetir el handshake TLS en cada llamada. Se logra creando un https.Agent con keepAlive activado y pasándolo explícitamente a cada fetch:
import https from "node:https";
const agent = new https.Agent({ keepAlive: true });
async function obtenerPerfil(userId) {
const res = await fetch(`https://api.miempresa.com/users/${userId}`, {
agent,
});
return res.json();
}
Otro truco de programación con impacto directo en observabilidad: usar logaritmo en base 10 para agrupar métricas en buckets cuando el rango de valores es muy amplio, por ejemplo la cantidad de usuarios por cuenta, que puede ir de 1 a 100.000:
const bucket = Math.floor(Math.log10(userInGroupCount));
metrics.increment("cuentas_activas", { bucket });
Con esto, una cuenta con 8 usuarios cae en el bucket 0, una con 80 en el bucket 1, una con 8.000 en el bucket 3. Sin el logaritmo, un histograma lineal quedaría dominado por las cuentas grandes y ocultaría la distribución real.
Por último, en expresiones regulares, \b (el aserto de límite de palabra) permite buscar el inicio o el final exacto de una palabra sin capturar coincidencias parciales dentro de otra palabra más larga:
/\bcat\b/.test("category"); // false
/\bcat\b/.test("the cat sat"); // true
Cómo empezar/probarlo
Instalar las tres herramientas centrales del post (fzf, ripgrep y atuin) toma menos de cinco minutos en cualquier sistema operativo.
fzf
# macOS (Homebrew)
brew install fzf
$(brew --prefix)/opt/fzf/install
# Linux (Debian/Ubuntu)
sudo apt install fzf
# Windows (winget)
winget install fzf
ripgrep
# macOS
brew install ripgrep
# Linux (Debian/Ubuntu)
sudo apt install ripgrep
# Windows (winget)
winget install BurntSushi.ripgrep.MSVC
atuin
# macOS y Linux
curl --proto '=https' --tlsv1.2 -sSf https://setup.atuin.sh | sh
# Windows (dentro de WSL, no hay build nativo)
wsl curl --proto '=https' --tlsv1.2 -sSf https://setup.atuin.sh | sh
Para activar el autocompletado avanzado de zsh, que no viene encendido por defecto, hay que agregar esto al .zshrc:
if type brew >/dev/null 2>&1; then
FPATH="$(brew --prefix)/share/zsh/site-functions:${FPATH}"
fi
autoload -Uz compinit
compinit
Para confirmar que fzf quedó activo en Ctrl+R, basta con abrir una terminal nueva, escribir un fragmento de un comando usado antes y presionar Ctrl+R: si aparece una lista filtrable con resaltado de coincidencias, la integración funciona.
Impacto y análisis
El valor de estos trucos de programación no está en ninguno por separado, sino en la acumulación. Keleher plantea que en una empresa, buena parte del conocimiento de más alto impacto tiene esta misma forma: pequeña, específica y sin mucha infraestructura detrás. “Para depurar tal problema, revisá tal fuente de datos” o “para hacer un reinicio en caliente de tal servicio, corré tal comando” valen tanto como saber que rg es más rápido que grep.
La práctica de compartir un truco por día en Slack, con una mezcla de técnicos genéricos y específicos de la empresa, resultó sostenible durante mucho tiempo en el equipo de Keleher. La razón que da es concreta: incluso si alguien ya sabía nueve de cada diez trucos compartidos, el décimo solía ahorrarle tiempo real, y la cadencia diaria, ni más frecuente ni más espaciada, evitaba saturar a la gente con información.
Una limitación honesta de este enfoque: no todos los trucos de programación son transferibles entre dominios. EXPLAIN ANALYZE no sirve de nada si el equipo trabaja con una base de datos documental sin planificador de queries relacional, y git log -S pierde valor en repositorios muy jóvenes, sin historia suficiente para explorar. La lista de Keleher tiene sentido para equipos que tocan terminal, git, SQL relacional y JavaScript a diario, pero un equipo enfocado en firmware embebido necesitaría su propia lista.
💭 Clave: el conocimiento de mayor retorno en un equipo suele ser específico de la empresa, no genérico: dónde está el dato para depurar X, quién sabe de Y, qué comando resuelve Z.
Qué sigue
Para equipos de LATAM que operan de forma remota, replicar la práctica de “un truco por día” en un canal de Slack o Discord es una forma barata de subir el nivel general sin depender de sesiones de capacitación formales. La clave, según la experiencia descrita en el post, está en mantener la cadencia baja: un truco diario, no una lista completa de golpe, que se olvida a las pocas horas.
El post original también funciona como un recordatorio de que vale la pena llevar un registro propio de estos hallazgos, aunque sea informal, porque la mayoría de los trucos de programación de mayor impacto se aprenden por accidente, resolviendo un problema puntual, y se olvidan si no quedan anotados en algún lado.
flowchart TD
A["Trucos de programación"] --> B["Terminal y shell"]
A --> C["Git"]
A --> D["SQL"]
A --> E["JavaScript y Node"]
B --> F["fzf, atuin, ripgrep"]
C --> G["git log -S, git checkout -"]
D --> H["SELECT sin FROM, EXPLAIN ANALYZE"]
E --> I["flatMap, https.Agent, Promise.withResolvers"]
📖 Resumen en Telegram: Ver resumen
Probalo vos: instalá fzf con brew install fzf o sudo apt install fzf y presioná Ctrl+R en tu próxima búsqueda de historial.
Preguntas frecuentes
¿Qué diferencia hay entre EXPLAIN y EXPLAIN ANALYZE?
EXPLAIN solo muestra el plan estimado que usaría el motor, sin ejecutar la query. EXPLAIN ANALYZE ejecuta la query de verdad y agrega tiempos reales por cada paso del plan.
¿git log -S y git log -G son lo mismo?
No. -S busca commits que agregaron o quitaron una cadena exacta. -G usa una expresión regular y además detecta cuando esa línea se movió de lugar, no solo cuando cambió su cantidad de apariciones.
¿Necesito saber SQL avanzado para usar SELECT sin FROM?
No. Es útil justamente para lo contrario: probar una expresión, una función o un operador sin necesidad de tener una tabla real a mano.
¿fzf y atuin hacen lo mismo?
Se superponen pero no son iguales. fzf agrega búsqueda difusa sobre el historial existente del shell. atuin reemplaza el historial completo por una base SQLite, con la opción de sincronizarla entre máquinas.
¿Por qué usar ripgrep en vez de grep?
Por velocidad en repositorios grandes y porque respeta por defecto las reglas de .gitignore, evitando buscar dentro de carpetas como node_modules sin configuración extra.
¿Qué es Promise.withResolvers?
Un método estático de Promise que devuelve la promesa junto con sus funciones resolve y reject ya extraídas, sin necesidad de declararlas como variables externas dentro del constructor.
Referencias
- Small Programming Tricks, will keleher: el post original con la lista completa de doce trucos.
- fzf en GitHub: repositorio oficial del buscador difuso de línea de comandos.
- ripgrep en GitHub: repositorio oficial de rg, el reemplazo moderno de grep.
- atuin.sh: sitio oficial del historial de shell basado en SQLite.
- Documentación de EXPLAIN en PostgreSQL: referencia oficial del comando EXPLAIN y EXPLAIN ANALYZE.
- MDN: Promise.withResolvers: documentación oficial del método en JavaScript.
📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.
Imagen destacada: Foto de Fotis Fotopoulos en Unsplash
0 Comentarios