Experience
Enterprise software since 2019: banking, logistics and commerce. I started by fixing systems and ended up designing them.
- years of experience
- 7
- companies
- 3
- Current
Oct 2025 — present
1 year and 1 monthRemote · US
MikMak (by Spins)
Senior Software Engineer
Marketing and commerce software for brands.
I joined in October 2025, working fully remote for a US company from Ecuador. MikMak was acquired by Spins in early 2026. From the start they put me on a new project: the new main app for employees, replacing a couple of old apps that were full of bugs and hard to maintain. The company is more mature about architecture and design than my previous ones, and we were on AWS from the first day.
The app is a .NET modular monolith with a Vue 3 UI. There’s a big team and I’m part of it. I’m not the team lead, but most decisions about this app are mine and I review most of its code, so in practice it’s my responsibility. Here the design decisions are the main part of the job, not something that happens alongside the tickets. I also manage its infrastructure, which is simple but important: Route 53, an ALB, Fargate, ElastiCache (Redis), S3, MongoDB and MySQL, with Auth0 for authentication. It’s all written in OpenTofu and applied through Spacelift.
After the acquisition we merged with Destini, another Spins company and a smaller competitor with much the same features. I led the way on the software that turns Destini clients into MikMak clients. It’s a whole module inside the main app, with a lot of asynchronous, event-driven code, and it has already migrated hundreds of clients.
I don’t touch the SQL databases directly, there’s a team for that, but I use EF. That means making sure queries stay under 30 seconds and don’t have N+1 problems. It’s the same kind of problem I used to fix in tickets, and now the job is to not write it in the first place.
I’m also in charge of a shared component library. Each UI app has its own styling today, so the components are moving into one npm package that every app can use.
I’ve been here about a year, almost all of it on this one app. It spans several microservices, and it will keep growing into the company’s main internal app, so key decisions go through me.
Highlights
100s
Destini clients moved to MikMak by the migration module I led, an asynchronous, event-driven process that has already run for hundreds of them.
4 modules
Moved from the old apps into the new modular monolith, plus a couple of new ones. The old apps were full of bugs and hard to maintain.
< 30 s
The limit I hold every EF query to, on databases another team owns, with no N+1. At Logiztik I fixed these after the fact. Here I try not to write them.
- .NET
- Vue 3
- AWS
- Fargate
- MongoDB
- MySQL
- Redis
- Auth0
- OpenTofu
- Spacelift
- Datadog
Aug 2023 — Aug 2025
2 years and 1 monthRemote · Ecuador
Logiztik Alliance Group
Senior Software Engineer
Import and export logistics for Ecuador.
I joined in August 2023 as a junior developer and was made senior soon after, once the company saw it had misjudged my level. Logiztik handles imports and exports to and from Ecuador. A client wants a lot of a product, a producer wants to export it, and neither knows how to move it. Logiztik does all of that for hundreds of exporters and clients, with millions of dollars of goods moving daily. The systems behind it were messy.
Over time the work moved from fixing the system to shaping it. Everything ran on premises, and I made architecture decisions there. I helped add observability across several services, started an application gateway, split monoliths into microservices, and brought in Docker, which the infra team and I then used for new services. Azure Kubernetes was being discussed when I left.
My first big project was the backend of an old mobile app for clients. It was a .NET Framework API with no architecture, hard to maintain and hard to untangle. I moved all of it to .NET 8 with Clean Architecture, on my own with a lead looking over the work.
Accounting used an old service that turned our financial data into something SAP understood. It kept freezing, and IT had to reboot the whole server several times a week or accounting couldn’t work. Our SAP licence capped the number of connections, and once enough were open, SAP didn’t refuse the next one, it hung it forever. Restarting the service didn’t help, because the hung connections kept blocking the database. While moving the service to current .NET I added a semaphore around the SAP SDK so it never opens more connections than allowed. The freezes stopped completely.
Sending invoices was a blocking operation. One click sent thousands of emails and tied the user up for hours. I put the emails in a queue and a separate microservice sends them one by one, so people keep working and any failures show on an error page. It was a small project, but the first async work the company had done.
Connecting to external APIs meant a developer writing a whole new connector each time, and the APIs kept changing or new ones kept arriving. Most of them follow the same standards, so I rebuilt it as parameters: URLs, auth codes and so on. When an API arrives with a new standard, supporting it is one more implementation of an interface (the Strategy pattern) instead of more
ifs.Alongside all that I fixed hundreds of bugs. In my second year I was put in charge of the ticket team, up to three people fixing bugs full time while other teams built features. That wasn’t the work I wanted to do, so I left.
Highlights
Reboots → 0
The SAP service accounting depended on froze and needed a full server reboot several times a week. A semaphore capping SAP connections fixed it for good.
Months → config
Connecting to a new external API used to mean a developer writing a new connector, which could take months. Now it's a new entry with the right parameters.
5 min → ms
Slow queries found while fixing tickets. Mostly N+1 problems, solved with temp tables, CTEs or better EF queries.
- .NET
- SQL
- Entity Framework
- Docker
- SAP
- Azure DevOps
- Next.js
Aug 2019 — Jul 2023
4 yearsRemote · Ecuador
CloudStudio
Junior Software Engineer
Banking software for credit unions in Ecuador.
I started as an intern in August 2019 and was hired about two months later. The product was a banking system used by around 30 savings and credit cooperatives in Ecuador. It covered savings, loans, investments and more, with a large parameter engine that let administrators configure products and workflows. It was a .NET Framework application with a Silverlight front end.
Almost all of my work there was inside design decisions other people had made. The first ones that were mine were small: a batch writer for the imports and a background job for users far from the server.
For the first three years I worked tickets: reports with DevExpress, database maintenance and code in .NET, EF and Silverlight. I gave direct support to about ten of the cooperatives.
The reports ran straight off the production database, so making them faster meant tuning stored procedures, queries and EF. The hardest ones rebuilt a savings account’s balance from its very first transaction, to check that accounting and finance still added up.
When another team moved the application to newer .NET and WPF, I spent about a month fixing the bugs the migration left, until it became the standard version.
Highlights
min → s
Heavy accounting and financial reports, from 5–10 minutes to as little as 30 seconds. Tuned stored procedures, queries and EF, with no data warehouse to lean on.
30 → 2 min
Bulk loads of files with millions of records. Replaced a paid EF extension with my own batched writer, and added a background job for users far from the server.
6×
Trained the teams of credit unions that bought the code, so they could run the system themselves.
- .NET
- SQL
- Entity Framework
- DevExpress
- Silverlight