Primero iniciá la hackathon
Tenés que completar tu nombre y contraseña antes de entrar al contenido del día.
Cuatro herramientas, un mini-proyecto
Este bloque es applied: los conceptos ya pasaron por tus ojos en el pre-work, acá los usamos en vivo. Cuatro herramientas que vas a usar el resto del día:
- Python — para escribir un script que hace algo útil.
- Markdown — para documentar qué hace y cómo correrlo.
- Git — para guardar el historial y poder volver atrás si rompés algo.
- Docker — para empaquetar el proyecto y que corra igual en cualquier máquina.
Al final del bloque vas a tener un mini-proyecto con script + README + primer commit + imagen Docker. Ese proyecto es la base sobre la que el agente va a trabajar en la tarde — por eso es el puente.
Un programa es un archivo de texto con instrucciones
Un script de Python es literalmente un .py con instrucciones. Lo ejecutás con uv run y listo. No hay compilación, no hay magia — el archivo entra, la computadora lo ejecuta línea por línea, y ves el resultado.
El modelo mental: Input → Proceso → Output
- Input — de dónde saca los datos (un CSV, una variable de entorno, una respuesta de API).
- Proceso — qué hace con ellos (filtra, cuenta, ordena, transforma).
- Output — qué devuelve (imprime a pantalla, escribe un archivo, llama a otra API).
El 90% de los scripts que vas a escribir con el agente tienen esta forma. Si te pedís explicar cualquier script en estos tres pasos, entendés qué hace.
Un script mínimo que lee un CSV
import csv
with open("datos/clientes.csv") as f:
reader = csv.DictReader(f)
filas = list(reader)
print(f"Total de personas: {len(filas)}")
print(f"Columnas: {', '.join(filas[0].keys())}")
top = max(filas, key=lambda x: int(x["agentes_ai"]))
print(f"Más agentes: {top['nombre']} ({top['area']}) con {top['agentes_ai']}")
Se corre con uv run scripts/analisis.py. Y ya. Eso es Python.
Texto con estructura, sin WYSIWYG
Markdown es texto plano con convenciones mínimas que cualquier editor sabe renderizar: GitHub, Notion, Slack, Claude, este sitio. Si aprendés Markdown, podés documentar cualquier cosa sin depender de Word o Docs.
# Header 1
## Header 2
### Header 3
Texto normal. **Negrita** y *cursiva*.
- Item de lista
- Otro item
- Sub-item
1. Lista numerada
2. Segundo punto
[Link a un lugar](https://growketing.com)
`código inline` dentro de una línea.
```python
# Bloque de código con sintaxis
print("hola")
```
| Columna A | Columna B |
|-----------|-----------|
| dato 1 | dato 2 |
Con esto cubrís el 95% de los casos. Lo demás lo buscás cuando lo necesites.
El modelo: repo → add → commit → push
Git es un sistema para guardar el historial de cambios de un proyecto. Cada vez que cambiás algo significativo, hacés un commit — un snapshot — con un mensaje de qué cambió. Podés volver atrás a cualquier snapshot, comparar versiones, y compartir el proyecto en GitHub.
| Comando | Qué hace |
|---|---|
git init | Crea un repo Git en la carpeta actual. |
git status | Te dice qué cambió desde el último commit. |
git add archivo.py | Marca ese archivo para el próximo commit ("staging"). |
git add . | Marca todo lo que cambió. Útil pero revisá antes con git status. |
git commit -m "mensaje" | Toma el snapshot de lo staged con un mensaje. |
git log --oneline | Lista los commits del repo en una línea cada uno. |
git push | Sube los commits al remoto (ej. GitHub). |
git checkout -b nombre | Crea y cambia a un branch nuevo. |
Aclaración importante sobre el comando git config --global user.name:
El "user" de Git no es el usuario del sistema operativo que vimos en el Bloque 1. Es simplemente el nombre con el que firmás cada commit — lo que aparece en el historial. Son dos "usuarios" que conviven sin chocar:
- El de macOS gobierna qué podés hacer en tu máquina (permisos,
sudo). - El de Git es sólo una etiqueta de autoría en los commits.
Git en 12 minutos
De los tres temas del bloque, Git es el que más conviene tener visto antes. Python ya es familiar para muchos, y Markdown se aprende haciendo (ver el tutorial interactivo en Referencias).
Armá el proyecto base del día
Si hiciste el pre-work, ya tenés ~/Desktop/hackathon-prueba/ armado. Si no, creémoslo ahora — son 4 snippets copiables.
1. Estructura
cd ~/Desktop
mkdir hackathon-prueba
cd hackathon-prueba
mkdir datos scripts docs
tree
2. Un CSV de prueba
cat > datos/clientes.csv << 'EOF'
nombre,area,agentes_ai
María,PPC,3
Juan,SEO,1
Laura,Data,5
Pedro,RevOps,0
Ana,Creative,2
Carlos,Programmatic,4
EOF
3. Script de Python que lo analiza
cat > scripts/analisis.py << 'EOF'
import csv
with open("datos/clientes.csv") as f:
reader = csv.DictReader(f)
filas = list(reader)
print(f"Total de personas: {len(filas)}")
print(f"Columnas: {', '.join(filas[0].keys())}")
print()
top = max(filas, key=lambda x: int(x["agentes_ai"]))
print(f"Más agentes: {top['nombre']} ({top['area']}) con {top['agentes_ai']} agentes")
sin_agentes = [f["nombre"] for f in filas if f["agentes_ai"] == "0"]
print(f"Sin agentes: {', '.join(sin_agentes)}")
EOF
uv run scripts/analisis.py
4. README, Git init y primer commit
cat > README.md << 'EOF'
# Hackathon Prueba
Mi primer proyecto desde la terminal.
## Qué tiene
- `datos/` — CSVs de ejemplo
- `scripts/` — Scripts de Python
- `docs/` — Documentación
## Cómo correr el análisis
uv run scripts/analisis.py
EOF
git init
git add .
git commit -m "Mi primer commit desde la terminal"
git log --oneline
Si todo eso corrió sin error, tenés un mini-proyecto listo para que a la tarde el agente lo lea y lo modifique.
.envDónde viven las API keys
En el Bloque 2 viste que las variables de entorno son valores que el shell "recuerda" ($HOME, $PATH). En el próximo Bloque 4 vas a ver en detalle el modelo cliente-servidor y por qué las API keys son credenciales para hablarle a un servidor remoto — por ahora alcanza con saber eso. Acá unimos los dos conceptos: las API keys se guardan en variables de entorno, y el lugar estándar de un proyecto es un archivo .env.
Crear el archivo
cd ~/Desktop/hackathon-prueba # el proyecto del ejercicio de arriba
touch .env
echo 'ANTHROPIC_API_KEY=sk-ant-ejemplo' >> .env
echo 'OPENAI_API_KEY=sk-ejemplo' >> .env
cat .env # verificás el contenido
CRÍTICO: .gitignore
Antes del próximo commit, agregá .env al .gitignore para que Git nunca lo suba.
echo '.env' >> .gitignore
cat .gitignore # confirmás que está
git status # .env ya no debería aparecer como untracked
El .env nunca va a Git. Si una API key se sube a GitHub, hay bots que la detectan en minutos y te vacían la cuenta. Literal — scanean el feed público 24/7 buscando keys filtradas.
Si ya committeaste un .env por accidente: rotá esa key inmediatamente (regenera una nueva desde el dashboard del servicio). Borrar el archivo del repo no alcanza — quedó en el historial de Git.
Leer el .env desde Python
Hay dos formas. La simple (sin dependencias):
# Cargar .env en la sesión actual de shell:
export $(grep -v '^#' .env | xargs)
# Desde Python:
import os
key = os.environ.get("ANTHROPIC_API_KEY")
print(f"Tengo key: {key[:10]}..." if key else "No hay key cargada")
La forma que usa todo el ecosistema Python (con python-dotenv — uv lo maneja):
uv add python-dotenv # agrega la dep al proyecto
# scripts/test_env.py
# /// script
# dependencies = ["python-dotenv"]
# ///
from dotenv import load_dotenv
import os
load_dotenv() # lee .env del directorio actual
key = os.environ.get("ANTHROPIC_API_KEY", "no-configurada")
print(f"API key cargada: {key[:15]}...")
Correlo con uv run scripts/test_env.py. Vas a ver los primeros caracteres de tu key — eso confirma que el script está leyendo el archivo .env correctamente. Este patrón es el mismo que vas a usar a la tarde cuando Claude Code lea tu ANTHROPIC_API_KEY.
Empaquetar tu proyecto en un contenedor
Hasta acá tu script corre en tu laptop porque tu laptop tiene Python instalado, uv, las dependencias, el .env en el lugar correcto. Si mañana se lo pasás a alguien, o lo subís a un servidor, arrancan los problemas clásicos: "a mí me funciona". Docker resuelve eso.
Qué es, en una frase
Un contenedor es tu proyecto empaquetado con todo lo que necesita para correr — un mini sistema operativo, Python, las dependencias, tu código — en una caja que se ejecuta igual en cualquier máquina que tenga Docker.
- Imagen — la receta/plantilla. Se construye a partir de un
Dockerfile. - Contenedor — la instancia corriendo de esa imagen. Podés tener muchos del mismo tipo.
- Dockerfile — un archivo de texto con los pasos para armar la imagen.
No es una máquina virtual — es mucho más liviano. Pensalo como "un zip que también sabe correrse solo".
El Dockerfile de tu proyecto
Parados en ~/Desktop/hackathon-prueba (el proyecto que armaste más arriba), creá un Dockerfile con esta receta:
cat > Dockerfile << 'EOF'
FROM python:3.13-slim
WORKDIR /app
COPY . .
RUN pip install --no-cache-dir python-dotenv
CMD ["python", "scripts/analisis.py"]
EOF
Línea por línea:
FROM python:3.13-slim— arrancamos desde una imagen chica que ya trae Python.WORKDIR /app— la carpeta de trabajo dentro del contenedor.COPY . .— copia tu proyecto adentro.RUN pip install ...— instala las dependencias que tu script necesita.CMD [...]— qué se ejecuta cuando arranca el contenedor.
Construir la imagen y correrla
# Construir la imagen (la primera vez tarda — se baja Python):
docker build -t hackathon-prueba .
# Correr un contenedor a partir de esa imagen:
docker run --rm hackathon-prueba
# Ver las imágenes y contenedores que tenés:
docker images
docker ps -a
Si todo salió bien, vas a ver el mismo output del script de Python — pero esta vez corriendo adentro de un contenedor, totalmente aislado de tu sistema.
Heads up con el .env: .gitignore protege tus secrets de Git, pero no de Docker. Si necesitás secrets en un contenedor, lo correcto es pasarlos en runtime con docker run --env-file .env hackathon-prueba — así viven en tu disco y nunca quedan horneados dentro de la imagen. (Y si querés blindarlo, agregás un .dockerignore con .env adentro.)
Para los que van rápido
- Modificá el script: agregá un filtro (solo líderes con más de 2 agentes), o contá cuántos hay por área.
- Escribí el resultado a un archivo nuevo en
docs/resumen.mden lugar de imprimirlo. - Creá un branch para tu cambio:
git checkout -b feature/filtro, hacé el cambio,git add,git commit, y después volvé amaincongit checkout main. - Explorá
git diffentre versiones ygit stashpara guardar cambios sin commitear. - Si tenés cuenta de GitHub, creá un repo nuevo en github.com/new, copiá los 3 comandos que te muestran en "push an existing repository" y subí tu proyecto.
¿Lo hiciste y lo entendés?
Dos listas independientes. Marcá lo que ya pudiste hacer (izquierda) y los conceptos que ya te cerraron (derecha). Al final de este bloque tenés que tener un repo con al menos un commit — el agente de la tarde lo va a usar como punto de partida.
Videos y tutoriales
Cómo documentás y versionás tu trabajo hoy
Python, Markdown y Git son tres formas de dejar registro. Antes de arrancar con el agente, mirá cómo venís haciendo lo equivalente sin ellas.
- ¿Cuántos archivos tuyos se llaman hoy algo como
reporte-FINAL,reporte-FINAL-v2,reporte-FINAL-real-este? Eso es versionado a mano — es justo lo que Git resuelve. - Si tu laptop se cae al piso ahora y no prende más, ¿qué información perdés para siempre? Mapealo en 30 segundos.
- ¿Documentás procesos que hacés seguido (en Notion, Docs, README), o viven en tu cabeza y salen sólo cuando alguien pregunta?
- Cuando escribís algo importante (propuesta, plan, reporte), ¿podés volver a una versión de hace dos semanas? ¿Cómo?
- ¿Alguna vez pisaste trabajo tuyo o de otro por tocar el mismo archivo en paralelo? Git existe por eso.