I actually worked at the same place as Andrew Tridgell, over a quarter-century ago. I got to know a few of the OzLabs folks during their immediate post-IBM years, and always had the highest respect for them in that way where you feel acute impostor syndrome when they're in the room.

Tridge almost walked backwards into implementing the Windows SMB protocol (he was just debugging some funny NetBIOS extensions IIRC). But his paper on the #rsync algorithm was groundbreaking, and actually writing the tool to implement it was brilliant. It's become one of those tools like #curl that just forms one of the major structural supports of the modern Internet. I still remember the day that the SSH transport became the default, and I remember being able to thank him in person when he came to the San Francisco office (although IIRC by that point he'd handed control of rsync over to mbp).

I remember at my next job he came to a summit of folks working on print driver/spooler software. When he pointed out that some problems were effectively a cache-consistency algorithm, we all kind of put our fingers to our temples and said "Oh wow, you're SO right!" He was always insightful and sharp, while being gentle and approachable.

I write in the past tense because I haven't crossed paths with him in two decades, and only know what I see him put out. A friend of mine in Australia noted that he hasn't posted to the Canberra LUG list since 2020, thanking someone for congratulating him on receiving the Medal of the Order of Australia. He's very much alive, but from what little I see I grow concerned for him.

In 2024 he took over maintenance of rsync once more. The 3.3.0 release was the last one from the previous maintainer, and Tridge is currently working on 3.4.x releases.

Well... Tridge and #Claude, it seems: https://mastodon.gamedev.place/@JeremiahFieldhaven/116654345332213390

The issue tracker for rsync has recently lit up with regressions, showing features that worked reliably for almost 30 years are suddenly coming crashing down in 3.4.2 and 3.4.3. People are scrambling to find ways to pin rsync to known-good versions. The considerate, incisive mind I briefly knew is letting the stochastic parrots do his work for him, and it just seems so astonishingly *unlike* the person I met back in the day.

I am still willing to give him the benefit of the doubt. I hope all is well for him, but I will not cast aspersions on his goals or his abilities. No, instead I draw this conclusion:

If TRIDGE of all people can't handle #LLMs without a slopocalypse, no one can.

That means you. That means someone you admire who is intelligent and careful and considerate. Not even someone whose opinions on technology you respect a great deal.

No one.

Jeremiah Fieldhaven (@[email protected])

So my systems recently updated to rsync 3.4.3, and as soon as that happened my backup system - which does incremental backups using multiple --compare-dest= arguments - started to fail on anything but a full backup. Revert to 3.4.1 and it works. So I go look at the source in GitHub to see what might have changed, because there doesn't seem to be anything relevant in the changelog. Since 3.4.1, 36 commits by "tridge and claude" Oh for fuck's sakes.

Gamedev Mastodon
@spacehobo that was a really thoughtfull post.
@onepict Thank you! I wanted to avoid the "Old Man Yells At Claude" genre for as much of it as possible.

@spacehobo so much this, 1000x over.

thank you for writing this up.

@spacehobo super duper post. Thanks for sharing, fedi friend. ✌️💙
@spacehobo This post just makes me feel sad.

@spacehobo wow, that's like one fortieth of a millennium.

Sorry, I have a habit of making dumb remarks for no reason.

I'm going to read the article now, which I am genuinely interested in. Thank you so much for sharing this story.

@spacehobo this is a very well written piece, thanks for sharing that story of yours. I guess I just shouldn't update it?

Good to know there is some trouble there. Thanks.

@dckim Heh, I always use fractions like these ever since I got my first copy of Salus.

@spacehobo I also interacted with and greatly respected Tridge almost 30 years ago and this report makes me sad. SMB & rsync are the best known contributions, but his role in the European courts in cracking all Microsoft's internals open was also epic. Rsync however was a re-invention of an algorithm patented years before, by Travelling Software. It was not new.

My insight (to reverse the roles of client vs server) was patented. It dramatically reduces the cost of publishing to many receivers.

@cliffordheath Ah, I may have misremembered the history of rsync vs xdelta and some other tools from the 90s.
@spacehobo as disclosed in US patent 6,636,872, the sender can publish a block summary (which can be precomputed for each file) and the receiver can sweep their existing files to find which sections they lack. This offloads almost all computation from the sender (unlike rsync which does the work for every transfer) and allows differential file updates from an unmodified HTTP server using byterange support. We didn't deploy it, but instead an improved version which differenced gzipped files
@spacehobo if you zlib compress a stream, running a rolling source checksum to flush the compressor when the bottom N bits are zero (or when the block is too big) you get blocks averaging a bit less than 2**N in size. Publish the checksum catalog of those variable-sized blocks and use them to do remote differencing. After a delta, the block boundaries will resynchronise, so compression doesn't defeat the differencing. The decompressor only needs complete plaintext, and complete compressed blocks
@spacehobo this invention by Tim Adam (one of the smartest & nicest blokes I ever worked with) really broke my brain with its brilliance. We told Tridge and he acknowledged its value, but he never implemented it into rsync. But even twenty years later, our implementation is deploying terabytes of updates every minute across many millions of machines

@spacehobo

Every #vibecoder starts at level 0
Going from orthodox coding to Vibecode is
Like going from 3GL to OOP x10

Folk need to understand that 20yo of #codemonkey means nothing unless you learn LLMs

As I say;
"Using Ai is a learned skill"

@n_dimension @spacehobo oh no, somehow this slopper replies in nearly all threads about slop…

@richlv @spacehobo

First, you lazy luddite, am not a slopper, too lazy to read my 1st pin.

Second, this is not your personal sandpit.

@n_dimension @richlv The Luddites were expert loom-users who understood the utility and limitations of the mechanical looms far better than the wealthy men who owned them. They did not smash technology to defeat progress, but rather destroyed the possessions of businessmen who did not engage in fair dealing.
@n_dimension @richlv @spacehobo I thought the definition of Mastodon is us sitting in a sandpit together and throwing cat shit at each other, because we think it’s our personal pit.

@n_dimension @richlv @spacehobo

hello. lazy luddite here. you are a slopper, and i have read several of your pins.

btw: when i read your first post’s first sentence i thought you were actually against ai because you compared it to object oriented programming, a paradigm that sucks ass.

@tudbut @n_dimension @spacehobo
The longer form posts seem to be generated, I even added such an observation in a personal note some time ago.
Or it could all be generated, just with a variation in style.

An alternative explanation could be somebody suffering from similar challenges like Dawkins. People are different, difficulties a myriad.

RE: https://teh.entar.net/@spacehobo/116235164062990027

@n_dimension I actually agree with you on one part of this, but only because inheritance-based OOP has been largely debunked as a programming practice:

@spacehobo

Wow, I didn't even realise OOL died.
It's what drove me from commercial coding !

@n_dimension
Oh, it's still around, and it's been branded "clean code" by its hard-right-wing proponents...
@n_dimension @spacehobo You're as deluded as anyone else who uses that crap. Get a therapist and get out of software.

@wcbdata

You organise things badly
You're rude
And juniors have absolutely no business telling their elders what to do
Behave child

@spacehobo same conclusion after I noticed I just can't perdict who is or isn't going to get sucked in.
@pbone @spacehobo This is one reason why folks who aren't going to be sucked in need to be vocally anti-slop.
@spacehobo So many people I once respected for their keen intellect, methodological rigor, and attention to minute detail have turned into slopologists and now churn out donkey doo. It's truly scary. LLMs are the actual mind virus.

@jaredwhite

Pump out analysis and code when you are young kids.

It becomes much more difficult or impossible as you get older.

@spacehobo

@spacehobo this post needs to be shared. my 6 followers will join the vanguard.
@spacehobo I keep thinking there *have* to be some giant foundational ux issues in programming that no one talks about that these things address
@deech @spacehobo there are giant foundational issues in programming but getting a vastly expensive probability engine to generate the code for you doesn't appear to solve any of them.
@deech @spacehobo IMO the foundational UX issue in programming addressed by LLMs is the modern need in certain settings to blindly make software for software's sake. Much software work now requires programmers to synthesise the abstract concepts of folks systematically making things more complicated than they need to be. BigTech with its massive teams and growth theatre broke things for the common programmer. Lots of other software businesses now service the needs of BigTech. All of that is rotten.
@deech @spacehobo or put another way, the UX issues I have if I develop a web app with a database and something like Rails are not ones that LLMs would appear to help with very much. On the other hand, if I have lots of React, NPM, SaaS integrations, microservices, k8s etc., the issues I have look more suited to slop generation. Slop code is literally software for software's sake.
@deech @spacehobo overall, as I've suggested elsewhere, the things that LLMs can apparently help with are largely things that nobody should want to do.
@sanityinc @deech @spacehobo I just look at how big tech wrecked Python as an example. Sure, but let's keep repeating that "Computer Programming for Everyone" mythology from 2001 to make us think it's still okay.
@dabeaz Any pointers regarding Big Tech's wrecking of Python? 🤔

@sanityinc @deech @spacehobo

I’d love to do a proper study on this. I find it hard to define the difference between necessary and unnecessary complexity. My favourite examples of this relate to text. Consider C++’s std::string vs Objective-C’s NSString. The former is a contiguous block of memory storing characters (it’s actually templated over the character type). I’ve worked with some very smart developers who are completely convinced that this is all that you need for text. In contrast, NSString provides an abstraction over the underlying storage (it doesn’t need to be contiguous) and character set (the interfaces are exposed as Unicode [not quite sensibly because it predates Unicode needing more than 16 bits per code point, so it uses UTF-16 code units where it should use code points]). I’ve worked on codebases where changing the underlying storage for a specific NSString usage gave a significant, measurable performance improvement. But implementing NSString correctly requires a couple of orders of magnitude more code than implementing the C++ strings APIs.

Similarly, the OpenStep NSTextView is a (slightly dated) thing of beauty that provides all of the text rendering that you need to build a DTP package. Most GUI toolkits provide something more primitive and it’s mostly okay for 80% of programs, but the remaining 20% all implement subtly different and incompatible versions of the missing functionality.

The problems I’ve seen with open-source codebases from big tech are somewhat different and they usually fall into two categories:

First, they assume that refactoring API consumers is easy. Google famously puts all of their code in a monorepo and runs at-scale automated refactoring tools over the whole thing. If you got an API slightly wrong, it doesn’t matter, you deploy the new one and refactor all consumers to use it. That doesn’t work in a distributed collaborative environment. Consumers of your library or framework may have much longer update cycles than you. If you ship a bad API, they will use it (and maybe thousands of downstreams will use it), so it will cause a lot of problems that could have been avoided by putting a few days more thought into the design. Refactoring them all is hard because they’re scattered across a load of different open and internal codebases owned by different people.

Second, they either don’t generalise or generalise from too few examples. If you created a library that has one internal user, the line between library code and application code is blurry. If you put things in the library, every subsequent consumer may be constrained by that choice. A good API lets you express the delta between what most people want and what you want. But if there’s a single consumer, that delta is either everything or nothing. And there’s no difference in code complexity based on where you put the things: it exists in exactly one place either way. So the best choice is to start by making everything explicit. Sure, 90% of consumers will end up with exactly the same thousands of lines of setup, but that’s better than providing the wrong defaults and having a thousand lines of changing the defaults in every consumer. But the maintainers then don’t see this duplication affecting their employer because their employer has only 2-3 consumers of the API, and maybe they have wildly different requirements for defaults (or maybe they just factor them out into some shared wrapper).

The best advice I’d give to junior programmers wanting to do something F/OSS is to contribute to a project that has thousands of downstream consumers and strong backwards ABI compatibility guarantees (decade plus ideally, but at least maintained stable releases with multi-year support) before you work on anything else. The intuitions that you pick up from this will be incredibly valuable and will improve every other project that you work on.

@david_chisnall @deech @spacehobo Yeah, I think the key is that long term compatibility and trust. Mainstream dev ecosystems of BigTech origin have become wildly prone to breaking change, which just keeps the churn going, feeding the "software for software's sake" machine. Regarding your example of the two string classes, centralising the more complete solution (NSString) in a stable library seems wildly preferable to having a smaller core with diverse add-ons, even though its implementation complexity is obviously greater. In fact, maybe it's "maintenance complexity" I'm often subconsciously trying to minimise, not the actual complexity of the included code. If adding a dependency, I would rather it be a stable, mature and comprehensive library than a more minimal simple subset with less momentum. The recent LLM mindset seems to correlate with lots of small things that get haphazardly published and/or inlined, so the implied maintenance complexity is enormous.

@spacehobo

Resisting slop is not about how smart you are. It's more of a moral thing.

I know, I know, in tech we see amazing accomplishments, and they are usually due to people who can think very, very well. But this is about understanding, and owning, the effects your actions have on others. That's an aspect of morality, and technically brilliant people can be utter moral idiots.

@jztusk @spacehobo The smarts side is a matter of being smart enough to recognize that cognitohazards are cognitohazards and that you are not magically immune to them. The only winning move is not to play.

@jztusk I had hoped that my post conveyed just how considerate I found Tridge to be, when I met him. I can't speak to deeper morals, but his aspect stood out in a Bay Area realm of smug engineers.

I don't know that there's a way to avoid this trap even for the best of us, any more.

@spacehobo @CursedSilicon Correct me if I'm wrong, but there seems to be a mass psychosis infecting our industry. Slop generators are completely anathema to the principles of software engineering, but if you apply any critical thinking it seems you're going against the tide of public opinion.

It certainly doesn't help that the tech giants appear to be "all-in" on AI and make it seem "inevitable". Sadly, it appears the turnaround time on this particular FAFO cycle is measured in years.

So it's no surprise really that otherwise intelligent people get caught up in this crap.

@whyrl @CursedSilicon It does really seem like we're polarising into not only entrenched positions but entire worldviews on this topic.

@spacehobo @whyrl @CursedSilicon but where are the technical trenchlines? Can we pin it down.

It's it really just "needs/wants to make money fast"?

I find it very hard to keep my critical scepticism because so many people are flipping over, even a lot of people i hold in high regard.

@spacehobo

Very well said, and thank you.

(I had thought back in the day he did actually implement a chunk of Samba, but I might be remembering wrong.)

@CliftonR
Yeah, samba was his reverse-engineering of the windows SMB protocol that I mentioned
@spacehobo @CliftonR I've got fond memories of samba, back in late 90s

@spacehobo I’m sorry, but that just doesn’t follow. We don’t know how he’s using Claude. Or if he’s even in the loop properly or what is going on. The code is always there to review, no matter who writes it. And if it’s not easy to review, then it would be better to write it himself and have Claude review it.

Even if Claude is just a flawed colleague, good developers have always had to work with flawed colleagues.

@mark I can promise you that Tridge was one of the experts at dealing with difficult collaborators. Everything you say just proves my point: whatever's going on, you'd have hoped that Tridge could handle it.

But right at 3.4.2 the commit volumes and frequency spike on a project that's effectively "done", and it's suddenly party time in regression city.

@spacehobo @mark Yeah, it's the sudden spike in regressions that's particularly alarming. I can't tell if this is simply a result of a lot more code being committed without adequate review or whether there are some LLM-generated sludgy bits that are particularly rancid, but it seems clear that "routine quality control of the sort a project like rsync normally requires" is out the window.
@dpnash @spacehobo It will be more code committed without adequate review. That’s what it always is.

@spacehobo @mark Most of the issues I saw related to CVEs. This is a treadmill we have needed to find some way to break for some time, but has only got faster now AI is finding vulnerabilities.

Security research is acting as entropy does in a physical system, a kind of arrow of time, causing a kind of decay in stable products. It's not bitrot, per se, the bits stay the same, but their value decreases and becomes negative. AI is now massively accelerating that decay process.

@mark @spacehobo it's not *just* a flawed colleague. That's the problem. If it were just a tool or just a colleague would we be seeing floods of regressions after it was adopted?

At some point you're gong to have to drop the "you're using it wrong" bullshit. If this many people are "using it wrong" it's not a good tool.

@kevingranade @spacehobo Claude produces a patch of code — as with any coder — which can be reviewed. At this point it doesn’t matter what entity is writing the code. If the code is bad, you throw it out. If it’s too big or complex to review, you don’t have to accept it in that form. If it “looks good” to some mythical status coder, but is actually horrendous, I would suggest that either Claude is practicing deliberate and ingenious deception (unlikely) or… the code just wasn’t reviewed.

@kevingranade @spacehobo From experience, it *is* just a tool. It can, at the very least, put in a ton of boilerplate code. It can, at the very least, be a good reviewer of human code.

It can be a bad and inconsistent colleague on occasion, so you use the tool, or not, on that understanding.

The ethical concerns are another issue. They may well all be valid, but we’re talking about use here.