I spent around five years working with WordPress before I landed my first proper software development role at InSky Solutions. At the time, I thought I knew quite a lot about web development. I’d worked on countless websites, dealt with plugins, hosting, databases, custom functionality and all the usual problems that come with maintaining websites for real businesses.
I was fairly confident in what I knew, and then I started working with .NET and Microsoft Dynamics 365.
That was quite an eye-opener.
Suddenly, I was working with enterprise applications, integrations, APIs, business processes and systems that needed to communicate reliably with one another. There was a whole world of software engineering that I hadn’t really experienced through WordPress, and I loved discovering it.
I remember working on an integration between Dynamics 365 and a hotel reservation system that exposed an XML-based SOAP API. We had to consider customer records, reservations, synchronisation, existing data, error handling and the limitations of the third-party provider. We built an IIS-hosted integration service, with a Windows Service running the synchronisation every five minutes because the external system couldn’t provide reliable event notifications.
It was the sort of project where you had to understand the problem, work through the limitations and figure out how to make everything fit together. I learnt an enormous amount from that experience, and there was always something else I wanted to understand.
I felt like I’d moved from being comfortable with websites into a much bigger field, and I was still finding my feet.

Then AI changed how I worked
Over the last couple of years, AI-assisted development has become a central part of my everyday workflow.
These days, when I receive a project specification, I’ll often start by discussing it with ChatGPT. I’ll go through the requirements, consider different approaches, raise ideas of my own and ask questions about the technologies or architecture we might use.
Sometimes I’ll bring Grok or Gemini into the discussion as well, particularly when I want another perspective on a decision.
I’ve also become quite conscious of how agreeable these tools can be. If I suggest an approach and receive a very convincing explanation of why it’s a good idea, I still have to ask myself whether the reasoning is sound or whether the model is simply following my lead.
Once I’ve settled on an approach, I’ll work on the implementation instructions and context for Cursor. Depending on the project, that might include setting up a GitHub repository, configuring GitHub Actions and arranging automated deployment to a test or staging environment.
Sometimes that’s a relatively simple FTP deployment. Other times it’s a Docker-based application hosted on something like Fly.io. The technology varies, but I like having a workflow where changes can be committed, tested and deployed consistently.
Cursor then handles a substantial amount of the implementation, often including tests, fixes and subsequent iterations.
The amount of software I can build this way is remarkable.
I’ve worked on custom BigCommerce applications, integrations with business systems, WordPress plugins and native Android applications. I’ve been able to explore technologies that I probably wouldn’t have had the time or confidence to tackle independently a few years ago.
Building an Android application over a weekend can feel like taking part in a game jam or hackathon with considerably more resources available to you.
I’ve always joked that if you can think of something, we can probably build it. We just have to figure out how.
AI has made that attitude feel more realistic than ever.
But something else changed along the way
As AI took on more of the implementation work, I gradually became less involved in writing the code myself.
At first, that seemed like a natural progression. If a tool could implement a feature, run tests and help resolve issues faster than I could manually, it made sense to use it.
And I still believe it does.
The difficulty is that writing code was also how I learnt.
When you’re working through an unfamiliar language, debugging a problem or trying to understand why a particular implementation isn’t behaving as expected, you gradually build knowledge that stays with you. You learn the syntax, recognise patterns and become more familiar with the decisions that experienced developers make almost instinctively.
When an AI agent handles much of that process, you can reach a working result without necessarily going through the same learning experience.
I’ve noticed that in myself.
I can plan an application, work through its requirements, coordinate implementation and test the finished functionality, but I don’t always have the same familiarity with the internal code that I would have had if I’d written it myself.

And while I’ve gained experience across a much wider range of projects, there are areas of software architecture that I still want to understand much more deeply.
For example, I understand the general differences between a monolithic application, a modular monolith and microservices, but I haven’t always had the opportunity to make those decisions in a professional environment and experience their consequences over time.
That sort of judgement comes from more than reading definitions. It comes from building systems, maintaining them, seeing where decisions cause problems and understanding why another approach might have worked better. It’s closer to the habits I’m learning to value in senior engineering than to the speed of a first green pass.
I sometimes feel as though AI arrived while I was still progressing from junior towards senior-level engineering, and suddenly the way I was learning changed.
My productivity continued improving, but I wasn’t always sure my technical understanding was progressing at the same rate.
