HNHacker News
TopNewBestAskShowJobs

barrkel

36,265 karma · joined March 3, 2007

http://blog.barrkel.com/

Data, compilers, software architecture

barry.j.kelly@gmail.com

submissionscomments
barrkel··on California farmers are struggling to sell grapes as demand for wine drops
10 litres alcohol is about 100 bottles of wine a year (exactly 100 at 13.33% alcohol content).

I drink a lot of wine, but 1 full bottle is too much to have regularly. A half bottle - two generous glasses - is more reasonable, but you'll still feel it the next day. And 10 litres of alcohol puts you at 8 generous glasses a week.

I reckon this is still quite a lot of alcohol.

barrkel··on Italian parliament votes for return to nuclear energy
Profitable compared to what, that provides base load?

If energy prices are too high, industry suffers. If you let the price rise, maybe China just eats your lunch.

What's the option value vs risk of gas price rises? Gas sets the marginal price of electricity in Italy today for 60% of the year [1]

[1] https://www.terna.it/DesktopModules/AdactoBackend/API/direct... "However, the electricity system remains significantly exposed to gas price volatility, which in 2024 determined electricity prices for more than 60% of the hours."

barrkel··on MCP was always a bad idea?
Sure, you have an LLM which can invoke functions. I will say that without storage and composition, you're asking for hallucination. LLMs are not deterministic and while they're good at regurgitating text - you can see how replies in an instruct model are structurally keyed off the question - they will rephrase, adjust, "correct" data they're schlepping from one call result to another call input. And one noisy MCP call and there goes your context.

You could build something with storage and composition out of MCP functions, but come on, have you seen how LLMs - particularly budget LLMs - try and invoke functions reliably? The amount of retries you have to hide, feedback you need to send back to the LLM about what it did wrong. Parameters get replaced with synonyms, arrays are passed for singular arguments and vice versa, structured inputs are flattened, etc.

So maybe you fine tune on interactions with your subset of MCPs, to improve reliability. But all you end up doing is reinventing a Unix-like command line, poorly.

Firecracker micro-VMs, gVisor, wasm sandboxes. There are ways to make this work that aren't heavyweight. Giving LLMs tools that they've seen how to use millions of times in training corpora just works better.

barrkel··on MCP was always a bad idea?
By OpenAI, I presume you mean Irregular - these guys https://www.irregular.com/about ?

These guys are the common factor, the guys running the evals that let all the AI agents out, it looks like.

barrkel··on MCP was always a bad idea?
Someone can be OpenAI/Anthropic/whomever.

If you don't have something running somewhere, you don't have an agent, you don't have a harness. You've got a token generator, an LLM from the 2024 era.

barrkel··on MCP was always a bad idea?
You hobble the expressiveness of the LLM and reduce its capability.

Think of an agentic harness as like a kind of body for the LLM. It gives it primitive inputs (read_file, web_search or whatever) and primitive outputs (edit file, respond to user, etc). Give it a command line environment (in a locked down sandbox, with as few or as many tools as you prefer), and you've given it a toolbox. It can do a whole lot more, faster and more efficiently. It can compose tools together. It makes fewer transcription errors manually shifting data around. It can tame verbosity with good protections in the harness and access to grep, sed and awk.

It's really up to you how useful you want your agent to be.

barrkel··on MCP was always a bad idea?
CLIs, run in a sandbox as tight as your preferred choosing, live in an ecosystem, where, via pipes and redirection, input and output can be easily manipulated. An agent can do similar things but more laboriously (and less token efficiently) via Python or similar but it would still live in a sandbox somewhere.

Going without the sandbox means hobbling the LLM. It can do things directly but is less able to construct ad-hoc programs to deal with looping, conditionality, tame verbosity, connect tools together, and so on.

It's a choice to not give the LLM an environment. As you say, it can be necessary if you're using dumb models. I don't find it particularly worth the trade most of the time.

barrkel··on Spain orders blocks on Archive.today and its mirrors
What they do instead is scoop up execs when they travel through the US.

Peter Dicks, David Carruthers

State violence is used to ensure compliance, so that companies self-censor.

barrkel··on MCP was always a bad idea?
A CLI doing all this is still a better UI for the agent though.
barrkel··on Why isn't mutable a subtype of immutable, or vice versa?
Mutability vs immutability describe the relationship between identity and state. Mutable values retain identity when their state changes. For immutable values, getting a new state requires a new identity, and importantly, existing identities never have their states changed.

Variables can be described by types. That is, a mutable slot referencing a value can be a value itself (a reference to a reference) and we can use subtype relationships to describe it. Variables are covariant when used as inputs (i.e code reads from the variable) and contravariant when used as outputs, and invariant when used as both. You can logically supply a Box<Cat> to a vet(in Box<Animal>) routine, and supply Box<Animal> to catchAndStore(out Box<Cat>). Substitute `ref X` for `Box<X>` when using a language that can pass variables by reference.

barrkel··on How to write an effective software design document
When I've worked with systems that had these kinds of characteristics, we had checklists. A long list of "have you thought of X". You can't rely on someone writing a design to think of these things either! You need to have a process, and the process applies whether you dive into the code, dive into the spec, or have an AI dive into either.

It's orthogonal.

To be clear, I'm not suggesting blindly deploying an AI-written spike implementation to production, but rather using it to elicit information for better designs.

The fact that a probe that goes off and modifies tables X, Y and Z to achieve the feature gives information for an AI auditor to look for other uses of X, Y and Z, and discover things humans may miss, because with good guidance and a proper harness, AI is usually more persistent and thorough than people. It can turn search results into a checklist and the harness can track completion, and so on. I am far from convinced that your example would not be found via this route.

barrkel··on How to write an effective software design document
If the feature works, and passes AI auditor agents with various hats (thinking of auth and security in particular), did that code you're not thinking of need to be touched? What effect did it have that cannot be captured in side effects, tests or audits?
barrkel··on How to write an effective software design document
I'm not suggesting using AI generated code as a proposed design.

I would try and get an understanding of design space by giving a good agent a high level goal and seeing what it does, then getting a summary of the approach.

When you do this several times, especially if you give it a steer on some non-functional requirement, you can compare and contrast different approaches.

The idea isn't to prototype so much as to gather information by doing. Prototype, to my mind, suggests other things; shortcuts, stubs, incompleteness. I would actually ask agents to do the whole thing, and find out the full scope. It can be particularly useful revealing side effects.

Pair it with code auditors wearing different hats, of course.

barrkel··on How to write an effective software design document
Instead of thinking through all the places in the code the AI is going to have to touch, why not kick off three parallel agents implementing the thing and finding out what they did and the tradeoffs they found?

Planning is essential but it doesn't survive contact with reality. However, AI makes contact with reality cheap! Why not use it to improve designs, by writing the design after a few implementations have already been made?

Only slightly tongue in cheek.

barrkel··on How to write an effective software design document
The biggest thing AI enables is cheap code.

That means you could choose to try three (or more) genuine implementations and explore their tradeoffs, instead of making three proposals in a document with one recommended (and the other two usually only provided for contrast).

I do think the design is important to keep around - in particular, the constraints, the communication points, schema, tacit things that might not be clear in code. I am not certain that the design should precede the implementation for features below a certain size though.

Larger efforts need milestones and collaboration and will have multiple people doing implementation, so there's more need to agree schemas, APIs etc up front there.

barrkel··on Mullenweg has returned as CEO after attempted board ouster
OpenAI was a charity, and the alternative was a mass move to Microsoft.
barrkel··on Volkswagen Just Built an EV That Can Go Nearly 900 Miles on a Charge
There's more usable space in station wagons, as a rule. And personally, if I'm cornering hard, I prefer to be closer to the road, not higher up...
barrkel··on Don't call yourself an artisanal programmer
A good chunk of engineering is putting together reliable systems from unreliable parts.

You build in safeguards, redundancy, defense in depth, recovery systems. You build models of the system and prove characteristics about it.

Software is fundamentally automation. LLMs enable automating the construction of software itself. They're much faster and cheaper than people, and they're more unreliable. (People are unreliable too!)

The immediate challenge of these times is figuring out how to reliably construct reliable software in the large, over the longer term, reliably. This is an engineering challenge, and the only way we'll get to the other side of it is by trying to do it. Things will be rough, there will be a Cambrian explosion of techniques, most approaches will fail, and many more won't survive as models improve on quality and capability. But we'll figure it out.

Making things by hand, as in the time before agentic coding, can be engineering too, but it is not the core challenge of these times, and it will soon be a hobby, or possibly a kind of luxury good. You will no more want hand-written software than you'll want a hand-made car. It will not have the precision, performance or reliability of machine-made software.

barrkel··on Navier-Stokes – Tristan Buckmaster [pdf]
This would be contract law, and it would also be a huge reputational risk. All it would take is a whistleblower and there would be billions lost.
barrkel··on Borges Labyrinth in Venice reopens to the public
Labyrinth is synonymous with maze in English.

The labyrinth symbol, as a decoration or motif in ancient Greek artifacts, isn't generally a maze, but the labyrinth of myth is. Theseus had to use thread, given to him by Ariadne, to find his way back out.

barrkel··on Don't use musl if you care about performance
Your point seems to be that if you use a slow standard library and complain, it's not a problem with the slow standard library because you can just reimplement the slow parts independently.

The problem with your argument is that it's a universal argument against performance. And if an argument is universal, then it doesn't have any information value.

barrkel··on Stripe said to abandon $50B pursuit of PayPal
For some reason PayPal is still quite big in Germany; about 28% of online revenue in 2025.

Also Austria, perhaps Italy, but I have less direct experience there.

barrkel··on Maiao: Gerrit-style code review workflow for GitHub, GitLab, Gitea, others
It makes every commit small, so they can be reviewed quickly and easily.

Small commits can often be tested faster, since irrelevant tests don't need to run.

Small commits are less risky. The smaller the delta of change, the lower the probability that something breaks.

Small commits get merged sooner; big commits take time to build up. Merging early front-loads your integration risk; merging later puts integration risk just before delivery.

Breaking a big feature into small commits means using feature flags to control whether a feature is enabled or not (since control paths will generally be incomplete). This means you separate the delivery of the code from the delivery of the feature, and has the added benefit that you can turn off a feature that has a problematic rollout without needing to redeploy code.

barrkel··on Maiao: Gerrit-style code review workflow for GitHub, GitLab, Gitea, others
jj support doesn't force an org-wide change. jj is compatible with git. It's just that the mental model is more aligned to Gerrit and stacked PRs.
barrkel··on Maiao: Gerrit-style code review workflow for GitHub, GitLab, Gitea, others
Jujutsu has a mental model that aligns far more closely to Gerrit than GitHub etc.

It uses a persistent changeid to model a change mutating over time, like Gerrit uses Change-Id in the description footer, and unlike git.

Jujutsu can be colocated with git and use .git as its backing store; every jj change revision is a git commit.

When you use jujutsu, you tend not to use branches any more, and think in terms of changes and chains of changes (i.e. stacked PRs, what Gerrit calls Relation Chains).

Jujutsu makes it very easy to work with a chain of changes (stacked PRs), letting you update commits in the middle and automatically rebasing the rest of the chain, without forcing you to interrupt work and resolve conflicts if there happen to be any (so, unlike git rebase -i with 'edit' on the commit you want to update).

IMO if you like the Gerrit workflow and the way it handles chained commits, if you switch to jj for two days of work, you'll never want to use git again.

barrkel··on DeepSeek-v4-flash-vision-exp
You'd expect a tool-enabled model to leverage crop and zoom tools to inspect and validate what it thinks it's seeing, though.
barrkel··on GIMP Development Update
How do you do drop shadow layer mask effects with Pinta and KolourPaint?
barrkel··on GIMP Development Update
I guess the idea is you can do edits via non-destructive layer effects and compositing a stack of layers, where somewhere amongst the stack is your original unmolested data. Though that has not been my experience with Gimp - it's far more likely to want to to commit to a rasterizing decision far earlier than Photoshop would.
barrkel··on GIMP Development Update
I don't care. 99% of my uses of an image editor are for ad hoc edits. I never want to clutter my disk with project files on the off-chance I want to preserve layers or whatnot. I have zfs snapshots and cloud backups should I want to revert but the odds I want to revert an ad hoc image edit are approximately nil - I can never recall needing to do so.

I don't use Gimp as a 3D modeling software or a digital audio workstation. I use it to add text to a family photo. The primary storage medium is jpeg. I don't want or need anything else.

The real issues with Gimp start when you try to work with selections, transforms, cuts, crops and so on. Photoshop muscle memory doesn't transfer and it is so incredibly clunky.

barrkel··on How do I permanently disable random Google Photos popup to backup photos? (2024)
If you run DNS at home (even just dnsmasq) and you bridge your home 192.whatever to tailscale, you can make the same domain name resolve both at home and via tailscale.
Page 1 of 34Next →