~/blog/productividad-desarrolladores-vscode-git-automatizacion.md
Productividad para desarrolladores: VS Code, Git avanzado, gestión ágil y scripts de automatización
Mi flujo de trabajo diario como desarrollador: las extensiones y ajustes de VS Code que sí aportan, Git más allá de commit y push (rebase, cherry-pick y bisect), cómo gestionar proyectos pequeños sin burocracia y los scripts que automatizan lo repetitivo.
- autor
- Alejandro Peñaloza
- Publicado
- Lectura
- 4 min
- English
- Read in English →

En este artículo
La productividad de un desarrollador no depende de escribir más rápido, sino de perder menos tiempo en lo que no es programar: buscar archivos, deshacer un merge mal hecho, recordar qué tarea seguía o repetir a mano el mismo respaldo cada semana.
Estas son las herramientas y hábitos que más tiempo me han ahorrado.
Mi setup de VS Code
Extensiones que sí aportan valor
La regla es simple: si una extensión no la uso al menos una vez por semana, la desinstalo. Cada extensión activa consume memoria y tiempo de arranque.
| Extensión | Para qué |
|---|---|
| ESLint y Prettier | Errores y formato automático al guardar |
| GitLens | Quién cambió cada línea y por qué, historial por archivo |
| Error Lens | Muestra el error en la misma línea, sin pasar el mouse |
| EditorConfig | Mismas reglas de indentación para todo el equipo |
| Docker y Dev Containers | Ver contenedores y desarrollar dentro de uno |
| Remote - SSH | Editar archivos de un servidor como si fueran locales |
| REST Client | Probar APIs con archivos .http versionados en el repo |
| PHP Intelephense / Dart / Python | Solo las del lenguaje del proyecto |
Un truco poco usado: los perfiles de VS Code. Tengo uno para PHP/Laravel, otro para Flutter y otro para Node, cada uno con sus extensiones. El editor carga solo lo que necesita.
Atajos imprescindibles
| Acción | Windows / Linux | macOS |
|---|---|---|
| Buscar archivo | Ctrl+P |
Cmd+P |
| Paleta de comandos | Ctrl+Shift+P |
Cmd+Shift+P |
| Ir a símbolo en el archivo | Ctrl+Shift+O |
Cmd+Shift+O |
| Ir a la definición | F12 |
F12 |
| Renombrar símbolo en todo el proyecto | F2 |
F2 |
| Seleccionar la siguiente coincidencia | Ctrl+D |
Cmd+D |
| Cursor en varias líneas | Ctrl+Alt+↑/↓ |
Cmd+Option+↑/↓ |
| Mover línea | Alt+↑/↓ |
Option+↑/↓ |
| Terminal integrada | Ctrl+` |
Ctrl+` |
Mi settings.json
{
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit",
"source.organizeImports": "explicit"
},
"editor.fontFamily": "'JetBrains Mono', monospace",
"editor.fontLigatures": true,
"editor.minimap.enabled": false,
"editor.bracketPairColorization.enabled": true,
"editor.guides.bracketPairs": "active",
"editor.stickyScroll.enabled": true,
"files.trimTrailingWhitespace": true,
"files.insertFinalNewline": true,
"files.autoSave": "onFocusChange",
"explorer.confirmDragAndDrop": false,
"workbench.editor.enablePreview": false,
"git.autofetch": true,
"terminal.integrated.scrollback": 10000
}Git más allá de commit y push
git rebase -i: historial limpio antes del pull request
Antes de abrir un PR, junto los commits de "fix typo" y "ahora sí" en commits con sentido:
git fetch origin
git rebase -i origin/developEn el editor cambias pick por squash (o s) para fusionar, reword para cambiar el mensaje o drop para eliminar. Si aparece un conflicto:
# resuelves los archivos y luego
git add .
git rebase --continue
# o, si te arrepientes
git rebase --abortRegla de oro: no hagas rebase de ramas que otras personas ya descargaron. Si ya publicaste la rama, usa git push --force-with-lease, que se niega a sobrescribir cambios ajenos que no tengas localmente.
git cherry-pick: llevar un solo commit a otra rama
Clásico de Gitflow: arreglaste un bug en develop y necesitas ese mismo arreglo en un hotfix.
git switch hotfix/1.4.1
git cherry-pick a1b2c3d
git cherry-pick a1b2c3d..f6e7d8c # un rango de commits
git cherry-pick -x a1b2c3d # agrega "cherry picked from" al mensajegit bisect: encontrar el commit exacto que rompió algo
Funcionaba hace dos semanas y hoy no. Hay 80 commits entremedio. bisect hace búsqueda binaria y lo encuentra en unos 7 pasos.
git bisect start
git bisect bad # el commit actual está malo
git bisect good v2.3.0 # este tag funcionaba
# Git te deja en un commit intermedio: pruebas y marcas
git bisect good # o git bisect bad
# ...repites hasta que Git te dice cuál es el primer commit malo
git bisect resetY si tienes un test que detecta el problema, lo automatizas por completo:
git bisect start HEAD v2.3.0
git bisect run npm test -- tests/calculo-totales.test.tsOtros comandos que salvan el día
git switch -c feature/nueva # crear rama y cambiarse
git stash push -m "a medias" # guardar cambios sin commit
git stash pop
git reflog # recuperar commits "perdidos"
git log --oneline --graph --all # ver el árbol completo
git commit --amend --no-edit # agregar algo al último commitgit reflog merece mención aparte: casi nada se pierde en Git. Si un reset --hard se llevó tu trabajo, el reflog te muestra dónde estaba HEAD antes.
Gestión de proyectos sin burocracia
En proyectos pequeños o freelance el riesgo no es la falta de proceso, sino tener tanto proceso que gestionar toma más tiempo que programar. Lo que me funciona:
- Un solo tablero con cuatro columnas: Pendiente, En curso, En revisión, Listo. Nada más.
- Límite de trabajo en curso: máximo dos tarjetas en "En curso". Si quieres empezar otra, termina una.
- Tarjetas pequeñas: si una tarea toma más de un día, se divide.
- Sprints de una o dos semanas con una revisión de 15 minutos al final: qué se entregó, qué pasa al siguiente.
- Cada tarjeta enlazada a su rama o PR, para que el tablero y el código cuenten la misma historia.
¿Qué herramienta usar?
| Herramienta | Mejor para |
|---|---|
| GitHub Projects | Si el código ya vive en GitHub: issues, PR y tablero en un solo lugar, gratis |
| Trello | Clientes no técnicos que necesitan ver el avance |
| Taiga | Scrum completo (historias, puntos, sprints) y opción de autoalojarlo |
Con GitHub Projects, además, puedes cerrar tarjetas automáticamente desde el commit:
git commit -m "fix(facturas): corrige redondeo del IVA
Closes #42"Automatización con scripts
Todo lo que haces más de tres veces merece un script.
Respaldo de PostgreSQL con rotación
#!/usr/bin/env bash
set -euo pipefail
DB_NAME="${DB_NAME:-app}"
BACKUP_DIR="${BACKUP_DIR:-/var/backups/postgres}"
RETENTION_DAYS="${RETENTION_DAYS:-14}"
STAMP="$(date +%Y%m%d_%H%M%S)"
FILE="${BACKUP_DIR}/${DB_NAME}_${STAMP}.dump"
mkdir -p "$BACKUP_DIR"
pg_dump -Fc -d "$DB_NAME" -f "$FILE"
echo "Respaldo creado: $FILE ($(du -h "$FILE" | cut -f1))"
find "$BACKUP_DIR" -name "${DB_NAME}_*.dump" -mtime +"$RETENTION_DAYS" -delete
echo "Respaldos con más de ${RETENTION_DAYS} días eliminados"Programado con cron todos los días a las 03:15:
15 3 * * * DB_NAME=app /opt/scripts/backup-pg.sh >> /var/log/backup-pg.log 2>&1Un respaldo que nunca restauraste no es un respaldo: prueba de vez en cuando con pg_restore -d app_prueba archivo.dump.
Limpieza de carpetas pesadas
#!/usr/bin/env bash
# Elimina node_modules de proyectos sin cambios en 30 días
find ~/proyectos -name node_modules -type d -prune -mtime +30 -print -exec rm -rf {} +
# Libera espacio de Docker (imágenes y caché sin usar)
docker system prune -fDespliegue en un comando
#!/usr/bin/env bash
set -euo pipefail
SERVER="deploy@mi-servidor"
APP_DIR="/srv/miapp"
ssh "$SERVER" bash -s <<EOF
set -e
cd "$APP_DIR"
git pull --ff-only
docker compose pull
docker compose up -d --build
docker image prune -f
EOF
echo "Despliegue terminado"Una tarea en Node.js: avisar cuando algo falla
// notify.mjs: envía un mensaje a un webhook (ntfy, Slack, Discord...)
const [, , titulo, mensaje] = process.argv;
await fetch(process.env.WEBHOOK_URL, {
method: "POST",
headers: { Title: titulo },
body: mensaje,
});/opt/scripts/backup-pg.sh || node notify.mjs "Respaldo falló" "Revisar servidor de producción"Conclusión
Ninguna de estas ideas es espectacular por sí sola. La diferencia aparece cuando se suman: un editor que trabaja para ti, un Git que sabes usar cuando algo sale mal, un tablero que no te roba la tarde y scripts que hacen solos lo repetitivo. Eso es tiempo que vuelve a lo que importa: construir.
Comentarios
Aún no hay comentarios. ¿Quieres dejar el primero?
Deja un comentario
$ ls ~/blog | grep relacionados
Sigue leyendo

Bitácora de guerra: depurar CORS, refactorizar código propio e integrar Webpay sin perder la tarde
Problemas reales y cómo los resolví: un error de CORS que solo fallaba en producción, una fuga de memoria en el servidor, código mío de hace un año refactorizado sin vergüenza y una guía práctica para integrar Webpay Plus, Mercado Pago y Flow.

De localhost a producción sin llorar: VPS, DNS, hosting y Docker para desarrolladores
Guía práctica para sacar un proyecto a producción: cómo asegurar un VPS desde cero, configurar DNS y Cloudflare, elegir entre hosting compartido, VPS o cloud, y levantar tu base de datos local con Docker Compose en segundos.

PHP2Shell: qué son CVE-2026-109618 y CVE-2026-109619 y cómo proteger tus servidores PHP
Dos fallas críticas en PHP permiten ejecutar código remoto sin autenticación, antes de que corra tu aplicación. Qué versiones afectan, quién está expuesto, qué cubre el WAF de Cloudflare, cómo actualizar y qué mitigar mientras tanto.