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.
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?
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).
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.
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 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.
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:
Clone the repo
Add it to your PATH
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!)
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.
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.
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?
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.
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.
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!