Writing
Tagged “Architecture”
- Stable Verbs, Dynamic Affordances
A tool catalog can describe what cancelOrder means without saying whether it applies to this order now. A resource can report current applicability without redefining the operation on every response. The useful synthesis is a stable typed vocabulary plus contextual affordances, with execution-time revalidation and an experiment honest enough to test whether the extra layer earns its keep. Third of three.
- What Runtime Affordances Cost — and Buy
Runtime controls keep the server authoritative about current transitions and invocation targets, but they move work from build time into execution. The relevant question is not whether HATEOAS won: it is whether applicability and binding change often enough to justify traversal, dynamic failure, and weaker static closure. Second of three on hypermedia and agents.
- The Browser Was Only Half the Client
A browser can operate a site it has never seen because it shares the work with a person. That does not make hypermedia useless to machines, but it does reveal what the constraint can and cannot supply: controls can bind known operations to current resources without teaching a client what those operations mean. First of three on the contracts hidden inside HATEOAS.
- The Runtime Is What's Left Over
This site is two different websites wearing the same clothes: an interactive Rust/WebAssembly portfolio, and a folder of static HTML articles generated by a separate program. They share a header, a colour, a typeface, a hairline width, and one WebAssembly bundle — without either one importing the other. This is how the sharing actually works, why Rust makes it cheap, and why almost nothing is left to decide in a browser.
- Performance Is Making Gradle Less Gradle
Gradle 9.7 promotes Isolated Projects to incubating, and the headline is parallel project configuration. The real story is that Gradle can only parallelize configuration because it has started making entire categories of previously legal build logic illegal. Performance pressure is quietly turning a programmable build system into a declarative one — and TypeScript is doing the same thing from the opposite direction.
- Who Pays for the Pressure
Bad API design is rarely bad taste. It is pressure correctly identified and incorrectly located — real forces from inside the implementation escaping into the contract, where every caller pays for them forever. Read through Google Cloud IoT Core, Datadog monitors, and the designs that got the same problems right.
- The Lookup That Saves the Handshake
RFC 9146 adds a connection identifier to DTLS 1.2, usually summarised as NAT rebinding support. That summary hides the design: what the CID really does is move where the protocol anchors its state, from an address it never chose to an identifier it owns. Nine bytes, and a case study in deep modules and interface ownership.
- Risk, Complexity, and Pressure
Architecture Must Follow Pressure sits between George Fairbanks's risk-driven architecture and John Ousterhout's philosophy of software design.
- Architecture Must Follow Pressure
Not fashion, not diagrams, not whatever book the team read last quarter. Architecture should emerge as a response to real constraints — and the sharpest of those constraints is failure. A failure-mode-driven view of software design.