šŸ‘‹šŸ»  Hello!

Thanks for visiting! You'll find a bunch of musings I've been writing around these parts since the early 2000's. Lately, I've been reviewing a lot of books. But I also write about code and my experiments using generative AI. But really, you're just here to see pictures of Benson.

Blog Posts

Old board games

One day, we’re going to take this for granted (maybe we already do?)

I remember a time in the late 80s or 90s, visiting one of my grandparents’ homes and playing… some board game. All I really remember is that it had:

– a bazaar
– some electronic component (with a sinister voice, maybe?)

That was it! I don’t really remember much else.

I search Google and get:

Clicking through, none of that looked or sounded familiar.

Let’s try ChatGPT.

Wouldn’t you know… it basically one-shot the search result!

That initial image looked like the ones Google returned, so no dice (hah) there. But! Dark Tower? What is this?

Uhhh, THIS WAS IT!

Apparently, it’s fondly remembered. And there is a modern sequel that uses your smartphone.

EDIT:

I realize that this might not be a totally fair comparison since I gave ChatGPT so much more context. It might be the nature of how we interact with these services (e.g., natural language chat vs ā€œgutturalā€ input in a search engine).

But… just to do some proper due diligence:

Apps I like: Merlin Bird ID

One way I know I’m getting old? It’s not the mysterious knee pain (self-inflicted, if we’re being honest). It’s when I download a bird identification app with multiple gigabytes of data and get excited about it.

I’m not joking! Recently, I excitedly told my wife, ā€œohhh, there’s a house finch in the backyard.ā€ She gave me a savage eye roll that’s usually reserved for the best of my dad jokes.

But hear me out: Merlin Bird ID is actually ridiculously cool!

The app, made by the Cornell Lab of Ornithology, has a sound ID feature that’s basically Shazam for birds. You hit record, point your phone vaguely skyward, and it tells you exactly what’s making noise around you in real time! It’s pretty neat to watch the spectrogram light up as different birds chime in, each one getting identified and added to your list.

I had no idea that we had more than a dozen species of birds just chit chatting out back: we’re talking Black Phoebes, Dark-eyed Juncos, House Finches, White-throated Sparrows, Golden-crowned Sparrows, Yellow-rumped Warblers, California Scrub-jays. Oh, and fucking crows.

The app is completely free and works offline once you download your region’s bird pack (like I mentioned earlier — this takes up gigabytes of data), and now I’m that person who stops mid-conversation because ā€œoh wait, do you hear that? That’s a Chestnut-backed Chickadee!ā€

My kids think I’ve lost it. My wife is questioning everything about me. Benson is confused why our walks now involve me holding my phone in the air like I’m trying to find cell service.

But whatever, I can now identify the difference between an American Crow and a Common Raven! And let me tell you, there is a distinct difference.

Coding Bootcampiversary: 10 years later

I forgot to note this last month, but hard to believe it’s been 10 years now since I first walked through these doors at Hack Reactor! 6 days a week for 12 weeks.

It was intense and crazy. But for me, it was a life changing experience, 100% worth it and I still enjoy my job today.

A screen grab from a presentation I did at Hack Reactor in October 2015, on ā€œbuilding intelligent robots using Node.js that can conquer Twitter.ā€œ

Book Review: Driven to Distraction by Edward Hallowell

A few weeks ago, I picked up Edward Hallowell’s Driven to Distraction after hearing someone say that it was ā€œlife changingā€ for them in dealing with an adult ADHD diagnosis. Combine that with the fact that one of our kiddos was recently diagnosed with ADHD and that I’ve long suspected I also have it, I figured it was time to do a bit of reading. I went in a bit skeptical. The book was published in 1994, after all.

What I wasn’t prepared for was how much I’d recognize myself in the pages. I encountered a number of passages that really resonated with me and provided some validation into how I’ve always felt, acted, approached things, and thought about problems. Some of the examples were so on the mark, I could have written them myself.

Take this passage that basically describes a frequent, near daily, experience:

ā€œI can be working on a project at my desk, when, without really knowing it, I begin to think about some other idea my work suggests. Then I follow that thought, or I may even leave my desk to go get something, and by the time I’ve gone to get the thing, I’ve forgotten what it was I was going to get.ā€

That’s me, walking away from my workstation to pour a fresh cup of coffee, only to come back, forget what I was doing and then opening Jira to organize some tickets, because for some reason they need to be done right now.

Another section is about how ADHD brains handle creative thinking:

ā€œWhen someone with ADD receives a stimulus of some sort—an image, a sentence, an idea, a person’s face, a question—he does not immediately put it in its ā€˜proper’ place. He doesn’t even know where that place is. So, for example, the water bill gets filed with concerns over a fishing trip, and the next thing you know an idea is being generated that has to do with entrepreneurial fishing expeditions.ā€

Again, this is another example that perfectly describes some past behaviors.

The book isn’t flawless, though. There are definitely some outdated and weird terms (using ADD instead of ADHD, also the number of times it describes someone with ADHD as a ā€œspaceshotā€), and some of the family dynamics and gender role assumptions feel very 1990s. A few examples made me cringe a bit with their stereotypical takes on household responsibilities and parenting roles.

All that said, it still managed to deliver really interesting insights. The sections on family dynamics were particularly eye-opening, especially around structure and negotiation. Hallowell talks about how people with ADHD sometimes pick fights just for the stimulation and it’s definitely a pattern we’ve patterns we’ve observed with our kiddo (related book review).

Hallowell’s insights about frustration tolerance helped give insight to some of the behaviors we’ve seen with our own little one:

ā€œThe process of negotiation is inherently difficult for someone with ADD because it entails bearing frustration. This is difficult for all people. But it is particularly difficult for the person with ADD who would rather deal with frustration by blowing it off, or by reaching closure too quickly—even if that means sabotaging his own interests—than by the excruciatingly painful ordeal of bearing with it.ā€

This explains so much about the meltdowns we see when our kiddo gets overwhelmed by too many options or when decisions need to be made collaboratively.

Another section of the book offered advice on how to deal with people who have ADHD. My favorite piece of advice was this:

ā€œMake copious use of praise and positive feedback. More than most people, people with ADD blossom under the warmth of praise.ā€

Sidenote: A few months ago, we had a work retreat. One of the sessions involved exploring what motivates us. We all wrote down a bunch of things and then tried to examine why they might motivate us. From my notes:

So, yeah! That little passage hit me hard. I’ve always thrived on positive feedback and acknowledgment of good work. And it’s always made a huge difference in my motivation and confidence.

Driven to Distraction gets 4 out of 5 stars from me. It’s definitely showing its age in places, but the core insights remain incredibly valuable. If you’ve ever wondered why your brain seems to work differently from everyone else’s, or if you’re trying to understand someone in your life who might have ADHD, this book is worth the read.

claude-sounds: better notifications for claude code

I use Claude Code a lot, for both work and play. One thing I noticed was that I’d often start a long query and then get distracted, ultimately forgetting to check if Claude was waiting for input.

So naturally, instead of just setting a timer like a normal person, I decided to build a ridiculous solution: claude-sounds

It’s a stupidly simple bash script that plays random sound effects whenever Claude Code’s notification hook triggers. Set it up once, and now every time Claude finishes a response or starts using a tool, you get a little audio notification.

The setup is pretty straightforward:

  1. Clone the repo
  2. Add it to your PATH
  3. Configure it as a Claude Code notification hook in your settings

The sounds themselves were generated using ElevenLab’s Archer persona.

The whole thing is just a few lines of bash that randomly selects an MP3 file and plays it with afplay. Add your own sounds, remove the ones you don’t like, customize it however you want.

Is this necessary? Absolutely not. Is it fun to hear a little message when Claude finishes helping you debug something? Yes! (At least at first… I imagine this might drive someone insane after hearing these about 100 times. I’m still having fun with it though!)

Examples:

SCHUMAKER 55

I’ve written a bit about my Dodgers fandom on this blog. Last night, I watched from afar (thank you, streaming services) as Clayton Kershaw notched his 3,000th strikeout, becoming the 20th pitcher to ever do it (and only the 3rd pitcher to rack up 3K strikeout for one team).

He’s definitely my favorite active player on the Dodgers (we even got to see him deal when we went to game 1 of the 2017 World Series). But it got me thinking: who is my absolute favorite player of all time?

There’s only one answer, and it goes back as far as I can ever remember: Orel Hershiser.

So much so, that when I was a wee little lad, I would write him actual letters and send them to Dodgers Stadium via the post office. I have no idea what I said. Probably something in an 8-year-old’s hand writing that said, ā€œDear Mr. Hershiser, you are my favorite baseball player and I’m going to be just like you when I grow up and blah blah blah.ā€

I remember writing him numerous times. One thing I do know: I never asked for anything*. Never for tickets to a game. Never for an autograph. Then, one day, we received a letter in a big envelope from Dodger Stadium. Do you know what it contained?

Are you kidding me?! Looking at that photo you can see it’s definitely been through some stuff over the years. Pre-teen and teen version of me probably just stuffed it in some folder that got lost in my room, stepped on, and whatever else. Anyway, I ultimately framed it and still have it today!

All of this brings me to the title of this post: ā€œSCHUMAKER 55ā€. For reference, Hershiser wore number 55 throughout his career.

So, as a kid, I would play baseball in our backyard, pretending to pitch and throw tennis balls at the garage, where I had drawn a small ā€œstrike zoneā€ in chalk.

(Side note: hey, I won a school wide pitching competition in 5th grade — maybe this pretend play helped!)

All the while, I would wear this homemade uniform in honor of him, where I had written ā€œDodgersā€ in blue marker on the front and ā€œSCHUMAKER 55ā€ on the back. I wish I had pictures. It was probably cheesy.

So, imagine my shock, surprise, and delight when the Dodgers acquired Skip Schumaker in 2012. And do you know what number he wore? Do you! Guess!

LOS ANGELES, CA – JULY 27: Skip Schumaker #55 of the Los Angeles Dodgers reacts to his two run homerun with A.J. Ellis #17 for a 3-2 lead over the Cincinnati Reds during the fifth inning at Dodger Stadium on July 27, 2013 in Los Angeles, California. (Photo by Harry How/Getty Images)

You know, I don’t have many regrets in life. But I definitely regret never getting an actual jersey!

—

* Regarding the never asking for anything comment:

So, I do remember asking for one thing. My mom was going to take me to a baseball game in August of 1992 (more on that in a bit). I think I wrote months ahead of time how I was going to my first baseball game with my mom and I hoped he would pitch.

So, we went and BY SOME COINCIDENCE, HE DID! HE PITCHED THE GAME!

Over time, the memories of that game faded away and I wished I could remember what game we actually went to.

Talking to my mom, we remembered three ultra specific things: An afternoon game. Orel Hershiser started. Darryl Strawberry hit a home run.

Thanks to the wonders of Baseball Reference, that is literally all you need to find something. The game my mom and I went to? Wednesday, August 21st, 1992.

When Darryl Strawberry went up to bat with the bases loaded in the fifth inning of the Dodgers’ 9-5 victory over the San Diego Padres on Wednesday, coach Bill Russell nudged someone in the Dodgers’ dugout.

ā€œIf I’m the pitcher, I’d intentionally walk him,ā€ Russell said. ā€œGive up one run instead of four.ā€

If only the San Diego Padres’ Ricky Bones had been listening. Three pitches later, Strawberry hit one over the left-center-field fence for a grand slam.

[…]

But before 32,864 on a warm afternoon, Strawberry did more than pad his statistics. He did more than help Orel Hershiser run his record to 5-2 in 5 2/3 innings of pain-free work.

What Strawberry did was restore flickering Dodger spirits. For the first time in weeks, the Dodgers actually looked as if they were having fun.

Ultimately, Darryl Strawberry hit two home runs (one of which was a grand slam)! Talk about an exciting and fun game.

Git Branch Manager: a manager for git branches

A logo that was completely generated with AI, like everything else in the project. (Source: ChatGPT)

I don’t mind the term ā€œvibe codingā€œ, when used correctly. A lot of people (at least on Reddit) seem to think it means ā€œany time you code with AI.ā€ I prefer Andrej Karpathy’s original definition: ā€

There’s a new kind of coding I call ā€œvibe codingā€, where you fully give in to the vibes, embrace exponentials, and forget that the code even exists. It’s possible because the LLMs (e.g. Cursor Composer w Sonnet) are getting too good. […] I ask for the dumbest things like ā€œdecrease the padding on the sidebar by halfā€ because I’m too lazy to find it. I ā€œAccept Allā€ always, I don’t read the diffs anymore. When I get error messages I just copy paste them in with no comment, usually that fixes it. The code grows beyond my usual comprehension, I’d have to really read through it for a while. Sometimes the LLMs can’t fix a bug so I just work around it or ask for random changes until it goes away. It’s not too bad for throwaway weekend projects.

Emphasis mine.

That last bit is key. For throwaway weekend projects, vibe coding is this magical state where you have an idea but absolutely no desire to setup boilerplate, read API documentation, or even want to deal with the plumbing. You just want the thing to exist.

A few evenings ago, I decided to put in a serious vibe coding session using one of my favorite tools, Claude Code via SSH through Blink on my iPhone (!), to create a CLI utility to help manage the endless number of branches I have on my machine, all because of our huge monorepo.

For reasons I’m not entirely sure about, I decided to use Python. A language I know approximately nothing about beyond ā€œwhite-space mattersā€, ā€œthere’s probably a library for that,ā€ and ā€œprint("Hello, world!").ā€

(Hey, I’d have to turn in my software engineering badge if I didn’t attempt to reinvent the wheel every so often)

So, picture this scenario: I’m staring at my terminal after I had just typed git branch. I’m looking at a screen with about 37 branches in various states of decay. And of course there are numerous unhelpful branches with names like, daves/no-jira/hotfix, daves/no-jira/hotfix-2, daves/no-jira/hackweek-project-cool. My terminal is just a wall of branch names, most of them mocking my organizational skills.

(By the way, what was hackweek-project-cool? I don’t know… I never committed any code to it!)

I needed a better way to manage this chaos. So naturally, instead of cleaning up my branches like a responsible developer, I decided to build a tool. In a language I don’t know. Using only Claude Code. What could possibly go wrong?

Claude Code is great. It never gets tired. It never gets angry. Even if I kept asking questions and piling more features on top.

  • ā€œLet’s make a shell script using Python to display Git branches.ā€
  • ā€œOhhh, can we make it show which branches have uncommitted changes?ā€
  • ā€œOh, oh! Add some colors, but tasteful colorsā€¦ā€
  • ā€œHey, there are a lot of branches here. What if pressing shift + d deleted branches (but we should probably have a confirmation…)?ā€
  • ā€œYou know what it really needs now? A loading spinner!ā€

After a few hours of asynchronous back and forth, we had a result! Git Branch Manager: a terminal UI that actually shows useful information at a glance. Navigate your branches with arrow keys, see visual indicators for everything important, and perform common operations without memorizing Git commands.

For me, those little indicators are game changers:

  • * Current branch
  • [modified] Has uncommitted changes
  • [unpushed] Exists locally but not on remote
  • [merged] Already merged (why is this still here?)
  • ↓ Remote branch you haven’t checked out yet

One feature that I love: Smart stash management. When you try to switch branches with uncommitted changes, gbm asks if you want to stash them. But here’s the cool part: it remembers which stashes it created and gives you a notification when you switch back. Press ā€˜S’ and boom! Your changes are restored!

This process still blows my mind. I describe what I wanted in plain English, and Claude Code would translate these chaotic ideas into actual, working Python. ā€œMake old branches look oldā€ turned into color-coding based on commit age. ā€œIt should be smart about stashingā€ became an entire stash management system.

Installation is pretty simple, too. No pip, no dependencies, just curl and go:

# Quick install
sudo curl -L https://raw.githubusercontent.com/daveschumaker/gbm/main/git-branch-manager.py -o /usr/local/bin/git-bm
sudo chmod +x /usr/local/bin/git-bm

# Additionally, add as a git alias
git config --global alias.bm '!git-bm'

Now you can just type git bm anywhere. Pretty neat!

There’s also browser integration (press b on any branch), worktree support, and a bunch of other features I’m proud of, err, creating, despite not having touched the code.

Here’s the thing about vibe coding with AI: it completely changes what’s possible for a weekend project. I built a legitimate, useful tool in a language I don’t know and using standard libraries I’d never heard of.

If you asked me 6 months ago if someone with no knowledge could build useful tools or websites using AI prompts only, I might have said no. ā€œYou still need people who understand software engineering principles, who understand what the code is doing,ā€ I’d (not so) confidently say.

But now… it’s getting crazy. Is this the future of programming? To be a glorified conductor who oversees an orchestra of AI agents? Maybe!

Bottom line: my Git branches have never looked better, and I didn’t have to spend six months learning Python to make it happen! So, if you’re buried in branches like I was, give gbm a shot: github.com/daveschumaker/gbm

Now if you’ll excuse me, I need to go stare at my beautifully organized branch list again.

P.S. Yes, I realize I could have just cleaned up my branches manually in less time than it took to build this. But where’s the fun in that?

Steer clear of those crows

A crow perched on our roof, looking at me wearily.

A frequent sound around our house lately has been an intense banging on the roof. It honestly sounds like someone has climbed up there and decided to hammer away for fun.

Curiosity finally got the better of me, and I grabbed a ladder to investigate. When I reached the top, I discovered the source of the obnoxious noises: an aggressive crow trying to crack open a walnut. We have a flat roof, so apparently it’s a perfect landing spot / walnut abuse space for them. I made a few attempts to shoo it away, waving my hands wildly and making all sorts of strange noises. The crow looked unimpressed and returned to its task.

I figured a more creative approach was needed, so I turned to the garden hose. Thankfully, no neighbors were around to question why I was suddenly watering the roof. The water seemed to have worked, as the crow took flight, leaving behind its walnut. Victory!

Or maybe not. I recently read about how long crows hold a grudge.

From a NY Times article, ā€œIf You Think You Can Hold a Grudge, Consider the Crowā€œ, published in October 2024:

Renowned for their intelligence, crows can mimic human speech, use tools and gather for what seem to be funeral rites when a member of their murder, as groups of crows are known, dies or is killed. They can identify and remember faces, even among large crowds.

They also tenaciously hold grudges. When a murder of crows singles out a person as dangerous, its wrath can be alarming, and can be passed along beyond an individual crow’s life span of up to a dozen or so years, creating multigenerational grudges.

Oh, cool! This must explain all the aggressive cawing I hear from the trees as I walk to kids to school each morning.

Update (2024-05-24): I have video of these punks! Watch out.

Ā 

Gemini: replace “this” with “this”

For the most part, I’ve had pretty positive experiences using AI tools to help enhance my coding activities (though there was the one time…).

A recent experience with Google’s new Gemini model left me frustrated. After prompting it to help me find and update some relevant code, it confidently informed me that it had identified the exact snippet that needed replacing. Great news, I thought, until I realized it was instructing me to replace the code with… exactly the same code.

I pointed out the issue. Gemini politely apologized for the confusion and assured me it would correct its mistake. To my disbelief, it promptly suggested the very same replacement again! And again!

Oh, I have receipts. Join me on this little adventure!

Maybe we don’t have to worry about AI taking our jobs just yet!