Documento decisiones, no solo código: RFCs y ADRs para dejar registro del por qué de cada elección y code reviews.
Diseño soluciones end-to-end pensando primero en el problema y el contexto, y recién después en la implementación.
Aplico Clean Code, Arquitectura Hexagonal y DDD donde el dominio lo justifica. En problemas simples evito la sobre-ingeniería.
Utilizo SOLID y patrones de diseño como: Strategy, Factory, CQRS, entre otros, como herramientas para resolver un problema concreto.
Diseño flujos asíncronos cuando el acoplamiento o la carga lo solicita: colas y eventos para desacoplar, webhooks idempotentes, reintentos y DLQ para que un fallo no se propague ni se pierda.
Selecciono la estrategia de caching según el patrón de acceso y la tolerancia a datos desactualizados: CDN, Redis o memoria según qué se lee, cuánto cambia y cuánto importa que esté fresco.
Elijo el backend según dominio, complejidad y necesidades de rendimiento: Go, Java o TypeScript sobre Node.js según el caso. REST o EDA según cuánto necesite desacoplar y escalar.
Elijo la estrategia de render según lo que el producto necesita: SPA, SSG, SSR o RSC según performance y SEO, con React, Angular o Astro sobre design systems propios.
Abordo la autenticación de forma integral: sesiones, JWT con refresh tokens u OAuth 2.0 según la superficie de exposición.
Modelo la autorización y la seguridad desde el diseño: RBAC y prácticas basadas en OWASP.
Automatizo CI/CD y containerizo con GitHub Actions y Docker para que el deploy sea transparente y seguro.
Incorporo observabilidad desde las etapas iniciales con Prometheus, Grafana y Sentry, para poder operar y mejorar los sistemas sobre datos concretos y no suposiciones.