Building an AI tutor for Utah's largest university

I was initially brought on to the AIVA project ("Artificial Intelligence Virtual Assistant") as an intern who would study under the team of contractors building out the app. Progress was slow and they were burning through our funding, so I built a simpler (and practically free) POC using Go and told UVU that I could lead the way.

Aiva chatbot helping with a math problem

My jaw dropped to the floor when UVU agreed and promptly fired every contractor. Time was short and funding uncertain, so I burned the midnight oil for the better part of a year to get the tutor bot up and running.

Enter Hubris

For months, I was the only developer on the project. This created a problem: I became a control freak. When other teams were eventually looped in to help align the codebase with UVU standards, I pushed back hard. Why use Vue when HTMX is so much cleaner? Why switch to Flutter when Go packs the entire project into a single (lightning-fast) executable? And why do I have to use REST instead of gRPC for our remote procedure calls?

There's a chance I was right on occasion - but that didn't make me any more bearable to work with. This project was my baby and they were trying to bastardize it. I knew nothing of enterprise software, of standards, of using the technologies that the team already knows.

Learning to Let Go

We worked on Aiva for two years, getting it ready for production and adding features after release. Time achieved what arguing couldn't: I learned to work on a team, to value my co-workers' experience and capitalize on the momentum they already enjoyed with their familiar tech stack.

I still believe in best practices, in using the right tool for the job, and in having plenty of tools in your belt. My goal is to one day become a software craftsman, building clean, performant, and reliable systems that solve real-world problems. But working on Aiva taught me how little I really know, how strongly I depend on others to bring a project to fruition, and how academic principles of good software design relate to our messy, imperfect reality.