Creativity and AI Models

Since I’ve retired I’ve taken up reviving a project that I co-wrote over 20 years ago, bringing it into the modern age. The project is Dabo: a framework for writing cross-platform, database-centric apps. Nowadays things like this are done over the web, but in 2004 the state of web applications was pretty limited as far as UI flexibility and database integration. And there were many companies who ran their business on a networked application rather than over the internet, so the market for desktop apps was there.

The project was written using the tools of the day: Python 2.4, wxPython 2.x for the UI classes, along with the database drivers of that era. So bringing Dabo to modern times would take a lot of work. Updating to Python 3.10+ was straightforward enough; I had already worked on several 2->3 projects over the years. Updating the database drivers was also straightforward; most had current versions with the same interface, and the others had been replaced with new products that also shared a similar interface (thanks, Python DB-API!).

The biggest hurdle by far is updating to the current state of wxPython. This is a Python wrapper around the wxWidgets project, which is a C++ cross-platform framework for creating native GUI widgets. wxPython inherits a lot of the C++ feeling and style, and as a result is very un-Pythonic. So when we wrote Dabo, we made our UI layer a wrapper around wxPython. In other words, it’s a wrapper of a wrapper of a C++ library.

You’ve probably never heard of wxPython or wxWidgets – they are relatively obscure these days. And that’s where I think there’s a problem.

I was trying to debug a crash that happened in a part of an app: clicking a button on one tab of a pageframe ran some code, and then switched to a different page. Without fail, switching the page caused a crash with no Python traceback. I asked Claude to debug this for me. It spent a lot of time reading through my codebase, then the entire Dabo framework, and then the entire wxPython project before it could understand where the fault lay. It then confidently pronounced that it understood the issue, and coded the fix. I ran that fix, and it also crashed. Fed that crash report back into Claude, and it went through the same “thinking” steps before pronouncing the new fix. Well, you can guess where this is going. I went through this loop six more times until it finally got a fix that worked. The trouble is, it was one of the ugliest hacks I had ever seen: removing several event bindings, switching the page, and then restoring those bindings.

I’ve seen a lot of reviews of vibe coding where they say to consider Claude and others as “junior developers”, but I would never expect such an ugly hack from anyone, no matter how inexperienced; they would have come to me and said they can’t figure it out, so could I help them with it?

I had an idea as to what caused the crash, as I’ve seen similar crashes before and they almost always involved the event loop. Briefly, events fire all the time, and the framework handles them in the order they are received. So in a case like this, where the code changed the active page, under the hood it fired several events that control updating the UI. These events can sometimes conflict with others that happen around the same time, and cause a weird appearance at best, and a system crash at worst. The trick is to use the “call after” invocation, which instead of firing the events immediately, tells the app to wait until all pending events are processed before handling this one.

I told Claude that its “fix” was unnecessarily hackish and ugly, and had it revert those changes. (Tip: always have tools like Claude work on a development branch just in case it blows up like this). I then changed the one line that set the active page to use the call after design, and the crash went away.

Now I’m not trying to disparage tools like Claude; I’ve used them successfully in the past. What I think is different this time is unfamiliarity: there just isn’t that much code out there that uses wxPython for them to get sufficiently trained on in order to determine the correct approach. You can get great results with apps written in Python, JavaScript, Rust, Go, etc., because there are tons of repos in GitHub in those languages for LLMs to train on. There just isn’t enough training material for wxPython.

Which brings me to the main thought that resulted from this: creativity. How can we ever expect LLMs to come up with something new? They are designed to draw on what’s already been created, and if it hasn’t seen something yet, it is very unlikely to ever come up with that. I’m guessing that there was nothing in the crash report that had a link to a fix using call after, or else Claude would have come up with it as a solution. So in the next few years – the era of “vibe coding”, where LLMs generate the majority of new code – how do we expect new solutions to come about? New versions of the models will be trained on increasingly greater proportions of LLM-generated code; an inbreeding process that can only make newer models more repetitive.

Given this, can we ever expect an LLM to be creative? To propose an approach that has never been done before?

“Yeti”

That’s the nickname that Jay Reading goes by. Who’s Jay Reading? Before last week I had no idea.

I registered for a PDGA tournament here in San Antonio: the Battle All Up In the Briars tournament at McClain Disc Golf Course. I sent a link to my son Dan, who is the one who got me into the sport a few years ago. He read through the listing, and noticed who was organizing the tournament. He responded with “Jay Reading is the man – super cool”, accompanied by a picture of a signed Yeti disc. Apparently Dan had gone to a disc golf expo in Boston and met him there.

I had no clue who this guy was. I don’t really follow the professional circuit, and certainly didn’t in the late ’00s when he was one of the best playing professionally. But I thought it was pretty cool that Dan knew who he was.

On the morning of the tournament, I met Jay and introduced myself. I told him my son was a big fan, and showed him the photo of the signed disc he had. I asked if I bought a disc, would he sign it and take a selfie with it and me?

Now if you’ve ever been to any kind of tournament, it’s a lot of work for the organizers, and disc golf tournaments are no different. But Jay didn’t hesitate – he agreed immediately, with this result:

Ed posing with Jay Reading, a professional disc golfer, and a disc signed by Jay.
Selfie with Jay Reading and signed disc

And it wasn’t just me – he seemed to connect with everyone there, even though there was a ton of other stuff going on.

They held a raffle to raise money for community disc golf programs, and one of the prizes was a hat from the Lazy Frog, a game store in Martha’s Vineyard where Dan lives that also carries a good selection of discs and other disc golf stuff. I texted Dan about that, and he told me that he had gone to the disc golf expo in Boston with the owner of the Lazy Frog!

Before I retired I got some NVIDIA swag for my kids, and Dan said to mention that he happened to be wearing the NVIDIA hoodie when he was talking to Jay. So I asked Jay if he remembered talking with anyone in an NVIDIA hoodie, and after a moment he said he did! He had bought some NVIDIA stock at some point, and thought that Dan worked there! It was crazy to have this connection almost 2,000 miles apart.

So now I’m also a Jay Reading fan: not for his disc golf abilities (although they are impressive – I watched some YouTube videos), but because he is a genuine person who seems to really care about what he does.

Disc Golf Tournament Play

Yesterday I played in my second-ever PDGA tournament. Let’s get the obvious out of the way: I didn’t play that well. But it wasn’t about winning, although I did try my best on every shot. It was about keeping myself challenged: I want the motivation to work on my throws so that I don’t embarrass myself any worse than I did in my first tournament, back in January. I thought I was pretty good but not great, but I learned the truth: I was terrible, compared to people my age who had been playing for longer. The most obvious shortcoming was my distance off the tee: I routinely needed 2 or sometimes even 3 shots to reach the others’ first shot.

One thing to note, though: when I used to play regular golf (you know, the kind that uses little balls) and there was a player in a foursome who was not as good as the others, more often than not I heard others berate the player for slowing them down. Not here, though: my group was supportive and encouraging, and never made me feel unwelcome. Amateur disc golfers seem to be much friendlier than amateur ball golfers.

After the tournament I decided to get serious. I started to record my throws on video, where I could review it afterwards. That was especially enlightening! When I threw, I tried to consciously control my arm’s position and angle so that I was moving it in a straight line forward, while also keeping my weight centered. The video showed the exact opposite: I was taking the disc from very low, and instead of just reaching back, I was raising it almost a foot above my shoulders. All that up and down motion both robs you of distance and makes consistency impossible. I was also doing a lot of back-and-forth swaying with my weight.

I bought a practice net, so I could work on my technique throughout the day, instead of having to set aside a couple of hours to drive to a park to practice. I got rid of my walk-up and switched to a standstill throwing technique to reduce variables. I watched videos so I could compare my throw to others. But what really helped was discovering this app: Snapdisc. This records your throws on video, but also lets you compare your form when throwing to a model set to correct form.

Demo of the Snapdisc app comparing throwing form against an ideal model
Snapdisc Demo

What’s even more impressive is that the app is free! So I would record some throws, reviewing after each to see if what I felt matched what the camera saw. Slowly I began to get better feel for what I was doing. And when I did go out to a field to throw, I was getting longer. Before I would typically throw 150 feet, with an occasional 175. Now I’m averaging 180 feet with the occasional 240-250.

Yesterday’s results were not all that impressive, until you compare to how I did in January. In that first tournament, I shot +65 over par over the 36 holes; yesterday I was +48. That alone was a big improvement, but they also were very different courses: yesterday’s course had a LOT of trees, and I’m sure I hit most of them 😆. I lost at least a dozen in each round to that.

The other thing that was great about the tournament was the guy who ran it: Jay Reading. I’ll write about that in a follow-up post.

A Decade Together

Ten years ago today, Linda and I formalized what we had already known for some time: that we were so much better together, and wanted to always keep it that way. It was so obvious that there was never a marriage proposal by either of us; we knew that it was what we both wanted.

Looking back, it seems that we were so young, even though we were in our late 50s:

Linda and Ed posing just after being married.
Just after being married, January 16, 2016

We may be older now, but we’re still going strong! Here’s to the next 10 years!

Ed and Linda pose for a selfie in downtown Fortaleza, Brazil, in October 2025
Ed and Linda in Fortaleza, Brazil, October 2025

Letting Go

In my early 20s I got interested in working with my hands building things. I read everything I could find (remember, this is long before YouTube existed; you had to get actual books!) This led to a career of renovating houses that lasted over a decade.

When I first got some tools I wanted to start on something, but like a blank screen staring back at you when you try to write, the problem was where to start. Then one day I was driving along and saw an old, beat-up desk by the curb. It just so happened that I needed a desk for working on my brand-new Apple IIc, so I managed to get it into the trunk of my Mercury Capri, which needed lots of rope to keep it from falling out.

When I got it home I began stripping it down to the wood, as well as fixing some loose parts. I sanded it smooth, gave it a couple of coats of polyurethane, and fitted it with new hardware. It looked great, if I do say so myself.

Over the years that little desk has been used one way or another in every house I lived in—but not any more. There simply isn’t space for it in our new house. Not that the house is small, but it’s very old and the room shapes simply don’t leave room for it. So today when Goodwill Home Pickup came to clear out the furniture we couldn’t take with us, it was among the items they took.

My old desk being loaded into a truck
Goodbye, old friend!

I would say that 40 years of service after being tossed to the curb is quite impressive. It’s still in great shape, so I hope whoever gets it next can make use of it for many more years to come.