Senior Software Engineer — Arquitectura y Modernización

  • Buenos Aires, Argentina
  • Full-Time
  • On-Site

Job Description:

El rol tiene cuatro frentes con peso parecido. Esperamos que una semana típica tenga algo de cada uno, y que nunca pase un mes entero sin código propio en producción. 1. Oversight de arquitectura y del plan de modernización • Ser el dueño técnico del plan de evolución: migración de los satélites a .NET 10, del monolito a .NET Framework 4.8.1 y luego a .NET moderno, y del front Angular a React. • Definir y cuidar los límites de la arquitectura: qué va en el monolito, qué va en servicios nuevos, cómo se exponen capacidades para el módulo CLM y para la capa de servicios agent-ready (MCP). • Escribir y mantener ADRs (decisiones de arquitectura) cortos y claros. Revisar diseños antes de que se conviertan en código. • Priorizar la deuda técnica junto al CTO y los socios: qué se paga ahora, qué se posterga y por qué. 2. Conocimiento y custodia del legacy • Entender el monolito en profundidad (dominio, servicios, entidades, integraciones, esquema de datos) y documentar lo que hoy vive en la cabeza de pocas personas. • Mantener el sistema operando mientras se moderniza: diagnosticar incidentes de producción, acompañar releases, definir recetas de rollback. • Resolver los problemas estructurales conocidos: gestión de secretos, migraciones de esquema, pipelines de CI/CD con build y tests en cada PR, observabilidad. 3. Hands-on • Escribir código de producción en los módulos más críticos o más difíciles: refactors de clases grandes, extracción de servicios, migraciones de framework, integraciones. • Hacer code review con criterio y a tiempo: el review no puede ser el cuello de botella del equipo. • Construir las primeras versiones (spikes, PoCs) de los componentes nuevos y dejarlos en un estado que el equipo pueda continuar. • Incorporar herramientas de AI al flujo de desarrollo (agentes de código, generación de tests, análisis de repositorio) con reglas claras de uso y revisión. 4. Pedagogía y crecimiento del equipo • Hacer pair programming de forma regular, no como excepción. • Dictar sesiones técnicas cortas y prácticas (.NET moderno, Git/GitHub flow, testing, Azure, uso de agentes) alineadas al plan de entrenamiento del equipo. • Explicar el «por qué» de cada decisión, en reviews y en documentos, de forma que el equipo pueda tomar la misma decisión sin vos la próxima vez. • Ser el referente al que se consulta antes de un cambio riesgoso, y responder con paciencia y claridad. Requisitos excluyentes Buscamos experiencia real, no listas de tecnologías. En la entrevista vamos a pedir ejemplos concretos de cada punto. Área Lo que necesitamos Experiencia .NET legacy 8+ años desarrollando software, con al menos 3 como referente técnico de un equipo (tech lead, arquitecto hands-on o similar). Dominio de .NET Framework 4.x, ASP.NET MVC/Web API, Entity Framework 6, IIS. Haber mantenido y evolucionado un monolito grande (100k+ LOC) en producción. .NET moderno Experiencia en .NET 8 o superior, ASP.NET Core, EF Core, Azure Functions. Haber liderado o ejecutado al menos una migración de .NET Framework a .NET moderno. Área Lo que necesitamos Datos SQL Server sólido: modelado, performance, índices, migraciones de esquema controladas (EF explicit migrations, DbUp o equivalente). Nube Azure en producción: App Services, Functions, SQL, Blob Storage, Key Vault, App Insights / Azure Monitor. CI/CD y Git GitHub o Azure DevOps con pipelines de build y test en PR, estrategia de ramas y releases, versionado. Haber ordenado un flujo de trabajo que antes era manual. Front Capacidad de leer, revisar y modificar un front Angular y React (no hace falta ser especialista, sí poder hacer review y destrabar). Calidad Testing automatizado (unitario e integración), refactoring seguro de código sin tests, code review como práctica. Comunicación Español nativo o fluido. Capacidad de explicar decisiones técnicas por escrito y en persona a desarrolladores y a socios no técnicos. Inglés técnico para leer documentación. Deseables Ninguno de estos puntos es excluyente, pero suman mucho: • Uso cotidiano de herramientas de AI para desarrollo (Claude Code, Copilot, Cursor o similares) y criterio formado sobre cuándo sirven y cuándo no. • Experiencia diseñando APIs para ser consumidas por agentes o integraciones externas (REST bien versionado, MCP, webhooks). • Infraestructura como código (Terraform o Bicep) y ambientes efimeros o clon de producción. • Observabilidad: diseño de métricas, logs estructurados, alertas accionables. • Seguridad aplicada: gestión de secretos, OWASP, hardening de APIs públicas con API keys/OAuth, preparación para pentest. • Dominio de firma electrónica, PKI, certificados, PDF (iText, DynamicPDF o similares) o del negocio de gestión contractual. • Experiencia con multi-tenancy en SaaS B2B. • Haber trabajado con equipos pequeños en empresas en crecimiento, donde el mismo rol diseña, codea y enseña. Perfil y forma de trabajo Más que el stack, lo que define a esta persona es cómo trabaja. • Criterio antes que moda. Sabe distinguir entre lo que hay que cambiar y lo que funciona y conviene no tocar. No propone reescribir; propone el próximo paso seguro. • Respeto por el legacy y por quienes lo construyeron. Entiende que el código actual sostiene el negocio y que cada decisión rara suele tener una historia. Pregunta antes de juzgar. • Pedagogía genuina. Disfruta explicar. Prefiere que el equipo aprenda a resolverlo a resolverlo solo. Mide su éxito por lo que el equipo puede hacer sin esa persona. • Manos en el código. No delega todo lo difícil ni se queda solo en diagramas. Abre PRs, los defiende y acepta feedback. • Pragmatismo con estándares. Sabe que el equipo es chico y los plazos son reales, pero no negocia lo básico: tests en lo crítico, secretos fuera del repo, nada a producción sin pipeline. • Comunicación clara y sin ego. Escribe documentos cortos que se leen. Dice «no sé» cuando no sabe y «me equivoqué» cuando corresponde. • Autonomía con alineación. Trabaja sin supervisión diaria, pero mantiene al CTO y a los socios al tanto de riesgos y decisiones importantes antes de tomarlas, no después.