Claude Code is My New Best Friend

AI
5 min read

Just one month ago, I wrote an article asking "Are Coding Agents One PageRank Away From Awesome?". Well, little did I know at the time, that innovation had happened. Claude Code is here and it works. Coding agents are already awesome and the innovation that was missing was some combination of iteration, direct permissioned access to the file system, and context management.

I used Claude Code for two weeks. I merged 20 Dolt pull requests (PRs) and 2 go-mysql-server pull requests. I had never written Golang before and I guess I still haven't. Realistically, this work would have been impossible for me to complete without Claude Code. Claude Code just works.

I got the whole team using it and just yesterday, Neil published a how to article with a detailed example. We are sold.

In this article, I'll explain how I found Claude Code and walk through some of the initial tasks Claude Code completed to convince me it works.

How I Met Claude Code

A couple weeks ago, I downloaded Claude Code after reading this article by Steve Yegge who I worked with long ago at Amazon. In his article, he explained the difference between what he calls "Chat-based Coding", "Vibe Coding", and "Coding Agents". I really liked that framing.

He explained Coding Agents were very new and how they worked differently. Steve pointed to Claude Code as an example of a Coding Agent and explained the terminal user interface. I was skeptical given my experience with Chat-based coding. I definitely did not achieve 5X the productivity he claims Chat-based coding delivers. But, his article tempted me enough to fire up a terminal, type npm install -g @anthropic-ai/claude-code and see what Claude Code could do.

I picked a GitHub issue from Dolt and pointed Claude Code at it as the prompt. Much to my surprise, after hitting accept a few times, Claude Code was making progress. After seeing what it output, I realized the issue was nonsense. You can't output a SQL diff for diff statistics. So, I had Claude Code change the error message and delete the TODO in the code. Claude Code even found the Bash Automate Testing System (BATS) tests, updated them, and ran them just to make sure. Claude Code pulled all this off for $3. You can see Claude Code's summary in the Pull Request. This experience was completely different than my Chat-based coding experience with Cursor. With minimal prompting, I had a working change.

I ran out of my office to tell Dustin, our resident AI optimist turned skeptic, "Eureka! I've found it." but he was working from home that day. This was a Friday and I couldn't wait to come back in on Monday, to test Claude Code for real.

Eureka

How Claude Code and I Became Besties

Over the next two weeks, Claude Code and I worked together on a number of tasks. All these examples involved what I would describe as minimal prompting. I started with a link to the GitHub issue with some additional basic instructions. I did all the Git stuff myself like creating a branch, committing, and reverting if necessary. When Claude Code produced code, I reviewed and tested it. If the tests failed, I told Claude which tests failed and asked it to fix them. I understand you can automate even more than I did but this workflow worked well for me.

There were a few times where Claude Code produced non-working or suboptimal code that I caught in review or test. But, generally, results were reasonable. I could get many hours worth of work out of the tool in minutes.

Claude Code does cost a fair bit of money, approximately $10/hour in my experience. This is well within my tolerance and given the cost of a software engineer, I would have no problem running Claude Code 24/7.

Let's look at some examples of the changes Claude Code made. A full list of Dolt PRs is here and a full list of go-mysql-server PRs is here.

Involved Features

Now, back to my story. On Monday, when I returned, our internal Discord was awash with skepticism. "$3 to change an error message!" I knew that's not exactly what happened but I needed a more involved issue to convince the doubters. I picked this commit order issue which I created in response to a customer wanting a way to inspect a deterministic commit order. Ordering by date in both Git and Dolt is not the true commit order.

By the end of the day, I had a working Pull Request complete with both Golang engine tests and BATS tests. The dolt_log system table now contains a commit_order field. I had to iterate a few times adding tests and fixing some existing tests. But, getting Claude Code to do this was very straightforward. I even had Claude Code write the documentation.

$ dolt sql -q "select commit_hash, commit_order from dolt_log limit 3" 
+----------------------------------+--------------+
| commit_hash                      | commit_order |
+----------------------------------+--------------+
| iifq0hvp5fis9ld2lnhorqr5l697ph38 | 1427         |
| 62n14k63lu5jcc3a3qr18q8ku19e8g8q | 1426         |
| 2paehofana33lbbbjnqa18v3nlsvbgbk | 1425         |
+----------------------------------+--------------+

This surpassed all my expectations and if this is all that Claude Code made, I would still be shouting about it from the rooftops. But there's more!

Change Both Dolt and go-mysql-server

I wanted to make sure Claude Code could handle multiple dependent Git repositories. Dolt has a three-layer cake of dependencies: Dolt -> go-mysql-server -> Vitess. Changing SQL behavior often involves modifying more than one of these repositories.

Claude worked with overrides in go.mod with no issue, producing this go-mysql-server PR and its companion Dolt PR. Even for complex software that spans multiple Git repositories, Claude Code has you covered.

Succeeded Where Cursor Failed

As mentioned in my Are Coding Agents One PageRank Away From Awesome? article, I tried to get Cursor to fix this bug using Chat-based coding and failed. Claude Code required a couple passes but it was able to fix the bug.

dolt table import now makes varchar columns of length 200 instead of 1023, allowing far more columns in an imported table.

$ cat <<CSV > file.csv
id,c1,c2,c3,c4
0, foo,bar,baz,zap
CSV
$ dolt table import -c --pk id t file.csv  
Rows Processed: 1, Additions: 1, Modifications: 0, Had No Effect: 0
Import completed successfully.
$ dolt sql -q "show create table t"
+-------+------------------------------------------------------------------+
| Table | Create Table                                                     |
+-------+------------------------------------------------------------------+
| t     | CREATE TABLE `t` (                                               |
|       |   `id` int NOT NULL,                                             |
|       |   `c1` varchar(200),                                             |
|       |   `c2` varchar(200),                                             |
|       |   `c3` varchar(200),                                             |
|       |   `c4` varchar(200),                                             |
|       |   PRIMARY KEY (`id`)                                             |
|       | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_bin |
+-------+------------------------------------------------------------------+

True friends show up for you when other friends can't be there.

Unskip Bats Tests

My last Claude Code test was a little more ambiguous. Dolt has over 3,000 unskipped BATS tests with about 100 skipped. I wanted Claude to identify easy tests to fix and fix them. This is a task I wanted done but would have trouble assigning to a human engineer. The work is just not that fun.

This is the prompt I sent into Claude Code, spelling mistake included for effect.

alright, let's fix some skipped bats tests. Look in the 
integration-tests/bats folder and find all the skipped tests. The 
evealuate which ones should be simple to fix. Pick just one and propose a
fix to me. Optimize for the smallest and easiest change. Note, SQL 
behavior lives in a different package ../go-mysql-server so fixing SQL 
behavior is harder than dolt command line behavior.

Thirty minutes later.

Unskipped BATS test PRs

For the rest of the week, I let Claude Code continue to make PRs until finally my new friend gave up and told me there were no more easy tests to fix. Claude Code "crawled to freedom through five hundred yards of shit smelling foulness I can't even imagine". This is the kind of act of service that true friendships are based on.

Shawshank Claude

Conclusion

As you can see, Claude Code is my new best friend. Claude Code can make features. Claude Code can work across dependencies. Claude Code can do things I couldn't get Cursor to do. Claude code will do tedious work unskipping tests. You should definitely try it on your code. More questions? Come by our Discord and just ask.

SHARE

JOIN THE DATA EVOLUTION

Get started with Dolt

Or join our mailing list to get product updates.