As a professional software developer, I’ve noticed it’s becoming increasingly difficult to avoid using AI. CoPilot is now built into Microsoft products like Word, Excel, and PowerPoint, to name a few. Most IDEs, like Visual Studio and Xcode, now have AI enabled by default to assist with coding.
There’s a difference between deterministic and non-deterministic AI. If you’ve ever googled anything or used spell check, you’ve already used a mix of deterministic (or pre-programmed) and non-deterministic or probabilistic AI. For the rest of this post, what I mean by “AI” is the non-deterministic generative AI, using tools like Perplexity, ChatGPT, and more specifically CoPilot.
While I’m often amazed by how AI appears to read my mind when it suggests the next bit of code, it’s obvious that it also has some limitations. My experience in using AI in the development process reminds me a lot of guiding a toddler through an obstacle course — I’m constantly adjusting and cajoling it to get the results I need. I often ignore its suggestions — and sometimes even defy them outright. Prompt engineering seems as important an art to learn now as is other aspects of development.
At its core, AI is just a parrot imitating the style and syntax of the code surrounding it. That could be a good thing or a bad thing. For example, imagine walking into the subway in New York City. There’s trash everywhere and 1 out of every 10 people who come through the system evade the fare by jumping the gates.
If you were AI, you might conclude that these details define correct behavior in the context of the subway because that’s what the majority do.
Just because something is common, popular, or even ubiquitous does NOT make it right!
This is what “vibe coding” with AI gives you.
The large language models that power AI are only predicting which word comes next. Sure, today’s more advanced models included lots of training and self-analysis. But, at the end of the day, AI is merely imitating what everybody else has already done, or what it already sees in your codebase.
Or to use an early computing term: GIGO (garbage in, garbage out)!
There’s a lot of brilliant software out there. There’s also a lot of trash. Even some of the training bootcamps I’ve seen don’t actually follow best practices and end up with some less than tidy code. Perhaps because a training project, or a portfolio capstone project has a pretty high entropy tolerance, who cares if the code is tidy or not? But a real, professional production product deserves some careful thought. I’ve always said that even though nobody except one or two other developers will ever see your code doesn’t mean the code can be sloppy! Production code especially should be as clean on the inside as it is intuitive on the outside.
I hope that someone figures out a way to cut through all the politics of curating the “best practices” or “correct information”, and ignore all the “trash” of lazy (I mean brilliant) developers. At the end of the day, “vibe coding” with AI will only give you code that perhaps, possibly, maybe works??? (And yes my AI companion yelled curses at me to “fix” that last sentence!)
Don’t get me wrong, I use AI all the time. But I believe AI works best as an analysis tool, the same way spell-check is a lifesaver for a document. It can do wonders for checking your work, debugging issues, and helping you simplify and optimize things. Relying on it to write ALL your code would be risky.
AI has come a long way in the past few years, but I’m not holding my breath for Mr. Data to show up in the office any time soon! Perhaps we have reached the point of having a real Eddie from HHGTTG, or maybe it’s more like Holly from Red Dwarf. As long as we avoid HAL 9000 and Skynet, we’re good!
What do you think? How do you use AI in your workflow?