RSSAmplifier

Blog

Nathanael Bennett

The feed of updates to Nathanael Bennett

bennett.inkRSS feed ↗11 posts

Latest posts

UI development is event sourcing

“ React was such a good idea that we will spend the rest of the decade continuing to explore its implications.” - Guillermo Rauch One of the things I like about React and SwiftUI is how the declarative model makes it abundantly clear that UI data is simply derived, calculated “ lenses” of authoritative data. TanStack Query is really the nail in the coffin here. There’s no “ API lifecycle” separate…

Beyond OOP and the future of DX

Preface - Why are we still talking about OOP? The era of OOP should be over. The rise of Rust, the dominance of the TypeScript and React ecosystem, the backlash against Clean Code and Robert Martin, and a broader turn toward modularity and functional design all suggest a marked shift. Yet the evidence points in a different direction. In 2025, Object-Oriented Programming remains the dominant…

OOP & the expression problem

When modeling the behavior of data, we usually start by treating a concept either as data inside a system of functions, or as data coupled with behavior in a polymorphic hierarchy. The right choice depends on where the complexity actually lives. Take a game like Baldur’s Gate, or more abstractly, Dungeons and Dragons. In these games we need to model weapons. Weapons are numerous, but their…

Software architecture is about spending abstractions

DPC wrote a great blog post about how you can’t just avoid complexity. I think it’s definitely worth a read if you haven’t already. I agree with his point about complexity being a “ currency” and I extrapolated it to the domain of software architecture. One of the biggest mistakes I see in modern codebases is the idea of “ perfect abstractions”. That is to say, that everything has an abstraction…

Rust's map is cool

I know Rust is still pretty niche, so consider this piece of idiomatic Typescript: const client = this .clients.get(user_id); if (client) { client.status = ClientStatus.Disconnected; } A Rust version: self .clients.get_mut(&user_id).map(|client| { client.status = ClientStatus::Disconnected; }); Excuse the fact that this might not be idiomatic Rust, but I think it’s profound. In other languages I…

A response to "Programmers Are Users"

https://www.rfleury.com/p/programmers-are-users-bad-performance I thought this was a really well written piece describing some of the unforeseen consequences of optimizing toward DX . If you haven’t read it, read it. I’m someone who, to his dismay, spends a great deal of time building software for businesses which have accepted the exact tradeoff Ryan is describing in his post. While I’m…

It's probably time to stop recommending Redux

State management considered harmful One of the most exciting things about working in the React ecosystem is you can observe, almost in real time, how our perspective on the problem domain of UI development evolves. When I first got into React, state management was a very important architectural concept. This was I think, because of the struggle involved with sharing state and making things…

React view models and useSyncExternalStore

I’m currently building a browser-based multiplayer game using WebRTC, authoritative servers, and HTML5 . The game lives in a standalone library, and is hosted on a Nextjs app. Bridging the game code with the React app has been challenging. The UI game logic is pretty complex. There’s a traditional HTML5 renderer which iterates through a bunch of sprites every animation frame. There’s UDP-based P2P…

Scrum is the byproduct of a decade of easy money

When I first encountered Scrum, I liked the idea. I had a teammate fully dedicated to unblocking the politically unsavy engineers such as myself. To aggregating documentation. To finding the answers to problems that caused so many of my day-to-day context switches. Finally! A management style that prioritizes developers. But as any developer knows, that is far from the reality of Scrum. We weren’t…

DRY code is not a product

There’s a famous story about Bill Atkinson where management asks everyone to account for how many lines of code they wrote each week. Most developers understand the nuance immediately: lines of code is a bad metric because good programs are often written in less code. But lines of code isn’t a inverse metric either. Don’t Repeat Yourself ( DRY ) is a great principle that every SWE should be…

Rust tuple pattern matching

One of the things I love about Rust is the ubiquity of pattern matching. This can be seen when writing expressions to handle conditional, nested logic. Handling such scenarios is a common problem. The standard approach in most languages is writing each condition within an if block. In the center of the nested statements (often referred to as a pyramid) lies the happy path. if let Ok (response1) =…