⚖️ El Juicio del Maestro: Pull Requests y Code Review
“Un ninja sabio no integra su código sin antes someterlo al escrutinio de sus pares. El ego es enemigo de la excelencia.” - Código de Honor del Desarrollador
🎯 La Filosofía del Pull Request
El Pull Request (PR) es el momento más importante de tu workflow:
- Propones cambios: “Terminé la feature, por favor revísenla”
- El equipo revisa: Comentarios, sugerencias, aprobaciones
- Iteras: Aplicas feedback, mejoras el código
- Se fusiona: Tu código pasa a producción
Un PR bien hecho es:
- Una unidad lógica de trabajo (1 feature o 1 bugfix)
- Auto-documentado (título, descripción, screenshots)
- Revisable en <30 minutos
- Testeado y funcional
📜 El Camino del Conocimiento
Parte 1: Crear un Pull Request Profesional
Flujo completo:
# 1. Asegúrate de estar actualizado
git switch main
git pull origin main
# 2. Crea rama para tu feature
git checkout -b feature/dark-mode
# 3. Trabaja, commitea
git add .
git commit -m "feat: implementar modo oscuro en navbar"
git commit -m "test: añadir tests para theme switcher"
# 4. Sube tu rama
git push origin feature/dark-mode
# 5. GitHub te muestra un link para crear PR
# O ve a: https://github.com/user/repo/compare/main...feature/dark-mode
Anatomía de un PR profesional:
Título:
feat: Añadir modo oscuro con toggle en navbar
Usa Conventional Commits:
feat:Nueva funcionalidadfix:Corrección de bugrefactor:Cambio de código sin afectar funcionalidaddocs:Solo documentacióntest:Añadir/corregir testschore:Tareas de mantenimiento (deps, configs)
Descripción del PR:
## 📝 Resumen
Implementa un toggle de modo oscuro que persiste la preferencia del usuario en localStorage.
## 🎯 Problema que Resuelve
Closes #42
Los usuarios solicitaban un tema oscuro para uso nocturno.
## ✨ Cambios Implementados
- ✅ Toggle en navbar (sol/luna icon)
- ✅ CSS variables para colores dinámicos
- ✅ Persistencia en localStorage
- ✅ Detección automática de preferencia del sistema (`prefers-color-scheme`)
## 🧪 Testing
- [ ] Probado en Chrome, Firefox, Safari
- [ ] Tests unitarios para `ThemeContext`
- [ ] Verificado que funciona con SSR (Next.js)
## 📸 Capturas de Pantalla
### Modo Claro

### Modo Oscuro

## 📚 Documentación
- Actualizado README con instrucciones de uso
- Añadido comentario en `ThemeContext.tsx`
## ⚠️ Breaking Changes
Ninguno. Es retrocompatible.
## 🔗 Referencias
- Diseño: [Figma](https://figma.com/file/xyz)
- Issue original: #42
- PR relacionado: #38 (implementó CSS variables)
## ✅ Checklist
- [x] El código compila sin errores
- [x] Los tests pasan (`npm test`)
- [x] Lint sin warnings (`npm run lint`)
- [x] Actualicé la documentación
- [x] Añadí tests para nueva funcionalidad
Elementos clave de la descripción:
- Resumen ejecutivo (1-2 líneas)
- Qué problema resuelve (vincula issue con
Closes #X) - Cambios técnicos (lista de lo que modificaste)
- Cómo probar (pasos para verificar)
- Evidencia visual (screenshots, GIFs, videos)
- Breaking changes (si los hay)
Parte 2: El Arte del Code Review
Como AUTOR del PR:
DO ✅:
- Mantén PRs pequeños (<400 líneas de código)
- Añade contexto en comentarios para código complejo
- Responde a cada comentario (aunque sea con emoji ✅)
- Agradece el feedback
- Aplica sugerencias rápidamente
DON’T ❌:
- No te pongas a la defensiva
- No fuerces merge sin aprobaciones
- No mezcles múltiples features en un PR
- No subas código sin testear localmente
Como REVIEWER:
DO ✅:
- Empieza con algo positivo (“Me gusta cómo manejaste X”)
- Sé específico (“En línea 42, considera usar
mapen lugar deforEach”) - Pregunta antes de ordenar (“¿Consideraste usar un Set aquí?”)
- Aprueba si es “suficientemente bueno” (no perfecto)
- Usa emojis para suavizar críticas 😊
DON’T ❌:
- No seas grosero o condescendiente
- No pidas cambios sin explicar el porqué
- No bloquees PRs por preferencias de estilo (usa linters)
- No apruebes sin leer el código
Tipos de comentarios:
# 1. Pregunta (no bloqueante)
❓ ¿Consideraste usar `useMemo` aquí para optimizar renders?
# 2. Sugerencia (opcional)
💡 Sugerencia: Podrías extraer esto a un hook custom `useTheme()`
# 3. Cambio requerido (bloqueante)
🚨 Esto causa un memory leak. Debes limpiar el listener en el cleanup de useEffect.
# 4. Nitpick (estilo, no bloqueante)
🧹 Nitpick: Preferiría `isLoading` en lugar de `loading` para booleanos.
# 5. Aprobación con comentario
✅ LGTM! Solo un comentario menor arriba (no bloqueante).
Uso de GitHub Suggestions:
# Reviewer puede proponer cambios directos:
- const theme = localStorage.getItem('theme')
+ const theme = localStorage.getItem('theme') || 'light'
El autor puede aplicarlos con un click (“Commit suggestion”).
Parte 3: Flujo de Revisión Completo
Estado de un PR:
1. ⏳ Abierto (Open) → Esperando revisión
2. 👀 En revisión (Changes requested) → Autor debe aplicar feedback
3. ✅ Aprobado (Approved) → Listo para merge
4. 🎉 Fusionado (Merged) → Código en main
5. 🚫 Cerrado (Closed) → Rechazado o ya no aplica
Workflow típico:
# 1. Autor crea PR
git push origin feature/X
# 2. Reviewer comenta: "Cambia var a const en línea 10"
# 3. Autor aplica cambios
git add .
git commit -m "refactor: cambiar var a const según PR review"
git push origin feature/X
# GitHub actualiza el PR automáticamente
# 4. Reviewer aprueba
# 5. Autor o reviewer fusiona
# (Click en "Merge pull request" o desde CLI)
gh pr merge 42 --squash
Tipos de merge:
-
Merge commit (default):
git merge --no-ff feature/X # Crea commit de merge, preserva historia completa -
Squash and merge (recomendado):
git merge --squash feature/X # Combina TODOS los commits de la rama en 1 solo # Historia limpia en main -
Rebase and merge (para expertos):
git rebase main # Mueve commits de feature encima de main # Historia lineal, sin merge commits
Comparación visual:
# Merge Commit:
main: A---B---E---F (merge commit)
\ /
feature: C---D
# Squash:
main: A---B---G (C+D combinados)
# Rebase:
main: A---B---C'---D' (commits re-aplicados)
Configurar merge por defecto en GitHub:
Settings > General > Pull Requests
- ✅ Allow squash merging (recomendado)
- ❌ Allow merge commits (solo para proyectos open source grandes)
- ❌ Allow rebase merging (solo si tu equipo lo domina)
Parte 4: Protecciones de Ramas
Branch Protection Rules previenen merges accidentales a main.
Settings > Branches > Add rule:
Branch name pattern: main
☑️ Require a pull request before merging
☑️ Require approvals (mínimo: 1)
☑️ Dismiss stale reviews when new commits are pushed
☑️ Require status checks to pass before merging
☑️ Require branches to be up to date before merging
- Tests (CI)
- Linter
☑️ Require conversation resolution before merging
☑️ Require linear history (evita merge commits)
☑️ Include administrators (ni siquiera admins pueden saltarse reglas)
Resultado:
- ❌ No puedes hacer
git push origin maindirectamente - ✅ Debes crear PR + obtener aprobación
- ✅ Los tests deben pasar antes de merge
Parte 5: GitHub CLI para PRs
# Crear PR desde terminal
gh pr create --title "feat: dark mode" --body "Implementa tema oscuro"
# Crear PR interactivo (te pregunta título, descripción, etc.)
gh pr create
# Listar PRs abiertas
gh pr list
# Ver detalle de PR
gh pr view 42
# Checkout de un PR para probarlo localmente
gh pr checkout 42
# Añadir reviewer
gh pr edit 42 --add-reviewer @abraham,@maria
# Aprobar PR
gh pr review 42 --approve
# Solicitar cambios
gh pr review 42 --request-changes --body "Falta test en línea 10"
# Fusionar PR
gh pr merge 42 --squash --delete-branch
💡 Jutsu Secreto: PR Templates
Archivo .github/pull_request_template.md:
## 📝 Tipo de Cambio
- [ ] 🐛 Bug fix
- [ ] ✨ Nueva funcionalidad
- [ ] 💥 Breaking change
- [ ] 📚 Documentación
## 🎯 Descripción
<!-- Explica QUÉ cambiaste y POR QUÉ -->
## 🔗 Issue Relacionada
Closes #
## ✅ Checklist
- [ ] Mi código sigue el estilo del proyecto
- [ ] He realizado self-review de mi código
- [ ] He comentado partes complejas
- [ ] He actualizado la documentación
- [ ] Mis cambios no generan warnings
- [ ] He añadido tests que prueban mi fix/feature
- [ ] Tests unitarios pasan localmente
- [ ] Cambios dependientes ya fueron mergeados
## 📸 Screenshots (si aplica)
<!-- Añade imágenes o GIFs -->
Ahora cada PR se crea con esta plantilla pre-llenada.
🎯 Reto Ninja del Tema
Misión: Practicar flujo completo de PR
- Fork un proyecto público (ej: firstcontributions)
- Crea una rama
add-tu-nombre - Haz un cambio pequeño (añade tu nombre a Contributors.md)
- Push y abre PR siguiendo la plantilla profesional
- Simula una revisión:
- Crea otro repo tuyo
- Abre PR
- Pide a un amigo que revise (o crea cuenta secundaria)
- Aplica feedback
- Aprueba y fusiona
Criterios de éxito:
- ✅ Tu PR tiene título con conventional commit
- ✅ La descripción tiene al menos 3 secciones
- ✅ Añadiste una captura de pantalla (aunque sea del código)
- ✅ Aplicaste al menos 1 sugerencia de reviewer
- ✅ El PR fue fusionado exitosamente
📚 Recursos Adicionales
- About Pull Requests - GitHub Docs
- Code Review Best Practices
- Conventional Commits
- GitHub Flow
- The Art of Code Review
Siguiente Pergamino: 3.6 El Mapa de Estrategia - GitHub Projects (Kanban)
¿Hiciste tu primer PR? Comparte el link en Discord con #PrimerPR! 🎉🥷