DEV Community

Cover image for I'm a Confident Developer - Who Can't Code
Havard Skrodahl
Havard Skrodahl

Posted on

I'm a Confident Developer - Who Can't Code

That's how it feels with AI.

Backstory

I am 30+ years into enterprise system administration and IT management, and I once knew how to code. Just not good enough to make a career out of it. Assembly, C, Perl, all forgotten. I know how to develop, and maintain those skills through shell scripting, but I can no longer code. Enter AI.

I read so many cool stories about vibe coding, and wanted to try it out. It was fun. It gave me some useful tools. It gave me the answers to a lot of stuff I was curious about. But the code, while working, quickly got unmaintainable.

Then I faced a really great coding opportunity. A double elimination bracket manager for my darts club. It's so niche, that nothing like it exists. Our only option is pen and paper, and an Excel macro that somebody donated to us. Which crashed. Irrecoverably. Four out of five tournaments.

We needed something better. Something reliable that didn't crash. Something that worked without external dependencies. Without an Internet connection. It should be secure (Obey EU privacy laws? Transfer the responsibility to the end user). Most importantly: Maintainable.

Tournament Bracket

I reached out to my developer friends and colleagues who scoffed at me. I couldn't let go of this idea, so I tried making AI work by applying my developer and sysadmin skills. All I needed was a solid plan, right?

This is what I decided on, before starting the project:

  1. Zero Dependencies

    • HTML, JavaScript, CSS, run it in a browser
  2. Sky-High Resiliency

    • Use browser's localStorage
    • Hardcoded tournament logic as single source of truth
    • Transaction-based history for each tournament, applied to the hardcoded logic
  3. Reuse, Reuse, Reuse

    • Use a set of standard functions to treat and present the source of truth in the right context. Always.

Match Controls

Yes, I did need more than that:

  • Player registration and entrance fee payment
  • Global configuration
  • Manage localStorage
  • Create/Export/Import tournaments
  • Tournament draw
  • Fair BYE handling
  • Match results
  • Points scoring
  • Leaderboard and rankings
  • Conflict detection
  • A way to manage matches and tournament progression
  • Read-only, immutable tournament history

It turns out, except for the first three, I could reuse, over and over, the hardcoded brackets and the transaction-based history. My only sources of truth.

Struggles

It can be extremely frustrating working with AI. Some days, they read my mind and understand my intentions rather than what I actually say. And they solve everything perfectly.

Other days, not so much. I swear, I could code better myself using a pickaxe and a stone tablet.

Even though I lay out the ground rules, discussion first, no spontaneous coding, never do anything without my permission, they blatantly disregard it all. Out of spite, it seems. These are the lost days. It cost me a lot of extra work until I learnt how to walk away from the computer and try again another day.

The worst times have been when the AI agent decides, consistently, to write duplicate code. Like layers upon layers of duplicate code.

Quick Wins

Where AI wins, hands down is:

  • Troubleshooting and debugging
  • Documentation
  • Solving very specific use cases

Once the code base gets to a certain size, it gets harder to analyse. I can ask the AI agent to verify almost anything. Even if I did know how to code, that could take me days instead of a couple of minutes with AI.

If you've ever coded, I'm sure you can recognize the problems of collecting cryptic and incomplete commit messages. AI remembers all of that. Creating change logs and release notes is super quick and super easy.

Finally, I wanted a way of building a self-hostable Docker image. AI solved that using GitHub Actions. No studying, no rounds of troubleshooting and confirming it worked. AI got it right on the first try.

Where I'm At

Three months into the project, I still have a maintainable code base. One that gives me opportunities and adapts easily to my requirements.

It's responsive, it's resilient, it's still offline-first, it literally has no attack vectors, and it adapts to my needs.

And I did this by being structured and stubborn. I think it's more coding than vibe. Most importantly, it has given me a lot of confidence as a developer. Despite the fact that I can't code.

I still have to read and understand the code, I still have to review the documentation, and I publish everything manually. I also know when to walk away from the coding agent.

Player Registration

Try It

Feel free to try my tournament manager, it's a fully working instance that only handles your local data: https://darts.skrodahl.net

Top comments (0)