Agreed on the value of programs. But “any migration is but a prompt away” goes too far. We still need an intermediate language between us and the machine. English is expressive but underspecified. Machine code is precise but divorced from the semantics we care about. That said, I doubt Rust or C++ is the right IR. There’s also a tactical matter: useful mechanisms should be captured and reused, not regenerated each time.
Replying to @dhh
The value of programs going forward will be the collection of decisions and designs that encapsulates "what does it do and how does it do it". There is no more long-term value in a Rust code base than there is in any other. Any migration is but a prompt away.
1
238
Verification power is bounded by the representation in which the system is expressed.
I'm seeing a lot of euphoria about how Opus 5.5 is good at TLA+, and this means that all software will soon be formally verified. As a person who loves TLA+ so much he wrote a book on it, I want to throw a particular cold shower on people's enthusiasm by talking about the limits of what you can actually verified with it. The high level simplification is that TLA+ sees a system as a set of "behaviors", or possible sequences of states. For example, the pseudocode "pick a random number from 1-3 and decrement it to 1" has three behaviors: `{3 -> 2 -> 1, 2 -> 1, 1}`. From here, there are two basic kinds of TLA+ properties: - `[]P` means that `P` is true in *all states* of *every behavior*. - `<>P` means that `P` is true in *at least one state* of *every behavior*. `[]P` is immediately useful as an **invariant**, or something that always be true of your system. This is things like "your data is never corrupt" or "there's always at least one server online." `<>P` is a little more abstract, but for technical math reasons I won't get into here, can be stacked with `[]` to create really complex and useful properties. `<>[]P` represents things like "the algorithm eventually converges on the right answer", `[]<>P` things like "if two data stores desync, they will eventually resync", and `[](P => <>Q)` things like "If a message is put on the queue, it's eventually processed by a worker". Really cool stuff! These primitives were chosen to make a wide array of properties useful. And if we're clever, we can do all sorts of more complex properties, like bounded time constraints and history properties. But we're always constrained to 1) define a logical formula 2) over individual behaviors, and 3) check that all behaviors satisfy that formula. So some things that we *cannot* express in TLA+: - Possibility and reachability properties: that it's always possible to *make* P true, even if you don't actually decide to. Things like "I can always shut down the computer" or "A user can always change their password". These can't be expressed with `<>P` because that's "for all behaviors, P happens at least once", we actually want "for all behavior prefixes, there is at least one behavior where P happens at least once". - Hyperproperties: properties that are defined over two or more traces. These are things like "painting a car red doesn't make it faster" or "users cannot infer secret data by observing public data". We can't do these because TLA+ only looks at one behavior at a time. - Statistical properties: 95% latency is 1ms. Impossible because most of these are hyperproperties. - Properties about if a system is robust against code changes. Impossible because, uh, you have new behaviors now. Some of these are solvable in different logical formalisms. CTL can do reachability, PRISM can do statistical properties, etc. Those have their own tradeoffs and limitations, though, and no system can do everything. Others are solvable with a lot of cleverness tailored to the specific spec, like lifting a model into a hypermodel. But these are insanely inefficient and make your "clever spec" diverge significantly from the real world system, so introduce a lot more opportunity for things to go wrong. The core problem, though, is (1): properties are logical formula. If we don't know how to express a system property as a logical formula, we can't verify it. 99% of the properties we care about fall under this. The information on the site is easy for a user to find. Our LLMs behave as we expect them to. Our application can't be used to break the law. TLA+ (and Quint and Lean and Rocq) are near-useless here, no matter how clever you are. Don't get me wrong: `[]P` and `<>P` represent a huge range of useful properties and TLA+ is incredible at finding awful concurrency bugs. But there's a lot it fundamentally can't do and we shouldn't believe that it will solve all our worries about software bugs. And the same goes for all other formal verification languages, too.
3
163
The SDLC increasingly optimizes for access to human attention. Complexity gut checks are still something humans do better than agents, perhaps because, for now, we haven’t found a good way to express many of those judgments explicitly.
Code reviews today are mostly about gut checking if the complexity is worth the benefits.
3
163
Code reviews today are mostly about gut checking if the complexity is worth the benefits.
11
40
622
32,386
Yes, you can implement durable execution with object storage and a library, and that’s very elegant. But some workflows make that expensive quickly: large state, frequent reloads, high duty cycle, etc. This suggests separating workflow semantics from execution strategy. Define the process once, then realize it with S3 durability or a long-running VM, depending on the workload.
The right architecture for durable execution depends on the size of the state, the cost of unloading and reloading it, the type of state, the duty cycle, and the mutation rate. The right answer could be long-running VMs, local snapshots, remote snapshots, S3, a DB, etc.
136
Vibe coding runs into the same wall every abstraction eventually does: generated artifacts are not the same as system meaning. The next layer is explicit semantics…something closer to a new language/compiler rather than just piles of generated code.
The Sutro team has spent the last five years doing deep engineering to build secure and reliable software. They’re now becoming part of Lovable.
1
5
460
Interesting paper: resource-centric control (pods, deployments, services) is the wrong layer for governing agents. They propose an intent-aware control plane: intent, policy, capability, context, decision, execution plan, plus a decision artifact recording why one plan won. That feels directionally right. The next useful abstraction for agentic systems may not be another resource model, but a model of decisions, authority, and effects.
1
108
More capable agents and more compute can automate implementation, but they can’t resolve semantic ambiguity from insufficient information (underdetermination). Agentic engineering needs semantics to elicit and accept intent, make that accepted meaning the source of both implementation and verification, and use simulation and runtime evidence to validate it against real world conditions, while focusing human attention on the decisions that actually require judgment.
1
2
146
SQL is great when all the data is in one database and the query-composition problem is simple. But real applications need to dynamically compose queries and pull and join data across heterogeneous sources. We need something with SQL’s declarative, domain-specific nature, but with a richer composition model and first-class access to heterogeneous data sources.
Somehow a 100-line SQL query is considered unmaintainable, but splitting the same logic across five services and a message queue is considered architecture.
2
273
Take this one step further: why should the agent program primarily in Rust at all? Rust is excellent when ownership, memory safety, and low-level control are central. Often, they aren’t. If agents are doing the translation, define a language for the domain itself (e.g., entities, relations, processes, transitions, invariants, capabilities). Make those definitions first-class and checkable, then lower them into Rust, C#, SQL, infrastructure, etc. Now you have accepted system meaning you can verify implementations against, and a basis for closing the conformance gap. The interesting language for agents may increasingly be the one that captures system semantics, not implementation mechanics.
At some point, developers are going to abstract away their relationship with the programming language entirely. Many already have. You pick the one that gives the best feedback to the model and produces the fewest surprises in production. This is why Rust is rising. The developers now excited about Rust would never have learned it themselves. It's a pain in the ass to write and takes forever to master. Now that LLMs write it well, the calculus changes. Better type feedback, fewer bugs, faster runtime - what's not to like? If you're not really reading the code anyway, who cares what language it's written in?
2
200
When I offer useful input to my coding agent 😂
3
121
Really interesting direction. I wonder how far this can be pushed beyond individual programs/kernels. Could we define sufficiently strong semantics for an entire system, including interactions between components, and then let a stochastic optimizer lower that into an optimized distributed realization across one or more nodes? The verification problem gets much harder, but the possibility seems fascinating. I think so.
2
194
Perhaps what’s changing isn’t the value of reuse, but what we should reuse. We’ve historically optimized for reusable realizations: libraries, components, implementations. If realization becomes cheap, that matters less. But reusable semantics…the invariants, constraints, and relationships that must survive every realization may matter more than ever.
No one truly talks about the many foundational values in software engineering was about reusability. If reusability doesn’t matter that much, it impacts every fundamental value we’ve been holding for decades.
3
252
Perhaps when the dust settles, we’ll concede that English alone doesn’t scale as the “programming language” for intent. But until we measure, it’s all conjecture. I especially like that PostHog is measuring accuracy, and whether the semantic layer compounds rather than becoming stale documentation.
5
293
There are two different concerns here. One is stochasticity: an LLM may produce different outputs for the same prompt. The other is underdetermination: consequential decisions aren’t specified, so the model makes them for you.
Why Microsoft didn't have LLMs do their recent Typescript native rewrite in Go Anders Hejlsberg (Creator of Typescript): "If we just let AI loose on, what is it, half a million lines of code that we have in the old compiler? Well, I don't know that that would absolve us from then having go in and carefully examining every line that came out of it to make sure that there were no hallucinations. Right. Unless you have 100% perfect test coverage, you probably still gotta go check all of that. Now I think a better approach, quite honestly, would be enlist AI to write a program that helps you translate from TypeScript to go, because at that point you can park the stochastic ness in that program and then you can get deterministic behavior whenever you run the program, which means you get the same transformation every time you run it. Right. That's always the thing about AI that people forget it's not deterministic. Right. So you can't really trust that it's going to do the same thing twice. For the full conversation, you can search Anders Hejlsberg's name on my YouTube, Spotify or Apple Podcasts (link in bio)
218
I think this is true, but there’s a graveyard of sophisticated libraries that were technically right and still lost on adoption. The answer isn’t weaker foundations…we need them to build increasingly complex systems. The answer is a simpler surface: map technical concepts to the vocabulary developers already use, expose complexity progressively, and let agents guide developers through the decisions as they become relevant. If you tell someone DI is “just a coeffect, whats the problem?” don’t be surprised if they go on their merry way.
Effect is verbose is an argument that makes no sense, it is verbose compared to code that only cares about the happy path, that is not testable and doesn’t integrate telemetry. Compared to production grade code Effect is terse.
1
3
1,576
I wonder how much of this changes as AI writing becomes ubiquitous. If what matters most is the idea, will we eventually care less about whether a human wrote every sentence, much as we may care less about whether a human wrote every line of code? English is different because the audience is human (though we may increasingly read via AI too). But perhaps our focus shifts toward ideas, judgment, and taste rather than wording. Separately, I’m not sure colorful verbs are always a vice. Prose can be an art form, and a little indulgence and showing off is part of the fun.
I was thinking about how I recognize AI writing, and one big tell is excessively colorful verbs. A handful of journalists might write that a proposal "drew" 100 votes, but any normal person will just say "got".
2
2
538
My former boss from over a decade ago, previously a Google Storage SRE director, would always tell us about the 2003 Northeast blackout whenever retries amplified an outage. Apparently every generation of engineers gets to rediscover retry amplification in their own way😅. This seems to call for system-level admission and feedback control beyond per-client jitter and backoff.
The RCA for the outage we had at GitHub yesterday is live. We're sorry it happened and hope this answers your questions about it. The team is already working on the actions listed here to fix it. githubstatus.com/incidents/z…
1
1
6
720