A quarter of a century ago this week, A List Apart published A Dao of Web Design, something I wrote about how to think about the web, and design for it.
I’m working on a piece or two revisiting this, and have the privilege of speaking on this topic at CSS Day in June, since it seems to have stayed around in folks’ minds ever since–something gratifying and humbling.
A quarter of a century older and hopefully at least a little wiser, I feel the central idea holds up–for better or worse
What I sense is a real tension between the web as we know it, and the web as it would be. It’s the tension between an existing medium, the printed page, and its child, the web. And it’s time to really understand the relationship between the parent and the child, and to let the child go its own way in the world.
I’d argue that tension still exists–though perhaps its focus has shifted. We no longer so much see the Web as essentially an extension of print technology and culture–instead, we’ve made it into an application platform, aping all the conventions of other app platforms.
The Web is its own thing–but we’ve still yet to really discover what that is. Don’t ask me, I don’t know what that is either. But a quarter of a century on I’m still just as interested in discovering what that is.
More soon…
Meanwhile this week’s reading it appears it’s MCP (Model Context Protocol) week here on the newsletter with several MCP related posts (not sure what MCP is? We’ve got you covered!) Plus there’s plenty of CSS, performance, JavaScript, and more.
Forced reflows on a website happen when running JavaScript code depends on style and layout calculations. For example, if website code is reading the width of a page element that can cause a forced reflow.
Ideally, JavaScript code does not depend on layout recalculations that happen while the code is running. Instead, the browser performs layout calculations when it needs to display content to the user.
Especially before we got sophisticated layout aspects of CSS like grid and flex, it wasn’t uncommon for developers to do a lot of layout with JavaScript manipulating the DOM directly. And like any habit that’s formed over time, we tend to keep doing it even when better ways come along. So if you need other reasons to move away from using JavaScript to layout part or all of a web page, here it is.
VUCA Revisited: Acting Skillfully in Uncertain Times
Now that we’re again living through uncertainty, I wanted to share what I said at the time. Turns out, I never wrote about the framework itself. Let’s correct that.When contexts shift, it’s harder to act skillfully. The end of the Cold War was such a time. The tense order that emerged after World War II had ended; military leaders had to make decisions in unfamiliar territory.
In response, the U.S. Army War College produced VUCA, a framework for describing unsettling contexts. It’s an acronym of their four main characteristics:
There’s little doubt we live in volatile times–and not just in terms of the impact of new, dramatically higher tariffs on world trade. Technological changes give rise to uncertainty, and their impacts can take much longer to play out than we imagine. Often attributed to Bill Gates, the futurist Roy Amara observed in the 1960s “Most people overestimate what they can do in a year and underestimate what they can do in ten years”. And I would suggest that the changes LLMs will bring to many fields fit this model.
Here Jorge Arango considers how to respond to times of uncertainty, using a model from the US military. Have a “compelling picture of where you’re heading beyond the current turmoil” very much resonated with me.
‘An Overwhelmingly Negative And Demoralizing Force’: What It’s Like Working For A Company That’s Forcing AI On Its Developers
We’re a few years into a supposed artificial intelligence revolution, which could and should have been about reducing mundane tasks and freeing everyone up to do more interesting things with their time. Instead, thanks to the bloodthirsty nature of modern capitalism and an ideological crusade being waged by the tech industry, we’re now facing a world where many people’s livelihoods–like video game developers–are under direct threat.
I’ve been generally optimistic about the impact of AI on software engineering–but not all applications or adoptions of the technology are judicious. Ted Chiang observed as we’ve noted several times Fears of Technology Are Fears of Capitalism and that’s very much at play here.
Ideas of what makes for “good” typography are deeply rooted in eras when type was set by hand using metal, wood, or ink. Typesetters took great care when deciding if a word should go on the end of one line, the beginning of the next, or be broken with a hyphen. Their efforts improved comprehension, reduced eye-strain, and simply made the reading experience more pleasant. While beauty can be subjective, with disagreements about what’s “better”, there are also strongly-held typographic traditions around the globe, representing various languages and scripts. These traditions carry people’s culture from one generation to the next, through the centuries.
Typography on the Web has always been challenging, since, among other things, line lengths change due to numerous factors. If you’ve ever typeset print, you’ll likely have laboriously set lines of text to reduce rivering, something software struggles to address. Which is why full justified text is not recommended for web content.
CSS’s text-wrap property improved things significantly, and text-wrap: pretty promises to make typography even better on the Web. It’s supported in Chrome and now in Safari Technology Previews, and it’s straightforward to use in a progressively enhanced way. Here Jen Simmons gives history of typography on the Web and takes a look at text-wrap.
Cascade Layers, Container Queries, Scope, and More
I chat with Bruce Lawson about all things CSS. We geek out over the latest and greatest features like Cascade Layers, @Scope, Mixins, and Container Queries – exploring how these features impact web design.
For your listening pleasure, Miriam Suzanne and Bruce Lawson discuss all sorts of new exciting things happening with CSS, many covered on Conffab, some by Miriam herself.
At The Future of Software conference in London, Patrick Debois shared how mastering the latest AI tools and understanding the principles and patterns can help you navigate the space of AI Native development.
These patterns include “Producer to manager,” “Implementation to intent,” “Delivery to discovery,” and “Content to knowledge.”
Since just about the arrival of the second browser, web developers have debated this question–how do we handle the differences in support for browser features.
Do we revert to the lowest common denominator?
Do we build with the latest technologies and slap a “best viewed in” badge on the site (this was a surprisingly common strategy for a long time, though with its many other flaws, it makes no sense in an age of webkit only iOS browsers).
When we talk about the unfair practices and harm done by training large language models, we usually talk about it in the past tense: how they were trained on other people’s creative work without permission. But this is an ongoing problem that’s just getting worse.
The worst of the internet is continuously attacking the best of the internet. This is a distributed denial of service attack on the good parts of the World Wide Web.
While it’s very clear we’re positive about the impact of LLMs on software development, we entirely share Jeremy’s position here. As we noted earlier, Ted Chiang observed, “Fears of Technology Are Fears of Capitalism“.
if you aren’t redlining the LLM, you aren’t headlining
There’s something cooked about Windsurf/Cursors’ go-to-market pricing – there’s no way they are turning a profit at $50/month. $50/month gets you a happy meal experience. If you want more power, you gotta ditch snacking at McDonald’s.Going forward, companies should budget $100 USD to $500 USD per day, per dev, on tokens as the new normal for business, which is circa $25k USD (low end) to $50k USD (likely) to $127k USD (highest) per year.
If you don’t have OPEX per dev to do that, it’s time to start making some adjustments…These tools make each engineer within your team at least two times more productive. Don’t take my word for it—here’s a study by Harvard Business School published last week that confirms this.
Geoff Huntley has been writing extensively about working with LLMs recently. He proposes companies should be heavily investing in these tools for their developers. But as Mark Pesce observed to me in response–perhaps companies should be investing in the hardware themselves, and running their own models?
MCP, short for Model Context Protocol, is the hot new standard behind how Large Language Models (LLMs) like Claude, GPT, or Cursor integrate with tools and data. It’s been described as the “USB-C for AI agents.”It allows agents to:
Connect to tools via standardized APIs
Maintain persistent sessions
Run commands (sometimes too freely)
Share context across workflows
But there’s one big problem…⚠️ MCP is not secure by default.
And if you’ve plugged your agents into arbitrary servers without reading the fine print — congrats, you may have just opened a side-channel into your shell, secrets, or infrastructure.
Is vibe coding going to create a sea of crappy software? Are software engineers doomed?Let’s look at the evolution of photography again. Each of us have cameras in our pocket, that are with us 24/7, and are dramatically higher quality than Polaroid cameras. The number of images created per day is staggering, and once again you can argue that one persons slop it another’s gem. The photo of my kid at the Eiffel Tower is highly personal, and truly not interesting beyond a small family cohort. On the other hand, some amazing photos are captured from someone else’s phone, due to skill, luck, and the fact that these cameras are impressive and constantly improving.
The legendary Dion Almaer weighs in one the impact of AI on software development, likening it to the impact of polaroid cameras on the practice of photography.
I don’t know what MCP is and at this point I’m too afraid to ask
It feels like everyone’s talking about MCP (Model Context Protocol) these days when it comes to Large Language Models (LLMs), but hardly anyone is actually defining it. Let’s go deeper!
If you still think of AI-based code-autocompletion suggestions as the primary way programmers use AI, and/or you are still measuring Completion Acceptance Rate (CAR), then you are sitting on the vaguely dinosaur-shaped curve representing Traditional Programming in Figure 1. This curve super-slides into obsolescence around 2027.I have bad news: Code completions were very popular a year ago, a time that now feels like a distant prequel. But they are now the AI equivalent of “dead man walking.”
In May 20224, Steve Yegge wrote The death of the junior developer speculating that LLM based programming would have a very negative impact on the prospects of junior developers (and juniors in a lot of knowledge based careers and professions). He’s followed that up with The revenge of the junior developer.
A Model Context Protocol Server (MCP) for Microsoft Paint
Why did I do this? I have no idea, honest, but it now exists. It has been over 10 years since I last had to use the Win32 API, and part of me was slightly curious about how the Win32 interop works with Rust.
Anywhoooo, below you’ll find the primitives that can be used to connect Microsoft Paint to Cursor or ClaudeDesktop and use them to draw in Microsoft Paint. Here’s the source code.
The Web Share API allows us to present users with choices that matters to them, because it triggers the share mechanism of their device. For example, I can easily share links to the group chat, Bluesky or even Airdrop on my phone because the share sheet on my phone is relevant to me, not what a publisher thinks is relevant to me.
The other web platform tool — the Clipboard API — allows us to create a nice, simple “Copy Link” button. Copy and paste makes sense, mainly because it’s easy. Copy link buttons also give users complete choice in terms of where they share your URL.
The Web platform is full of features to make developers lives easier that many developers may not be familiar with. One such is the Web Share API. What does this do? Everyone is familiar with the share icon in iOS, Android, Mac OS and so on. This makes it simple for you to share say a web page to messages, Signal, AirDrop and other services on your device. It’s very very straightforward to implement, widely supported and can be used with progressive enhancement as Andy Bell explores here.
What I’m Doing Instead of Chasing FrameworksI haven’t sworn off new frameworks entirely (they’re still fun to explore!). But I have changed my approach:
Double down on fundamentals: I invest more time sharpening my core JavaScript/TypeScript, HTML, and CSS skills. It’s amazing how many “magical” framework features are just clever applications of language fundamentals. Understanding closures and the module pattern can help you write simple state management without any library.
Use frameworks as tools, not dogma: Now I choose frameworks based on project requirements and team expertise, not novelty. If my team knows React well and we need to build quickly, we stick with React. If I’m adding a small feature to a mostly vanilla JS project, I might not use a framework at all.
Build real projects (even small ones): Nothing teaches better than creating something end-to-end. Instead of rewriting the same demo in 5 frameworks, I focus on building useful projects with tools I already know. Working on my own app, Kollabe, taught me more about software development and teamwork than framework migrations ever could. By building a real product, I learned about managing growing complexity, handling user feedback, and performance optimization – lessons that stick.
Keep an eye on trends, but bet on proven tech for serious work:I stay aware of new libraries and developments (I’m a developer after all!). I’ll experiment with them in small projects or study their concepts. But for production code or anything with deadlines, I rely on stable, well-documented technology. It’s less about being conservative and more about being pragmatic. I can always adopt new tools once they prove their value and address a specific need.
This shift in focus has brought more peace of mind and productivity. I no longer panic that “FrameworkXYZ 1.0 just launched, I’m falling behind!” Instead, I evaluate new tech calmly and often find that my existing skills are sufficient to do the job well.
Do people still write CSS in CSS files any more? I honestly don’t keep up with the trends as much as I did back when I started by career. Partly because I’ve started to feel that the web development community online has become a lot more “this(my) way is the best way” than when I started out at the tail-end of the HTML tables era and the start of the floats era.