Speeding up code review with `small-change`
lethain.com
lethain.com
Only my personal view but even 1000 LoC is not a "small change".
The other criteria are more important.
"This has 900 lines but 850 of them are in codegen boilerplate that changed", for instance.
"This has 900 lines but they're mostly updating a bunch of test fixtures along common patterns."
"This is 800 lines because we bumped ten version dependencies and that bumped a lot of other things + they changed the package naming for some so we had to rewrite a bunch of imports."
"I added two panels to a Grafana dashboard." (ok slight exaggeration)
I won't respond further.
> I won't respond further.
That's okay, I don't care.
If you bother to read the blog post, the other conditions in the "AND" are who posted the developer and which project the PR is updating.
This does not make it better. It's a YOLO bro allowlist.
I won't respond further.
To make matters worse, they effectively implemented a YOLO allowlist to allow a specific developer to batch 1k loc changes to the set of services they are working on without requiring any scrutiny.
Crazy stuff.
They could achieve this in a much simpler way by just removing PR requirements from those users in those projects.
But this has "agents".
I do not think this is a good metric
Even if it’s not perfect, I think it’s the right idea. There’s some category of changes that are low risk and simple enough that a human reviewer isn’t needed and if you can identify those then you’re going to be able to save human review for the things that really need it.
If something is low risk and simple enough then it can be quickly judged in 1 to 5 minutes. Not sure why someone can’t review it.
I think we're probably around 50/50 needing human review vs not.
Our rules for whether something needs a human review are currently mostly filepath-based: are you touching the api, or an important internal contract, or adding db migrations? Though I'd like to make it a bit smarter as we're definitely getting false positives.
Something like 30% of PRs in our company are merged like this. It's a huge velocity win when you don't have to wait around for a review.
While small, frequent changes generally allow the system to remain stable, assuming the change is truly minor and doesn't shake the underlying infrastructure, it can be quite frustrating for the QA team to receive a new build every few hours. And also as the project progresses, the regression scope becomes extremely massive.
The solution that has worked for me in my projects is to combine daily nightly runs, performed prior to approving a major release, with local smoke tests and automation. Specifically, I focus on API test automation, which is both fast and efficient and cheap to develop and execute.
Sure, they look harmless, but it’s all the external pieces (not shown in the diff) impacted by the “small change” tend to make such a disaster.
This is the sort of thing that's difficult to argue economically for studying with proper randomisation and everything, but an observational study can be made on open source repositories (even in projects where the main contributors are on a corporate payroll) fairly easily with LLMs these days. I wish I had more time to pursue things like this...
I think you're confusing things. The "small change" refers to the diff size. It's far easier to review a one-liner because the impact analysis is limited to that local change.
Of course if your change is something like "mutex.lock()" or "rm -rf *" then these changes will be more consequential than 500 files worth of whitespace changes.
The tiny 2 or 3 line change that fixes a problem doesn’t always get the same critical thought process.
When it crosses subsystems rarely crossed, there are often nasty surprises.
The author is only seeing 10% as small-change, but my version has 80% as small-change. This is due to Terraform forcing you to be intentional about the borders of functional software. There is a minimum-viable-deployable component in Terraform called a Resource: you can add more resources to your module (increasing the scope), but you can't get any smaller than one resource. So it's relatively easy to define what makes a module functional, and reason about how big it gets, before deciding to break the module up. (Technically you can -target specific parts of a single resource but it's quite frowned upon)
Compare to traditional software design, where there is no absolute minimum functionality. You can make "minimum functional software" as huge or as tiny as you want. Different people design their software different ways (often unintentionally) resulting in low cohesion and a very large scope of changes required for minimum function. If you want smaller changes, you have to intentionally design your software for it.
Code review is such a key step to the feedback loop and helps keep people current on the changes as they come out. Skipping that entirely is just inviting disaster.
And that doesn't even get into the "features" that were implemented without reviewing the design or requirements were actually hit (they were not).
I would love to replace all of these useless meat bags with more ai. But I would absolutely still want to be in the loop to review things.
The lesson I've learned about AI is that lazy/bad engineers without AI are still lazy/bad engineers with AI.
Okay, sorry, I don't know what I'm arguing anymore, this turned into a rant.
What kind of change impacts fewer than 1 services or applications? Is this meant to say “at most N”?