A Story
The Day Before Everything
A CRM migration, a lost phone, a stranger from Cuba - and the night before go-live that I keep coming back to.
There's a version of this story that fits neatly into a project retrospective. Enterprise CRM migration, year and a half of development, three deployment attempts, a pivot to a new caching layer two weeks post-launch. That version is true.
But it misses the part I actually think about.
This one's a little different from what I usually post here. No biology of flavor, no quantum edges of perception. Just a story about a project, a phone, and a stranger who showed up at exactly the right time. I think it's worth telling.
The Project
Our company had run on the same CRM system for roughly twenty years. It was on-premise - our hardware, our servers, our institutional knowledge baked into workflows that predated most of the people using them. Moving off of it to a modern cloud platform wasn't just a technology swap. It was archaeology.
My team got brought in about six months to a year after the project had already kicked off. Someone else had started it; we were there to finish it. And even with all that prior groundwork, we were still discovering requirements we didn't know existed.
That's the thing nobody tells you about legacy system migrations: you can watch an experienced agent process a guest compensation for twenty years and still not capture every nuance of what that workflow actually does. The edge cases live in muscle memory, not documentation. An agent doesn't think "first I check X, then I flag Y, then the system triggers Z." They just do it, because they've done it ten thousand times. Your job as the development team is to reverse-engineer twenty years of habit into a system that's never seen any of it.
We learned this the hard way.
Three Dates
We scheduled our first go-live with confidence. We had been building for over a year, we had features mapped, we had a plan. What we didn't have - though none of us said it out loud - was complete requirements.
UAT made that obvious fast.
We finally got our testing environment set up, got users access with the right profiles and roles, and they started clicking through the features we'd spent over a year building. Within hours, it was a steady stream of where's this? Where's this? Where's this? Compensation features were missing steps. Other workflows had gaps we hadn't anticipated. The UAT was doing exactly what it was supposed to do, which was the problem.
We kept the foot on the gas anyway. Kept saying: keep testing, we're going live, keep testing. In the back of our minds we all knew. But you push anyway, because even a failed sprint teaches you something. When the final decision day came, we made the call: we're not going live. We're pushing back six months.
Nobody was crushed. Honestly, there was relief. We had clarity we didn't have before. We went to work.
The second date came. We were closer. But not close enough. We pushed again.
My boss asked me what was different this time versus the first delay. I told him: this time we actually have a hundred percent of the requirements. Not we think we do. We'd done enough UAT to surface everything - all the edge cases, all the muscle-memory workflows - and we'd written them down. And the development team had looked at that list and said, with buy-in, here is how long this will actually take. The third date wasn't a hope. It was a commitment grounded in reality.
That date held.
The Day Before
We were on the road for the go-live. The cutover was scheduled to start Saturday morning - a full day and night of coordinated deployments, testing, fixes, more deployments. The whole team was there. The day before, we took a breath and went to play pickleball.
I left my phone in the Uber.
By the time I realized, the driver was forty-five minutes away. I was the lead architect on the project. Two-factor authentication. Full coordination responsibility for the next thirty-six hours. My phone wasn't a convenience - it was a necessity.
My boss, who's also one of my closest friends - I've known him for over twenty years - jumped in another Uber with me and we headed back to the hotel. We asked our driver: realistically, what's the incentive for an Uber driver to return a lost phone? The answer was something like twenty dollars. We looked at each other. No way this guy drives forty-five minutes for twenty bucks.
We filed the lost item claim anyway and called the prior driver through the Uber app.
He didn't speak English. I don't speak Spanish.
Our current driver heard what was happening and just took over. Without being asked, he spent ten or fifteen minutes on the phone with the other driver, negotiating, pushing, working through it. Eventually a solution emerged: the driver would leave my phone with his sister across town and we could come pick it up.
Our driver offered to take me.
An Hour South
It was a full hour each way. Just the two of us in the car.
He had escaped Cuba. Left a dictatorship behind. Some of his family was still there; he was working on getting them out. He was grateful to be in the United States in a way that you could feel - not performed, just real. I told him about the project. The year and a half. The failed go-lives. The fact that tomorrow was the day, and I needed that phone back in my hands before morning.
He got it immediately. We talked the whole way down.
When we got to the sister's house, he got out of the car with me. Handled the conversation. Got my phone back. The sister asked - I'm told - is this the gringo? Yes. That was me. The gringo with a go-live in the morning.
On the drive back, he turned to me and said something I haven't forgotten:
Your project is gonna be successful.
Not I think. Not I hope. Is gonna be.
I got a little tear in my eye. I said, you know what, I think you're right.
I really do think he was sent. An angel in an Uber, showing up the night before everything, to get me where I needed to be - not just geographically.
The Go-Live
We went live the next day.
There were issues. There are always issues. We hit API limits, asynchronous event limits, middleware backlogs. The transactional calls that used to flow through our legacy systems weren't built for what we were asking the new platform to do - cloud CRMs aren't designed for high-frequency transactional requests, and we felt that immediately. Within a week or two, we introduced a caching layer to handle that load and the architecture stabilized.
But we didn't stop. We didn't back out. We went forward and we stayed forward.
The Uber driver was right.
What I Actually Learned
The migration taught me that requirements are never finished - they're discovered. The safest thing you can do is create conditions where people show you what they need instead of trying to tell you. UAT isn't a formality. It's the process by which twenty years of habit becomes a feature list.
And it taught me that a real go-live date isn't the one that sounds good in a meeting. It's the one your developers commit to with eyes open, full requirements in hand, honest about what it takes.
But the night before the go-live taught me something else. That strangers show up. That faith is worth leaning on when the situation is out of your hands. That sometimes you need someone to look you in the eye and tell you it's going to work - not because they have any reason to believe it, but because they do.
I got my phone back. The project shipped. And I still think about that driver sometimes.
I texted him a few days ago. He didn't respond. That's okay.