Year round learning for product, design and engineering professionals

Your weekend reading

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.

Like to get these in your inbox?

Sign up to our weekly newsletter to get this newsletter in your inbox every Friday.

How To Fix Forced Reflows And Layout Thrashing

Diagram comparing the normal rendering process versus forced synchronous layout reflow in JavaScript. The normal process shows sequential blocks: JavaScript, Layout, and Paint. The forced reflow process shows JavaScript interleaved with Layout steps: JavaScript, Layout, JavaScript, Layout, then Paint.

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.

Source: How To Fix Forced Reflows And Layout Thrashing | DebugBear

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

2x2 matrix chart with the quadrants labeled Complexity, Volatility, Ambiguity, and Uncertainty. The x-axis is labeled 'How much do you know about the situation?' from low to high, and the y-axis is labeled 'How well can you predict the results of your actions?' from low to high

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:

Source: VUCA Revisited: Acting Skillfully in Uncertain Times | Jorge Arango

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

Cartoon-style robot with antennae and glowing yellow eyes, wearing a suit and crossing its arms

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.

Source: ‘An Overwhelmingly Negative And Demoralizing Force’: What It’s Like Working For A Company That’s Forcing AI On Its Developers – Aftermath

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.

Better typography with text-wrap pretty

A text box with the label "text-wrap: auto" displaying a medium-length headline that wraps, causing the word "itself" to appear on a line by itself.

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.

Source: Better typography with text-wrap pretty | WebKit

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

Podcast Episode 8 titled 'Cascade Layers, Container Queries, Scope and more!' featuring host Bruce Lawson from Vivaldi and guest Miriam Suzanne, Co-Founder of OddBird

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.

Source: Cascade Layers, Container Queries, Scope, and More | OddBird

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.

Bonus Video: watch CSS Containers, What Do They Know? by Miriam Suzanne, no signup or signin required.

AI Native development principles and practices | Patrick Debois

Source: Youtube

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.”

We recently covered Patrick Debois’ The 4 patterns of AI Native Dev article–here’s a video of a talk on the same topic.

A pragmatic browser support strategy

Screenshot for the article. Text reads "A pragmatic browser support strategy

Today, I wanted to talk about my approach to browser support. The tl;dr version…

Basic functionality should work on any device that can access the web.
Extras and flourishes are treated as progressive enhancements for modern devices.
The UI can look different and even clunky on older devices and browsers, as long as it doesn’t break rule #1.
Let’s unpack this a bit…"

Today, I wanted to talk about my approach to browser support. The tl;dr version…

  • Basic functionality should work on any device that can access the web.
  • Extras and flourishes are treated as progressive enhancements for modern devices.
  • The UI can look different and even clunky on older devices and browsers, as long as it doesn’t break rule #1.

Let’s unpack this a bit…

Source: A pragmatic browser support strategy | Go Make Things

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).
  • The strategy of ‘graceful degradation‘ which morphed into progressive enhancement has become, for those who care about such things, the best practice approach.

But that still leaves a lot of specifics to be considered. As Chris Ferdinandi does here.

Denial

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.

Source: Adactio: Journal—Denial

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

Bar chart showing standardized quality scores for four groups: Individuals without AI, Teams without AI, Individuals with AI, and Teams with AI. Individuals with AI and Teams without AI perform similarly, both outperforming Individuals without AI. Teams with AI perform best, but only slightly better than Individuals with AI or Teams without AI

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.

Source: if you aren’t redlining the LLM, you aren’t headlining

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?

The “S” in MCP Stands for Security

🤖 What Is MCP and Why Should You Care?

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.

Source: The “S” in MCP Stands for Security | by Elena Cross

MCP (Model Context Protocol) is the talk of the town. But there’s a little (ok potentially giant) security issue, as Elena Cross details.

Vibe Coding: Democratizing Software, One Snapshot at a Time

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.

Source: Vibe Coding: Democratizing Software, One Snapshot at a Time – AI Native Dev

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

A colorful, minimalist graphic with the text "Cassidy Williams" prominently displayed, accompanied by the subtitle "writing, musing, and all that jazz," on a background decorated with scattered, multicolored "X" shapes

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!

Source: I don’t know what MCP is and at this point I’m too afraid to ask

It’s MCP week here at the newsletter it would appear. Here’s a succinct and clear introduction to MCP–Model Context Protocol.

Revenge of the junior developer

A line graph illustrating the evolution of AI coding strategies from 2022 to 2027, showing a decline in traditional programming and code completions, a rise and then plateau in chat-based programming, and significant growth in "vibe coding," "coding agents," "agent clusters," and especially "agent fleets" by 2027.

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.”

Source: Revenge of the junior developer | Sourcegraph Blog

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

Meme of two astronauts in space pointing at Earth labeled 'Agents'. One astronaut says 'Wait, it’s just a for loop?', while the other, pointing a gun at him, replies 'Always has been' — humorously implying that 'agents' are just a loop in disguise

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.

Source: A Model Context Protocol Server (MCP) for Microsoft Paint

Geoffrey Huntley (who we’ve cited a number of times recently) has built an MCP server for Microsoft Paint.

Minimal CSS-only blurry image placeholders

Gradify web interface showing a grid of blurred image gradients in the background and a centered popup. The popup explains that Gradify generates CSS gradients from prominent image colors for smoother placeholders, with buttons labeled 'Single Color' and 'Get Code'

Here’s a CSS technique that produces blurry image placeholders (LQIPs) without cluttering up your markup — Only a single custom property needed!

Source: Minimal CSS-only blurry image placeholders

This is a genuinely breathtakingly clever CSS only technique for creating Low Quality Image Placeholders (LQIPs).

Simplify sharing with built-in APIs and progressive enhancement – Piccalilli

Social media sharing options with buttons for Bluesky, Facebook, Instagram, Mastodon, Threads, and WhatsApp, under the heading 'Share this post'.

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.

Source: Simplify sharing with built-in APIs and progressive enhancement – Piccalilli

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.

First Look at The Modern attr()

CSS attr() function syntax with labeled components: 'data-color' as the attribute name, 'type(<color>)' as the type, and 'red' as the fallback value

You might have used the attr() function in CSS before to get the text content for a pseudo-element.

However, when we want to use a value other than text, it will not work. In the following HTML, I added data-color attribute to the p element.

Now, we can use attr() and define the type of value we want to use.

Source: First Look at The Modern attr()

Get the low down on the new CSS attribute which goes far beyond what we’ve been able to do until now. As always an excellent article by Ahmad Shadeed.

Stop Chasing New JavaScript Frameworks: Build with Fundamentals Instead

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.

Source: Stop Chasing New JavaScript Frameworks: Build with Fundamentals Instead 🏗️ – DEV Community

Matt Lewandowski makes the case for learning and keeping up to date with the fundamentals and foundations of web development.

The case for “old school” CSS

A visual timeline titled 'The CSS Eras' showing five web design layout phases: Nothing (black screen), Tables (stacked wooden furniture), Floats (person floating in water), Flex (person doing a handstand), and Grid (modern tiled wall)

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.

Source: The case for “old school” CSS

Hui Jing Chen uses some old school (and new school) CSS to style a brand new Drupal site.

delivering year round learning for front end and full stack professionals

Learn more about us

Web Directions South is the must-attend event of the year for anyone serious about web development

Phil Whitehouse General Manager, DT Sydney