As a non-web dev, I have a question about this part:
> There was a sad coda; as is the way of contract work, I moved on. I explained what I had built to my replacement, that it always worked even without javascript. He was appalled and said, “but that’s a lot more work for us.”
Why is it more work? The approach described in the article seems honestly reasonably simple: just write the standard <input> components for the form, have a submit button at the bottom. When I was making my own websites many years ago now, that's how it worked, and it wasn't that hard. Maybe it's reflecting my ignorance in this field, but doing fancy front-ends seems much harder to me.
Simpler doesn't mean easier. Consider a chef who at their previous job started using a wood-burning stove. This is an objectively simpler tool than a gas or electric stove, yet it would be very difficult (even impossible, depending on local architecture and regulations) for a new kitchen to add one.
The message you just wrote involved how many complex systems, from your keyboard switches and firmware to your BIOS and OS interrupts, to your browser, the internet and middle boxes, just to say one sentence to someone. It would be much simpler (and more secure!) if you just told me with your mouth, but you didn't do that.
I'm interested to hear what architecture and regulations prevent the use of something that is foundational to web develpment and backwards compatible by design? Which also, by the way, comes with the advantage of not incinerating other parts of the restaurant (accessibility, user experience...), forcing expensive countermeasures or total rebuilds of the things destroyed every time you turn it on.
90% of the SPAs I use could be Django/Rails/Flask apps with no noticeable difference, other than that they'd be many times more responsive on slower devices.
"Old" SSR apps are mature, not obsolete. It's ridiculous when they're not considered even when they'd be the right tool for the job. I wouldn't try to clone Google Docs in Django, but something like Linear could 100% be modeled as a CRUD app with new page loads on click without a substantial loss of functionality from the user's POV. Not to mention built-in, automatic support for pervasive "deep linking", aka "linking", because you access a URL's contents by GETting and rendering that URL is just how it works.
I agree but you and I aren't the audience and I think experts in general should be a little more holistic when critiquing other people's choices. For any given problem there always exists a perspective from which your solution is over-engineered. People who (like us, I presume) understand processes, files, the command line, compilers, a computer language or two, a bit about computation theory (e.g. Turing, big-O, Knuth..) can get to a very broad swath of places along many different (often shorter!) paths. This is not where most people are starting from.
Speaking of Knuth, imagine being asked to "write a program to add two numbers" and using something like Python instead of assembler, or because really that's complex too, machine code. Do you think that the amount of housekeeping and computer activity is justified for adding two numbers? Objectively, it is not, its just that steady-state dominates the transient over time.
It probably has to do with what technology people are used to. There has been a couple of generations of web developers who have only known javascript and its ecosystem for building webapps, and so anything other than pure javascript solution looks foreign.
I think Facebook with their money and Vercel with their VC funding tried hard to push the React and then the Next.js everywhere. So it arrived in time for AIs to all train on it. And now it’s the one true way :)
But do we really need all that stuff? Build steps, bundling, tree shaking, all for what? And is it really simpler… hmm
By this point people don't appear to have any real clue how to write HTML anymore. Writing semantic HTML isn't significantly harder than say writing Markdown. You copy some HTMl skeleton and you literally just stack your elements into the body. I managed to do that as a 13 year old on MySpace without any deep instruction. Sure you have to close elements as well so the syntax is slightly harder than markdown, but that allows you to differenciate between for example <article>, <section> and <aside>.
I am convinced the one single thing that made HTML unusable over the time was that people wanted or needed a way to re-use parts of the page across multiple pages, like headers, navigational elements and footers.
This meant people used frames, PHP, templating engines or any other new technology mainly for the purpose of creating shared elements, simply because HTML failed (and to this day: fails) to offer a way to include one HTML file in another without having it suck (like frames definitely did, since the browser treated each subpart of the page like its own entity including caching).
Large websites resorted to PHP and server side includes to get headers and footers. Smaller websites resorted to frames and copy/paste. It wasn't perfect, but it also wasn't horrible or unusable either.
I think it was... SHTML? that allowed for server includes. My recollection from... 25ish years ago was that it was generally quite well supported and worked quite well (and was dead simple to implement). Not sure why, if that was the issue, the fix didn't quite catch on (but it's totally possible I'm mis-remembering the state of browser support).
Server-side includes worked fine but weren't enabled by default in any of the mainstream web servers. I think the lack of default-enabled status hampered their adoption. Joe User couldn't just FTP a bunch of ".shtml" files up to their shared web space and expect it to work right.
I certainly used the heck out of them in the late 90s, though.
It would have been very cool if HTML had been created with the ability to do client-side includes without having to resort to using a Turing-complete VM in the client to do it.
Ahh, yeah! That rings a vague bell of having to futz with IIS at some point to figure out why a page wasn't working. I can't quite recall if it worked in Geocities, but I think some of the gaming websites I was building (maybe xoom? That sounds familiar for some reason) had it on.
yeah editing all the footers and navigation parts in html is too annoying to me so i've resorted for my websites to just a back button to a page that has links to everything else lmao
The `<template>` tag has gotten very close. Right now you still need JS (optionally wrapped as a Web Component) to load a `<template>` from an outside HTML file (at which case, yeah, it's so easy to just use a JS-based HTML renderer instead of a template today), but discussions are ongoing about closing that loop for simpler "JS-free Web Components".
I don't know when that will be accepted into the web platform, but it still feels more like a matter of time that it may happen eventually.
I've found at least some of my static page generation has moved to just dumbly appending `<template>` tags to the bottom of a page rather than use some other template language, so it feels like we are closer every day to finally having "HTML-native" simple part reuse.
Yes you used HTML to design a website in a way that was the opposite of semantic. Semantic HTML is about just writing your content and then using CSS and js for everything else (as far as possible).
Also: the meaning of the word semantic is that the used elements give you context about the contents. So if you place text in an <aside> that tells you that this is additional information as opposed to the stuff in <content> for example.
If you use a hundred nested divs, there is probably a better way to do it.
I suspect they are both more familiar with client-side rendering, and also thinking of things being able to share components, reuse existing libraries, and so on. So re-implementing everything with vanilla HTML and forms feels like reinventing the wheel to a team used to an SPA component library, it's not that it's intrinsically harder, it's that they don't have the existing building blocks they'd normally reach for.
Modern frameworks such as Astro allow for a similar development experience (and can optionally use JS, React and other client-side libraries) while still being able to generate a static site if desired.
I think server-side rendering and static site generation are less familiar to many web devs who came up in the React/Vue/Svelte era. The patterns and mental model are just different. In an ideal world we combine both: fast static HTML that works everywhere, with progressive enhancement for interactivity. Astro does this well; Next.js supports it too, though the SSR parts have a learning curve.
Starting a few years ago, I realized some junior and medior engineers never once considered the possibility of building a website (app, experience, etc.) in anything other than a heavy SPA framework. But they're not stupid people! If you directly asked "Can you build a website without React?" they know the answer is obviously "Yes." However, if you asked them to build a new website, they would unthinkingly start a new React project, mostly out of familiarity and a desire to get the job done.
A few of them would outright not know how to do anything else. No knowledge of how to stand up a boring HTTP server to send pure HTML. No experience building a form that validates or submits without JavaScript. These are not the people who post here on HN. They are not engaged in online discussions of new tools and skills (or old tools and skills!). These are people who learned just enough from a bootcamp, or their uni's single "web apps" course, to get a job. Since then, they have just-in-time learned whatever their employer required, or whatever particular tools someone else on their team chose for a project.
As an old, it took me a while to recognize/realize it, but I understand them now. Depending on their career path, someone will encounter the simplest aspects of HTML, CSS and vanilla JavaScript after they learn the complex, framework-specific aspects of each. It feels (to them) like more esoteric, advanced, or tertiary knowledge.
Tying it back to to the quote "that’s a lot more work for us", that's not necessarily an intentionally false claim. It probably does feel like a lot more work to perform a task using unfamiliar tools, even if they are less-complex tools.
You are far too empathetic to them. They should not hold the jobs they have.
These are the people writing React monstrosities for government benefit websites, and testing them on fast iPhones and fast 4G, without realizing that every page load for actual users will take 30 seconds on their old $200 Android on 3G, and users won’t complete the form.
It’s a culture of not giving a shit, that’s the deeper issue.
I use to have an old pentium 2 computer for testing websites. Sometimes you cant make things fast enough for the old box. A fun trick is/was to have <script>elm.textContent="loading images"</script> between each "heavy" section, all targeting the same elm. If the computer, network or server is truly extremely slow you will get a nice message at the top describing what they are waiting for. On a normal slow computer you won't see the messages unless something went wrong.
I see no reason not to be empathetic. The frustration is fair, but it's aimed at the wrong layer. These people were guided into this spot by bootcamps and curricula that start at React and never go down the stack.
My experience was the reverse. I learned HTML and CSS first, then Rails in college to serve templated pages. I understood the client/server boundary fine as a concept, what I couldn't see was where it actually sat in a web context. I sort of knew JavaScript ran in the browser, but then I'd see ERB templates stamping values directly into script tags, so the server was writing the JavaScript that ran on the client, and my mental model fell apart. Where does my code actually execute? Why does this variable exist here but not there? Why does the page have data the network tab never fetched? Nobody ever sat me down and explained the request/response lifecycle as its own thing. I had to assemble it from fragments over years. This was around 2017 for context.
How you learn something shapes how you keep learning. If your mental model is misaligned, everything downstream is friction. The thing that finally made it click for me was reading the actual HTTP RFCs, which is apparently a weird thing to do, because HTTP itself is absent from nearly every guide and curriculum. Tutorials teach you the framework, maybe the language, and just assume the protocol underneath. These days I make newbies read the MDN docs like a book and skim the HTTP wiki page, learn the history of the protocol. It's short! It's not even a book! That gives you a firm foundation. But if your foundation starts at React, drilling down is like digging past bedrock. People don't know where to start, and Googling only shows them wrong answers because they don't yet know how to ask the question.
Are you sympathetic to a doctor who specialized in surgery and now always recommends surgery, even for a common cold? Or would you say they are in the wrong job, if they are anywhere but surgery?
Ridiculous example that does nothing to argue the original, fair point. Obviously health interventions demand more finely tuned solutions than information technology
FWIW, maintaining at least a moderate degree of empathy even in systemically frustrating situations is good for the empathizer and thus in one’s interest
Junior and midlevel devs aren't decision makers for government benefit websites. The culture of not giving a shit is real, but the responsibility goes far beyond these roles.
You'd be surprised, then. Some managers don't know squat. I rolled onto a project once and found that an entire application was being delivered as a 300MB ActiveX control, to run in a browser because that was cool and "cutting-edge" at the time.
Looking at the code, I found it was using UI elements for data storage and other such nonsense. A colleague and I had to tell the manager that the entire thing had to be rewritten. I'm not sure he actually went pale, but that's how I remember it.
The tech stack is almost always decided by someone in leadership that has no developer experience. Or by the consultant company that will chose the most complicated and difficult to maintain stack because then they can invoice more and will win all future contracts. The trick is to hire someone that is not corrupted by money, someone like the author of this post, who cares more for the users then how much he gets paid.
It is EXACTLY the type of people that are hired to make decisions, because of either nepotism or impressing with portfolio filled with overcomplicated, 3.js frontpages.
If we're talking a government site, chances are you don't have the budget to be able to hire much above junior or midlevel devs. And the project manager probably has a small budget [^1] and little experience with what the web design choices really mean (and what the trade off are).
I think you'd be surprised who ends up making those decisions.
Which goes back to the original point (that's valid for any project) - keep your user in mind. If your users will be using recent-ish iOS or Android devices, use as much flair as you'd like. If your users will be using mass-market low-end devices or used devices from 4+ years ago, then maybe dial down the interface.
Knowing your user is important, no matter what level you're at.
[1] Unless we're talking about some kind of large system that's being redesigned by a consulting company on a cost-plus contract. Who knows how those decisions are made.
Even if this were the case, and I wouldn't be surprised, it's still misplaced blame.
> Knowing your user is important, no matter what level you're at.
I agree, but it's absolutely ridiculous to expect a junior dev to make excellent decisions on this. Software development is a massive industry with no prescribed methods. It's not like these folks are going through a residency before getting the job. Even if they went to uni for CS those programs don't teach these skills.
In Canada you can't call yourself an engineer unless you have some kind of association behind it; the title holds meaning including partially accountability. Something that is lacking in the tech world. I'm not saying I want to live in that world but also I worked hard for the knowledge I have starting in the IE days of web dev; it was hard earned experience making things work across the web without loosing performance. The idea that we have developers out there now getting paid higher than me that are clueless on how auth works, how the browser works, why css and browsers maintain backwards comparability for a reason.. well it's sad; but good for them I guess?
The behaviours of developers as well being beholden to their managers rather than the craft; meaning not saying No we will not move forward without proper unit tests, or pushing back when business demands quick corner cutting solutions.
Anyway, decades of bitterness. I wish we had associations to uphold some level of accountability on developers as much as protect developers. I think things would be a lot more expensive and slow if we did that though.
Fundamentally I agree with your take, not just on dev side but just the web/dev/produce' a culture of not giving a shit.
I had a contract once to save a government website that had serious performance issues, it was so unusable that people preferred to go in-person and wait 4h in a queue rather than try to fill the forms online.
The frontend was in React because the company that got the contract initially used React for everything. The frontend was a 5MB SPA, but it could've been (mostly static) HTML files with some interactivity for forms like TFA. Everyone working on the project agreed React didn't make sense, but we couldn't do anything about it because someone from the government IT department would have to admit they made a mistake. There was no budget for rewrites in the contract. The few times a developer attempted to remove any "React monstrosity" they got in trouble.
Sometimes developers care, but the people in charge don't, and in government environments every change must go through them first.
> Sometimes developers care, but the people in charge don't, and in government environments every change must go through them first.
To be fair, the same thing happens in private companies. How many UI changes have people gone through that didn't actually make anything better and just made everybody relearn everything? We would have been better of scrapping many of those and let people continue to use what's already familiar, but that too would have to involve someone admitting failure, which is a hard thing to do for some people.
I've used many a government website in the Navy, and they were almost invariably bad, but it had nothing to do with React per se.
A very slow website I can think of had something like 200 GET requests required to load the landing page, and it used Liferay with Material Design Bootstrap. That was closer to the "style at the time". React is the style of this time, but you can write very slow websites in anything, I'm convinced.
I’m curious if - and when - LLMs change this. They’re very good at web apps. And they’re great at rewriting existing stuff. Just give them a well scoped /goal and go get coffee.
Theres lots of open questions about the future of our profession in the age of AI. But, playing with opus and fable, I think the future will be bright for our users. There is no reason any more for teams to put out junk that’s worse than what an LLM can do.
Unfortunately the LLMs are trained on what we've made, and there's going to be a ton more React garbage[1] in the training set than there are carefully-crafted websites like the article describes, so I don't expect a decrease in overengineered, bloated junk. If anything, I predict that the fact that you can shit one out in less time than before will have a different effect: A modest increase in bloat since an LLM won't mind adding a half dozen redundant and competing ways to do the same things in a large codebase, combined with a shorter mean-time-between-full-rewrites.
I think most of us have seen incredibly creaky codebases that are too buggy to be maintained any longer, where we make the hard choice to wipe the slate clean and build a new one.
We might find those rewrites happening every 12-24 months instead of after a decade.
[1] Frontend people, I mean no disrespect -- just that React & friends are (ab)used for nearly every website now, even those which map perfectly onto the "Simple document viewing with occasional submission of incredibly simple form data" model that plain HTML has always been perfect for.
It doesn't take that much effort to put guardrails around your prompt to solve problems in a certain way and with certain frameworks and excluding certain others.
Who will be doing that? Only a small minority of developers pre-ai cared to attempt using HTML, so I don’t see them urging Claude to create efficient and lean websites in the future either.
Claude is remarkably good at performance engineering and ports. It only takes one person on your team to ask claude to do a round of performance profiling and tuning. Or ask claude to take your react site and set up a server to render parts of your site as static, cache friendly HTML.
You barely need domain expertise any more. Just ask claude to make it go faster and it will.
> Unfortunately the LLMs are trained on what we've made
This.
As I’ve pointed out in other posts, I work in two languages: Swift (my main language), for native app clients, and PHP, for backend work.
I have a lot of experience, with each language (12 years for Swift, and 25, for PHP).
My experience with an LLM, is that I get very good PHP, and fairly mediocre Swift. The Swift often looks like fancy tricks, that newer enthusiasts like to demonstrate. Lots of unnecessary threading, and complex, dogmatic, overengineered approaches to simple problems.
I suspect that this has a great deal to do with the availability of high-Quality public repositories. PHP is more than twice as old as Swift, and, by nature, is a much more open language.
New cheap android phones are just as slow as old cheap android phones. The bottom of the market has been stuck in performance limbo for years, and modern web dev frameworks are ill designed to meet them where they are at.
Oh, I know it's not the point but I find it a bit disingenuous going from iPhone base model to the Pro in the last 3 years and still comparing to the base model Samsung S series. Though maybe I'm missing something non obvious.
But yeah, generally I've seen a better experience buying used phones (in good condition) instead of budget/cheap new ones.
I just had one of these people, a contractor working for a state government, argue vocally with me in a meeting stating that "500 JavaScript requests is not a problem" for a single page. Un-cached, of course, despite there being a CDN in front of the site.
You can't win against cargo-cult coders because they just assume you're from a different, competing cult.
They have no concept of engineering or science, they have never encountered it.
Heh this is one nice thing about doing engineering work in Australia. Our round-trip time to US data centers is often about 200ms. There’s no hiding from sloppy choices in the performance panel.
I had an argument a few weeks ago because our page took 4 serial requests before content appeared. I argued - with solid data - that it should be 1. If we could manage that, cold load time would ~ halve.
> argue vocally with me in a meeting stating that "500 JavaScript requests is not a problem" for a single page
Where's the benchmark or at least the numbers? If not, that's not proof of anything. Nothing to argue about. I'd just laugh.
> You can't win against cargo-cult coders
You don't need to. Unless you're not in control or don't have influence then whatever. It shouldn't be about "winning". It's either some vote (hence influence) or there's a process e.g. PoC with backed numbers.
Most companies actively punish you for giving a shit. The more shit you give, the worse things get for you. Not giving a shit is a form of self-preservation.
> These are the people writing React monstrosities for government benefit websites, and testing them on fast iPhones and fast 4G, without realizing that every page load for actual users will take 30 seconds on their old $200 Android on 3G, and users won’t complete the form.
@concinds, you yourself are being too empathetic. I am trying to view these websites on my $2,000 PC on high speed internet, and it still is maddeningly slow.
>Don't you think they have a legit skill issue here and should they be better off upskilling themselves?
Absolutely agree! Just because I understand how they got there doesn't mean I think it's a good state of affairs ;)
My post was already quite long, and I didn't want to append a treatise on what one should do when encountering those engineers. It depends on many details. Avoid hiring them, if that's a power you have. If you are stuck working with them, depending on your authority, encourage them to learn or force them to learn. If you're coming in to clean up after them... well, hopefully your comp is worth the annoyance.
We are all simultaneously in the position of encountering "the world as it is", understanding it, and doing what we can to improve it.
Why should you necessarily avoid hiring them? You yourself said that they are not stupid. Maybe some of them are very good, hardworking employees. And if all your company needs is a react app, does it matter that much that those people are unfamiliar with building websites without react? Maybe they've spent all their working hours doing work for their employer's company, leaving no time to learn other ways of building websites.
The thing is, people often assume that bootcampers/self-taught devs are only in it for the money and do not "care about the craft", or else they would have studied CS in the first place. But this is not true: There are many reasons why someone could have found their passion for software engineering only later in life. Some of the best engineers I know are self-taught or bootcampers.
Yep. It’s also an attitude problem. A lot of devs are able to up-skill just fine, but some are downright demeaning towards anything they don’t understand, or towards anything that doesn’t come from a FAANG.
In the olden days, people wouldn't take office jobs or factory job necessarily because they thought: "Yes! That's my passion! That's exactly what I've always wanted to do." Passion isn't your first and foremost thought when you have a family to feed.
A few decades ago, IT jobs were for the most part done only by people who were in it for the kick they got out of working with computers. They already hacked at their dad's computer in their early teens (or sometimes even younger), and just could just never let go. It was for people who loved it because it was a niche.
But today, IT is no longer that. It's the backbone of much of our society. And so the field no longer attracts just the die hard fans, the nerds. It attracts ordinary "career people", who just need to have a job to feed the family. Who turn the machine off after 8 hours. Who don't go on coding all through the evening on their hobby project. Who don't try out new tech just for the heck of it.
I think it's hard to understand if you belong to the first group, the nerds, that anyone working in the field isn't like you. Because they all used to be! But those days are gone. We live in the times of enshitification for a reason. If you have the hacker spirit, you don't enshitify because you simply can't. You know what is the right way to do it. Sometimes that's a React app but sometimes it's just an HTML page.
You're not just in it for the money. You care. Not necessarily for the end user, although that would be nice. You care for the tech. And when - like in this article - both come together, sweet things can happen.
A few of them would outright not know how to do anything else.
It's like how a lot of people these days reach for an electric drill/driver for even the most simple projects like tightening a screw. It never occurs to them to use a screwdriver, or even a butter knife.
Kinda sorta analogous to the cloud engineers who can standup complex monstrosities in AWS-land, but don’t know the first thing about how to troubleshoot say a connectivity or simple problem where they have to ssh to an ec2 box and do the needful
well... just because you know how to ssh into the prod DNS host and manually update the prod zone files in vim to remove orphan A records + duplicate CNAME records, in order to fix an ip address exhaustion issue that is blocking new VM's from spinning up for your customers... it doesnt mean that you should, lol.
that was 8 years ago in my first gig. now i kinda wonder... having those skills made it easier to put off implementing a robust long term solution. it was playing with fire, sure, but i was a rookie
There is a reason we use React today - if you want dynamic and complex site, HTML is PITA to work with. Either you reload everything on any change (not good), or end up with a maze of partial reloads in event handlers (not good either). It was done, it was bad, React (and similar frameworks) was the solution. If you don't need complexity of React, fine, use HTML. But if you do, who can guarantee that 5 min later someone will not start requesting site not to reload here and there, but update this bit here. So I don't blame people for just using React. And in this case the issue wasn't that react was used, but that it was used poorly.
I'm not a web developer. I built a few websites in high school, but these days I write safety-critical real-time code for robots.
A few years ago I was back in grad school and I took a class with undergrad senior CS students. We had to write a fairly simple web service, and I was blown away by how complicated they were making it. Based on the requirements we easily could have written 90% of it in plain HTML, but everyone else insisted it should be 100% react. Part of that is honors students wanting to do everything the most complex way possible to impress teacher, and part of it is them simply not knowing that other options exist.
I’ve long thought frontend web developers are the ones most threatened by LLM-assisted programming for a bunch of reasons and now I can add “many don’t understand web fundamentals” to the list.
Yup. It’s exactly like the dismal state of CSS frameworks we're mired in.
All these new kids walk in and learn the CSS framework du jour first, then find themselves stranded when things move on. If they had just learned CSS the first time, they'd be set for life.
Nobody should learn React before learning HTML and vanilla javascript.
Yeah but at least now we don't argue about Bootstrap or Foundation, it's just go with Tailwind.
I still remember when a good chunk of the web took Bootstrap's defaults and ran with it.
That said I've still got a bone to pick with Tailwind but I understand it's a good compromise in a world where BEM and CUBE and other methodologies require more effort up front and if done incorrectly impose a bigger burden.
My wife used to maintain a website for a non profit organization that was just HTML/CSS. After that she started building a lot of stuff in HTML without javascript.
And (now that I'm in management I understand this better than I used to) this problem becomes self-reinforcing. If every candidate out there only knows react and doesn't actually know how to do a simple front-end without it, you need to use React because at some point you'll need to hire someone to replace the person doing it. Even when management understands why the design is bad, if that's what the labor market supports it exerts a definite pressure.
They may not be stupid people, but they are bad at their jobs. One needs to be able to at least try other approaches to a problem, and not have a one size fits all approach. The latter isn't engineering, it's cargo culting.
As a web dev a lot of this is simply ongoing maintenance of a largely unknown quantity. Most web devs know React and use it extensively; Astro is something they'll have to learn on the job or hire for specifically.
It's akin to writing a backend in Haskell. Chances are you could write something performant that leverages FP in a way that serves as a magic bullet for your domain. But now everyone after you needs to learn Haskell and how to model all future problems in a way that conforms with it - or rewrite things again.
Before LLMs, learning on the job looked like reading documentation. Now it’s a guided tour with verification. When I produce things in this way, I’m not just blindly accepting it. The goal is that by the end of it I have learned more about the codebase and architecture, not less. I feel that’s important.
Many people don't understand this, even big tech engineers. They see LLMs as a bottleneck. It's more that they don't understand how to use it to multiply their skills, just basics and code gen.
I use multiple Claudes at a time, daily. It's precisely because of that experience that I wrote:
LLM + framework you don't understand goes in ... unmaintainable garbage comes out.
Claude follows code patterns and structure. If you setup that structure and those patterns properly, it will produce great code. If not, it will follow ... whatever it feels like, with each commit.
If you just have it built something with a framework you don't understand, it will do so just fine! But over time every "vibe coded" change you make will drift it further and further, until you are left with a mess of vibe-coded spaghetti.
I agree that's fine in that at least it's doesn't cause unmaintainable garbage. And might even get you up to speed quicker that reading the docs old school.
But the GP point, that you're better off finding people that already, truly understand and are familiar with the tech (ie. Astro), imo still stands.
I read a fun comment the other day from a frustrated windows user who failed to configure linux in previous attempts but now with LLMs it was very easy for him.
Not a web-dev myself and I was wondering if, apart from unfamiliarity with astro or HTML being treated as unknown technology, it also has to do with having to handle fallback cases, eg the 3 point validation (web component, browser default, server), esp when one is used to have react (libraries) just handling it all without any more considerations.
Someone is saying that they delivered a very reasonable solution that's simpler than most would come up. Person taking over was not happy.
Do we know if the code being handed over was high quality? Were they reacting to the fact that it was "not React"? Maybe they have a template they enforce in the company about how apps are built?
As an application becomes more stateful it gets harder to keep that state aligned across the frontend and backend, especially if they're in different languages.
A lot of developers have made or just perceive very strong silos between frontend and backend today. Any coordination that needs to happen between frontend and backend is potentially a communication challenge.
It seems like a lot more work because you have to keep the backend and frontend in closer sync. The backend has to be aware of and able to store every sub-form in the full process (which sounds like a "wizard form" with a multiple sub-forms to get through the full "form" process), not just accept a "finished" or "complete" submission. If a sub-form needs a change the backend, the backend's storage, and the frontend all need to change. The backend and frontend have to agree on validation logic for each small piece of the form. The backend and the frontend need to both validate every small piece of the form, and maybe can't share that validation logic (depending on what language the backend is written in), especially if one of the goals is to do as much of the frontend validation as possible with Browser native validation tools (`<input required` and `<input type="email"` and so forth) so that you get the most benefits of progressive enhancement.
The original ways of making websites were "full stack" and from a full stack perspective it shouldn't seem that hard to have a coordinated frontend and backend, especially when a progressive enhancement approach likely means a smaller more agile frontend, but current siloed world where frontend and backend are different teams with different goals and alignment makes that seem like way too much work.
I have had issues where the Frontend team is unable to explain how to communicate with their SPA, they say "just use this package/just run node" and are unable to explain the workflow in primitives.
Then they just validate on the front end, and we validate on the backend.
That's generous. I always heard people espouse that ideal, but I rarely saw them actually do it. And I never saw it at work.
There were always certain UX requirements that required JS, and that meant the company wasn't interested in testing to make sure it worked without JS. None of their customers were going to use it that way.
Angular, React, etc helped force it further, but they didn't cause it.
I know I always did. CakePHP and Rails made it really easy to determine if a request came from AJAX or direct and you could slightly tweak the response to match the medium.
Agree that most people didn't, but I was always an advocate.
As someone that reads a lot of code written by others, I'm confident that "learning a new way to do something" is perceived by many as the hardest thing in the world.
I was confused by that too, but then I thought maybe the new replacement was commenting that using javascript in the app would provide more work for contractors, which he perceives as a good thing. So not using javascript provides less work. I could be wrong though.
Two years ago, I started a new company, and decided at the outset to avoid using any heavy JavaScript SPA framework. We stuck to simple server-rendered html and only use progressive-enhancement style JavaScript.
Our app was fast, and simple, but it also came at a cost: we were limited in our ability to take rich UI elements off the shelf with an npm package. We had to do a lot more work to provide a rich user experience. Everything took longer, and the user experience was worse as a result. We cared, but sometimes you don't have time to carry through.
The company failed, and I don't think react would have saved it. But I can tell you first hand that righteous adherence to "simplicity" didn't help either. It's always a trade-off.
I feel like there is some context missing in your story here. There is a lot of middleground between heavy SPA frameworks and creating everything from scratch. More importantly, I am left wondering what sort of functionality was your team trying to build that requires that much interactivity? At least that is what I assume with "rich user experience"?
If I had to guess, they were probably wanting to implement something like animations into the UI. Animating a list of items onload in a staggered format is still basically impossible unless 100% of your users are using Chrome. With a JS animation+component library, this type of animation is pretty much plug-n-play.
When the startup is trying to attract customers and also impress investors, sometimes there is a lot of effort spent on the investors just so they keep putting money into the machine. "See! We have an ultra modern/sleek site so it must be some other variable that is causing customers to churn..."
Computers are very good at repeating a known "recipe". They can add numbers billions of time per second. Yes, billions with a bee.
The hard part is coming up with a recipe that solves your problem and that the machine can run without breaking things when it runs around with a few billion steps per second. You have to think ahead for it and handle edge cases in the recipe.
It is harder to do more with less. There is a reason React and other is used so much. Makes it easier to make interactive websites. It’s like asking why backend engineers think it’s harder to code an api using C instead of using Django.
I used to think that was true but I now think it’s only true for very interaction-heavy apps: if you have hundreds of interactions on a page over many minutes, using an SPA is amortized across a lot of time, but if it’s something you could do with e.g. a simple Django app you’ll not only be done faster but will spend an order of magnitude less time on maintenance and accessibility work.
That's usually not even in the books of a typical SPA: It doesn't have fallbacks at all, and just shows a blank white page. Accessibility is always taking a rear seat with such SPAs.
It can be really difficult for people with screen readers: focus jumps, inconsistent update flow, too many or not enough announcements, etc. People just want to live their lives, not have to threaten 508 to be able to pay their cable bill as easily as it was 20 years ago.
Alright but Django isn’t a pure HTML file only solution. If you have a site with no interactivity it seems like Django is the wrong choice if everything is static.
Who said it was? My point was simply that if you’re doing something like getting data in and out of a SQL database using web forms, you can avoid a ton of overhead and deliver a better user experience without using an SPA, and of course there’s a lot to be said for not needing to install security patches weekly due to having fewer, simpler moving parts.
> There is a reason React and other is used so much.
Yes, it's because many people are quite bad at their jobs and reach for the same tool regardless of whether it's the right one. Let's not make excuses for incompetence.
As someone who has built both react based frontends and html based ones (with htmx), there is a law of diminishing returns at play.
To start off, writing a basic crud website with forms is much easier with htmx.
But when you start building more complex components, and integrate with other systems (OAuth for e.g.) there are tons of libraries and SDKs for the react ecosystem, but not many for pure html components.
At this point, it's much easier to use off the shelf components than it is to manually write html to handle all the bizarre UI edge cases.
I think a lot of people here don't seem to understand or appreciate the diversity of systems that "web developers" have to work in.
Some people might say, "Why do you need all that oAuth complexity? Rip it out and use a cookie like God intended."
We, the devs/ICs, don't often get to make those decisions. We're placed into teams working on specific features/apps/tools and we often have to integrate with a myriad of business systems by default.
Yea, I would love to work on a simpler system, but I don't get to make that decision. Especially not when my company has been acquired by unbounded VC cash three times in the past 5 years and now I'm forced to fold in my lovingly crafted baby into the behemoth.
my most recent website is fully static html and css. it contains several pages and a menu that is duplicated in all pages.
that menu is maintained manually, and every time a page is added, all copies of the menu have to be updated. at some point that will get tedious. then i have a few options:
i generate the menu using a backend framework. the downside: the website is no longer fully static. i now depend on a backend framework for hosting. static hosting is out. i also have to edit the content through the backend, and i have to continuously maintain the backend for the lifetime of the site.
i generate the menu using a static site builder. the downside: i can no longer edit the content directly in html. i have to keep a source version for the static site generator, and more critically, i have to keep a copy of the site generator in my repo because i want to be able to make changes to this site 10 years from now and not find that the version of the site generator i was using is no longer available for download and my source is not compatible with the new version of the site generator.
i generate the menu using xslt. works, but xslt is no better than javascript security wise. it's possibly even worse. and xslt support may be removed from browsers in the future.
the final option is javascript. using some framework that doesn't need build tools, or something homegrown. i am afraid javascript is the only option that is futureproof while letting me avoid manual work to maintain the menu.
While purists will disagree, a little bit of javascript is fine. Having said that, you are talking about a personal website. Most companies will have a backend of some sort anyway.
Also, here is a little secret. If you want something that is future proof, try something that has been around for decades and still runs large parts of the internet. People will scoff at this, but PHP is actually really neat for personal websites and has been for decades.
A while ago I also found myself looking at static site generators, workflows from github to my host, etc. Eventually I realized I don't update things nearly enough, don't blog, etc.
For similar reasons as you I didn't want to go completely static as that is just too much hassle when doing multiple pages. So I decided to utilize that good old lamp stack to basically do something like this.
Slightly more, but the base principle is the same. Just 10 lines of php code, and now I can just add pages by uploading their contents and adding them to the json file for whitelisting. For your use case it would be trivial to add a menu based on the json file and I'd be confident that it will still work in 10 years with minimal adjustments.
As a bonus I also rediscovered PHP in itself works really well as a templating language (as you can see) so no need for extra stuff like handlebars. As an extra extra bonus, I can just go to any shared webhosting party and get it running with no issue at all.
I am not saying you'd need to go down this road. But I just want to illustrate how stupidly simple a website can be with "old" basic technologies even if you want some form of backend.
This seems like a very complicated way to maintain a menu on a static website. Have you considered using old school server side includes? It’s what they were designed for.
server side includes are just a variant of the backend framework. they have the same problem. i'd still be locked in. and i'd depend on and have to maintain a backend for the lifetime of the site.
Most of my apps are now simply HTMX + Go + SQLite.
I've found it's enough for most projects.
One of my sites is image heavy and serves 10 TB of traffic per month. For this, I use the following setup:
1. S3 (I wanted reliable data storage)
2. In front of it, I have Cloudflare (with Tiered Cache enabled, which makes POPs prefer pulling from Cloudflare rather than the origin). I've set rules to cache everything on both the browser and Cloudflare for 1 year, ignore origin cache policies, ignore query strings, etc., and I simply use immutable objects that require revisioning.
3. BunnyCDN in front
Cloudflare will not let you run an image heavy site on its own, so I use this approach to massively cut the bills. Their policy says you cannot use it primarily for images; it must be used for HTML, CSS, JavaScript, and other site content.
And if you run only S3, the bills will be huge.
But yes, lately I’ve been building mobile apps. PWAs are limited; the OS can evict IndexedDB storage, so I cannot offer people reliable data storage in the app without sign up or involving a backend.
What can I do? So I was forced to switch to Flutter on Android, but I ran into another pain point: app updates sometimes spend a lot of time "under review," which is frustrating. For the same app, I maintain a web app that is very quick to update by comparison.
I wonder why there isn't a mobile OS that simply lets you build apps with JavaScript, HTML, and CSS and gives you reliable storage without all this effort.
> I wonder why there isn't a mobile OS that simply lets you build apps with JavaScript, HTML, and CSS and gives you reliable storage without all this effort.
There is! You just have to time travel all the way back to 2009 when webOS was launched by Palm. Time travel is the easy part, you then also need to somehow prevent Palms demise and webOS fading into obscurity as a smartphone OS.
If 2009 is too far back you can try your luck in 2012 with Firefox OS.
Joking aside, people and companies have given it a go. But a combination of bad timing and various other events never made that reality happen in our timeline.
The amount of effort that goes into keeping Termux barely functional, has a lot to do with Android and the platform making it harder and harder, to access a dev environment on a phone.
Running `npm install` on Android isn't so easy.
(Caveat: The new Android Terminal that only works on a handful of models.)
No that's not correct, they both support PWAs with a large feature set. I built and have been maintaining a client's PWA (an internal tool for their employees) for over 10 years now.
Not my site, but someone on HN (can't remember who) built it: https://pwascore.com
Go is so awesome for server apps. I should have discovered it much sooner. It somehow sits in the exact optimal point having no bullshit overhead like C, yet also getting out of your way so you can focus on the business logic like Java (not Rust).
It's not great for every task - in particular the lack of abstraction-building capabilities - but it's great for business-logic-heavy server apps. It feels like it's specialized for that and not trying to be a jack of all trades.
>One of my sites is image heavy and serves 10 TB of traffic per month
I can't imagine this kind of traffic without acting as a CDN, advertising broker, pornographer, or part of a massive ecommerce site. I have to wonder, what are you doing that generates 10TB of traffic per month?
Lots of legitimate businesses that deal in maintenance have ridiculous amounts of image data.
I have a civil engineering firm as a client, they take video & photo’s of roads they help project manage the maintenance on.
Small towns of 10000 can have ridiculously big road networks in Australia. And you take a photo every 10m, likely more but you only care about every 10m. It adds up, quick.
I’m only now investigating a web version of the app I wrote them because I think origin file system will work for them but I would never consider serving their 200TB+ of their imagery as a website.
Since you're using HTMX, I have to ask: do you have any tips or idioms for composing complex forms and UI without things getting out of hand? I love the approach, but I'm having a bad time figuring out where the ideal balance is between too few or too many HTMX-replaced areas in a page. Thanks.
My #1 advice is not creating separate server endpoints for every HTMX fragment, unless you are 1000% sure that endpoint will be used in multiple different pages.
Working on a "simple html page" that is actually 5 different independent "subpages" (routes, views, templates) in the backend is awful. The UX was improved, but the DX was sacrificed.
I recommend having a single view function for each page/SPA and do sub-routing within that function to handle page fragments. In other words, use a GET/path/Header parameter that indicates which fragment is currently needed, defaulting to the full document as normal. Just make sure you are considering request logging and client-side caching in your solution.
This makes it very easy to add/remove async content from the page, since you are just editing the one view function/template and you can easily reason about the entire page as one logical unit.
It also means you don't need to duplicate security logic or other middlewares for the page, since it can be implemented once at the start of your multi-faceted view function.
Generally you don't even need to do the sub-routing in the handler. You can just render the entire page and have `hx-select` attributes pluck out the part that you want.
That is a good solution for reusing content across pages, but most of my HTMX usage is for fetching data that would otherwise delay first page load significantly, or for seamless interactivity. Very different use cases.
> Cloudflare will not let you run an image heavy site on its own, so I use this approach to massively cut the bills. Their policy says you cannot use it primarily for images; it must be used for HTML, CSS, JavaScript, and other site content.
Pages has a 20k-100k limit on static files, but if they just guide you to R2 to offload it, which is still Cloudflare.
Did you mean the CDN? In which case, I'm not seeing that in the terms. [0] Though, I would have expected they'd have a similar thing. R2 resources don't generally count towards your cache limits.
10TB is nothing these days. All Hetzner virtual servers in Europe have 20TB/month traffic included (excess less than $2/TB) and all their dedicated servers have unlimited fair use (which is probably about 200TB/month averaged over many months).
> I wonder why there isn't a mobile OS that simply lets you build apps with JavaScript, HTML, and CSS and gives you reliable storage without all this effort.
Because there isn't a 30% walled garden you can create with that.
Then that approach will work. If you need to scale beyond that, you need some way to route the request to the server with the right data. And what if a request needs data that was stored on two different servers?
Your Go server can have endpoints that render XML instead of HTML and basically get the same server-driven experience of your HTMX site. Fully skips the need for the app review process since you're not updating the actual client app code to make UI changes.
Are you me? I've been on a tear building stuff with HTMX + Go + SQLite. It's like the trifecta of boring technology that jives with me. Stuff gets deployed to a colo server using a generic bash script.
I created a couple libraries to abstract the SQL and HTMX/web/OAuth bits; my apps are now very similar and easy to copy features between.
Can't vouch for it's effectiveness, but Hotwire Native might meet the needs for mobile paired with plain HTML. Despite the name, it doesn't seem that using Hotwire for the web UI is necessary to use Hotwire Native. I could be wrong about that though.
That's pretty much true of HTMX too (which is what GP mentions using). I mention Hotwire Native (different from plain Hotwire) because it makes it easy to wrap a web app as a mobile app. Then you can replace performance critical parts with native views, but keep everything else working through the web app portion. This is easier to maintain, albeit with the downside that everything requires network round trips. Depending on you use case, that may be an acceptable tradeoff.
I've learned about several frameworks that are system language + web frontend. The general approach is, ship a small binary compiled for the specific platform, and use the platform's native browser (and whatever html frontend tech you like) for frontend. The whole binary can be 1mb or less.
There's a couple of Rust libraries like this; right now I'm building an app in Tauri+Svelte.
It looks like Wails might be a similar framework in Golang.
> Cloudflare will not let you run an image heavy site on its own
Cloudflare R2 object storage is S3-compatible, offers free egress, and does not share their CDN product's fair use policy against image-heavy use. Storage is 65% the per-GB cost of S3.
> I wonder why there isn't a mobile OS that simply lets you build apps with JavaScript, HTML, and CSS and gives you reliable storage without all this effort.
There WAS. Firefox OS phone! HTML+CS+JS apps! But Mozilla kicked it to the graveyard even though it was very popular in third world nations. I guess it was not $$$$$ enough for the Mozilla CEO of that era.
I haven't heard much about in a while, but the HTML Triptych proposal [0] is still something I hope to eventually land in browsers. HTML forms speaking to REST endpoints are a good pattern. (meaning user-aiding validation is handled via the input attributes, real validation is handled on the far side of the request, and the flow is GET /form => POST /thing => GET /thing/1) It would be a great pattern with the triptych features implemented!
Excellent article but I am always torn when I read inspirational articles like this - it makes perfect sense to me and I love the idea of simple, non-nonsense sites that work well, load quickly and don't rely on the latest browsers to function.
Then I start to wonder if that's just because I'm not smart enough to understand React or whatever the fancy technology of the day is.
Feels like I have a hard understanding threshold that cannot be breached - give me a simple editor like Sublime and ask me to make a web page - even with JavaScript - and it's my happy place. Give me VSCode or Zed, Claude/Copilot/ChatGPT plugins everywhere, React tutorials and my brain goes to mush.
I love the web. I hate what the React cretins have done to it.
Embrace Extend Extinguish is real, and the people going along with it deserve to be replaced by a LLM that lies and spits out garbage code just like they do but faster.
React has helped folks like vercel/convex/cloudflare to build fantastic dashboards. There's just as many examples of well done React as there are the opposite.
I generally prefer solidJS nowadays, but the react ecosystem has enabled lots of amazing user experiences (and developer experiences too if you don't fall into the trap of overcomplexity).
Funny enough. I’m opening this on mobile internet connection and it stuck at loading spinner. I don’t know if the problem is with my internet (probably not) or support for mobile so I can’t even read the content.
Ages ago when writing.com was first modernizing its site, they started by hiding story content to display a spinner, waiting a second or two, then re-displaying the content. It was on the page the whole time, they just made it look like it was loading in the background.
I built apps like these on GOV.UK over 10 years ago for the Ministry of Justice. We built our own form wizard library that let us validate long forms in steps and break them out into multiple pages because Ruby on Rails didn't support doing that out of the box. It was a very important principle back then that everyone should be able to make use of these digital services regardless of whatever users were using to access them.
I've always liked basic HTML pages where one can upload a document without having to restart the entire application. That's a great practice you have there with general forms. With each session ID, it can cross reference a page in a multi page application with that session ID, so that the user can maybe type it in if necessary, but it should be able to determine that with enough information, like IP address, upload date, browser, OS and so on. But the most accurate session would be within the browser so that the cookies for a single application aren't mixed up with another applicant, like a relative, who might be using the Playstation Portable.
This isn't "We replaced a React app with an HTML form and performance improved." It's "We replaced a bad web page with a good web page and performance improved."
Attributing this to the technology driving the browser experience is silly. You can make a brilliant user experience with React. You can make a terrible website with plain HTML.
The improvement comes from the change design, not tech.
The standard answer to that is that some technologies make one harder than the other. That's kind of true from first principles, but it requires making the case that e.g. React is actually harder to make good than a plain HTML page.
Fun thing, TFA describes a kind of multi-page wizard style form that I haven't seen a lot anymore in the last decade or so. But when I did see it, it's always some dogshit enterprise system. Some Oracle product for expensing expenses last time.
The problem with those things always seems to be that they are slow in the middle of doing your task. Every button is seconds of waiting. Doubly annoying if you have to go back a step or two. The badly coded SPAs seem to be slow at the start. It takes a while to load, but once it's loaded its performance is usually okay.
Is it slow though? Like in practice? This demo [1] using Datastar (a streaming HTML framework) every action including scrolling roundtrips to the server. Even the checkboxes changing colour is a roundtrip.
The advantage of SPAs, like the checkboxes page, is that they can do the round-trip less visibly. The user can still continue the next thing. So even if it is slow, it's less of a deal than loading and rendering a page anew.
> Is it slow though? Like in practice?
The multi-page wizards? The ones I've seen were. Enterprise crap systems.
every action including scrolling roundtrips to the server
As soon as you include a network roundtrip in anything you're opening up a Pandora's box of slow connections, slow DNS queries, network outages, what-if-the-user-is-on-a-train problems, what-if-their-IP-changes-mid-flow problems, etc.
Reducing the network calls in any app has upsides and downsides. It isn't really true that SPAs are faster to render (as your example proves) but rendering speed isn't the only thing that matters.
It baffles me people can write software like this.... Surely it's the most basic tenet of webpages is that it's all sent over the network and the network lags and drops packets.
I don’t like multi-page forms when I’m not able to see at a glance all the info needed to fill out the form. Though I guess if my progress is durably saved that makes it not so bad. The worst is when I fill out a bunch of stuff and then realize it’s asking for info I don’t have, and after I get the info I have to fill everything out again from scratch!
> The improvement comes from the change design, not tech.
You could argue that the constraints of using HTML-first (as they call it) helped them stay away from the bad patterns they were using before.
But you’re right: The user change came from fixing the design, not the technology used.
This is a lot like those bad resume bullet points where someone tries to claim an increase in business was due to their code change. “Increased visitor count 100% by rewriting website to be HTML-first”. Then when you ask them about that point they concede that the entire site was redesigned to fix some design problems or add a feature and that’s what drove the visitor increase.
Plain old HTML with vanilla JS is not exactly a pit of success but React is much closer to a pit of despair. The former tends to be clunky but effective, while the latter requires a PhD in complexity avoidance to stand a chance.
JavaScript: The Good Parts by Douglas Crockford is a comically short book. React: The Good Parts would be shorter still.
Totally wrong, re-read the article. React requires JavaScript, which the new page doesn’t. That’s a strict accessibility improvement. (And I’m not a React hater!)
This post is good, and it's a great example of taking a problem and solving it with the appropriate tech with the right amount of depth. It really helps to have full domain knowledge of your customers as well.
However, I do not like how it is framed as "simple html is better than react" - because you could just as well have told the same story as a react developer.
(Nb. I could go on forever about the complexities and intricacies of storing things session based on a server vs browser based and etc - and lots of other things that were skimmed over in this article, but that would be too long)
All of those things that are simple in html are also simple in react.
It's literally the same code - there's nothing preventing you from using browser based html validation in react - all the same code that gets complicated in react (overly complicated validation logic) also ends up being complicated in astro - they have their own thing around schema validation etc and integrating it within an astro site means you have to integrate their client router etc etc.. so it's very easy to go overly-complicated there as well.
The comparison is also with an off-shore team doing development for you with probably incomplete knowledge and the way projects are structured they have an incentive to create the solution as fast as possible, in as little time as possible, with the biggest amount of complexity as possible.
The last point is devious - it's not necessarily that the contractor does this by design, but the incentive structure makes it so something that's overly complicated actually benefits them, so they don't have a direct incentive to go with something simple.
Anyways, a simple solution, directly addressing the problem at hand is always better - no matter what stack you pick.
(I'd like to say that I don't have anything against Astro's form validation, I was just trying to highlight how there's more to it than "native html browser validation")
There is one hard wall that stops very old clients from connecting: Not supporting a new enough version of TLS. TLS 1.2 is from 2008, and TLS 1.3 is from 2018. Web browsers older than 2008 can't connect to modern websites since TLS 1.0 and 1.1 were deprecated from web servers in 2021.
I still think it's worth it to provide connections over plain HTTP for this reason. It probably doesn't apply to many people, and you shouldn't allow anything really important to happen over plain HTTP (logins, payment), but normal viewing should still be possible.
Sadly, the internet as a whole seems to disagree. Even the most useful resource on the web one could use over plain HTTP, Wikipedia, only allows connections over HTTPS. I guess it kind of made sense as part of the campaign to push the internet as a whole over to HTTPS, but anyone who's connecting to any website over normal HTTP these days is doing so because they literally can't use HTTPS.
I agree; you should allow non-TLS connections as well as TLS. (At least, access that does not require authentication should not require TLS, but should still allow it if that is what the client wants.)
If you are concerned about accidental login or API keys without TLS, then you can consider supporting mutual TLS, which improves security (and flexibility) in other ways as well. (You do not necessarily, have to require mutual TLS, in case someone prefers to use a username/password login, or 2FA or something else like that instead.) (In the case of login forms, you can have the links to the login forms to always use HTTPS, in order to avoid the problem.)
The push to have everything be served over HTTPS is absolutely insane. Very few things actually need to be served securely. But sadly, browser makers don't give a damn about actual benefits for the users, but rather shove their out of touch ideas about what the Web should be down everyone's throats.
Imagine if you found someone making full fledged applications from word documents. Like, they'd managed to create a "framework" in VBA so they can do all the things word docs can't do out the box. The word documents were running servers, production code etc
You'd think the person was creative but maybe insane.
This is the exact same feeling I get when I see web "apps".
Sadly, this is the story of nearly every React project I've reluctantly inherited. In my experience, it's because React is not opinionated like its peers Vue and Svelte. So, a bunch of devs will use something for state management and and another team will use something else completely. Eventually both teams leave after making a mess. But, if you look at the graphs and numbers that MBAs chase, they will all look like everyone was productive until the very last minute. The ultimate casualty is unfortunately the user. Even Facebook hasn't figured out React across their properties. Just use Instagram / Facebook on the web. Bunch of spinners to load a static list of items in a drop down menu. Not even joking, click on the bhamburger menu on Instagram web. It makes a dozen requests, shows you a loading skeleton and takes 5 seconds before you can see a finite list of menu items. Ironically Facebook was super popular in the 2014s because they didnt have much React based BS going on. Everything was just good old hyperlinks.
If the creators of React haven't figured it out, what makes you think you can?
> Ironically Facebook was super popular in the 2014s because they didnt have much React based BS going on.
facebook was super popular in 2014s because they were just starting the transition from mostly being about people to mostly being algorithmic rage bait, and they tapped a new market of fox news/conservative talk radio listeners
If there is one thing developers hate its admitting that something is too complex. They feel it makes them look dumb, and for some it is perhaps some form of job security.
You don't have to have a technical discussion whether or not React is too complex, you just have to look at the average website created with it.
I'm curious how many web issues can be solved by having the people responsible for the relevant sites only be allowed to use them on a Windows 11 machine with only 4 GB of RAM using Firefox with the network throttled to 3G speeds.
Assuming the processor isn't horrible, I can still browse plenty of sites with those specs without much issue, and on the sites that do require more, it's very rarely because the sites actually needs it (i.e. I'm not running Windows XP in a VM in the browser or something). It could just be normal HTML and CSS and normal forms, sprinkled with some light JS to help out a bit. But the amount of sites made with that level of care and attention are sadly rare, since the people responsible rarely feel the pain or have the empathy to fix the problem.
> Windows 11 machine with only 4 GB of RAM using Firefox with the network throttled to 3G speeds
And their mobile device should be the cheapest Android phone from a monthly cell provider you've never heard of. This is what the real world is for a lot of people, and a huge number of developers simply don't know or care.
The number of websites that are almost useless on the iPhone SE is getting pretty insane. Many site have a massive header, maybe a footer and a sticky ad. That frequently leaves less than half (~4.5cm) the screen usable.
I don't even think Apple cares about smaller screens anymore, because iOS UI elements also overlaps in some places.
Don't tell me were going to rediscover progressive enhancement all over again after more than a decade. Back when we used to actually care about the end user whether you were programming frontend or backend.
Too much VC money and big tech influence in the JS ecosystem made the web worse in some ways.
I keep hearing the term "dead internet theory" getting thrown around, and at first thought it was referring to web pages that don't work, not high rates of bot-generated content.
I've had far more trouble with web pages that only work on a computer that's at least 80% similar to the developers computer, and the RAM sacrifice has been accepted, than from bots diluting real user-generated content, assuming I can even get to the page, if the CDN doesn't think I'm a bot myself, because I'm not logged into a Google or Apple account and their captcha is so bad only a bot could get through it.
I'm not convinced from the article that HTML-first was the thing that fixed the problem. What fixed the problem was 1) the person building it knew what they were doing and 2) it had design constraints from the get-go to be user-friendly. You can do that with React. It's arguable whether it's easier or better, but you can get there regardless of the approach you use.
1. Presumably the team that made the previous app also thought they knew what they were doing. Presumably they were not hired on the assumption that they couldn't make a good app.
2. The design constraints had always existed, the previous app just failed to meet them.
1a. They may have thought they knew what they were doing, but their work product shows otherwise.
1b. They may have thought they knew what they were doing and spoke confidently enough to convince whoever was doing the acquisition, likely non-technical, of the same, but the bad hire and the bad hire’s work product shows that neither was the case.
2. Ideas merely exist. To be constraints, they must be enforced.
I was going to comment on the Terence Eden excerpt quoted by the author about the woman researching housing benefits on an old PSP browser, when I noticed that you (the OP) are Terence himself. It's strikingly powerful, and a reminder of the duty we have in building our infrastructure.
> Of course, your javascript-based analytics package doesn’t see the users you are bouncing because of javascript failures.
It is frightening to think of how many people are alienated from critical systems every day because of this bias reinforcing the idea that they do not exist.
just use firefox with an adblocker like adnauseam and a fairly decent chunk of the internet stops working, including chase.com and several other massive corp sites.
I can't imagine trying to use links/lynx or a browser with less market share than FF that isn't based on chromium.
It doesn't work if you disable JavaScript...but it wasn't always this way!
They had a mobile version of their online banking service at https://m.chase.com that was EXTREMELY FAST and did 85% of what you need to do in an online banking portal (check balances, transfer funds). They scrapped it when they moved to their current bloated monstrosity of the portal that they have today.
It was a big reason why I moved to a credit union (who outsources their online banking services to Alkami, which maintains a very tight portal and supports 2FA AND passkeys!).
i am unclear on if it's because of the adblocker (specifically i use ad nauseam which does block some JS. some.) or because of firefox. I can load it on edge every time it fails on firefox. last week, chase.com worked fine on firefox. the previous 15 months where i needed to log in, it did not.
Someone at chase isn't checking their work on firefox.
FWIW I use Firefox with uBlock Origin and Enhanced Tracking Protection, and use Chase's website almost weekly. No issues that I've noticed on MacOS or Windows
CDNs like Cloudflare will often block traffic if you don't leak enough data to differentiate yourself from a bot. It's usually not very transparent either, with vague error messages. They've given up on just throwing up a captcha then letting you proceed, because bots are much better than real people, at solving them.
The PSP has 32MB of RAM plus 4MB of embedded RAM, upgraded to 64MB of RAM in later models, the browser also is limited to only a subset of that. I wonder how old the anecdote is? It's hard to imagine any websites now working on that. It does have javascript, but a version shipped with Netfront browser from 2011 or so. https://en.wikipedia.org/wiki/PlayStation_Portable#Web_brows...
Nice to see that Astro supports non-js browsers. Perhaps website developers, especially ones needing to develop for government services, should use 1GB Raspberry Pis for testing, but that would still have modern javascript. I got a 1GB RPi 4 in about mid-2019 and was rudely reminded of how much memory Chrome used even back then. More than 1 tab open and it would be killed.
I used PSP browser a lot in the mate 2000's, and don't remember having much trouble. It could even display pages that, at the time, ware pretty bloated, like the Flash-based Homestar Runner cartoons.
This takes me back close to 15 years ago: using backend session management in Grails and the html forms that were enhanced with “some” JS, using responsive CSS. The difference at that time was browser tech not being as advanced as now, we had to care for different browsers and deal with IE7 and even IE6, it was difficult and we needed extensive QA (Browserstack would appear later). There is a reason why we had JS library evolution. Dude there was no npm, not even bower. Then we had Backbone.js - loved it, then AngularJS - amazing, then Angular version which had huge breaking changes then React, Polymer etc. Native browsers can do a lot these days, it is easy to enhance the functionality as well. But it was not always the same, the decisions to use React made sense for a variety of reasons at the time, maybe it was the case here as well.
Not really, no. Astro requires you to opt a component in to client-side rendering, React (with its server components etc) require you to opt out. Defaults matter in scenarios like this and I'd bet the average developer of crappy websites would have a much faster site with Astro than React for that reason alone.
Small correction: it's other frameworks that require you to opt-out, most notably Next.js. Although I've been seeing so many people confusing Next.js with React lately...
Astro itself works just fine with React, and it can still be HTML-only.
But you can also render React on the server yourself using renderToString, if you don't want a framework.
This is patently untrue, give a craftsman terrible tools, and they'll still produce a decent end result. That said, defaults matter, and astro is going to be significantly more friendly out-of-the-box to low-end clients
> Just because something is a proverb, doesn't mean it's automatically true for all cases.
A professional woodcarver armed with only a metal spoon will still make a nicer woodcarving than I can given a full wood shop. Similarly, if you only give me notepad.exe, I can still make a pretty nice website.
Does using the right tools make our lives easier? For sure. Using mildly-wrong tools (react, in this case) isn't going to hold us back very much though.
How good are you at hammering nails with a screwdriver? Tools are important. We have a more apropos saying in our industry: use the right tool for the job. Don't let your brain get fried by the 'poor workman' adage, it's talking about the difference between an expensive tool and a cheap tool of the same kind, not two tools of different kinds entirely.
It's definitely possible to make slow server-rendered website. Most of the slow client-side apps are slow because they're waiting on slow network requests.
(I still very much support fast, simple HTML websites. The good ones are a fantastic user experience)
but the host (the company) will need to pay the price in the form of server equipment. Not the user as is the case with client side rendering. If server side rendering becomes slow it will affect all users regardless of their hardware or connection, prompting earlier response from management and devteams.
True. Crappy developers will build crappy websites irrespective of the tech.
The article is clearly aimed at non crappy developers or developers who want to do better for their users.
And it provides an anecdotal experience where an HTML first
option developed by a good developer was far superior to what a JS necessary option would have been, given the user base of this application.
I disagree. An HTML website which uses links, forms, buttons and inputs will by default:
* Have working back/forward buttons
* Have working progress indicator as provided by the browser
* Show errors to the user - even if they are ugly
* Be accessible to keyboard navigation
With SPAs these are all things the developer has to get right.
So often when using a SPA I'll click a button, you get a spinner and then nothing will happen. Is it still in progress? Don't know. Eventually I'll open developer console and trace the network requests to find the JSON HTTP request that returned "ERR_BAD_EMAIL" and fix what I've entered. With a normal form submission at least the user will see the error message and can press back and then fix it.
I find it's way easier to build crappy React apps than an HTML-first approach.
An "old school" Ruby on Rails/Symfony/Django app, with templates, usual get/post forms etc, frames you and pushes you in using the standards and relying on browser default behaviors.
In JS-heavy apps, it's as easy to code normal `button` elements as it is to code clickable `div` elements. But with the divs you just forget to handle keyboard nav, proper element roles, etc. It's easy to create fake links, not relying on `a` tags, using an internal JS router that doesn't expose URLs, doesn't handle middle click mouse, for no particular reasons.
In less JS-heavy contexts, the easiest way to do is to use proper HTML so you are less inclined to mess up.
Even on codebases that use a decent framework like Next.js that handles those for you on paper, it's often we see people not very aware of the benefits of using proper semantics and standard behaviors, and you easily end up with web apps with poor UX in the end.
I agree. Server-rendered React can also send down 100% HTML apps.
But I 100% see where the author's coming from, considering the massive fragmentation of react codebases/patterns and decision paralysis of React development in general. I really doubt most React apps, even the more accessible ones, are testing their multi-page form wizards with JS completely turned off.
HTML-first does seem highly underutilized in the commercial web, and I learnt a lot from reading this (as a solidJS/react dev).
This reminds me of the story of the "Feather" project at YouTube where they improved a lot the page weight and the average page latency went higher just because they were actually seeing a lot more traffic from places with slow Internet.
> When we launched, the number of people completing the form doubled. The analytics people didn’t even know where these users were coming from. Of course, your javascript-based analytics package doesn’t see the users you are bouncing because of javascript failures.
Yeah, reminds me of the b52 story re holes in wings on the planes that made it back from missions, leading them down the wrong path of strengthening wings. They weren't looking at the planes that never came back with holes in the fuel silages.
> this was a regulated monopoly, and if their customer satisfaction dropped below 96% (if I remember correctly) it could result in millions of pounds in fines.
OK, I'm still at the beginning and irrelevant to the article, but as a USA-ian, I am so jealous about that. Unheard of here.
The public sector, simple, no frills, accessible, no flashy graphics, websites were a massive eye-opener.
They just worked. They had a job. They did it. I wasn't going to buy more from them because of it, and they didn't care. It was great.
I've heard that recently they've dismantled the centralised team that wrote all the rules, enforced it, and started moving to decentralised hosting, but so far the whole still seems to hold to together really well. I think, I hope, they have embedded the expectation that the local council, the tax office, your visa status, etc, should just be utilitarian in nature, and work for everyone.
That hit me, too, specifically thinking about my current gas/electricity provider. I have not heard one single piece of positive feedback from the public, and there's only ever problems. I feel like that's a pretty universal experience here. Even outside the scope of websites, it holds so very true.
Personal anecdote: Recently they were updating everyone to "smart meters" on the gas lines. They needed me to be home so they could enter my apartment and bleed the gas out of the line by turning on the stove prior to replacing the meter. I played phone tag with them for 6 months, setting up countless appointments, and nobody ever showed up, the meter remains un-upgraded. At the same time, I have received weekly phone calls and monthly physical letters stating that if I don't upgrade the meter, my gas will be shut off.
I just moved, so the new tenant will have to deal with it now.
Hmm I cannot load the font on Firefox 151.0.3 Arch Linux. All I see is only a title and empty paragraphs. So I end up reading the article in the source code mode and felt pretty on-brand.
Back to HN comments it looks like this wasn't actually intentional?
I like JavaScript-light websites just as much as anyone (my own website works on the same principle). However, I do wonder how much of the increased traffic has to do with AI agents that now have an easier time working with the more standard web forms. My own contact form had a bunch of bots quoting Scorpion lyrics before I added a rate limiter.
The full context of that quote makes it clear that it's meant more as a wry joke:
> A venerable web application pattern that has had a small modern renaissance thanks to Remix, form submissions and redirects took a while to explain to my colleagues, on account of everyone being used to heavily client-side web applications.
(Although it's not really a joke, it's pretty amazing how many professional web developers these days don't know how to use forms without JavaScript.)
The opposite is why I'd never be a good web developer. I grew up messing around with PHP and if I spent the time to learn the modern stack, I'd constantly be thinking it's stupid.
I think the author is suggesting that Remix was the inspiration for the renaissance, not that it's necessarily the most popular method for doing so.
I'd be curious to see the stats on how often Next.js users lean into the server component model that makes the frontend fast. My anecdotal experience is that it's an afterthought for many. By comparison, Astro (as mentioned by the author) makes you think about this stuff upfront via opt-in rather than opt-out. It's a wonderful framework.
I'm personally of the mind that any .gov or utility website should work on old browsers, or at least have a lite fallback to ensure everyone can at least read how to do something the pen and paper way
JavaScript-heavy approaches are not compatible with long-term performance goals
178 points by luu 3 months ago | 237 comments
https://news.ycombinator.com/item?id=47029339 (should be called "Why React is not compatible with long-term performance goals")
I am not familiar with this astro framework they used. But having built some sites using Pure HTML/JS back in the day, React, Angular, Vue, Rails ERB, Rails Hotwire, and HTMX. I think HTML first websites are absolutely the way to go. Rails Hotwire with View Components makes rails sites super fast, faster to develop and easy to re-use components. HTMX more generally, but Ive used it with Spring boot and Thymeleaf. I really don't want to go back to SPAs. Development time is less and the website performance is better, and I haven't really seen any regressions in capability. With HTMX and some url parameters, I can make a pure HTML site that seems like a Single Page Application but without the excessive loading times.
I first tested Astro on my site and never went back. Now every new project defaults to Astro and I have to have a reason not to use it. So far no reasons. It's simple, fast and it kinda fits my desire to keep things minimal. For example, yes, page content matters, but all but one page on my site is under 10kb, most hovering in the 3-4kb range (100% of the downloadable content)
This is such a great story. I am glad more people are sharing stories like this. I hope my article the other day inspired more to develop lightweight websites:
Even if it is more work (it isn't, the author of this phrase probably is just not familiar with this "tech stack"), the sum of saved time for the users is far more important.
My biggest tip to reduce complexity of data validation if you are using React is to stop using React controlled components and switch to React uncontrolled components. They are an underused part of React. You usually don’t need React to handle every single keypress and every single character being entered by the user. In fact before React popularized it, it was unusual for form components to update on each key press; traditional desktop apps tend to validate when a field loses focus only, not on each key press. This has at least three benefits: (a) good for performance, (b) reduces unnecessary error UI when the user is in the middle of entering data, and (c) simplifies your own code by not having to deal with prefixes of valid input that’s not itself valid.
Also allows user scripts to interact with the forms, eg I can run a bookmarklet to fill out certain forms. With React controlled components all these changes are wiped out and reset with the state that React has in its app memory.
You ever tried to maintain or enhance an ASP form that was built 20 years ago and enhanced by random devs with no documentation? I was working with ASP forms 15 years ago that were hopelessly outdated, included tons of technical debt and were not in the least bit user friendly. You can accomplish so much more with things that ship in every browser now. It’s not a very modern technology and you miss out on things that are now very standardized and much, much easier and quicker to develop and maintain.
HTML first, minimal JS, not using any frameworks unless absolutely justified is already part of my prompts to LLMs when I build stuff for myself. I’m not a frontend developer, and have not kept up to date with the ton of frameworks. That HTMl first approach already makes the LLM outputs faster/fresher for me.
I wish more people went this route for public facing services.
Not even that old. 60 year people can't user your fancy site because then don't have an internal model of how a computer works.
You know that when pressing a button a hidden engine runs in the backend (or something runs in the backend). You expect an answer and if the expectation do not match the result, the model in your mind creates an hypothesis about what maybe happened and iterate from there. Maybe you should have clicked something before? Maybe you should mark some form checkbox?
Old people don't have that because they didn't grow up with computers.
What is on the screen is what they see. I clicked next and nothing happens. Well... the site is broken.
You known when you plug your refrigerator and nothing happens and instead of reflecting on the possible blown out resistor that you can bypass with a small wire you understand that your only relationship with the refrigerator is plug and unplug or call for help? That is an old person using your site. They won't fight against it. They'll give up immediately.
Next time I have trouble checking in on an airline site I’ll remember that there are so many other sites to interact with that whatever I was trying to do probably doesn’t matter.
I wouldn’t sweat the broken fridge either though, there’s so many other electrical appliances in the house to use.
"Why did the bank change the layout? I want the old one back!" - Don't like it? Change bank then. That's what I did.
I get that changing to another bank is a big unknown, but it's probably still worth it to show your displeasure. Plus her bank are morons when it comes to several other things.
The problem with changing banks to search for a ux you like is that it's not easy to see the ux before you've invested in signing up.
My main bank changed their UX not too long ago, and I liked the old one better, but the banks I've signed up for since are even worse. I signed up with them for other reasons though, so I put up with them because it's worth the pain. It does make my main bank look better though --- mobile style on desktop is annoying, but at least I can easily find everything I need... And it's not really their fault there are seven different options on the transfers page (including my favorite: same day transfer vs next day transfers... at one point same day transfers had a fee but they don't anymore so from a user perspective, it's the same thing but you can have it slower if you want...)
Also, signing up for a new bank these days is an exercise in KYC frustration. And then you can't actually transfer your money and use it, because banks responded to the dumbass check fraud that was being promoted on social media by limiting new accounts.
> The problem with changing banks to search for a ux you like is that it's not easy to see the ux before you've invested in signing up.
I agree. Better to deal with the devil you know rather than potentially one you don't.
Thankfully, I switched to a bank with a UI that was known good going by all the chatter I'd heard, but that's not really something you can guarantee to know. And even if you do know, if the rate is drastically worse at that bank than any of the others', then that's kind of moot.
Yeah. We grown being trained to solve those small puzzles that are websites and apps, so we learned _how they are projected_, not how they work.
I mean, we learn that a enroll is normally a flow. Flows have steps. So if you came to the end of the flow and the finish button is gray, you think.
Hum… I'm used to flows. This is a multistep flow. Flows normally need me to fulfill some small checks and won't let me proceed between steps if something is missing. But some won't. Maybe this is one of those? Some flows have warnings in the end, some have next to the thing missing. I don't see any warn in the last screen, so I'll go back every step and check field by field for errors. That'll probably do.
This is the model you have in your mind, of how a website or an app works.
People that came to computers, apps and websites later in life didn't learned the puzzles.
When did the industry put the onus on the user to understand how the computer works? What happened to the old days of Xerox PARC's HCI studies putting the user first? The computer is in service of the user, not the other way around!
If I need to build a mental turing machine to understand your application, it is a bad application. It is rather the engineer's job to build a mental model of the user and their needs, and if you can't do that you should not call yourself a software engineer.
Automation generally goes along with a transition to more "self-service" approaches that require the user to model internal states and workflows of whatever they're dealing with.
This is even true for things as seemingly non-technological as getting to your flight once you arrive at the airport. People who are used to dealing with a service desk might just show up with their printed ticket without even having looked at it, take it to the counter, and expect instructions on what to do next without having read or considered all the fields present on the ticket.
It's not just about understanding the technology, but sometimes about understanding the business, policies, whatever. When a human agent or customer service worker is handling that stuff for you (typical in the pre-computer age), you barely have to think about that stuff and even if you're told, it can be "in one ear, out the other". Automation very often means pushing a requirement of more understanding onto customers/users.
As a firmware engineer, my philosophy is this: if I'm doing my job properly, the user should never even know I exist.
Maybe this isn't applicable to all software devs. If you make web apps, users actually see your UI, they click an icon or type in a URL and hit enter with the intent of using the thing you made. With firmware, that's not how it works.
When you hit the "mute" button on your laptop keyboard, it should just do it. The audio should turn off and the little LED should light up. If that fails, even once, the mirage is broken. The user is forced to think about the fallibility of firmware, which is a word they might not even know, and still struggle to conceptualize if they do. I think it also has a lasting effect on the way someone thinks about the pruduct: Is this going to work today? Why did that happen? Was that a virus? So on.
OTA firmware updates have the same problem. Most users don't know what the hell firmware is. All they know is their computer is showing a loading screen they've never seen before. It's unfamiliar and weird.
Like I said, I don't know if this mindset translates perfectly to other fields, but the priorities that fall out of my philosophy certainly apply. Reliability over everything, and get it right the first time.
I have this quote from Wag the Dog burned into my brain.
It's like being a plumber.
Yeah, it's like a plumber: do your job right and nobody should notice. But when you fuck it up, everything gets full of shit.
Usability was thrown to the wolves in favor of more readily available designers from non-UI backgrounds, brand identity (“UI as branding”), and pretty screenshots for slideshows and marketing.
The pendulum is overdue for swinging back the other way, but I don’t know who or what has both the capability and will to give it the push needed to send it on its way back.
> When did the industry put the onus on the user to understand how the computer works?
Just after the turn of the century, that was when there was a big shift in the industry to move all user interface design work to artists, and away from original user interface specialists. The whole profession of user interface designer (one who understood "form follows function") ceased to exist in the early 2000s, as all work was assigned to graphic designers (who only understand aesthetics).
This movement can be seen clearly in the evolution of widget toolkits for desktop applications, which peaked in usability in the late-90s/early-2000s, and have been losing usability while getting prettier with every iteration since.
> 60 year people can't user your fancy site because then don't have an internal model of how a computer works.
I think this is a bit outdated. I'll be 60 in a month, and have been practicing and writing about machine learning, for money, for a straight 10 years now; and I was a young man (and a full stack developer) during the digital revolution.
If anything, GenX had to work harder to get into these brittle emerging technologies and paradigms. There's no-one of my age group, at least that I know of, who is remotely as tech-illiterate as your comment depicts.
Truth is that it took so long for smartphones to dumb down everyone's tech acumen that those of my generation had already learned to do it the hard way.
60 year olds have been using computers most of their working life. Word processors and spreadsheets having been ubiquitous for office workers from at least the early 90s.
> 60 year olds have been using computers most of their working life.
Absolutely. I am in full-time work, and expect to be for another decade. I have worked my entire career in IT, doing tech support, training, systems design and implementation, tech journalism, and tech writing (i.e. documentation).
I will be 60 in less than 18 months.
> Word processors and spreadsheets having been ubiquitous for office workers from at least the early 90s.
You did say "at least", but still... longer than that.
I started work in 1988 and they were already ubiquitous in my world. Richer companies had the fairly newfangled IBM compatibles, which were still big and expensive. The cheap Amstrad PCs were just starting to appear.
Older hands had multiuser boxes with SCO Xenix or DR Concurrent CP/M or Concurrent DOS and a bunch of dumb terminals. My company had switched to these from Alpha Micro systems running AMOS -- and again, dumb terminals. One of my clients had a DEC PDP-11.
The real old hands had 8-bit kit: some CP/M, and a few BBC Micros.
The first big migrations I saw were from standalone (or multiuser) PCs to LANs, and from pre-PC systems to PCs and Macs.
That would be "60 year olds who have been office workers most of their working life"
60-year-olds who worked blue-collar for a significant part of their life, this is not so obviously true for.
Also probably not true for 60-year-olds who worked in other non-office jobs, like acting or sports.
There have been a variety of well-paid jobs that didn't use computers that a 60-year-old might have done over their life, meaning that this can't even be broken up along class/income lines.
I'm 55 and likely have been using computers longer than that poster has been alive. Regardless of the fact that I started young, by the time I was in college the PC revolution was in full swing and everyone had and worked with computers.
My mother, born in 1934, had no problem using computers. She didn't internalize how they work, but she learned the workflows she needed. How to launch applications and so on.
The situation described in that comment is just a broken app, it has nothing to do with the age or the understanding of the user.
> practicing and writing about machine learning ... full stack developer ... digital revolution.
my mum, a boomer now in her 70s, would have no bloody clue what you're talking about. she used to work helping out a guy who was doing punchcard programming back when she was young. she ain't dumb. if i broke it down into normal human english words, she'd probably get a sort of idea (or at least nod along to humour me).
i've lost count of the number of conversations i've had with my dad, late 70s boomer, where he complains that they've changed the UI. "It's all different and i don't understand, why did they have to change it? I don't know where anything is now." he's been moaning about things like this for over a decade now (so since his late 60s).
there are definitely technically not-very-literate 60 year olds and the general point about older folks, whether that's >60 or >70, is very real:
older people exist who don't have a clue about SPAs/PWAs, and chances are they're either asking their offspring for help (my mum does this), trying to phone someone instead (my mum does this) or just walking away from it (my mum does this).
Dude, you know what he meant. Don't be the internet pedant. No need to be the protector of your class, especially one so inconsequential as "literal 60 year olds".
Instead of "old person" he put a number on it. (Cue the people who need to cut me down because I used a male pronoun for an unknown poster)
I would argue it's not even old people. Most people do not have any understanding of what's going on when you click a button. Website either acts as expected, or it doesn't "work"
If the button doesn't work, the average user is going to say "this most be broken" and then use a competitor (or contact your support). That's why it's really important to error-proof one's design (eg https://en.wikipedia.org/wiki/Poka-yoke).
So instead of the button failing because you didn't check a box, pop up with a message telling them "Please click $box before continuing". Or if you want to be fancy, feed them whatever form you're giving them piecemeal, so that they can't continue until they finish this small part (e.g., have them input a name, then the next page only has a spot for an address, then the next page only has a spot for card information, then the next only has a spot to select shipping). Simple bite sized chunks anyone (well, anyone you would ethically want to sell to) can understand.
Yep, I changed town a few years ago and my new social circles are mostly like that.
Either it works right away without any further questions, or they'll not do it.
Sadly, also if they can't do it on their phone, they will not do it. It's actually very hard to get people motivated to do anything that has to do with sitting down at an actual computer anymore. Which is a bit hard if you're in a very technical political advocacy group, kinda makes me the guy to do everything remotely complex... XD
Yeah, it's really, really not an age issue. If there's an age distinction, it's the range of people who were brought up on computers before the UI was really polished, but even then it's not consistent, and they may not have deep understanding. Kids brought up on iPads, and who aren't forced to learn by their interests or educators, have no clue.
"Old people don't have that because they didn't grow up with computers."
You know, it's time to stop this trope.
People who are 60 today were born in 1966, they probably entered the workforce in the mid 80's. They probably are not even retired yet. They know how to use computers, they own a smartphone (or if they don't, it's probably for economic reasons unrelated to their age).
As a founder and product manager, this kind of thinking is unhelpful as we design the future. In many ways it's actually ageist to imply that old people are unable to utilize everyday technology.
I was building public service websites (BBC News website) back in the early 2000's where accessibility was a real and important consideration. Technology progresses, and the bar for accessibility has moved up.
My father is about to turn 80 - he checks his heart with his Apple watch, video calls his grandson from his iPad, and asks ChatGPT questions from his iPhone and MacBook Pro. Maybe he's more unusual for 80yo's but it's time to stop this lazy trope that old people are technically illiterate.
(also, shit, I'm only 15 years away from being 60 myself :/ )
I think the relationship people are seeing is "80 year old can't fill out my form, must be because they can't use a computer." But international surveys like PIAAC [0] indicate that adaptive problem solving is the real problem. 30 percent of adults are at or below Level 1; I've copied and pasted what that level represents below:
> Adults at this level are able to understand simple problems and develop and implement solutions to solve them. Problems contain a limited number of elements and little to no irrelevant information. Solutions at this level are simple and consist of a limited number of steps. Problems are embedded in a context that includes one or two sources of information and presents a single, explicitly defined goal.
This test is administered on a tablet, so I think scores can be interpreted as a sort of combo of computer use and problem solving.
A full 40% of adults from 55-64 are at that level or lower. Wikipedia thinks that a novel online form would be a Level 2 task, provided it involves navigating across more than 1 page. Based on that framework and assuming your dad can use the sort function in his email, he represents a top 20th percentile adult for the 55-64 age group. It's probably even higher considering his age as the trend is towards older groups having a rougher time with the survey.
I also think it's ageist to assume that older people can't use a computer. But assessments like this indicate that a full quarter of the US regardless of age would have trouble with some of the basic tasks we associate with computer use. So designers should consider their intended audience when deciding what's simple or not simple enough.
I'm curious how this lines up with US literacy rates. Is the group of people who can't navigate a two page online form the same as the one have reading comprehension skills on a 5th grade level or lower? Or do they at least largely overlap? In my experience they do, but it'd be nice to have confirmation.
I got taught in school to check whether or not the piece of paper we got with the test on it had something on both sides, so you didn't hand in a test that was only half done. I thought that went without saying back in the day, but given that filling out a two page form is a non-trivial task for what should be literate people, I guess it doesn't.
Your intuition is largely correct. For any given level of adaptive problem solver, approximately 55% of those people share the same literacy level (i.e. a Level 1 adaptive problem solver is also a Level 1 for literacy around 55% of the time). 35% have a reading level that's 1 up from their problem solving ability, and around 10% have a literacy level 1 below their problem solving ability.
I think he means the submit button is disabled because some field failed validation. It might have turned red or have a message appeared next to it - and it might be scrolled off the screen so you have no idea. Or just the common "I have read and agree to ..." checkbox you didn't tick. Possibly because you didn't read the T&C or because it won't let you tick it until you click the link to the T&C. Nobody else read them either but they've learned through trial and error that when the checkbox doesn't work, you have to click the link to fool the computer into thinking you read it.
Yeah. And reflect on the fact that you know that a 404 error is not a form error. Old people won't. Heck then won't understand that a chrome error page is not your site.
A lot of the people I build web pages for are poorly educated. The text we use for web is written for people with an eighth-grade education. Print material is fifth-grade.
People in the SV bubble can't imagine that there are tens of millions of people in America who cannot understand how an SPA works.
These people are invisible, even as they ladle out the food in the Google cafeteria, and polish the chrome in the Meta lobby.
I'm going to link my favorite survey [0] to illustrate this point. Its called the PIAAC, and it's a internationally standardized assessment of adult skills in literacy, numeracy, and problem solving.
28% of the US is at Level 1 or below. That level roughly corresponds to reading a simple text and being able to answer a question about it that requires limited inference (i.e. if the question is "what color are pigs," the answer would be in the text as "pigs are pink in color.")
Yes, but even non-technical users have a different relationship that formed over the young (neural plasticity) days.
"I click the <next> button on this form, nothing happens. Given that I have an internalized notion of forms as a multistep flow, maybe it couldn't advance because something is missing on the current step? Maybe it will give me those messages below or above the form? Maybe some read message somewhere? I'll search for those and try again"
vs
"I click the <next> button on this form, nothing happens. Not sure what would happen next. Maybe the thing will tell me? I can't see no dialogs, no messages, no error screen. Nothing changed. Maybe if I press it again? Nothing? Hum, maybe is disconnected from the network? It's the wifi again? Maybe if I power cycle the wifi router it will reconnect? I click next again now I get a clear error message: no internet connection. I suppose my internet is broken again. Will call my tech-savvy friend."
> 60 year people can't user your fancy site because then don't have an internal model of how a computer works.
Many developers are unaware how many people are not comfortable with computers.
Here's an example with my dad, 64. During Covid, he had to get his medicine by emailing his GP instead of going to him. He received the email address as a photograph of a piece of paper over WhatsApp. (Clearly the doctor wasn't comfortable with tech either.) The paper said:
Send your medication request to:
- john.smith@some.long.medical.site.org
He tried a lot, but every time he received an email saying the address is invalid. After a lot of frustration he asked me for help (he's not the kind to ask for help).
He said "I tried everything: lowercase, uppercase, spaces between '.', no spaces, space between '-', no space... Nothing works!"
He thought "-" was part of the email address. To some people it might seem like he was being dumb, but he's never had to seriously use computers before. When he bought our first computer he was 38 and never used it. He got his own laptop at 46, and only used it for movies and Skype, before WhatsApp existed. It doesn't seem that odd to know how email addresses work. (He is a technical person, but not a computer person. For example, decades ago he etched a circuit to make an HBO decoder so we can watch HBO for free.)
How many people are using browsers which don't support Javascript in 2026, and doing so out of necessity rather than out of choice? I can't imagine this number to be >1%.
How many such devices can still support modern TLS certificates anyway? By this logic, shouldn't we also use plain HTTP instead of TLS?
It may only be 1%, but that small fraction of users are also probably the people who sure as hell don't need even one more tiny thing going wrong in their life.
If you're using a decade old phone to sign up for a utility, you've got bigger problems in your life and no self-respecting person should be adding to them.
A decade-old phone was released in 2016 (yes, we're old).
React already existed in 2016, so did Vue and Typescript. Never mind good old JS.
I frankly can't imagine a device capable of supporting modern TLS stacks but incapable of supporting JS. Much less a phone, which in many countries basically requires LTE (and sometimes even VO LTE) support to function at all, due to the 2G and 3G shutdowns.
> By this logic, shouldn't we also use plain HTTP instead of TLS?
Better would be to use plain HTTP in addition to TLS, rather than instead of TLS. TLS does have benefits, but if it is optional then it can also be used on computers without TLS (as well as potentially other situations where you do not want TLS or where it is not useful).
It's still present. JSON/JS parsing still has a delay. And in either case (as the author states) not everyone is using an iPhone over 5G. Heavy React apps are a miserable experience on low end Android phones, even when the connection is fast. I've seen JS/JSON parsing times in the multiple seconds.
Read the article. Typical users had old browsers often with poor reception. One user was using a PlayStation Portable which had very limited WWW capability.
"What, support Safari? Isn't that, like, less than 20%? And its standards support is abysmal! No, not worth my time, they can upgrade to a normal browser like everyone else."
If Rick Rubin could take a tape to his car to listen to his mixes, your product people can try their websites on £20 phones from Tesco. They can ask to sit in on user tests with minority groups. Extending your knowledge like this is trivial, but rarely done.
May i ask why, specifically, Rick Rubin? I don't know who that is, but whenever we finished mastering a new song, we had a series of "systems" we listened to it on. We went out to my dad's work van and listened there. We called up our friend with a street-comp sound system in his car, and listened in there (neighbors must have loved us!), and then a "cheap" boombox with large-ish speakers but cheap.
if it sounded "clean" on all 3, without the bass muffling everything, and the highs not hurting the eardrums, we called it "good" and released.
i don't work in the industry, sorry. We just made music and released mp3s, 1997-2008. Co-creator of Def Jam, alright.
I wonder if David Lynch watches his stuff on a tiny screen just to make sure everyone has a good experience.
hint: no, he thinks small screens are stupid.
ETA: after like 3 years of mastering and reviewing this way i trusted my ears and my studio monitors enough to know what it would sound like. I also wrote in headphones and mastered on speakers, then remastered in monitor headphones. Anyhow, i think the whole point i was making is "yes, this is a good thing to do, for music, for websites, for software, etc"
Not testing your software in the way your users use it is the disrespect. Not everyone has a modern device. Not everyone has 12gb RAM. Not everyone has 100mbps or even 10mbps. Not everyone has "unlimited" Internet.
If your website takes more than 3 seconds to load on the free Metro Wi-Fi, I'll go back to my search and pick a different page. If it takes more than 3 seconds to load on gigabit on a PC, I'll remember it and never click on links to it again.
If you don't respect my devices, then your work doesn't deserve my respect.
(Don't get me started on people calling themselves software _engineers_)
This is a matter of perspectives here. Some of my friends are absolutely brilliant lawyers and they trump me in their reasoning abilities (while I am a typ. HN member, high-tech engineer). Yet, they would not know some tech basics. I see lawyers struggle with formatting in Microsoft Word all the time :-), for one.
A brilliant physicist friend likewise once told me he is clueless how real numbers are handled in computers (not talking about floating point encoding specifics but conceptually itself). Yes, I can say that feels dumb, but I cannot deny that he is a brilliant physicist.
It's not about perspectives, basically every human has the same baseline reasoning capabilities. Understanding that "more work = more time needed" is part of that baseline.
The only "excuse" would be if someone didn't know what a film is at all, because they can't be expected to reason about something they don't have any knowledge about.
You're not a good and modern engineer who knows his craft if you aren't defaulting to react and tailwind.
And don't dare to contradict me, the fact that MIT-bred leetcode ninjas paid half a million per year can't produce a simple (mostly static) website on that stack it's only because of management that wants to ship the next product. /s
As a public policy specialist (and a tinkerer when it comes to tech), I read the article with pure joy.
This is the "wonder" that happens when you build for the client instead of for yourself. It takes being truly intentional: sometimes the client (especially that kind of client) does not know what he needs or want; sometimes you as a dev simply build something with good intentions but just out of habit.
Taking the time to ask true, relevant questions, and build backwards, is one of the ways you achieve this. It takes time, energy, intentionality (once again)... but it's worth it.
Everyone pays lip service to 'user experience' and 'putting the customer first', but, only with experiences such as acing customer service forms can one really claim to know what 'putting the customer first' means.
Sometimes it is just a form that you need, with the web page loading a new one after 'submit' has been clicked. Yes we can do fancy things to ajax-submit the data, but did the customer want that?
Getting to the form in its 'final form' takes work, particularly if asking the customer for more information, such as proof of purchase or important documents. Do you just start the conversation with a 'contact us' box to have customer service ask for the bits they need later, or do you ask the customer for all information up front, reducing the need for back and fore?
You need to actively test what your customers will do, with metrics such as time filling in the form and how big the ticket queue is.
There can also be internal problems that prevent getting the form right. For example, if there is some manager in charge of customer service that is an empire builder, with a vast team. If your form decimates the team because everyone is efficient and able to go home at the end of the day with an empty queue, then you have undermined the empire builder, so he will want you gone!
There are some huge benefits to getting customer service right. You can brazenly have phone numbers, email addresses and even physical addresses, all published on the website. If the forms work then the phone never rings, the inbox is empty. And nobody can accuse the company of hiding behind a wall of corporate website small print.
The word of mouth aspect is also not to be overlooked. You can harvest reviews from happy customers that should have been unhappy under the old system. If you fix their problem in an hour, or get a replacement product to them the next day, then they will write you a rave review, with that being great for the customer because they explain better than you can how dedicated your customer service team is.
I use the word customer lightly here, there is the term 'service user' that is used in the public/third sectors, but that doesn't sound good in front of the 'service user', probably because they have an actual name.
Getting to the form 'in the final form' means quite a few small changes that can be easily reverted and monitored. It could be just making an input box only show capital letters, or show a numeric rather than standard keyboard.
Ideally, a submitted form does something when completed to place the ball in either the customer service court or that of the customer. If the customer need to provide some information before anyone need look at the ticket, the form needs to send out that email, then park the ticket awaiting whatever the customer does next. There should be no need for someone on the team to do that step.
I know AI does everything awesomely under all circumstances, but the 3-6 month journey needed to deeply understand the customer, the product and the team is something that needs a human, simply because you are dealing with humans and their emotions.
What has proven to be a huge bonus is CSS grid styling. Inputs and labels can be written without the div and span cruft, with everything lining up nicely with a few align 'center' CSS things.
What a fun time to be doing forms that actually work!
> Adding a lot of pressure, this was a regulated monopoly
> Some requirements I derived:
> ...
> We had to meet WCAG accessibility (the team settled on AA rather than AAA)
The author doesn't doxx their employer by giving any dates, but if we take the story at face value and assume it took place in last few years, it is pretty shocking.
How does it take a single hero to be fighting for AA compliance as an afterthought for a project with this scope in the 2020s?
I've worked on much more niche projects that treated this with the respect it deserves as a quasi-legal requirement.
It didn't say anyone was fighting for it just that they had to. Whoever fought for the least possible compliance is the real hero. The less of that feel-good nonsense that is implemented, the easier it is for a text-only browser to parse, and the better a graphical browser works with the keyboard navigation that has been built into pretty much all web browsers since their conception.
Ideally, they ignore WCAG altogether, then throw on an overlay if compliance is required, which can be easily blocked by a dedicated blocker (e.g. https://www.accessibyebye.org/) or I just add a list of overlay domains to my ad blocker.
We have the "social media" companies to thank for this innovation. They introduced these stupid patterns primarily to keep users locked into their walled gardens and the rest of the industry followed them to the bad place like lemmings. Software is a fashion industry.
I've tried this before and I think this constraint is something that has to be kept top of mind for a designer not just the engineer. Most designs these days assume a single page app and there are interaction patterns that make plain HTML not suitable. But if you incorporate this in from the start and stick with it, there's no reason you can't do this.
Recently I had to migrate an old SpringBoot app that had a React front-end to a new cluster. Not wanting to mess with super-old dependencies, I opted to rewrite it on a new version of Java/SpringBoot. When it came to the frontend, I paused. I couldn't come up with a single good reason why this app needed React. I rewrote the frontend in straight HTML with a little bit of JavaScript for DOM manipulation. I literally used `var` instead of `let/const` just to drive the point home... (yes, that was overkill). But you know what I didn't need? A BUILD PROCESS! No npm deps. No vite/rsbuild/etc. It was like I had forgotten we could even DO that.
Don't get me wrong, I actually have enjoyed React over these past 10 years. But, including it blindly is just silly.
esm.ah let's you include "complicated" JS that isn't usually found in CDNs.
it doesn't work for everything and imo is worse for (p)react due to the lack of native JSX, but it does allow for bringing in stuff that usually takes an `npm install && npm build`
Yeah in this case, I needed to pop up a <dialog /> and take some form info, persist it via POST and then show the result of a "used" card/token. So there just wasn't a lot of need for libraries. I'm from the VERY old school so I do recall the fresh hell of including many deps via script tags (pre-Bower!)
I was a little confused by "doubled our users" since that's more about inbound traffic than site experience. I guess it's really shorthand for "halved form abandonment" which is still pretty great.
I think that's even more significant, since it's measuring people who cared enough to click the form in the first place, which is juicier than just page loads.
My go-to for spinning up a site has been Jekyll + Bootstrap with the occasional bit of React for well over 10 years now.
While it still does the job, I'm a little curious to explore more modern options, if for nothing else to understand the choices a more junior dev would face/make today.
I'm seriously considering giving Atro a go. Is it worth it?
Literally signed up here after 20+ years of lurking, because reading that the PSP had Candy Crush made me stop everything I was doing.
This game is a mobile game and did not exist on PSP.
"Clutched in her hands is a games console - a PlayStation Portable. She stares at it intensely; blocking out the world with Candy Crush."
You missed the point. The guy thought she was playing a game, but she was actually using the built-in web browser on the PSP. Whether it was Candy Crush or Tony Hawk Pro Skater or Super Mario Bros. (also not on PSP) doesn't matter.
She was using what is broadly comparable to a WebTV browser to access a government site, and it worked because the guidelines for gov.uk are so very, very good.
(The UK gov sometimes gets a bit of stick for being needlessly useless, but their web guidelines are extremely good. Absolutely a fantastic starting point for anybody interested in web development.)
I think it is a good idea. JavaScripts and CSS can enhance it but should not be required.
Accessibility functions are also helpful; if designed well then it would be helpful for everyone (not only if you are blind or other disabilities), in many possible circumstances.
I've started getting traffic on my website only after I re-build it with a locally-brewed MD parsing engine that uses Astro to spit out the final version of the site.
I guess the main argument is how easy it is for an LLM to ingest the content, since I can bet all of the crawlers are llm-enabled one way or another.
I teared up at the PSP talk. I feel terrible that life requires a level of technology that not everyone is capable of affording and it doesn’t seem right.
I had a PSP long before a cell phone, and the built-in browser was like a peek into the future. It really was janky, and could only scroll a page at a time, like an e-reader, but back then web pages didn't need a top-of-the-line computer with gigabytes of ram, to display text and the occasional image, so it was extremely useful when a laptop wasn't available. The button mapping was pretty good, and navigated similar text-based browsers like Lynx, but with the benefit of seeing images.
> Javascript and modern CSS should be used to enhance the experience
When messing around with my blog's Javascript, this mantra is so thoroughly embedded into writing it, that I try to include "enhance" in function names where it makes sense. I might have to do likewise with my CSS.
The landing page for our latest tool is a static website (exported from nextjs). It has no marketing on it. It just has simple instructions to copy a prompt into ChatGPT / Claude.
Two failed React attempts before this. Shows how chasing fancy frameworks over solid basics can cost millions. Simple HTML wins for public services every time.
All the text is invisible for me in Firefox on Linux when the `--font-body` is set to `"Atkinson", sans-serif`. Setting it to `"Atkinson Hyperlegible", sans-serif` fixed it.
Open your eyes: the "web" was stolen by the 'whatng cartel'. Their web engines are abominations, the c++ language is making things even worse because now it requires a compiler of an obscene complexity to handle "~right" the absurd and grotesque complexity of the c++ syntax.
We have to eat the bullet, there is only one way out: restore noscript/basic HTML interop in "security" infrastructures (can still have a non-mandatory web app on top). And it will probably require super strong _technical_ regulations and expect the 'whatng cartel' to fight hard, because they won't like critical web sites not being web apps then forced to run on their massively complex web engines...
Don't forget, a few years back, most, if not all, online services were able to run on 1D or 2D (simple table) HTML documents.
I still to this day is baffled by all the idiot geniuses who thought it was OK to have "Please enable javascript" when opening a website without JS enabled. A good chunk in many pages are just static content. You should be able to render HTML. Ashte!
> Shipping them 20MB of javascript before we even render a form would be a ridiculous thing to do.
> I have seen teams waste person-months of effort wrangling React validation libraries.
> It is not acceptable to bounce users on old browsers, users with bad network connections, users using assistive technologies.
> Build a web application that works on a playstation portable on a 3G connection - if you do, it will work for all your users, and it will still work 30 years from now.
The other day I added a fix so that the website would work in a PS5. Before that I didn’t even know that PS5 has a browser.
in the bio ... "has over twenty years of experience building highly accessible and usable web applications"
why not take the html5 standard (see https://html.spec.whatwg.org/ ) and if needed (dont think so for these use cases... "for clients ranging from energy companies to political parties") htmx or alpinejs ...
The downside mentioned by the author's replacement in the article is the unfortunate explanation for why this is rare in practice.
> "but that’s a lot more work for us."
And it's not that any individual or team is lazy. Most teams have a constant barrage of priorities to balance and are paid by companies valuing efficiency over everything. That said, I think the article makes a great case for adjusting our prioritization. Going a bit slower won't kill anyone, in fact doing so will probably save some.
No, it's actually people. FTA: 'My client was a utility company, and they had a big problem. To apply for their services, customers could either use an old ASP form on the website...'
Ie customers of the utility company were completing the form, not random users from the internet.
Maybe this is heretical in today's AI hype climate but...weirdly due to the rise of AI, then AI-slop polluting everything, a lot of old fundamentals are coming back. Clear, well-structured, descriptive content on a well-built page has a better shot of being picked up for SEO/AEO/whatever which are the same best practices from 2005. A lot of these tips and tricks and hacks just aren't going to move the needle as much anymore imo.
SEO and accessibility laws have always been the most effective way to convince someone to build clean, well-structured webpages. Guess what, both are measures of how easy it is for a machine to extract content from your pages. AI is just the latest machine that wants to slurp up your soup of tags.
That this article even has to be written proves how stupid web development as a whole has become.
I loathe this area of software development, loads of unnecessary frameworks and spinning gears that add complexity while making less and less functional applications
If you're a "React person", as the article puts it, friendly reminder that you can render components to HTML and serve that to the user.
I have done exactly that on a project that was under similar constraints. The UI models live in .tsx files and the browser gets pure HTML with zero JS by default.
We are still in the early days of software and web development. This is the food service equivalent of a restaurant operator discovering that if they serve dog poo vs edible food they get more return customers.
HTML doesnt have hundreds evangelists writing blogs about how cool it is. So it doesn’t really matter what the benefits are if juniors are going to keep showing up writing client-side react components. And the product managers letting them because of their sparkling (but naive) personality.
I will never stop singing the praises of plain HTML. It's accessible, it's portable, it's simple, but for some reason we need horrid JavaScript nonsense to operate.
It will still work 30 years from now! 300 years! 3000 years. There will be no strange error messages in the log, no browser updates breaking stuff.
Personally, rather than this luxurious approach, I just do one giant form and store all values in local storage. If something is wrong have one message at the top listing which fields failed validation and why. Generate some css to put a red border around the fields.
Local storage might not be a good idea for such sensitive data but if you can get away with the simplicity it's lovely.
Totally agree, gov pages should be widely accessible. Also gov services should NEVER mandate internet access. There should always be a way for tech-illiterate people to ask someone, and fill their forms
Yes, there 'should' be a trail. And there's someone and a process to check that trail. And a process to find the issues, correctly so, and fix, and do all that on a timely basis, and reimburse the person for damages, ...
PS: I have actually suffered through some of this, badly so, though in an unrelated setting.
It comes back to which system is more robust/mistake-proof and more practically recoverable.
>She’s connected to the complementary WiFi and is browsing the GOV.UK pages on Housing Benefit. She’s not slicing fruit; she’s arming herself with knowledge.
>The PSP’s web browser is - charitably - pathetic. It is slow, frequently runs out of memory, and can only open 3 tabs at a time.
Alluring, an annoying property of private software development is that making websites and software in general inaccessible to lower end hardware is actually a positive effect, as it filters out 'undesirable' lower-income prospects.
That, along with pressure to produce fast, without much concern for quality (with notable privileged exceptions of luxury software like Apple or 1B+ user software like Google), as well as a disregard for sourcing "I don't care if you do it yourself, or npm install software from effectively unpaid volunteers", ends up in a state of software lacking craftmanship, software that one is not proud of to work in.
The best way to filter out unwanted users is to make them install software that just displays a webview of what could have been a completely open web page. That way, you only get the ones you can track, which is more important than their wealth, as poor customers often end up spending more on commodity items than someone who is wealthy.
In my experience, Apple and Google are the worst offenders at software bloat, maybe because they can afford to create releases every few weeks, so the bloat accumulates faster.
I did some work for a company that spent nearly a grand on a Flash animation for their title page of a red bouncing ball that would bounce from right to left along the letters of the word "Yipee" (yeah totally not ripping off Yahoo! were they?) until it landed in the crook of the Y, where it would spread down the middle - the finished logo had the Y made out of blue, yellow, and red stripes.
Every single person I showed it to including my then-70-something mother said "that just looks like menstrual bleeding".
Every single person said that.
They still went with it. Conversion rate? Dunno, never got numbers high enough to test the script.
As a teenager I remember going to a website for... a city, I think? And their 'sidebar' was a Java applet that did nothing but provide links for you to click with on-hover effects. The page used frames; the applet was in the left-side frame and the content was in the main frame on the right.
The applet took 30 seconds to load. Once it loaded, it showed five buttons to click to get to different sections of the site. When you clicked on one, instead of changing the content frame, it sent you to an entirely new frameset. This, of course, caused the sidebar to take another 30 seconds to load. Hitting the back button did the same thing.
Meanwhile, I knew someone whose friend made a little applet that he showed me; it was a Java applet that you could provide an image URL for and it would load the image and then, below the image, show a rippling effect as though you were looking at something on the shore of a rippling lake. This applet took less than a second to load and ran incredibly smoothly.
Java was a curse, not because Java was bad but because Java applets were written badly and used badly simply because they were neat.
Every language can say that bad developers write bad code with it while good developers write good code with it.
I would like to say the early interweb was just a learning experience, but today's interweb hasn't learned any of the lessons. It's just changed which language the lesson is being relearned
A lot of these tools, like React, are designed to embrace, extend extinguish the web. Why Microslop and Zuckerberg spend millions of dollars of dark PR claiming anyone who doesn't like React doesn't know what's going on is because it makes the web worse and less useful, which means you spend more time talking to Co-Pilot or bots on Facebook.
Not in the Wikipedia page (but check the Italian version): it started as "Mons Belli" (Mount of the Battle) because of a battle fought by the Romans a few years before the Hannibal campaign. Then the original meaning was lost and it gained another "of battle" in the 1800s. Mount of the Battle of the Battle. Hopefully there won't be another one to add.
Actually, in English, Chai does not mean tea, it means a specific flavor of tea. If you don't believe me, try ordering some Earl Grey Chai, see what happens.
it's redundant at a place that serves chai, but it isn't redundant at a place that does not serve chai, because you're skipping the "what is chai" question from whoever you're querying.
Except places are now offering Chai Latte Coffee so if you don't specifically order Chai Tea Latte, you could get some thing totally different than expected. I learned this the hard way.
As a non-web dev, I have a question about this part:
> There was a sad coda; as is the way of contract work, I moved on. I explained what I had built to my replacement, that it always worked even without javascript. He was appalled and said, “but that’s a lot more work for us.”
Why is it more work? The approach described in the article seems honestly reasonably simple: just write the standard <input> components for the form, have a submit button at the bottom. When I was making my own websites many years ago now, that's how it worked, and it wasn't that hard. Maybe it's reflecting my ignorance in this field, but doing fancy front-ends seems much harder to me.
Simpler doesn't mean easier. Consider a chef who at their previous job started using a wood-burning stove. This is an objectively simpler tool than a gas or electric stove, yet it would be very difficult (even impossible, depending on local architecture and regulations) for a new kitchen to add one.
I don't understand how having to pay 20 different vendors so hackers can run commands on your server barely impeded is somehow simpler.
The message you just wrote involved how many complex systems, from your keyboard switches and firmware to your BIOS and OS interrupts, to your browser, the internet and middle boxes, just to say one sentence to someone. It would be much simpler (and more secure!) if you just told me with your mouth, but you didn't do that.
Of course, and if you use all these services you can be a pedantic ass who never has to actually ship a product.
I'm interested to hear what architecture and regulations prevent the use of something that is foundational to web develpment and backwards compatible by design? Which also, by the way, comes with the advantage of not incinerating other parts of the restaurant (accessibility, user experience...), forcing expensive countermeasures or total rebuilds of the things destroyed every time you turn it on.
90% of the SPAs I use could be Django/Rails/Flask apps with no noticeable difference, other than that they'd be many times more responsive on slower devices.
"Old" SSR apps are mature, not obsolete. It's ridiculous when they're not considered even when they'd be the right tool for the job. I wouldn't try to clone Google Docs in Django, but something like Linear could 100% be modeled as a CRUD app with new page loads on click without a substantial loss of functionality from the user's POV. Not to mention built-in, automatic support for pervasive "deep linking", aka "linking", because you access a URL's contents by GETting and rendering that URL is just how it works.
I agree but you and I aren't the audience and I think experts in general should be a little more holistic when critiquing other people's choices. For any given problem there always exists a perspective from which your solution is over-engineered. People who (like us, I presume) understand processes, files, the command line, compilers, a computer language or two, a bit about computation theory (e.g. Turing, big-O, Knuth..) can get to a very broad swath of places along many different (often shorter!) paths. This is not where most people are starting from.
Speaking of Knuth, imagine being asked to "write a program to add two numbers" and using something like Python instead of assembler, or because really that's complex too, machine code. Do you think that the amount of housekeeping and computer activity is justified for adding two numbers? Objectively, it is not, its just that steady-state dominates the transient over time.
How is that objectively simpler?
It probably has to do with what technology people are used to. There has been a couple of generations of web developers who have only known javascript and its ecosystem for building webapps, and so anything other than pure javascript solution looks foreign.
Because before there was AI Slop, there was React.
I think Facebook with their money and Vercel with their VC funding tried hard to push the React and then the Next.js everywhere. So it arrived in time for AIs to all train on it. And now it’s the one true way :)
But do we really need all that stuff? Build steps, bundling, tree shaking, all for what? And is it really simpler… hmm
There are some advantages, but the main one is probably that it stops everyone from using NoScript and breaking tracking.
By this point people don't appear to have any real clue how to write HTML anymore. Writing semantic HTML isn't significantly harder than say writing Markdown. You copy some HTMl skeleton and you literally just stack your elements into the body. I managed to do that as a 13 year old on MySpace without any deep instruction. Sure you have to close elements as well so the syntax is slightly harder than markdown, but that allows you to differenciate between for example <article>, <section> and <aside>.
I am convinced the one single thing that made HTML unusable over the time was that people wanted or needed a way to re-use parts of the page across multiple pages, like headers, navigational elements and footers.
This meant people used frames, PHP, templating engines or any other new technology mainly for the purpose of creating shared elements, simply because HTML failed (and to this day: fails) to offer a way to include one HTML file in another without having it suck (like frames definitely did, since the browser treated each subpart of the page like its own entity including caching).
Large websites resorted to PHP and server side includes to get headers and footers. Smaller websites resorted to frames and copy/paste. It wasn't perfect, but it also wasn't horrible or unusable either.
Ikea relies heavily on Edge Side Includes, assembling static pages from parts at the CDN level and then having small islands of JS interactivity
I think it was... SHTML? that allowed for server includes. My recollection from... 25ish years ago was that it was generally quite well supported and worked quite well (and was dead simple to implement). Not sure why, if that was the issue, the fix didn't quite catch on (but it's totally possible I'm mis-remembering the state of browser support).
Server-side includes worked fine but weren't enabled by default in any of the mainstream web servers. I think the lack of default-enabled status hampered their adoption. Joe User couldn't just FTP a bunch of ".shtml" files up to their shared web space and expect it to work right.
I certainly used the heck out of them in the late 90s, though.
It would have been very cool if HTML had been created with the ability to do client-side includes without having to resort to using a Turing-complete VM in the client to do it.
[delayed]
Ahh, yeah! That rings a vague bell of having to futz with IIS at some point to figure out why a page wasn't working. I can't quite recall if it worked in Geocities, but I think some of the gaming websites I was building (maybe xoom? That sounds familiar for some reason) had it on.
yeah editing all the footers and navigation parts in html is too annoying to me so i've resorted for my websites to just a back button to a page that has links to everything else lmao
> (and to this day: fails)
The `<template>` tag has gotten very close. Right now you still need JS (optionally wrapped as a Web Component) to load a `<template>` from an outside HTML file (at which case, yeah, it's so easy to just use a JS-based HTML renderer instead of a template today), but discussions are ongoing about closing that loop for simpler "JS-free Web Components".
I don't know when that will be accepted into the web platform, but it still feels more like a matter of time that it may happen eventually.
I've found at least some of my static page generation has moved to just dumbly appending `<template>` tags to the bottom of a page rather than use some other template language, so it feels like we are closer every day to finally having "HTML-native" simple part reuse.
I used SSIs to include menus and footers back in the day.
If you wanted to reduce server load you could “compile” those includes at publish time.
<div><div><div><div><div><div><span></div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div><div>></div></div></div></div></div></div></div></div></div>
writing straight html and css sucked. building reddit css themes sucked
But I believe the point is: if you were writing HTML by hand, you would never have written the above.
This is not semantic HTML.
Yes you used HTML to design a website in a way that was the opposite of semantic. Semantic HTML is about just writing your content and then using CSS and js for everything else (as far as possible).
Also: the meaning of the word semantic is that the used elements give you context about the contents. So if you place text in an <aside> that tells you that this is additional information as opposed to the stuff in <content> for example.
If you use a hundred nested divs, there is probably a better way to do it.
I suspect they are both more familiar with client-side rendering, and also thinking of things being able to share components, reuse existing libraries, and so on. So re-implementing everything with vanilla HTML and forms feels like reinventing the wheel to a team used to an SPA component library, it's not that it's intrinsically harder, it's that they don't have the existing building blocks they'd normally reach for.
Modern frameworks such as Astro allow for a similar development experience (and can optionally use JS, React and other client-side libraries) while still being able to generate a static site if desired.
I think server-side rendering and static site generation are less familiar to many web devs who came up in the React/Vue/Svelte era. The patterns and mental model are just different. In an ideal world we combine both: fast static HTML that works everywhere, with progressive enhancement for interactivity. Astro does this well; Next.js supports it too, though the SSR parts have a learning curve.
Starting a few years ago, I realized some junior and medior engineers never once considered the possibility of building a website (app, experience, etc.) in anything other than a heavy SPA framework. But they're not stupid people! If you directly asked "Can you build a website without React?" they know the answer is obviously "Yes." However, if you asked them to build a new website, they would unthinkingly start a new React project, mostly out of familiarity and a desire to get the job done.
A few of them would outright not know how to do anything else. No knowledge of how to stand up a boring HTTP server to send pure HTML. No experience building a form that validates or submits without JavaScript. These are not the people who post here on HN. They are not engaged in online discussions of new tools and skills (or old tools and skills!). These are people who learned just enough from a bootcamp, or their uni's single "web apps" course, to get a job. Since then, they have just-in-time learned whatever their employer required, or whatever particular tools someone else on their team chose for a project.
As an old, it took me a while to recognize/realize it, but I understand them now. Depending on their career path, someone will encounter the simplest aspects of HTML, CSS and vanilla JavaScript after they learn the complex, framework-specific aspects of each. It feels (to them) like more esoteric, advanced, or tertiary knowledge.
Tying it back to to the quote "that’s a lot more work for us", that's not necessarily an intentionally false claim. It probably does feel like a lot more work to perform a task using unfamiliar tools, even if they are less-complex tools.
You are far too empathetic to them. They should not hold the jobs they have.
These are the people writing React monstrosities for government benefit websites, and testing them on fast iPhones and fast 4G, without realizing that every page load for actual users will take 30 seconds on their old $200 Android on 3G, and users won’t complete the form.
It’s a culture of not giving a shit, that’s the deeper issue.
I use to have an old pentium 2 computer for testing websites. Sometimes you cant make things fast enough for the old box. A fun trick is/was to have <script>elm.textContent="loading images"</script> between each "heavy" section, all targeting the same elm. If the computer, network or server is truly extremely slow you will get a nice message at the top describing what they are waiting for. On a normal slow computer you won't see the messages unless something went wrong.
Oooh! Like a status bar!
shit, I'm too old to remember those...
haha right, I forgot the word for it.
I see no reason not to be empathetic. The frustration is fair, but it's aimed at the wrong layer. These people were guided into this spot by bootcamps and curricula that start at React and never go down the stack.
My experience was the reverse. I learned HTML and CSS first, then Rails in college to serve templated pages. I understood the client/server boundary fine as a concept, what I couldn't see was where it actually sat in a web context. I sort of knew JavaScript ran in the browser, but then I'd see ERB templates stamping values directly into script tags, so the server was writing the JavaScript that ran on the client, and my mental model fell apart. Where does my code actually execute? Why does this variable exist here but not there? Why does the page have data the network tab never fetched? Nobody ever sat me down and explained the request/response lifecycle as its own thing. I had to assemble it from fragments over years. This was around 2017 for context.
How you learn something shapes how you keep learning. If your mental model is misaligned, everything downstream is friction. The thing that finally made it click for me was reading the actual HTTP RFCs, which is apparently a weird thing to do, because HTTP itself is absent from nearly every guide and curriculum. Tutorials teach you the framework, maybe the language, and just assume the protocol underneath. These days I make newbies read the MDN docs like a book and skim the HTTP wiki page, learn the history of the protocol. It's short! It's not even a book! That gives you a firm foundation. But if your foundation starts at React, drilling down is like digging past bedrock. People don't know where to start, and Googling only shows them wrong answers because they don't yet know how to ask the question.
Are you sympathetic to a doctor who specialized in surgery and now always recommends surgery, even for a common cold? Or would you say they are in the wrong job, if they are anywhere but surgery?
Well that's horribly reductive. I certainly do not expect everyone in a given field to know absolutely everything there is to know in that field.
Crazy enough, I also hold doctors and surgeons to higher standards than web developers.
If those web developers fail a critical government service, or online pharmacy or financial service, it can mess up peoples life pretty badly as well.
Yes it's truly a shame when the people responsible for critical infrastructure only hire the cheap inexperienced software engineers to build it.
Much like how relying on a resident nurse instead of a cardiologist when you are experiencing a heart attack can end your life pretty badly as well.
Ridiculous example that does nothing to argue the original, fair point. Obviously health interventions demand more finely tuned solutions than information technology
FWIW, maintaining at least a moderate degree of empathy even in systemically frustrating situations is good for the empathizer and thus in one’s interest
It's more of a culture of "but everybody else does it".
I like how HTMX does SPAs. It straddles the divide nicely between simple and capable.
Junior and midlevel devs aren't decision makers for government benefit websites. The culture of not giving a shit is real, but the responsibility goes far beyond these roles.
I am always baffled by people who blame developers. Like some mid dev or junior would calling shots what stack should be used for project.
You'd be surprised, then. Some managers don't know squat. I rolled onto a project once and found that an entire application was being delivered as a 300MB ActiveX control, to run in a browser because that was cool and "cutting-edge" at the time.
Looking at the code, I found it was using UI elements for data storage and other such nonsense. A colleague and I had to tell the manager that the entire thing had to be rewritten. I'm not sure he actually went pale, but that's how I remember it.
When you give the project to a bunch of junior devs the stack is necessarily decided by one or more of them since there's nobody else to decide it...
The tech stack is almost always decided by someone in leadership that has no developer experience. Or by the consultant company that will chose the most complicated and difficult to maintain stack because then they can invoice more and will win all future contracts. The trick is to hire someone that is not corrupted by money, someone like the author of this post, who cares more for the users then how much he gets paid.
Not in my experience. If they're throwing it to a group of junior devs they're throwing it to a group of junior devs.
It is EXACTLY the type of people that are hired to make decisions, because of either nepotism or impressing with portfolio filled with overcomplicated, 3.js frontpages.
Preach! Amen! Hallelujah!
If we're talking a government site, chances are you don't have the budget to be able to hire much above junior or midlevel devs. And the project manager probably has a small budget [^1] and little experience with what the web design choices really mean (and what the trade off are).
I think you'd be surprised who ends up making those decisions.
Which goes back to the original point (that's valid for any project) - keep your user in mind. If your users will be using recent-ish iOS or Android devices, use as much flair as you'd like. If your users will be using mass-market low-end devices or used devices from 4+ years ago, then maybe dial down the interface.
Knowing your user is important, no matter what level you're at.
[1] Unless we're talking about some kind of large system that's being redesigned by a consulting company on a cost-plus contract. Who knows how those decisions are made.
Even if this were the case, and I wouldn't be surprised, it's still misplaced blame.
> Knowing your user is important, no matter what level you're at.
I agree, but it's absolutely ridiculous to expect a junior dev to make excellent decisions on this. Software development is a massive industry with no prescribed methods. It's not like these folks are going through a residency before getting the job. Even if they went to uni for CS those programs don't teach these skills.
I've found what works really well on 3G an MPA with streaming HTML with brotli compression rendering the whole page on every change.
In Canada you can't call yourself an engineer unless you have some kind of association behind it; the title holds meaning including partially accountability. Something that is lacking in the tech world. I'm not saying I want to live in that world but also I worked hard for the knowledge I have starting in the IE days of web dev; it was hard earned experience making things work across the web without loosing performance. The idea that we have developers out there now getting paid higher than me that are clueless on how auth works, how the browser works, why css and browsers maintain backwards comparability for a reason.. well it's sad; but good for them I guess?
The behaviours of developers as well being beholden to their managers rather than the craft; meaning not saying No we will not move forward without proper unit tests, or pushing back when business demands quick corner cutting solutions.
Anyway, decades of bitterness. I wish we had associations to uphold some level of accountability on developers as much as protect developers. I think things would be a lot more expensive and slow if we did that though.
Fundamentally I agree with your take, not just on dev side but just the web/dev/produce' a culture of not giving a shit.
I had a contract once to save a government website that had serious performance issues, it was so unusable that people preferred to go in-person and wait 4h in a queue rather than try to fill the forms online.
The frontend was in React because the company that got the contract initially used React for everything. The frontend was a 5MB SPA, but it could've been (mostly static) HTML files with some interactivity for forms like TFA. Everyone working on the project agreed React didn't make sense, but we couldn't do anything about it because someone from the government IT department would have to admit they made a mistake. There was no budget for rewrites in the contract. The few times a developer attempted to remove any "React monstrosity" they got in trouble.
Sometimes developers care, but the people in charge don't, and in government environments every change must go through them first.
> Sometimes developers care, but the people in charge don't, and in government environments every change must go through them first.
To be fair, the same thing happens in private companies. How many UI changes have people gone through that didn't actually make anything better and just made everybody relearn everything? We would have been better of scrapping many of those and let people continue to use what's already familiar, but that too would have to involve someone admitting failure, which is a hard thing to do for some people.
I've used many a government website in the Navy, and they were almost invariably bad, but it had nothing to do with React per se.
A very slow website I can think of had something like 200 GET requests required to load the landing page, and it used Liferay with Material Design Bootstrap. That was closer to the "style at the time". React is the style of this time, but you can write very slow websites in anything, I'm convinced.
> That was closer to the "style at the time".
So I tied an onion to my belt.
Ref: https://youtu.be/yujF8AumiQo
I’m curious if - and when - LLMs change this. They’re very good at web apps. And they’re great at rewriting existing stuff. Just give them a well scoped /goal and go get coffee.
Theres lots of open questions about the future of our profession in the age of AI. But, playing with opus and fable, I think the future will be bright for our users. There is no reason any more for teams to put out junk that’s worse than what an LLM can do.
Unfortunately the LLMs are trained on what we've made, and there's going to be a ton more React garbage[1] in the training set than there are carefully-crafted websites like the article describes, so I don't expect a decrease in overengineered, bloated junk. If anything, I predict that the fact that you can shit one out in less time than before will have a different effect: A modest increase in bloat since an LLM won't mind adding a half dozen redundant and competing ways to do the same things in a large codebase, combined with a shorter mean-time-between-full-rewrites.
I think most of us have seen incredibly creaky codebases that are too buggy to be maintained any longer, where we make the hard choice to wipe the slate clean and build a new one.
We might find those rewrites happening every 12-24 months instead of after a decade.
[1] Frontend people, I mean no disrespect -- just that React & friends are (ab)used for nearly every website now, even those which map perfectly onto the "Simple document viewing with occasional submission of incredibly simple form data" model that plain HTML has always been perfect for.
It doesn't take that much effort to put guardrails around your prompt to solve problems in a certain way and with certain frameworks and excluding certain others.
Who will be doing that? Only a small minority of developers pre-ai cared to attempt using HTML, so I don’t see them urging Claude to create efficient and lean websites in the future either.
Claude is remarkably good at performance engineering and ports. It only takes one person on your team to ask claude to do a round of performance profiling and tuning. Or ask claude to take your react site and set up a server to render parts of your site as static, cache friendly HTML.
You barely need domain expertise any more. Just ask claude to make it go faster and it will.
You also need to ask Claude not to make any mistakes /s
You can order LLMs to use other patterns. I had an LLM recreate an app in a different stack with reasonable success
You can, if you know what you want.
> Unfortunately the LLMs are trained on what we've made
This.
As I’ve pointed out in other posts, I work in two languages: Swift (my main language), for native app clients, and PHP, for backend work.
I have a lot of experience, with each language (12 years for Swift, and 25, for PHP).
My experience with an LLM, is that I get very good PHP, and fairly mediocre Swift. The Swift often looks like fancy tricks, that newer enthusiasts like to demonstrate. Lots of unnecessary threading, and complex, dogmatic, overengineered approaches to simple problems.
I suspect that this has a great deal to do with the availability of high-Quality public repositories. PHP is more than twice as old as Swift, and, by nature, is a much more open language.
Lol
Better than a lot of web dev teams at least.
New cheap android phones are just as slow as old cheap android phones. The bottom of the market has been stuck in performance limbo for years, and modern web dev frameworks are ill designed to meet them where they are at.
My cheap phone has 6 cores and 8GB I think. My first cheap phone had 1 core and 256MB. Both ran Android. I think you're mistaken.
old != oldest
They are referring to this:
https://us-east-1-shared-usea1-02.graphassets.com/cluuijofv0...
Oh, I know it's not the point but I find it a bit disingenuous going from iPhone base model to the Pro in the last 3 years and still comparing to the base model Samsung S series. Though maybe I'm missing something non obvious.
But yeah, generally I've seen a better experience buying used phones (in good condition) instead of budget/cheap new ones.
> single-core scores
> only goes back to 2015
Are you saying a phone from 2015 isn't old?
I just had one of these people, a contractor working for a state government, argue vocally with me in a meeting stating that "500 JavaScript requests is not a problem" for a single page. Un-cached, of course, despite there being a CDN in front of the site.
You can't win against cargo-cult coders because they just assume you're from a different, competing cult.
They have no concept of engineering or science, they have never encountered it.
Heh this is one nice thing about doing engineering work in Australia. Our round-trip time to US data centers is often about 200ms. There’s no hiding from sloppy choices in the performance panel.
I had an argument a few weeks ago because our page took 4 serial requests before content appeared. I argued - with solid data - that it should be 1. If we could manage that, cold load time would ~ halve.
> argue vocally with me in a meeting stating that "500 JavaScript requests is not a problem" for a single page
Where's the benchmark or at least the numbers? If not, that's not proof of anything. Nothing to argue about. I'd just laugh.
> You can't win against cargo-cult coders
You don't need to. Unless you're not in control or don't have influence then whatever. It shouldn't be about "winning". It's either some vote (hence influence) or there's a process e.g. PoC with backed numbers.
This is a leadership failure. People who want to do a good job always get fired for taking too long.
Most companies actively punish you for giving a shit. The more shit you give, the worse things get for you. Not giving a shit is a form of self-preservation.
> These are the people writing React monstrosities for government benefit websites, and testing them on fast iPhones and fast 4G, without realizing that every page load for actual users will take 30 seconds on their old $200 Android on 3G, and users won’t complete the form.
@concinds, you yourself are being too empathetic. I am trying to view these websites on my $2,000 PC on high speed internet, and it still is maddeningly slow.
I mean there are web programmers that do not know C. C! The substrate of all computing! The bedrock, surely…
I have been coding for several decades and still haven't delved into assembly.
This is how things goes when the employers ask for a list of technologies...
Not their fault.
Don't you think they have a legit skill issue here and should they be better off upskilling themselves?
This is a direct effect of being a low barrier industry to enter. Most of the ppl among us are mostly here because of a good paycheck. And it SUCKS!
>Don't you think they have a legit skill issue here and should they be better off upskilling themselves?
Absolutely agree! Just because I understand how they got there doesn't mean I think it's a good state of affairs ;)
My post was already quite long, and I didn't want to append a treatise on what one should do when encountering those engineers. It depends on many details. Avoid hiring them, if that's a power you have. If you are stuck working with them, depending on your authority, encourage them to learn or force them to learn. If you're coming in to clean up after them... well, hopefully your comp is worth the annoyance.
We are all simultaneously in the position of encountering "the world as it is", understanding it, and doing what we can to improve it.
Why should you necessarily avoid hiring them? You yourself said that they are not stupid. Maybe some of them are very good, hardworking employees. And if all your company needs is a react app, does it matter that much that those people are unfamiliar with building websites without react? Maybe they've spent all their working hours doing work for their employer's company, leaving no time to learn other ways of building websites.
The thing is, people often assume that bootcampers/self-taught devs are only in it for the money and do not "care about the craft", or else they would have studied CS in the first place. But this is not true: There are many reasons why someone could have found their passion for software engineering only later in life. Some of the best engineers I know are self-taught or bootcampers.
Yep. It’s also an attitude problem. A lot of devs are able to up-skill just fine, but some are downright demeaning towards anything they don’t understand, or towards anything that doesn’t come from a FAANG.
“HTML only? Nobody is doing it!”
In the olden days, people wouldn't take office jobs or factory job necessarily because they thought: "Yes! That's my passion! That's exactly what I've always wanted to do." Passion isn't your first and foremost thought when you have a family to feed.
A few decades ago, IT jobs were for the most part done only by people who were in it for the kick they got out of working with computers. They already hacked at their dad's computer in their early teens (or sometimes even younger), and just could just never let go. It was for people who loved it because it was a niche.
But today, IT is no longer that. It's the backbone of much of our society. And so the field no longer attracts just the die hard fans, the nerds. It attracts ordinary "career people", who just need to have a job to feed the family. Who turn the machine off after 8 hours. Who don't go on coding all through the evening on their hobby project. Who don't try out new tech just for the heck of it.
I think it's hard to understand if you belong to the first group, the nerds, that anyone working in the field isn't like you. Because they all used to be! But those days are gone. We live in the times of enshitification for a reason. If you have the hacker spirit, you don't enshitify because you simply can't. You know what is the right way to do it. Sometimes that's a React app but sometimes it's just an HTML page.
You're not just in it for the money. You care. Not necessarily for the end user, although that would be nice. You care for the tech. And when - like in this article - both come together, sweet things can happen.
> If you have the hacker spirit, you don't enshitify because you simply can't.
Not me, if they want shit I give them shit. I used to care 30 years ago, but they beat it out of me. Now its all for the money, HODLing to retirement.
Beaten by the system. Thanks for adding that, it's not uncommon. I should have added that to my post above.
A few of them would outright not know how to do anything else.
It's like how a lot of people these days reach for an electric drill/driver for even the most simple projects like tightening a screw. It never occurs to them to use a screwdriver, or even a butter knife.
Try to get a Java developer to do something without Spring.
Yeah, my dad is like this. But even just for one screw I am at least 10x faster with the electric option.
But I also achieve faster HTMl with vanilla and never touched react, so .. I will continue to stick with using the right tool for the job.
Kinda sorta analogous to the cloud engineers who can standup complex monstrosities in AWS-land, but don’t know the first thing about how to troubleshoot say a connectivity or simple problem where they have to ssh to an ec2 box and do the needful
or the materials engineers who are great at making mems tools, but couldnt for the life of them design an aircraft prop
well... just because you know how to ssh into the prod DNS host and manually update the prod zone files in vim to remove orphan A records + duplicate CNAME records, in order to fix an ip address exhaustion issue that is blocking new VM's from spinning up for your customers... it doesnt mean that you should, lol.
that was 8 years ago in my first gig. now i kinda wonder... having those skills made it easier to put off implementing a robust long term solution. it was playing with fire, sure, but i was a rookie
There is a reason we use React today - if you want dynamic and complex site, HTML is PITA to work with. Either you reload everything on any change (not good), or end up with a maze of partial reloads in event handlers (not good either). It was done, it was bad, React (and similar frameworks) was the solution. If you don't need complexity of React, fine, use HTML. But if you do, who can guarantee that 5 min later someone will not start requesting site not to reload here and there, but update this bit here. So I don't blame people for just using React. And in this case the issue wasn't that react was used, but that it was used poorly.
Absolutely
I'm not a web developer. I built a few websites in high school, but these days I write safety-critical real-time code for robots.
A few years ago I was back in grad school and I took a class with undergrad senior CS students. We had to write a fairly simple web service, and I was blown away by how complicated they were making it. Based on the requirements we easily could have written 90% of it in plain HTML, but everyone else insisted it should be 100% react. Part of that is honors students wanting to do everything the most complex way possible to impress teacher, and part of it is them simply not knowing that other options exist.
I’ve long thought frontend web developers are the ones most threatened by LLM-assisted programming for a bunch of reasons and now I can add “many don’t understand web fundamentals” to the list.
Yup. It’s exactly like the dismal state of CSS frameworks we're mired in.
All these new kids walk in and learn the CSS framework du jour first, then find themselves stranded when things move on. If they had just learned CSS the first time, they'd be set for life.
Nobody should learn React before learning HTML and vanilla javascript.
HN last week: Learn SQL Once, Use It for 30 Years https://news.ycombinator.com/item?id=48347483
The practical question most face is which is more likely to land them a good role. Does standards level CSS knowledge meet that bar?
(I’m team CSS standards although my knowledge is a bit tilted towards late 2010s, currently revisiting)
Yeah but at least now we don't argue about Bootstrap or Foundation, it's just go with Tailwind.
I still remember when a good chunk of the web took Bootstrap's defaults and ran with it.
That said I've still got a bone to pick with Tailwind but I understand it's a good compromise in a world where BEM and CUBE and other methodologies require more effort up front and if done incorrectly impose a bigger burden.
My wife used to maintain a website for a non profit organization that was just HTML/CSS. After that she started building a lot of stuff in HTML without javascript.
And (now that I'm in management I understand this better than I used to) this problem becomes self-reinforcing. If every candidate out there only knows react and doesn't actually know how to do a simple front-end without it, you need to use React because at some point you'll need to hire someone to replace the person doing it. Even when management understands why the design is bad, if that's what the labor market supports it exerts a definite pressure.
They may not be stupid people, but they are bad at their jobs. One needs to be able to at least try other approaches to a problem, and not have a one size fits all approach. The latter isn't engineering, it's cargo culting.
As a web dev a lot of this is simply ongoing maintenance of a largely unknown quantity. Most web devs know React and use it extensively; Astro is something they'll have to learn on the job or hire for specifically.
It's akin to writing a backend in Haskell. Chances are you could write something performant that leverages FP in a way that serves as a magic bullet for your domain. But now everyone after you needs to learn Haskell and how to model all future problems in a way that conforms with it - or rewrite things again.
> Astro is something they'll have to learn on the job or hire for specifically.
Before LLMs I would have agreed.
LLM + framework you don't understand goes in ... unmaintainable garbage comes out.
Before LLMs, learning on the job looked like reading documentation. Now it’s a guided tour with verification. When I produce things in this way, I’m not just blindly accepting it. The goal is that by the end of it I have learned more about the codebase and architecture, not less. I feel that’s important.
Many people don't understand this, even big tech engineers. They see LLMs as a bottleneck. It's more that they don't understand how to use it to multiply their skills, just basics and code gen.
I use multiple Claudes at a time, daily. It's precisely because of that experience that I wrote:
Claude follows code patterns and structure. If you setup that structure and those patterns properly, it will produce great code. If not, it will follow ... whatever it feels like, with each commit.
If you just have it built something with a framework you don't understand, it will do so just fine! But over time every "vibe coded" change you make will drift it further and further, until you are left with a mess of vibe-coded spaghetti.
Using it to understand a framework is fine.
I agree that's fine in that at least it's doesn't cause unmaintainable garbage. And might even get you up to speed quicker that reading the docs old school.
But the GP point, that you're better off finding people that already, truly understand and are familiar with the tech (ie. Astro), imo still stands.
We cant all be wise enough to use php.
I read a fun comment the other day from a frustrated windows user who failed to configure linux in previous attempts but now with LLMs it was very easy for him.
LLMs are a lifesaver for configuring Vim. I could not be happier to get that drudgery out of the way.
Not a web-dev myself and I was wondering if, apart from unfamiliarity with astro or HTML being treated as unknown technology, it also has to do with having to handle fallback cases, eg the 3 point validation (web component, browser default, server), esp when one is used to have react (libraries) just handling it all without any more considerations.
I don't know about you, but my team uses React and we also have to handle validation on front end and back end, in different ways.
I think the problem is hearing just one side.
Someone is saying that they delivered a very reasonable solution that's simpler than most would come up. Person taking over was not happy.
Do we know if the code being handed over was high quality? Were they reacting to the fact that it was "not React"? Maybe they have a template they enforce in the company about how apps are built?
We don't know.
The author open sourced the validation library: https://gitlab.com/alistairldavidson/validation-enhancer
As an application becomes more stateful it gets harder to keep that state aligned across the frontend and backend, especially if they're in different languages.
A lot of developers have made or just perceive very strong silos between frontend and backend today. Any coordination that needs to happen between frontend and backend is potentially a communication challenge.
It seems like a lot more work because you have to keep the backend and frontend in closer sync. The backend has to be aware of and able to store every sub-form in the full process (which sounds like a "wizard form" with a multiple sub-forms to get through the full "form" process), not just accept a "finished" or "complete" submission. If a sub-form needs a change the backend, the backend's storage, and the frontend all need to change. The backend and frontend have to agree on validation logic for each small piece of the form. The backend and the frontend need to both validate every small piece of the form, and maybe can't share that validation logic (depending on what language the backend is written in), especially if one of the goals is to do as much of the frontend validation as possible with Browser native validation tools (`<input required` and `<input type="email"` and so forth) so that you get the most benefits of progressive enhancement.
The original ways of making websites were "full stack" and from a full stack perspective it shouldn't seem that hard to have a coordinated frontend and backend, especially when a progressive enhancement approach likely means a smaller more agile frontend, but current siloed world where frontend and backend are different teams with different goals and alignment makes that seem like way too much work.
I have had issues where the Frontend team is unable to explain how to communicate with their SPA, they say "just use this package/just run node" and are unable to explain the workflow in primitives.
Then they just validate on the front end, and we validate on the backend.
> they say "just use this package/just run node" and are unable to explain the workflow in primitives
Now it's worse. It's "just run <claude or codex>"
This was the jQuery way. It was called Graceful Degradation.
The entire approach went out of style with the advent of single page apps, React, Angular, VueJS, etc.
That's generous. I always heard people espouse that ideal, but I rarely saw them actually do it. And I never saw it at work.
There were always certain UX requirements that required JS, and that meant the company wasn't interested in testing to make sure it worked without JS. None of their customers were going to use it that way.
Angular, React, etc helped force it further, but they didn't cause it.
I know I always did. CakePHP and Rails made it really easy to determine if a request came from AJAX or direct and you could slightly tweak the response to match the medium.
Agree that most people didn't, but I was always an advocate.
jQuery and graceful degradation are different things. The vast majority of sites in the jQuery era that used jQuery did not gracefully degrade.
the shockwave and flash way was simpler.
download the whole app and run it in browser. you can even run it off line!
They don’t know how to compose and style elements without someone providing them with a prebuilt library of $framework components.
> Why is it more work?
As someone that reads a lot of code written by others, I'm confident that "learning a new way to do something" is perceived by many as the hardest thing in the world.
I used to do web dev. (Got out of it due to js frameworks and their bloat.)
I'd pee myself in happiness to take over a project like this.
I was confused by that too, but then I thought maybe the new replacement was commenting that using javascript in the app would provide more work for contractors, which he perceives as a good thing. So not using javascript provides less work. I could be wrong though.
Two years ago, I started a new company, and decided at the outset to avoid using any heavy JavaScript SPA framework. We stuck to simple server-rendered html and only use progressive-enhancement style JavaScript.
Our app was fast, and simple, but it also came at a cost: we were limited in our ability to take rich UI elements off the shelf with an npm package. We had to do a lot more work to provide a rich user experience. Everything took longer, and the user experience was worse as a result. We cared, but sometimes you don't have time to carry through.
The company failed, and I don't think react would have saved it. But I can tell you first hand that righteous adherence to "simplicity" didn't help either. It's always a trade-off.
I also prefer simple web tech, but I'm really glad you brought these points up! Ecosystems matter more than a lot of purist devs think.
I feel like there is some context missing in your story here. There is a lot of middleground between heavy SPA frameworks and creating everything from scratch. More importantly, I am left wondering what sort of functionality was your team trying to build that requires that much interactivity? At least that is what I assume with "rich user experience"?
If I had to guess, they were probably wanting to implement something like animations into the UI. Animating a list of items onload in a staggered format is still basically impossible unless 100% of your users are using Chrome. With a JS animation+component library, this type of animation is pretty much plug-n-play.
When the startup is trying to attract customers and also impress investors, sometimes there is a lot of effort spent on the investors just so they keep putting money into the machine. "See! We have an ultra modern/sleek site so it must be some other variable that is causing customers to churn..."
I'm risking being wrong here, but I think the difficulty is getting conforming behavior across all device and browser combos.
This is the only correct answer in this entire thread! Congrats!
Computers are very good at repeating a known "recipe". They can add numbers billions of time per second. Yes, billions with a bee.
The hard part is coming up with a recipe that solves your problem and that the machine can run without breaking things when it runs around with a few billion steps per second. You have to think ahead for it and handle edge cases in the recipe.
That is the really hard part.
It is harder to do more with less. There is a reason React and other is used so much. Makes it easier to make interactive websites. It’s like asking why backend engineers think it’s harder to code an api using C instead of using Django.
I used to think that was true but I now think it’s only true for very interaction-heavy apps: if you have hundreds of interactions on a page over many minutes, using an SPA is amortized across a lot of time, but if it’s something you could do with e.g. a simple Django app you’ll not only be done faster but will spend an order of magnitude less time on maintenance and accessibility work.
That's usually not even in the books of a typical SPA: It doesn't have fallbacks at all, and just shows a blank white page. Accessibility is always taking a rear seat with such SPAs.
It can be really difficult for people with screen readers: focus jumps, inconsistent update flow, too many or not enough announcements, etc. People just want to live their lives, not have to threaten 508 to be able to pay their cable bill as easily as it was 20 years ago.
Alright but Django isn’t a pure HTML file only solution. If you have a site with no interactivity it seems like Django is the wrong choice if everything is static.
Who said it was? My point was simply that if you’re doing something like getting data in and out of a SQL database using web forms, you can avoid a ton of overhead and deliver a better user experience without using an SPA, and of course there’s a lot to be said for not needing to install security patches weekly due to having fewer, simpler moving parts.
> There is a reason React and other is used so much.
Yes, it's because many people are quite bad at their jobs and reach for the same tool regardless of whether it's the right one. Let's not make excuses for incompetence.
I take Astro with React over manually editing 1000 html files.
The short and sad answer is that most people that work in web development do not understand how the web works or how web apps work.
Modern web/frontend devs do NOT understand whole page navigating form POST calls from a pre JS era.
As someone who has built both react based frontends and html based ones (with htmx), there is a law of diminishing returns at play.
To start off, writing a basic crud website with forms is much easier with htmx.
But when you start building more complex components, and integrate with other systems (OAuth for e.g.) there are tons of libraries and SDKs for the react ecosystem, but not many for pure html components.
At this point, it's much easier to use off the shelf components than it is to manually write html to handle all the bizarre UI edge cases.
Really curious to understand why I'm being downvoted. I don't think it's a particularly spicy take - Just choose the right tool for the job.
I think a lot of people here don't seem to understand or appreciate the diversity of systems that "web developers" have to work in.
Some people might say, "Why do you need all that oAuth complexity? Rip it out and use a cookie like God intended."
We, the devs/ICs, don't often get to make those decisions. We're placed into teams working on specific features/apps/tools and we often have to integrate with a myriad of business systems by default.
Yea, I would love to work on a simpler system, but I don't get to make that decision. Especially not when my company has been acquired by unbounded VC cash three times in the past 5 years and now I'm forced to fold in my lovingly crafted baby into the behemoth.
my most recent website is fully static html and css. it contains several pages and a menu that is duplicated in all pages.
that menu is maintained manually, and every time a page is added, all copies of the menu have to be updated. at some point that will get tedious. then i have a few options:
i generate the menu using a backend framework. the downside: the website is no longer fully static. i now depend on a backend framework for hosting. static hosting is out. i also have to edit the content through the backend, and i have to continuously maintain the backend for the lifetime of the site.
i generate the menu using a static site builder. the downside: i can no longer edit the content directly in html. i have to keep a source version for the static site generator, and more critically, i have to keep a copy of the site generator in my repo because i want to be able to make changes to this site 10 years from now and not find that the version of the site generator i was using is no longer available for download and my source is not compatible with the new version of the site generator.
i generate the menu using xslt. works, but xslt is no better than javascript security wise. it's possibly even worse. and xslt support may be removed from browsers in the future.
the final option is javascript. using some framework that doesn't need build tools, or something homegrown. i am afraid javascript is the only option that is futureproof while letting me avoid manual work to maintain the menu.
While purists will disagree, a little bit of javascript is fine. Having said that, you are talking about a personal website. Most companies will have a backend of some sort anyway.
Also, here is a little secret. If you want something that is future proof, try something that has been around for decades and still runs large parts of the internet. People will scoff at this, but PHP is actually really neat for personal websites and has been for decades.
A while ago I also found myself looking at static site generators, workflows from github to my host, etc. Eventually I realized I don't update things nearly enough, don't blog, etc.
For similar reasons as you I didn't want to go completely static as that is just too much hassle when doing multiple pages. So I decided to utilize that good old lamp stack to basically do something like this.
Slightly more, but the base principle is the same. Just 10 lines of php code, and now I can just add pages by uploading their contents and adding them to the json file for whitelisting. For your use case it would be trivial to add a menu based on the json file and I'd be confident that it will still work in 10 years with minimal adjustments.
As a bonus I also rediscovered PHP in itself works really well as a templating language (as you can see) so no need for extra stuff like handlebars. As an extra extra bonus, I can just go to any shared webhosting party and get it running with no issue at all.
I am not saying you'd need to go down this road. But I just want to illustrate how stupidly simple a website can be with "old" basic technologies even if you want some form of backend.
This seems like a very complicated way to maintain a menu on a static website. Have you considered using old school server side includes? It’s what they were designed for.
server side includes are just a variant of the backend framework. they have the same problem. i'd still be locked in. and i'd depend on and have to maintain a backend for the lifetime of the site.
> Why is it more work?
People expect the entire screen not to redraw whenever they interact with an app and expect behaviour asides from the HTML defaults.
Most of my apps are now simply HTMX + Go + SQLite.
I've found it's enough for most projects.
One of my sites is image heavy and serves 10 TB of traffic per month. For this, I use the following setup:
1. S3 (I wanted reliable data storage) 2. In front of it, I have Cloudflare (with Tiered Cache enabled, which makes POPs prefer pulling from Cloudflare rather than the origin). I've set rules to cache everything on both the browser and Cloudflare for 1 year, ignore origin cache policies, ignore query strings, etc., and I simply use immutable objects that require revisioning. 3. BunnyCDN in front
Cloudflare will not let you run an image heavy site on its own, so I use this approach to massively cut the bills. Their policy says you cannot use it primarily for images; it must be used for HTML, CSS, JavaScript, and other site content.
And if you run only S3, the bills will be huge.
But yes, lately I’ve been building mobile apps. PWAs are limited; the OS can evict IndexedDB storage, so I cannot offer people reliable data storage in the app without sign up or involving a backend.
What can I do? So I was forced to switch to Flutter on Android, but I ran into another pain point: app updates sometimes spend a lot of time "under review," which is frustrating. For the same app, I maintain a web app that is very quick to update by comparison.
I wonder why there isn't a mobile OS that simply lets you build apps with JavaScript, HTML, and CSS and gives you reliable storage without all this effort.
I like how quickly you can update PWA app.
> Most of my apps are now simply HTMX + Go + SQLite.
Would like to hear about your Go stack for building htmx apps.
> I wonder why there isn't a mobile OS that simply lets you build apps with JavaScript, HTML, and CSS and gives you reliable storage without all this effort.
There is! You just have to time travel all the way back to 2009 when webOS was launched by Palm. Time travel is the easy part, you then also need to somehow prevent Palms demise and webOS fading into obscurity as a smartphone OS.
If 2009 is too far back you can try your luck in 2012 with Firefox OS.
Joking aside, people and companies have given it a go. But a combination of bad timing and various other events never made that reality happen in our timeline.
Maybe I'm missing something but aren't PWAs pretty dead-simple on both iOS and Android? Maybe it's the "reliable storage" part that's the gap?
The amount of effort that goes into keeping Termux barely functional, has a lot to do with Android and the platform making it harder and harder, to access a dev environment on a phone.
Running `npm install` on Android isn't so easy.
(Caveat: The new Android Terminal that only works on a handful of models.)
I thought I read that one or both of them removed or heavily restricted PWA support to funnel more apps to their 30%-taking app store.
No that's not correct, they both support PWAs with a large feature set. I built and have been maintaining a client's PWA (an internal tool for their employees) for over 10 years now.
Not my site, but someone on HN (can't remember who) built it: https://pwascore.com
You can still buy KaiOS phones, I have one.
Sure, but they aren't exactly widespread or even close to mainstream.
Alternatively, you could try to keep HP from killing the TouchPad
Go is so awesome for server apps. I should have discovered it much sooner. It somehow sits in the exact optimal point having no bullshit overhead like C, yet also getting out of your way so you can focus on the business logic like Java (not Rust).
It's not great for every task - in particular the lack of abstraction-building capabilities - but it's great for business-logic-heavy server apps. It feels like it's specialized for that and not trying to be a jack of all trades.
>One of my sites is image heavy and serves 10 TB of traffic per month
I can't imagine this kind of traffic without acting as a CDN, advertising broker, pornographer, or part of a massive ecommerce site. I have to wonder, what are you doing that generates 10TB of traffic per month?
Lots of legitimate businesses that deal in maintenance have ridiculous amounts of image data.
I have a civil engineering firm as a client, they take video & photo’s of roads they help project manage the maintenance on.
Small towns of 10000 can have ridiculously big road networks in Australia. And you take a photo every 10m, likely more but you only care about every 10m. It adds up, quick.
I’m only now investigating a web version of the app I wrote them because I think origin file system will work for them but I would never consider serving their 200TB+ of their imagery as a website.
Since you're using HTMX, I have to ask: do you have any tips or idioms for composing complex forms and UI without things getting out of hand? I love the approach, but I'm having a bad time figuring out where the ideal balance is between too few or too many HTMX-replaced areas in a page. Thanks.
My #1 advice is not creating separate server endpoints for every HTMX fragment, unless you are 1000% sure that endpoint will be used in multiple different pages.
Working on a "simple html page" that is actually 5 different independent "subpages" (routes, views, templates) in the backend is awful. The UX was improved, but the DX was sacrificed.
I recommend having a single view function for each page/SPA and do sub-routing within that function to handle page fragments. In other words, use a GET/path/Header parameter that indicates which fragment is currently needed, defaulting to the full document as normal. Just make sure you are considering request logging and client-side caching in your solution.
This makes it very easy to add/remove async content from the page, since you are just editing the one view function/template and you can easily reason about the entire page as one logical unit.
It also means you don't need to duplicate security logic or other middlewares for the page, since it can be implemented once at the start of your multi-faceted view function.
Generally you don't even need to do the sub-routing in the handler. You can just render the entire page and have `hx-select` attributes pluck out the part that you want.
That is a good solution for reusing content across pages, but most of my HTMX usage is for fetching data that would otherwise delay first page load significantly, or for seamless interactivity. Very different use cases.
This is huge, thank you.
> Cloudflare will not let you run an image heavy site on its own, so I use this approach to massively cut the bills. Their policy says you cannot use it primarily for images; it must be used for HTML, CSS, JavaScript, and other site content.
Pages has a 20k-100k limit on static files, but if they just guide you to R2 to offload it, which is still Cloudflare.
Did you mean the CDN? In which case, I'm not seeing that in the terms. [0] Though, I would have expected they'd have a similar thing. R2 resources don't generally count towards your cache limits.
[0] https://www.cloudflare.com/service-specific-terms-applicatio...
Looks like "Section 2.8 to give Cloudflare the means to preserve the original intent of the CDN: limiting use of the CDN to webpages." is gone.
https://blog.cloudflare.com/updated-tos/
interesting, it seems now i can host stuff directly on r2 and put CF in front and serve images, video and other files!
10TB is nothing these days. All Hetzner virtual servers in Europe have 20TB/month traffic included (excess less than $2/TB) and all their dedicated servers have unlimited fair use (which is probably about 200TB/month averaged over many months).
> I wonder why there isn't a mobile OS that simply lets you build apps with JavaScript, HTML, and CSS and gives you reliable storage without all this effort.
Because there isn't a 30% walled garden you can create with that.
Where do you store the SQLite database files? What is your strategy for partitioning your data into SQLite files? One per user or…?
> Where do you store the SQLite database files?
What? On the server, where else would you put it?
You only have one server?
Then that approach will work. If you need to scale beyond that, you need some way to route the request to the server with the right data. And what if a request needs data that was stored on two different servers?
Those are the kinds of questions I had in mind.
Developing webapps only for iPhone was Jobs original strategy. Only changed when developers complained.
On the mobile point, there is https://github.com/instawork/hyperview
Your Go server can have endpoints that render XML instead of HTML and basically get the same server-driven experience of your HTMX site. Fully skips the need for the app review process since you're not updating the actual client app code to make UI changes.
> Most of my apps are now simply HTMX + Go + SQLite.
Very cool!
> But yes, lately I’ve been building mobile apps. ... What can I do?
I am currently building HTMXNative.
Together with Objective-Smalltalk, which has linguistic support for REST built-in.
The idea is that you create your model in a natural way and then thinly wrap it to deliver wherever.
Are you me? I've been on a tear building stuff with HTMX + Go + SQLite. It's like the trifecta of boring technology that jives with me. Stuff gets deployed to a colo server using a generic bash script.
I created a couple libraries to abstract the SQL and HTMX/web/OAuth bits; my apps are now very similar and easy to copy features between.
https://github.com/cattlecloud/webtools
https://github.com/cattlecloud/litesql
Can't vouch for it's effectiveness, but Hotwire Native might meet the needs for mobile paired with plain HTML. Despite the name, it doesn't seem that using Hotwire for the web UI is necessary to use Hotwire Native. I could be wrong about that though.
https://native.hotwired.dev/
Hotwire doesn't work anywhere you can't guarantee a high-quality low-latency connection. Every UI interaction in Hotwire includes that round trip.
That's pretty much true of HTMX too (which is what GP mentions using). I mention Hotwire Native (different from plain Hotwire) because it makes it easy to wrap a web app as a mobile app. Then you can replace performance critical parts with native views, but keep everything else working through the web app portion. This is easier to maintain, albeit with the downside that everything requires network round trips. Depending on you use case, that may be an acceptable tradeoff.
I've learned about several frameworks that are system language + web frontend. The general approach is, ship a small binary compiled for the specific platform, and use the platform's native browser (and whatever html frontend tech you like) for frontend. The whole binary can be 1mb or less.
There's a couple of Rust libraries like this; right now I'm building an app in Tauri+Svelte.
It looks like Wails might be a similar framework in Golang.
have you considered Capacitor? it works pretty well for cross platform web development
> Cloudflare will not let you run an image heavy site on its own
Cloudflare R2 object storage is S3-compatible, offers free egress, and does not share their CDN product's fair use policy against image-heavy use. Storage is 65% the per-GB cost of S3.
yes, you are right i didn't see their update: https://blog.cloudflare.com/updated-tos/
> I wonder why there isn't a mobile OS that simply lets you build apps with JavaScript, HTML, and CSS and gives you reliable storage without all this effort.
There WAS. Firefox OS phone! HTML+CS+JS apps! But Mozilla kicked it to the graveyard even though it was very popular in third world nations. I guess it was not $$$$$ enough for the Mozilla CEO of that era.
I haven't heard much about in a while, but the HTML Triptych proposal [0] is still something I hope to eventually land in browsers. HTML forms speaking to REST endpoints are a good pattern. (meaning user-aiding validation is handled via the input attributes, real validation is handled on the far side of the request, and the flow is GET /form => POST /thing => GET /thing/1) It would be a great pattern with the triptych features implemented!
[0] https://triptychproject.org/
In the mean time, HTMX is pretty much that with much more. Definitely recommend.
Excellent article but I am always torn when I read inspirational articles like this - it makes perfect sense to me and I love the idea of simple, non-nonsense sites that work well, load quickly and don't rely on the latest browsers to function.
Then I start to wonder if that's just because I'm not smart enough to understand React or whatever the fancy technology of the day is.
Feels like I have a hard understanding threshold that cannot be breached - give me a simple editor like Sublime and ask me to make a web page - even with JavaScript - and it's my happy place. Give me VSCode or Zed, Claude/Copilot/ChatGPT plugins everywhere, React tutorials and my brain goes to mush.
If it makes you feel any better, the people using the fancy frameworks and whatnot usually aren't smart enough to understand them either.
I love the web. I hate what the React cretins have done to it.
Embrace Extend Extinguish is real, and the people going along with it deserve to be replaced by a LLM that lies and spits out garbage code just like they do but faster.
React has helped folks like vercel/convex/cloudflare to build fantastic dashboards. There's just as many examples of well done React as there are the opposite.
I generally prefer solidJS nowadays, but the react ecosystem has enabled lots of amazing user experiences (and developer experiences too if you don't fall into the trap of overcomplexity).
you might enjoy this post on complexity and why it is bad: https://tengstrand.github.io/blog/2019-09-14-the-origin-of-c...
keeping things simple is not a bad thing, and often requires you to be smart enough not to overcomplicate them.
The counterargument: In Defence of the Single Page Application:
https://williamkennedy.ninja/javascript/2022/05/03/in-defenc...
Funny enough. I’m opening this on mobile internet connection and it stuck at loading spinner. I don’t know if the problem is with my internet (probably not) or support for mobile so I can’t even read the content.
it's a sarcasm loader
My guess it’s a joke.
I think that's the joke :) all other articles load fine instantly, just this one that has a spinner
Heh it got me then :)
Got me too :-)
Whoosh! Right over my head. I feel a little silly, but also, got me!
lol this got me
All I got is a "loading" animation. Gave up after 10 seconds. So, not a counterargument, but a confirmation of the article's thesis.
It's a joke/sarcasm
Sufficiently advanced parody is indistinguishable from reality.
https://medium.com/luminasticity/on-the-triumph-of-satire-fa...
"Satire isn’t dead.
Satire won.
This is what it looks like from inside, looking out. "
Ages ago when writing.com was first modernizing its site, they started by hiding story content to display a spinner, waiting a second or two, then re-displaying the content. It was on the page the whole time, they just made it look like it was loading in the background.
I remember doing this as a kid making my first website. I thought it looked more "professional"
I got wooshed.
Nice work!
I wish I hadn't read the replies. I love being made the fool (though not to worry, I'll have plenty of other opportunities, likely today!)
I have to say that I hate SPAs. It is often a far worse user experience than the vanilla multi-page websites.
Like most defenses of Single Page Applications it managed to make me angry, at least at first.
Discussed at the time:
In Defence of the Single Page Application - https://news.ycombinator.com/item?id=31275178 - May 2022 (32 comments)
I built apps like these on GOV.UK over 10 years ago for the Ministry of Justice. We built our own form wizard library that let us validate long forms in steps and break them out into multiple pages because Ruby on Rails didn't support doing that out of the box. It was a very important principle back then that everyone should be able to make use of these digital services regardless of whatever users were using to access them.
I've always liked basic HTML pages where one can upload a document without having to restart the entire application. That's a great practice you have there with general forms. With each session ID, it can cross reference a page in a multi page application with that session ID, so that the user can maybe type it in if necessary, but it should be able to determine that with enough information, like IP address, upload date, browser, OS and so on. But the most accurate session would be within the browser so that the cookies for a single application aren't mixed up with another applicant, like a relative, who might be using the Playstation Portable.
I am actually impressed by the gov.uk websites. Its minimal and just about right for its purpose.
May I ask what tech is used for mobile apps? I am guessing not a full mobile app but it uses webview.
It's still happening.
I built some libraries that ease the process, and they power the new MOJ Forms and GOV.UK Forms.
Rails still has a decent foothold across departments, but it's being nibbled away at by Python and.NET.
https://govuk-form-builder.x-govuk.org/
https://govuk-components.x-govuk.org/
The MoJ have moved on to using Forge now. https://www.npmjs.com/package/@ministryofjustice/hmpps-forge
Great work. The gov.uk site is a beacon of light on the web.
This isn't "We replaced a React app with an HTML form and performance improved." It's "We replaced a bad web page with a good web page and performance improved."
Attributing this to the technology driving the browser experience is silly. You can make a brilliant user experience with React. You can make a terrible website with plain HTML.
The improvement comes from the change design, not tech.
Of course, is just what with React is 100x harder, and when you fail the fans will blame you instead of the technology.
The standard answer to that is that some technologies make one harder than the other. That's kind of true from first principles, but it requires making the case that e.g. React is actually harder to make good than a plain HTML page.
Fun thing, TFA describes a kind of multi-page wizard style form that I haven't seen a lot anymore in the last decade or so. But when I did see it, it's always some dogshit enterprise system. Some Oracle product for expensing expenses last time.
The problem with those things always seems to be that they are slow in the middle of doing your task. Every button is seconds of waiting. Doubly annoying if you have to go back a step or two. The badly coded SPAs seem to be slow at the start. It takes a while to load, but once it's loaded its performance is usually okay.
Is it slow though? Like in practice? This demo [1] using Datastar (a streaming HTML framework) every action including scrolling roundtrips to the server. Even the checkboxes changing colour is a roundtrip.
https://checkboxes.andersmurphy.com
The advantage of SPAs, like the checkboxes page, is that they can do the round-trip less visibly. The user can still continue the next thing. So even if it is slow, it's less of a deal than loading and rendering a page anew.
> Is it slow though? Like in practice?
The multi-page wizards? The ones I've seen were. Enterprise crap systems.
every action including scrolling roundtrips to the server
As soon as you include a network roundtrip in anything you're opening up a Pandora's box of slow connections, slow DNS queries, network outages, what-if-the-user-is-on-a-train problems, what-if-their-IP-changes-mid-flow problems, etc.
Reducing the network calls in any app has upsides and downsides. It isn't really true that SPAs are faster to render (as your example proves) but rendering speed isn't the only thing that matters.
It baffles me people can write software like this.... Surely it's the most basic tenet of webpages is that it's all sent over the network and the network lags and drops packets.
I don’t like multi-page forms when I’m not able to see at a glance all the info needed to fill out the form. Though I guess if my progress is durably saved that makes it not so bad. The worst is when I fill out a bunch of stuff and then realize it’s asking for info I don’t have, and after I get the info I have to fill everything out again from scratch!
> The improvement comes from the change design, not tech.
You could argue that the constraints of using HTML-first (as they call it) helped them stay away from the bad patterns they were using before.
But you’re right: The user change came from fixing the design, not the technology used.
This is a lot like those bad resume bullet points where someone tries to claim an increase in business was due to their code change. “Increased visitor count 100% by rewriting website to be HTML-first”. Then when you ask them about that point they concede that the entire site was redesigned to fix some design problems or add a feature and that’s what drove the visitor increase.
Plain old HTML with vanilla JS is not exactly a pit of success but React is much closer to a pit of despair. The former tends to be clunky but effective, while the latter requires a PhD in complexity avoidance to stand a chance.
JavaScript: The Good Parts by Douglas Crockford is a comically short book. React: The Good Parts would be shorter still.
Totally wrong, re-read the article. React requires JavaScript, which the new page doesn’t. That’s a strict accessibility improvement. (And I’m not a React hater!)
This post is good, and it's a great example of taking a problem and solving it with the appropriate tech with the right amount of depth. It really helps to have full domain knowledge of your customers as well.
However, I do not like how it is framed as "simple html is better than react" - because you could just as well have told the same story as a react developer.
(Nb. I could go on forever about the complexities and intricacies of storing things session based on a server vs browser based and etc - and lots of other things that were skimmed over in this article, but that would be too long)
All of those things that are simple in html are also simple in react.
It's literally the same code - there's nothing preventing you from using browser based html validation in react - all the same code that gets complicated in react (overly complicated validation logic) also ends up being complicated in astro - they have their own thing around schema validation etc and integrating it within an astro site means you have to integrate their client router etc etc.. so it's very easy to go overly-complicated there as well.
The comparison is also with an off-shore team doing development for you with probably incomplete knowledge and the way projects are structured they have an incentive to create the solution as fast as possible, in as little time as possible, with the biggest amount of complexity as possible.
The last point is devious - it's not necessarily that the contractor does this by design, but the incentive structure makes it so something that's overly complicated actually benefits them, so they don't have a direct incentive to go with something simple.
Anyways, a simple solution, directly addressing the problem at hand is always better - no matter what stack you pick.
(I'd like to say that I don't have anything against Astro's form validation, I was just trying to highlight how there's more to it than "native html browser validation")
Seems like LLMs embrace that last point as well.
I think you might be on to something there
There is one hard wall that stops very old clients from connecting: Not supporting a new enough version of TLS. TLS 1.2 is from 2008, and TLS 1.3 is from 2018. Web browsers older than 2008 can't connect to modern websites since TLS 1.0 and 1.1 were deprecated from web servers in 2021.
I still think it's worth it to provide connections over plain HTTP for this reason. It probably doesn't apply to many people, and you shouldn't allow anything really important to happen over plain HTTP (logins, payment), but normal viewing should still be possible.
Sadly, the internet as a whole seems to disagree. Even the most useful resource on the web one could use over plain HTTP, Wikipedia, only allows connections over HTTPS. I guess it kind of made sense as part of the campaign to push the internet as a whole over to HTTPS, but anyone who's connecting to any website over normal HTTP these days is doing so because they literally can't use HTTPS.
Having HTTPS as mandatory it more mistake-proof.
I agree; you should allow non-TLS connections as well as TLS. (At least, access that does not require authentication should not require TLS, but should still allow it if that is what the client wants.)
If you are concerned about accidental login or API keys without TLS, then you can consider supporting mutual TLS, which improves security (and flexibility) in other ways as well. (You do not necessarily, have to require mutual TLS, in case someone prefers to use a username/password login, or 2FA or something else like that instead.) (In the case of login forms, you can have the links to the login forms to always use HTTPS, in order to avoid the problem.)
The push to have everything be served over HTTPS is absolutely insane. Very few things actually need to be served securely. But sadly, browser makers don't give a damn about actual benefits for the users, but rather shove their out of touch ideas about what the Web should be down everyone's throats.
Imagine if you found someone making full fledged applications from word documents. Like, they'd managed to create a "framework" in VBA so they can do all the things word docs can't do out the box. The word documents were running servers, production code etc
You'd think the person was creative but maybe insane.
This is the exact same feeling I get when I see web "apps".
Sadly, this is the story of nearly every React project I've reluctantly inherited. In my experience, it's because React is not opinionated like its peers Vue and Svelte. So, a bunch of devs will use something for state management and and another team will use something else completely. Eventually both teams leave after making a mess. But, if you look at the graphs and numbers that MBAs chase, they will all look like everyone was productive until the very last minute. The ultimate casualty is unfortunately the user. Even Facebook hasn't figured out React across their properties. Just use Instagram / Facebook on the web. Bunch of spinners to load a static list of items in a drop down menu. Not even joking, click on the bhamburger menu on Instagram web. It makes a dozen requests, shows you a loading skeleton and takes 5 seconds before you can see a finite list of menu items. Ironically Facebook was super popular in the 2014s because they didnt have much React based BS going on. Everything was just good old hyperlinks.
If the creators of React haven't figured it out, what makes you think you can?
> Ironically Facebook was super popular in the 2014s because they didnt have much React based BS going on.
facebook was super popular in 2014s because they were just starting the transition from mostly being about people to mostly being algorithmic rage bait, and they tapped a new market of fox news/conservative talk radio listeners
To be fair, Facebook invented React slightly before 2014 so the original point seems very very strange to me.
If there is one thing developers hate its admitting that something is too complex. They feel it makes them look dumb, and for some it is perhaps some form of job security.
You don't have to have a technical discussion whether or not React is too complex, you just have to look at the average website created with it.
I'm curious how many web issues can be solved by having the people responsible for the relevant sites only be allowed to use them on a Windows 11 machine with only 4 GB of RAM using Firefox with the network throttled to 3G speeds.
Assuming the processor isn't horrible, I can still browse plenty of sites with those specs without much issue, and on the sites that do require more, it's very rarely because the sites actually needs it (i.e. I'm not running Windows XP in a VM in the browser or something). It could just be normal HTML and CSS and normal forms, sprinkled with some light JS to help out a bit. But the amount of sites made with that level of care and attention are sadly rare, since the people responsible rarely feel the pain or have the empathy to fix the problem.
+1 to the idea. Developers should have a powerful machine to develop, but a minimal machine to run and test.
> Windows 11 machine with only 4 GB of RAM using Firefox with the network throttled to 3G speeds
And their mobile device should be the cheapest Android phone from a monthly cell provider you've never heard of. This is what the real world is for a lot of people, and a huge number of developers simply don't know or care.
And with a small screen.
The number of websites that are almost useless on the iPhone SE is getting pretty insane. Many site have a massive header, maybe a footer and a sticky ad. That frequently leaves less than half (~4.5cm) the screen usable.
I don't even think Apple cares about smaller screens anymore, because iOS UI elements also overlaps in some places.
Don't tell me were going to rediscover progressive enhancement all over again after more than a decade. Back when we used to actually care about the end user whether you were programming frontend or backend.
Too much VC money and big tech influence in the JS ecosystem made the web worse in some ways.
I keep hearing the term "dead internet theory" getting thrown around, and at first thought it was referring to web pages that don't work, not high rates of bot-generated content.
I've had far more trouble with web pages that only work on a computer that's at least 80% similar to the developers computer, and the RAM sacrifice has been accepted, than from bots diluting real user-generated content, assuming I can even get to the page, if the CDN doesn't think I'm a bot myself, because I'm not logged into a Google or Apple account and their captcha is so bad only a bot could get through it.
I'm not convinced from the article that HTML-first was the thing that fixed the problem. What fixed the problem was 1) the person building it knew what they were doing and 2) it had design constraints from the get-go to be user-friendly. You can do that with React. It's arguable whether it's easier or better, but you can get there regardless of the approach you use.
1. Presumably the team that made the previous app also thought they knew what they were doing. Presumably they were not hired on the assumption that they couldn't make a good app.
2. The design constraints had always existed, the previous app just failed to meet them.
1a. They may have thought they knew what they were doing, but their work product shows otherwise.
1b. They may have thought they knew what they were doing and spoke confidently enough to convince whoever was doing the acquisition, likely non-technical, of the same, but the bad hire and the bad hire’s work product shows that neither was the case.
2. Ideas merely exist. To be constraints, they must be enforced.
I was going to comment on the Terence Eden excerpt quoted by the author about the woman researching housing benefits on an old PSP browser, when I noticed that you (the OP) are Terence himself. It's strikingly powerful, and a reminder of the duty we have in building our infrastructure.
> Of course, your javascript-based analytics package doesn’t see the users you are bouncing because of javascript failures.
It is frightening to think of how many people are alienated from critical systems every day because of this bias reinforcing the idea that they do not exist.
just use firefox with an adblocker like adnauseam and a fairly decent chunk of the internet stops working, including chase.com and several other massive corp sites.
I can't imagine trying to use links/lynx or a browser with less market share than FF that isn't based on chromium.
Chase works with ad blockers, though.
It doesn't work if you disable JavaScript...but it wasn't always this way!
They had a mobile version of their online banking service at https://m.chase.com that was EXTREMELY FAST and did 85% of what you need to do in an online banking portal (check balances, transfer funds). They scrapped it when they moved to their current bloated monstrosity of the portal that they have today.
It was a big reason why I moved to a credit union (who outsources their online banking services to Alkami, which maintains a very tight portal and supports 2FA AND passkeys!).
i am unclear on if it's because of the adblocker (specifically i use ad nauseam which does block some JS. some.) or because of firefox. I can load it on edge every time it fails on firefox. last week, chase.com worked fine on firefox. the previous 15 months where i needed to log in, it did not.
Someone at chase isn't checking their work on firefox.
When I have to log into Chase on my computer, I do via Firefox, and it works fine. Maybe you flipped something on in about:config that's breaking it?
i love that i'm holding it wrong. thanks, HN.
FWIW I use Firefox with uBlock Origin and Enhanced Tracking Protection, and use Chase's website almost weekly. No issues that I've noticed on MacOS or Windows
CDNs like Cloudflare will often block traffic if you don't leak enough data to differentiate yourself from a bot. It's usually not very transparent either, with vague error messages. They've given up on just throwing up a captcha then letting you proceed, because bots are much better than real people, at solving them.
And that is what pixel tracking is for. :)
What's wrong with web server logs? That would give you the number of visitors, if not the pageviews on an SPA.
The PSP has 32MB of RAM plus 4MB of embedded RAM, upgraded to 64MB of RAM in later models, the browser also is limited to only a subset of that. I wonder how old the anecdote is? It's hard to imagine any websites now working on that. It does have javascript, but a version shipped with Netfront browser from 2011 or so. https://en.wikipedia.org/wiki/PlayStation_Portable#Web_brows...
Nice to see that Astro supports non-js browsers. Perhaps website developers, especially ones needing to develop for government services, should use 1GB Raspberry Pis for testing, but that would still have modern javascript. I got a 1GB RPi 4 in about mid-2019 and was rudely reminded of how much memory Chrome used even back then. More than 1 tab open and it would be killed.
The Eden quote is here https://shkspr.mobi/blog/2021/01/the-unreasonable-effectiven... and it has some stats of gaming consoles using uk government sites.
I used PSP browser a lot in the mate 2000's, and don't remember having much trouble. It could even display pages that, at the time, ware pretty bloated, like the Flash-based Homestar Runner cartoons.
This takes me back close to 15 years ago: using backend session management in Grails and the html forms that were enhanced with “some” JS, using responsive CSS. The difference at that time was browser tech not being as advanced as now, we had to care for different browsers and deal with IE7 and even IE6, it was difficult and we needed extensive QA (Browserstack would appear later). There is a reason why we had JS library evolution. Dude there was no npm, not even bower. Then we had Backbone.js - loved it, then AngularJS - amazing, then Angular version which had huge breaking changes then React, Polymer etc. Native browsers can do a lot these days, it is easy to enhance the functionality as well. But it was not always the same, the decisions to use React made sense for a variety of reasons at the time, maybe it was the case here as well.
I remember when YouTube implemented a new html player and suddenly, unexpectedly, they had all the is traffic coming from rural Africa. Size matters.
People who built a crappy website using React are just as likely to build a crappy website using Astro, HTML-first approach or any other technology
Not really, no. Astro requires you to opt a component in to client-side rendering, React (with its server components etc) require you to opt out. Defaults matter in scenarios like this and I'd bet the average developer of crappy websites would have a much faster site with Astro than React for that reason alone.
Small correction: it's other frameworks that require you to opt-out, most notably Next.js. Although I've been seeing so many people confusing Next.js with React lately...
Astro itself works just fine with React, and it can still be HTML-only.
But you can also render React on the server yourself using renderToString, if you don't want a framework.
You can do a bad job with any tool but you cannot do a good job with any tool.
This is patently untrue, give a craftsman terrible tools, and they'll still produce a decent end result. That said, defaults matter, and astro is going to be significantly more friendly out-of-the-box to low-end clients
> give a craftsman terrible tools, and they'll still produce a decent end result
This is an absurd statement. Just because something is a proverb, doesn't mean it's automatically true for all cases.
> Just because something is a proverb, doesn't mean it's automatically true for all cases.
A professional woodcarver armed with only a metal spoon will still make a nicer woodcarving than I can given a full wood shop. Similarly, if you only give me notepad.exe, I can still make a pretty nice website.
Does using the right tools make our lives easier? For sure. Using mildly-wrong tools (react, in this case) isn't going to hold us back very much though.
How good are you at hammering nails with a screwdriver? Tools are important. We have a more apropos saying in our industry: use the right tool for the job. Don't let your brain get fried by the 'poor workman' adage, it's talking about the difference between an expensive tool and a cheap tool of the same kind, not two tools of different kinds entirely.
> it's talking about the difference between an expensive tool and a cheap tool of the same kind, not two tools of different kinds entirely.
I have trouble seeing how React vs Astro is two tools of different kind entirely?
Astro itself uses React.
It can use other libraries with it too, or just plain HTML, but it’s not in the same space.
React can’t work on the backend by itself without Astro, Next.js, etc, or some hand-made micro-framework.
i dont think thats a proverb though? the actual idiom is more like
> A poor workman blames his tools
which is towards the opposite meaning
The presupposition is that workman chose his tools and brought them with him.
At least it'll be a fast and crappy website.
yeah, I love when shit loads immediately, so I'm not wasting seconds of my life just to see shit.
It's definitely possible to make slow server-rendered website. Most of the slow client-side apps are slow because they're waiting on slow network requests.
(I still very much support fast, simple HTML websites. The good ones are a fantastic user experience)
but the host (the company) will need to pay the price in the form of server equipment. Not the user as is the case with client side rendering. If server side rendering becomes slow it will affect all users regardless of their hardware or connection, prompting earlier response from management and devteams.
The cost difference between client-side and server-side rendering is pretty non-existent these days.
True. Crappy developers will build crappy websites irrespective of the tech.
The article is clearly aimed at non crappy developers or developers who want to do better for their users.
And it provides an anecdotal experience where an HTML first option developed by a good developer was far superior to what a JS necessary option would have been, given the user base of this application.
with this logic, why discuss any technology?
true, but where can I find the smallest functional react website where react is needed...?
I disagree. An HTML website which uses links, forms, buttons and inputs will by default:
* Have working back/forward buttons * Have working progress indicator as provided by the browser * Show errors to the user - even if they are ugly * Be accessible to keyboard navigation
With SPAs these are all things the developer has to get right.
So often when using a SPA I'll click a button, you get a spinner and then nothing will happen. Is it still in progress? Don't know. Eventually I'll open developer console and trace the network requests to find the JSON HTTP request that returned "ERR_BAD_EMAIL" and fix what I've entered. With a normal form submission at least the user will see the error message and can press back and then fix it.
"What one man built, another will always find a way to break"
I find it's way easier to build crappy React apps than an HTML-first approach.
An "old school" Ruby on Rails/Symfony/Django app, with templates, usual get/post forms etc, frames you and pushes you in using the standards and relying on browser default behaviors.
In JS-heavy apps, it's as easy to code normal `button` elements as it is to code clickable `div` elements. But with the divs you just forget to handle keyboard nav, proper element roles, etc. It's easy to create fake links, not relying on `a` tags, using an internal JS router that doesn't expose URLs, doesn't handle middle click mouse, for no particular reasons.
In less JS-heavy contexts, the easiest way to do is to use proper HTML so you are less inclined to mess up.
Even on codebases that use a decent framework like Next.js that handles those for you on paper, it's often we see people not very aware of the benefits of using proper semantics and standard behaviors, and you easily end up with web apps with poor UX in the end.
I agree. Server-rendered React can also send down 100% HTML apps.
But I 100% see where the author's coming from, considering the massive fragmentation of react codebases/patterns and decision paralysis of React development in general. I really doubt most React apps, even the more accessible ones, are testing their multi-page form wizards with JS completely turned off.
HTML-first does seem highly underutilized in the commercial web, and I learnt a lot from reading this (as a solidJS/react dev).
This reminds me of the story of the "Feather" project at YouTube where they improved a lot the page weight and the average page latency went higher just because they were actually seeing a lot more traffic from places with slow Internet.
https://blog.chriszacharias.com/page-weight-matters
> When we launched, the number of people completing the form doubled. The analytics people didn’t even know where these users were coming from. Of course, your javascript-based analytics package doesn’t see the users you are bouncing because of javascript failures.
Yeah, reminds me of the b52 story re holes in wings on the planes that made it back from missions, leading them down the wrong path of strengthening wings. They weren't looking at the planes that never came back with holes in the fuel silages.
Certainly not the b52, which arrived after the end of WWII…
> this was a regulated monopoly, and if their customer satisfaction dropped below 96% (if I remember correctly) it could result in millions of pounds in fines.
OK, I'm still at the beginning and irrelevant to the article, but as a USA-ian, I am so jealous about that. Unheard of here.
I moved to the UK in 2016.
The public sector, simple, no frills, accessible, no flashy graphics, websites were a massive eye-opener.
They just worked. They had a job. They did it. I wasn't going to buy more from them because of it, and they didn't care. It was great.
I've heard that recently they've dismantled the centralised team that wrote all the rules, enforced it, and started moving to decentralised hosting, but so far the whole still seems to hold to together really well. I think, I hope, they have embedded the expectation that the local council, the tax office, your visa status, etc, should just be utilitarian in nature, and work for everyone.
I worry how long it will last...
That hit me, too, specifically thinking about my current gas/electricity provider. I have not heard one single piece of positive feedback from the public, and there's only ever problems. I feel like that's a pretty universal experience here. Even outside the scope of websites, it holds so very true.
Personal anecdote: Recently they were updating everyone to "smart meters" on the gas lines. They needed me to be home so they could enter my apartment and bleed the gas out of the line by turning on the stove prior to replacing the meter. I played phone tag with them for 6 months, setting up countless appointments, and nobody ever showed up, the meter remains un-upgraded. At the same time, I have received weekly phone calls and monthly physical letters stating that if I don't upgrade the meter, my gas will be shut off. I just moved, so the new tenant will have to deal with it now.
Hmm I cannot load the font on Firefox 151.0.3 Arch Linux. All I see is only a title and empty paragraphs. So I end up reading the article in the source code mode and felt pretty on-brand.
Back to HN comments it looks like this wasn't actually intentional?
> Arch Linux
You've only got yourself to blame, there.
I like JavaScript-light websites just as much as anyone (my own website works on the same principle). However, I do wonder how much of the increased traffic has to do with AI agents that now have an easier time working with the more standard web forms. My own contact form had a bunch of bots quoting Scorpion lyrics before I added a rate limiter.
None of the increased traffic was from AI agents. FTA: 'The results? When we launched, the number of people completing the form doubled.'
All completions were real people. It's a government website.
Good post, but:
> A venerable web application pattern that has had a small modern renaissance thanks to Remix
Remix is not that popular. I don't think attributing this to remix is accurate. Next.js quite possibly.
The full context of that quote makes it clear that it's meant more as a wry joke:
> A venerable web application pattern that has had a small modern renaissance thanks to Remix, form submissions and redirects took a while to explain to my colleagues, on account of everyone being used to heavily client-side web applications.
(Although it's not really a joke, it's pretty amazing how many professional web developers these days don't know how to use forms without JavaScript.)
The opposite is why I'd never be a good web developer. I grew up messing around with PHP and if I spent the time to learn the modern stack, I'd constantly be thinking it's stupid.
I can relate to that.
I recently had to intervene during the latest office holy war to explain that you don't need JS for file uploads.
It was eye opening.
I'm in the same boat as you. Today I generally use Laravel for new projects.
I think the author is suggesting that Remix was the inspiration for the renaissance, not that it's necessarily the most popular method for doing so.
I'd be curious to see the stats on how often Next.js users lean into the server component model that makes the frontend fast. My anecdotal experience is that it's an afterthought for many. By comparison, Astro (as mentioned by the author) makes you think about this stuff upfront via opt-in rather than opt-out. It's a wonderful framework.
Opt-in = action is required to opt in = off by default.
I think Remix brought back interest in Form Actions and other meta frameworks took inspiration from that.
Remix has been nonetheless influential in the space, in the same way preact and signals have been.
The quote from Terence Eden almost made me cry. Actually the whole article did.
I'm personally of the mind that any .gov or utility website should work on old browsers, or at least have a lite fallback to ensure everyone can at least read how to do something the pen and paper way
Note: the <input> tag does not use and does not need a closing slash and never has in any HTML specification. https://html.spec.whatwg.org/dev/input.html#the-input-elemen...
Related recent threads about react performance:
JavaScript-heavy approaches are not compatible with long-term performance goals 178 points by luu 3 months ago | 237 comments https://news.ycombinator.com/item?id=47029339 (should be called "Why React is not compatible with long-term performance goals")
Does anybody like React? (jsx.lol) 242 points by brazukadev 15 days ago https://news.ycombinator.com/item?id=48274077
I should have added this one from 2022:
https://news.ycombinator.com/item?id=30528473
SPAs Were a Mistake (gomakethings.com) 692 points March 2, 2022 | 620 comments
I am not familiar with this astro framework they used. But having built some sites using Pure HTML/JS back in the day, React, Angular, Vue, Rails ERB, Rails Hotwire, and HTMX. I think HTML first websites are absolutely the way to go. Rails Hotwire with View Components makes rails sites super fast, faster to develop and easy to re-use components. HTMX more generally, but Ive used it with Spring boot and Thymeleaf. I really don't want to go back to SPAs. Development time is less and the website performance is better, and I haven't really seen any regressions in capability. With HTMX and some url parameters, I can make a pure HTML site that seems like a Single Page Application but without the excessive loading times.
I first tested Astro on my site and never went back. Now every new project defaults to Astro and I have to have a reason not to use it. So far no reasons. It's simple, fast and it kinda fits my desire to keep things minimal. For example, yes, page content matters, but all but one page on my site is under 10kb, most hovering in the 3-4kb range (100% of the downloadable content)
Yep Hotwire and Hotwire Native are amazingly useful tech.
This is such a great story. I am glad more people are sharing stories like this. I hope my article the other day inspired more to develop lightweight websites:
https://inavoyage.blogspot.com/2026/06/im-building-parallel-... https://inavoyage.blogspot.com/2026/06/how-about-new-java-ba...
“but that’s a lot more work for us.”
Even if it is more work (it isn't, the author of this phrase probably is just not familiar with this "tech stack"), the sum of saved time for the users is far more important.
What do people like for form validation?
In this article he recommends the “validation-enhancer” library:
https://www.npmjs.com/package/validation-enhancer
I’ve also seen one called “formisch” that the author of valibot is working on:
https://github.com/open-circle/formisch
They’re both pretty new. Has anyone tried them?
My biggest tip to reduce complexity of data validation if you are using React is to stop using React controlled components and switch to React uncontrolled components. They are an underused part of React. You usually don’t need React to handle every single keypress and every single character being entered by the user. In fact before React popularized it, it was unusual for form components to update on each key press; traditional desktop apps tend to validate when a field loses focus only, not on each key press. This has at least three benefits: (a) good for performance, (b) reduces unnecessary error UI when the user is in the middle of entering data, and (c) simplifies your own code by not having to deal with prefixes of valid input that’s not itself valid.
Also allows user scripts to interact with the forms, eg I can run a bookmarklet to fill out certain forms. With React controlled components all these changes are wiped out and reset with the state that React has in its app memory.
I actually like the built-in stuff and the Constraint Validation API. I wrote about using it with htmx: https://dev.to/yawaramin/handling-form-errors-in-htmx-3ncg
I try to stick to plain HTML5 / Javascript validation. Trying to not reinvent the wheel and use what the browser already has built-in seems best.
"customers could either use an old ASP form on the website"
Did I miss it, or did the article neglect to explain why this was a problem?
You ever tried to maintain or enhance an ASP form that was built 20 years ago and enhanced by random devs with no documentation? I was working with ASP forms 15 years ago that were hopelessly outdated, included tons of technical debt and were not in the least bit user friendly. You can accomplish so much more with things that ship in every browser now. It’s not a very modern technology and you miss out on things that are now very standardized and much, much easier and quicker to develop and maintain.
Also, Microsoft.
In the age of LLMs it shouldn't be a big deal to migrate any legacy ASP to .net core, surely
HTML first, minimal JS, not using any frameworks unless absolutely justified is already part of my prompts to LLMs when I build stuff for myself. I’m not a frontend developer, and have not kept up to date with the ton of frameworks. That HTMl first approach already makes the LLM outputs faster/fresher for me. I wish more people went this route for public facing services.
Old people. They exist.
Not even that old. 60 year people can't user your fancy site because then don't have an internal model of how a computer works.
You know that when pressing a button a hidden engine runs in the backend (or something runs in the backend). You expect an answer and if the expectation do not match the result, the model in your mind creates an hypothesis about what maybe happened and iterate from there. Maybe you should have clicked something before? Maybe you should mark some form checkbox?
Old people don't have that because they didn't grow up with computers.
What is on the screen is what they see. I clicked next and nothing happens. Well... the site is broken.
You known when you plug your refrigerator and nothing happens and instead of reflecting on the possible blown out resistor that you can bypass with a small wire you understand that your only relationship with the refrigerator is plug and unplug or call for help? That is an old person using your site. They won't fight against it. They'll give up immediately.
Giving up is a wise choice: there are so many other sites to interact with. On the other side they have only one refrigerator.
Next time I have trouble checking in on an airline site I’ll remember that there are so many other sites to interact with that whatever I was trying to do probably doesn’t matter.
I wouldn’t sweat the broken fridge either though, there’s so many other electrical appliances in the house to use.
Is entirely context dependent. I can agree in some scenarios but when it’s a utility or gov site that I can’t really avoid it’s less straightforward.
I wish I could convince my grandmother of this.
"Why did the bank change the layout? I want the old one back!" - Don't like it? Change bank then. That's what I did.
I get that changing to another bank is a big unknown, but it's probably still worth it to show your displeasure. Plus her bank are morons when it comes to several other things.
The problem with changing banks to search for a ux you like is that it's not easy to see the ux before you've invested in signing up.
My main bank changed their UX not too long ago, and I liked the old one better, but the banks I've signed up for since are even worse. I signed up with them for other reasons though, so I put up with them because it's worth the pain. It does make my main bank look better though --- mobile style on desktop is annoying, but at least I can easily find everything I need... And it's not really their fault there are seven different options on the transfers page (including my favorite: same day transfer vs next day transfers... at one point same day transfers had a fee but they don't anymore so from a user perspective, it's the same thing but you can have it slower if you want...)
Also, signing up for a new bank these days is an exercise in KYC frustration. And then you can't actually transfer your money and use it, because banks responded to the dumbass check fraud that was being promoted on social media by limiting new accounts.
> The problem with changing banks to search for a ux you like is that it's not easy to see the ux before you've invested in signing up.
I agree. Better to deal with the devil you know rather than potentially one you don't.
Thankfully, I switched to a bank with a UI that was known good going by all the chatter I'd heard, but that's not really something you can guarantee to know. And even if you do know, if the rate is drastically worse at that bank than any of the others', then that's kind of moot.
Yeah. We grown being trained to solve those small puzzles that are websites and apps, so we learned _how they are projected_, not how they work.
I mean, we learn that a enroll is normally a flow. Flows have steps. So if you came to the end of the flow and the finish button is gray, you think.
Hum… I'm used to flows. This is a multistep flow. Flows normally need me to fulfill some small checks and won't let me proceed between steps if something is missing. But some won't. Maybe this is one of those? Some flows have warnings in the end, some have next to the thing missing. I don't see any warn in the last screen, so I'll go back every step and check field by field for errors. That'll probably do.
This is the model you have in your mind, of how a website or an app works.
People that came to computers, apps and websites later in life didn't learned the puzzles.
There's a great book that explains how abstract computer systems have become from the machinery: https://dabacon.org/caelifera/2017/02/05/book-overcomplicate...
> Old people don't have that because they
Aren't insane.
When did the industry put the onus on the user to understand how the computer works? What happened to the old days of Xerox PARC's HCI studies putting the user first? The computer is in service of the user, not the other way around!
If I need to build a mental turing machine to understand your application, it is a bad application. It is rather the engineer's job to build a mental model of the user and their needs, and if you can't do that you should not call yourself a software engineer.
Automation generally goes along with a transition to more "self-service" approaches that require the user to model internal states and workflows of whatever they're dealing with.
This is even true for things as seemingly non-technological as getting to your flight once you arrive at the airport. People who are used to dealing with a service desk might just show up with their printed ticket without even having looked at it, take it to the counter, and expect instructions on what to do next without having read or considered all the fields present on the ticket.
It's not just about understanding the technology, but sometimes about understanding the business, policies, whatever. When a human agent or customer service worker is handling that stuff for you (typical in the pre-computer age), you barely have to think about that stuff and even if you're told, it can be "in one ear, out the other". Automation very often means pushing a requirement of more understanding onto customers/users.
As a firmware engineer, my philosophy is this: if I'm doing my job properly, the user should never even know I exist.
Maybe this isn't applicable to all software devs. If you make web apps, users actually see your UI, they click an icon or type in a URL and hit enter with the intent of using the thing you made. With firmware, that's not how it works.
When you hit the "mute" button on your laptop keyboard, it should just do it. The audio should turn off and the little LED should light up. If that fails, even once, the mirage is broken. The user is forced to think about the fallibility of firmware, which is a word they might not even know, and still struggle to conceptualize if they do. I think it also has a lasting effect on the way someone thinks about the pruduct: Is this going to work today? Why did that happen? Was that a virus? So on.
OTA firmware updates have the same problem. Most users don't know what the hell firmware is. All they know is their computer is showing a loading screen they've never seen before. It's unfamiliar and weird.
Like I said, I don't know if this mindset translates perfectly to other fields, but the priorities that fall out of my philosophy certainly apply. Reliability over everything, and get it right the first time.
> my philosophy is this: if I'm doing my job properly, the user should never even know I exist.
This is my philosophy too working in infrastructure. It’s my job to care way too much so downstream users don’t have to.
I have this quote from Wag the Dog burned into my brain.
Usability was thrown to the wolves in favor of more readily available designers from non-UI backgrounds, brand identity (“UI as branding”), and pretty screenshots for slideshows and marketing.
The pendulum is overdue for swinging back the other way, but I don’t know who or what has both the capability and will to give it the push needed to send it on its way back.
> When did the industry put the onus on the user to understand how the computer works?
Just after the turn of the century, that was when there was a big shift in the industry to move all user interface design work to artists, and away from original user interface specialists. The whole profession of user interface designer (one who understood "form follows function") ceased to exist in the early 2000s, as all work was assigned to graphic designers (who only understand aesthetics).
This movement can be seen clearly in the evolution of widget toolkits for desktop applications, which peaked in usability in the late-90s/early-2000s, and have been losing usability while getting prettier with every iteration since.
> 60 year people can't user your fancy site because then don't have an internal model of how a computer works.
I think this is a bit outdated. I'll be 60 in a month, and have been practicing and writing about machine learning, for money, for a straight 10 years now; and I was a young man (and a full stack developer) during the digital revolution.
If anything, GenX had to work harder to get into these brittle emerging technologies and paradigms. There's no-one of my age group, at least that I know of, who is remotely as tech-illiterate as your comment depicts.
Truth is that it took so long for smartphones to dumb down everyone's tech acumen that those of my generation had already learned to do it the hard way.
GP clearly isn’t talking about 60 year olds who were full stack devs and get on Hacker News.
Well, neither am I - I am talking about my own peer group, non-tech types just fine with computers.
60 year olds have been using computers most of their working life. Word processors and spreadsheets having been ubiquitous for office workers from at least the early 90s.
> 60 year olds have been using computers most of their working life.
Absolutely. I am in full-time work, and expect to be for another decade. I have worked my entire career in IT, doing tech support, training, systems design and implementation, tech journalism, and tech writing (i.e. documentation).
I will be 60 in less than 18 months.
> Word processors and spreadsheets having been ubiquitous for office workers from at least the early 90s.
You did say "at least", but still... longer than that.
I started work in 1988 and they were already ubiquitous in my world. Richer companies had the fairly newfangled IBM compatibles, which were still big and expensive. The cheap Amstrad PCs were just starting to appear.
Older hands had multiuser boxes with SCO Xenix or DR Concurrent CP/M or Concurrent DOS and a bunch of dumb terminals. My company had switched to these from Alpha Micro systems running AMOS -- and again, dumb terminals. One of my clients had a DEC PDP-11.
The real old hands had 8-bit kit: some CP/M, and a few BBC Micros.
The first big migrations I saw were from standalone (or multiuser) PCs to LANs, and from pre-PC systems to PCs and Macs.
That would be "60 year olds who have been office workers most of their working life"
60-year-olds who worked blue-collar for a significant part of their life, this is not so obviously true for.
Also probably not true for 60-year-olds who worked in other non-office jobs, like acting or sports.
There have been a variety of well-paid jobs that didn't use computers that a 60-year-old might have done over their life, meaning that this can't even be broken up along class/income lines.
I'm 55 and likely have been using computers longer than that poster has been alive. Regardless of the fact that I started young, by the time I was in college the PC revolution was in full swing and everyone had and worked with computers.
My mother, born in 1934, had no problem using computers. She didn't internalize how they work, but she learned the workflows she needed. How to launch applications and so on.
The situation described in that comment is just a broken app, it has nothing to do with the age or the understanding of the user.
Most people under 60 aren’t full stack devs either.
> practicing and writing about machine learning ... full stack developer ... digital revolution.
my mum, a boomer now in her 70s, would have no bloody clue what you're talking about. she used to work helping out a guy who was doing punchcard programming back when she was young. she ain't dumb. if i broke it down into normal human english words, she'd probably get a sort of idea (or at least nod along to humour me).
i've lost count of the number of conversations i've had with my dad, late 70s boomer, where he complains that they've changed the UI. "It's all different and i don't understand, why did they have to change it? I don't know where anything is now." he's been moaning about things like this for over a decade now (so since his late 60s).
there are definitely technically not-very-literate 60 year olds and the general point about older folks, whether that's >60 or >70, is very real:
older people exist who don't have a clue about SPAs/PWAs, and chances are they're either asking their offspring for help (my mum does this), trying to phone someone instead (my mum does this) or just walking away from it (my mum does this).
To be fair, the UI randomly changing in every update is a pain point for people of any age.
Dude, you know what he meant. Don't be the internet pedant. No need to be the protector of your class, especially one so inconsequential as "literal 60 year olds".
Instead of "old person" he put a number on it. (Cue the people who need to cut me down because I used a male pronoun for an unknown poster)
Some people know how to fix a fridge.
I would argue it's not even old people. Most people do not have any understanding of what's going on when you click a button. Website either acts as expected, or it doesn't "work"
If the button doesn't work, the average user is going to say "this most be broken" and then use a competitor (or contact your support). That's why it's really important to error-proof one's design (eg https://en.wikipedia.org/wiki/Poka-yoke).
So instead of the button failing because you didn't check a box, pop up with a message telling them "Please click $box before continuing". Or if you want to be fancy, feed them whatever form you're giving them piecemeal, so that they can't continue until they finish this small part (e.g., have them input a name, then the next page only has a spot for an address, then the next page only has a spot for card information, then the next only has a spot to select shipping). Simple bite sized chunks anyone (well, anyone you would ethically want to sell to) can understand.
Yep, I changed town a few years ago and my new social circles are mostly like that.
Either it works right away without any further questions, or they'll not do it.
Sadly, also if they can't do it on their phone, they will not do it. It's actually very hard to get people motivated to do anything that has to do with sitting down at an actual computer anymore. Which is a bit hard if you're in a very technical political advocacy group, kinda makes me the guy to do everything remotely complex... XD
Yeah, it's really, really not an age issue. If there's an age distinction, it's the range of people who were brought up on computers before the UI was really polished, but even then it's not consistent, and they may not have deep understanding. Kids brought up on iPads, and who aren't forced to learn by their interests or educators, have no clue.
And now also a lot of young people. They grew up with iPhones and many think that "Wi-Fi" = "internet".
Keep it simple and light. HTML+CSS first, JS to expand functionality. Don't re-invent the wheel.
"Old people don't have that because they didn't grow up with computers."
You know, it's time to stop this trope.
People who are 60 today were born in 1966, they probably entered the workforce in the mid 80's. They probably are not even retired yet. They know how to use computers, they own a smartphone (or if they don't, it's probably for economic reasons unrelated to their age).
As a founder and product manager, this kind of thinking is unhelpful as we design the future. In many ways it's actually ageist to imply that old people are unable to utilize everyday technology.
I was building public service websites (BBC News website) back in the early 2000's where accessibility was a real and important consideration. Technology progresses, and the bar for accessibility has moved up.
My father is about to turn 80 - he checks his heart with his Apple watch, video calls his grandson from his iPad, and asks ChatGPT questions from his iPhone and MacBook Pro. Maybe he's more unusual for 80yo's but it's time to stop this lazy trope that old people are technically illiterate.
(also, shit, I'm only 15 years away from being 60 myself :/ )
I think the relationship people are seeing is "80 year old can't fill out my form, must be because they can't use a computer." But international surveys like PIAAC [0] indicate that adaptive problem solving is the real problem. 30 percent of adults are at or below Level 1; I've copied and pasted what that level represents below:
> Adults at this level are able to understand simple problems and develop and implement solutions to solve them. Problems contain a limited number of elements and little to no irrelevant information. Solutions at this level are simple and consist of a limited number of steps. Problems are embedded in a context that includes one or two sources of information and presents a single, explicitly defined goal.
This test is administered on a tablet, so I think scores can be interpreted as a sort of combo of computer use and problem solving.
A full 40% of adults from 55-64 are at that level or lower. Wikipedia thinks that a novel online form would be a Level 2 task, provided it involves navigating across more than 1 page. Based on that framework and assuming your dad can use the sort function in his email, he represents a top 20th percentile adult for the 55-64 age group. It's probably even higher considering his age as the trend is towards older groups having a rougher time with the survey.
I also think it's ageist to assume that older people can't use a computer. But assessments like this indicate that a full quarter of the US regardless of age would have trouble with some of the basic tasks we associate with computer use. So designers should consider their intended audience when deciding what's simple or not simple enough.
[0]: https://nces.ed.gov/surveys/piaac/2023/national_results.asp
I'm curious how this lines up with US literacy rates. Is the group of people who can't navigate a two page online form the same as the one have reading comprehension skills on a 5th grade level or lower? Or do they at least largely overlap? In my experience they do, but it'd be nice to have confirmation.
I got taught in school to check whether or not the piece of paper we got with the test on it had something on both sides, so you didn't hand in a test that was only half done. I thought that went without saying back in the day, but given that filling out a two page form is a non-trivial task for what should be literate people, I guess it doesn't.
Your intuition is largely correct. For any given level of adaptive problem solver, approximately 55% of those people share the same literacy level (i.e. a Level 1 adaptive problem solver is also a Level 1 for literacy around 55% of the time). 35% have a reading level that's 1 up from their problem solving ability, and around 10% have a literacy level 1 below their problem solving ability.
You are just describing a broken site?
I've seen static sites with these same problems, 404 was invented decades before React...
I think he means the submit button is disabled because some field failed validation. It might have turned red or have a message appeared next to it - and it might be scrolled off the screen so you have no idea. Or just the common "I have read and agree to ..." checkbox you didn't tick. Possibly because you didn't read the T&C or because it won't let you tick it until you click the link to the T&C. Nobody else read them either but they've learned through trial and error that when the checkbox doesn't work, you have to click the link to fool the computer into thinking you read it.
Yeah. And reflect on the fact that you know that a 404 error is not a form error. Old people won't. Heck then won't understand that a chrome error page is not your site.
> Old people don't have that because they didn't grow up with computers.
You realize that someone who was 18 when the Mac was first released would be 60 now?
Old people. They exist.
It's not about age. It's about ability.
A lot of the people I build web pages for are poorly educated. The text we use for web is written for people with an eighth-grade education. Print material is fifth-grade.
People in the SV bubble can't imagine that there are tens of millions of people in America who cannot understand how an SPA works.
These people are invisible, even as they ladle out the food in the Google cafeteria, and polish the chrome in the Meta lobby.
I'm going to link my favorite survey [0] to illustrate this point. Its called the PIAAC, and it's a internationally standardized assessment of adult skills in literacy, numeracy, and problem solving.
28% of the US is at Level 1 or below. That level roughly corresponds to reading a simple text and being able to answer a question about it that requires limited inference (i.e. if the question is "what color are pigs," the answer would be in the text as "pigs are pink in color.")
[0]: https://nces.ed.gov/surveys/piaac/2023/national_results.asp
This describes all non-technical users, not just "old people."
Yes, but even non-technical users have a different relationship that formed over the young (neural plasticity) days.
"I click the <next> button on this form, nothing happens. Given that I have an internalized notion of forms as a multistep flow, maybe it couldn't advance because something is missing on the current step? Maybe it will give me those messages below or above the form? Maybe some read message somewhere? I'll search for those and try again"
vs
"I click the <next> button on this form, nothing happens. Not sure what would happen next. Maybe the thing will tell me? I can't see no dialogs, no messages, no error screen. Nothing changed. Maybe if I press it again? Nothing? Hum, maybe is disconnected from the network? It's the wifi again? Maybe if I power cycle the wifi router it will reconnect? I click next again now I get a clear error message: no internet connection. I suppose my internet is broken again. Will call my tech-savvy friend."
> 60 year people can't user your fancy site because then don't have an internal model of how a computer works.
Many developers are unaware how many people are not comfortable with computers.
Here's an example with my dad, 64. During Covid, he had to get his medicine by emailing his GP instead of going to him. He received the email address as a photograph of a piece of paper over WhatsApp. (Clearly the doctor wasn't comfortable with tech either.) The paper said:
He tried a lot, but every time he received an email saying the address is invalid. After a lot of frustration he asked me for help (he's not the kind to ask for help).
He said "I tried everything: lowercase, uppercase, spaces between '.', no spaces, space between '-', no space... Nothing works!"
He thought "-" was part of the email address. To some people it might seem like he was being dumb, but he's never had to seriously use computers before. When he bought our first computer he was 38 and never used it. He got his own laptop at 46, and only used it for movies and Skype, before WhatsApp existed. It doesn't seem that odd to know how email addresses work. (He is a technical person, but not a computer person. For example, decades ago he etched a circuit to make an HBO decoder so we can watch HBO for free.)
Wait til he learns that email addresses can contain spaces and line breaks. They just have to be quoted.
"why
ohgodwhy"@example.com is a valid email address (although I suspect most providers will reject it).
Try having that make sense without all the prerequisite knowledge the average computer toucher has. "Well you see, [...]"
Designing for failure modes (bad network, old devices, no JS) often leads to better systems even in the happy path. This is a good case study of that.
How many people are using browsers which don't support Javascript in 2026, and doing so out of necessity rather than out of choice? I can't imagine this number to be >1%.
How many such devices can still support modern TLS certificates anyway? By this logic, shouldn't we also use plain HTTP instead of TLS?
It may only be 1%, but that small fraction of users are also probably the people who sure as hell don't need even one more tiny thing going wrong in their life.
If you're using a decade old phone to sign up for a utility, you've got bigger problems in your life and no self-respecting person should be adding to them.
A decade-old phone was released in 2016 (yes, we're old).
React already existed in 2016, so did Vue and Typescript. Never mind good old JS.
I frankly can't imagine a device capable of supporting modern TLS stacks but incapable of supporting JS. Much less a phone, which in many countries basically requires LTE (and sometimes even VO LTE) support to function at all, due to the 2G and 3G shutdowns.
> By this logic, shouldn't we also use plain HTTP instead of TLS?
Better would be to use plain HTTP in addition to TLS, rather than instead of TLS. TLS does have benefits, but if it is optional then it can also be used on computers without TLS (as well as potentially other situations where you do not want TLS or where it is not useful).
Remember, "don't support JS" is just a shorthand for a broader variety of situations:
- Old browsers without the modern JS features you're trying to use
- Different browsers, with different features
- JS didn't load due to network errors
Can anyone confirm if Web Components work in the old psp web browser?
The point is that they don't have to! That's what progressive enhancement means.
Empathy and respect for users is what product managers should be doing.
Shipping tens of megabytes per web page is impolite, if not outright disrespectful to users.
They don't know what a megabyte is
They feel the slowness of the page load
Not on their iPhones operating over 5G or the corporate WiFi.
You don't think there's any palpable difference as long as the connection is any good?
I think there’s a palpable difference but many young developers have no concept of why.
It's still present. JSON/JS parsing still has a delay. And in either case (as the author states) not everyone is using an iPhone over 5G. Heavy React apps are a miserable experience on low end Android phones, even when the connection is fast. I've seen JS/JSON parsing times in the multiple seconds.
There's 5 bars 5G and there's one bar 5G anyway... Citing connection types really is completely beside the point.
My old iPhone handles well react apps, but frequently freeze/crash on heavy advertised pages and pages with huge images/auto loading videos.
Read the article. Typical users had old browsers often with poor reception. One user was using a PlayStation Portable which had very limited WWW capability.
The person you are replying to is saying the PMs are using new phones on WiFi, not that the customers are.
Thank you.
"What, support Safari? Isn't that, like, less than 20%? And its standards support is abysmal! No, not worth my time, they can upgrade to a normal browser like everyone else."
Salesforce and SAP are not fast, even on that. But ubiquitous for building corporate platforms for their customers.
The vast majority of global users are not using iPhones.
Yes, that was kind of the point of my comment. Apparently not well made.
But if they dont, where is the disrespect? They dont know what a megabyte is, they dont feel a slow page load. Where is the disrespect?
React is too heavy weight for a lot of things. But it's ridiculous to call it disrespectful.
If Rick Rubin could take a tape to his car to listen to his mixes, your product people can try their websites on £20 phones from Tesco. They can ask to sit in on user tests with minority groups. Extending your knowledge like this is trivial, but rarely done.
May i ask why, specifically, Rick Rubin? I don't know who that is, but whenever we finished mastering a new song, we had a series of "systems" we listened to it on. We went out to my dad's work van and listened there. We called up our friend with a street-comp sound system in his car, and listened in there (neighbors must have loved us!), and then a "cheap" boombox with large-ish speakers but cheap.
if it sounded "clean" on all 3, without the bass muffling everything, and the highs not hurting the eardrums, we called it "good" and released.
Working in the music industry and not being aware who Rick Rubin is… is a bit weird.
i don't work in the industry, sorry. We just made music and released mp3s, 1997-2008. Co-creator of Def Jam, alright.
I wonder if David Lynch watches his stuff on a tiny screen just to make sure everyone has a good experience.
hint: no, he thinks small screens are stupid.
ETA: after like 3 years of mastering and reviewing this way i trusted my ears and my studio monitors enough to know what it would sound like. I also wrote in headphones and mastered on speakers, then remastered in monitor headphones. Anyhow, i think the whole point i was making is "yes, this is a good thing to do, for music, for websites, for software, etc"
Yeah but for those not using £20 phones from Tesco, where is the disrespect?
Not testing your software in the way your users use it is the disrespect. Not everyone has a modern device. Not everyone has 12gb RAM. Not everyone has 100mbps or even 10mbps. Not everyone has "unlimited" Internet.
If your website takes more than 3 seconds to load on the free Metro Wi-Fi, I'll go back to my search and pick a different page. If it takes more than 3 seconds to load on gigabit on a PC, I'll remember it and never click on links to it again.
If you don't respect my devices, then your work doesn't deserve my respect.
(Don't get me started on people calling themselves software _engineers_)
+1.
I have been asked by someone in late 40s why uploading a video takes a lot longer than uploading a photo.
They are not dumb people. They just do not know.
The onus is on the engineers to design for them.
"Does it take longer to upload 10,000 photos than to upload 1 photo?"
If a 40-year-old can not answer that question, then they are in fact - dumb.
This is a matter of perspectives here. Some of my friends are absolutely brilliant lawyers and they trump me in their reasoning abilities (while I am a typ. HN member, high-tech engineer). Yet, they would not know some tech basics. I see lawyers struggle with formatting in Microsoft Word all the time :-), for one.
A brilliant physicist friend likewise once told me he is clueless how real numbers are handled in computers (not talking about floating point encoding specifics but conceptually itself). Yes, I can say that feels dumb, but I cannot deny that he is a brilliant physicist.
It's not about perspectives, basically every human has the same baseline reasoning capabilities. Understanding that "more work = more time needed" is part of that baseline.
The only "excuse" would be if someone didn't know what a film is at all, because they can't be expected to reason about something they don't have any knowledge about.
The consequences of MBs of JavaScript can be perceived by anyone in terms of performance and mobile data consumption.
"If our users can't afford the bits, we don't need them!"
You're not a good and modern engineer who knows his craft if you aren't defaulting to react and tailwind.
And don't dare to contradict me, the fact that MIT-bred leetcode ninjas paid half a million per year can't produce a simple (mostly static) website on that stack it's only because of management that wants to ship the next product. /s
> Shipping tens of megabytes per web page is impolite, if not outright disrespectful to users.
You're being generous with what I would consider negligence.
As a public policy specialist (and a tinkerer when it comes to tech), I read the article with pure joy.
This is the "wonder" that happens when you build for the client instead of for yourself. It takes being truly intentional: sometimes the client (especially that kind of client) does not know what he needs or want; sometimes you as a dev simply build something with good intentions but just out of habit.
Taking the time to ask true, relevant questions, and build backwards, is one of the ways you achieve this. It takes time, energy, intentionality (once again)... but it's worth it.
Everyone pays lip service to 'user experience' and 'putting the customer first', but, only with experiences such as acing customer service forms can one really claim to know what 'putting the customer first' means.
Sometimes it is just a form that you need, with the web page loading a new one after 'submit' has been clicked. Yes we can do fancy things to ajax-submit the data, but did the customer want that?
Getting to the form in its 'final form' takes work, particularly if asking the customer for more information, such as proof of purchase or important documents. Do you just start the conversation with a 'contact us' box to have customer service ask for the bits they need later, or do you ask the customer for all information up front, reducing the need for back and fore?
You need to actively test what your customers will do, with metrics such as time filling in the form and how big the ticket queue is.
There can also be internal problems that prevent getting the form right. For example, if there is some manager in charge of customer service that is an empire builder, with a vast team. If your form decimates the team because everyone is efficient and able to go home at the end of the day with an empty queue, then you have undermined the empire builder, so he will want you gone!
There are some huge benefits to getting customer service right. You can brazenly have phone numbers, email addresses and even physical addresses, all published on the website. If the forms work then the phone never rings, the inbox is empty. And nobody can accuse the company of hiding behind a wall of corporate website small print.
The word of mouth aspect is also not to be overlooked. You can harvest reviews from happy customers that should have been unhappy under the old system. If you fix their problem in an hour, or get a replacement product to them the next day, then they will write you a rave review, with that being great for the customer because they explain better than you can how dedicated your customer service team is.
I use the word customer lightly here, there is the term 'service user' that is used in the public/third sectors, but that doesn't sound good in front of the 'service user', probably because they have an actual name.
Getting to the form 'in the final form' means quite a few small changes that can be easily reverted and monitored. It could be just making an input box only show capital letters, or show a numeric rather than standard keyboard.
Ideally, a submitted form does something when completed to place the ball in either the customer service court or that of the customer. If the customer need to provide some information before anyone need look at the ticket, the form needs to send out that email, then park the ticket awaiting whatever the customer does next. There should be no need for someone on the team to do that step.
I know AI does everything awesomely under all circumstances, but the 3-6 month journey needed to deeply understand the customer, the product and the team is something that needs a human, simply because you are dealing with humans and their emotions.
What has proven to be a huge bonus is CSS grid styling. Inputs and labels can be written without the div and span cruft, with everything lining up nicely with a few align 'center' CSS things.
What a fun time to be doing forms that actually work!
> My client was a utility company
> Adding a lot of pressure, this was a regulated monopoly
> Some requirements I derived: > ... > We had to meet WCAG accessibility (the team settled on AA rather than AAA)
The author doesn't doxx their employer by giving any dates, but if we take the story at face value and assume it took place in last few years, it is pretty shocking.
How does it take a single hero to be fighting for AA compliance as an afterthought for a project with this scope in the 2020s?
I've worked on much more niche projects that treated this with the respect it deserves as a quasi-legal requirement.
It didn't say anyone was fighting for it just that they had to. Whoever fought for the least possible compliance is the real hero. The less of that feel-good nonsense that is implemented, the easier it is for a text-only browser to parse, and the better a graphical browser works with the keyboard navigation that has been built into pretty much all web browsers since their conception.
Ideally, they ignore WCAG altogether, then throw on an overlay if compliance is required, which can be easily blocked by a dedicated blocker (e.g. https://www.accessibyebye.org/) or I just add a list of overlay domains to my ad blocker.
I'm not a fan at all, but the thing I don't get about react sites is do they not lazy load at all?
Large spa apps are very fast if components are only loaded when needed
Coming from a angular1 -> vue2 -> svelte2 -> settling on pure web components with no shadow dom it's a joy to work with, and fast
I'm not a web dev and my needs are pretty simple but I've had a lot of success with jekyll. It's a open source static-site generator.
We have the "social media" companies to thank for this innovation. They introduced these stupid patterns primarily to keep users locked into their walled gardens and the rest of the industry followed them to the bad place like lemmings. Software is a fashion industry.
I've tried this before and I think this constraint is something that has to be kept top of mind for a designer not just the engineer. Most designs these days assume a single page app and there are interaction patterns that make plain HTML not suitable. But if you incorporate this in from the start and stick with it, there's no reason you can't do this.
Also possible to just ignore interaction patterns that don't work well with HTML and replace them with ones that do.
Yeah the uk gov website is indeed petty damn good. For once all the money dumped into studies and what not produced an outcome.
Recently I had to migrate an old SpringBoot app that had a React front-end to a new cluster. Not wanting to mess with super-old dependencies, I opted to rewrite it on a new version of Java/SpringBoot. When it came to the frontend, I paused. I couldn't come up with a single good reason why this app needed React. I rewrote the frontend in straight HTML with a little bit of JavaScript for DOM manipulation. I literally used `var` instead of `let/const` just to drive the point home... (yes, that was overkill). But you know what I didn't need? A BUILD PROCESS! No npm deps. No vite/rsbuild/etc. It was like I had forgotten we could even DO that.
Don't get me wrong, I actually have enjoyed React over these past 10 years. But, including it blindly is just silly.
esm.ah let's you include "complicated" JS that isn't usually found in CDNs.
it doesn't work for everything and imo is worse for (p)react due to the lack of native JSX, but it does allow for bringing in stuff that usually takes an `npm install && npm build`
Yeah in this case, I needed to pop up a <dialog /> and take some form info, persist it via POST and then show the result of a "used" card/token. So there just wasn't a lot of need for libraries. I'm from the VERY old school so I do recall the fresh hell of including many deps via script tags (pre-Bower!)
I was a little confused by "doubled our users" since that's more about inbound traffic than site experience. I guess it's really shorthand for "halved form abandonment" which is still pretty great.
I think that's even more significant, since it's measuring people who cared enough to click the form in the first place, which is juicier than just page loads.
may be he meant, doubled our users who actually submitted the form
Users visited the site and couldn't even begin the form, nor get seen as a visitor, due to javascript metrics and rendering failing.
Doubling conversions, in digital marketing-speak. Marketing firms probably give out fat bonuses for this kind of result.
My go-to for spinning up a site has been Jekyll + Bootstrap with the occasional bit of React for well over 10 years now.
While it still does the job, I'm a little curious to explore more modern options, if for nothing else to understand the choices a more junior dev would face/make today.
I'm seriously considering giving Atro a go. Is it worth it?
Yes
Guess I should have stated the questions as "what makes Astro worth while to try out?" :)
Literally signed up here after 20+ years of lurking, because reading that the PSP had Candy Crush made me stop everything I was doing. This game is a mobile game and did not exist on PSP.
"Clutched in her hands is a games console - a PlayStation Portable. She stares at it intensely; blocking out the world with Candy Crush."
You missed the point. The guy thought she was playing a game, but she was actually using the built-in web browser on the PSP. Whether it was Candy Crush or Tony Hawk Pro Skater or Super Mario Bros. (also not on PSP) doesn't matter.
She was using what is broadly comparable to a WebTV browser to access a government site, and it worked because the guidelines for gov.uk are so very, very good.
(The UK gov sometimes gets a bit of stick for being needlessly useless, but their web guidelines are extremely good. Absolutely a fantastic starting point for anybody interested in web development.)
I think it is a good idea. JavaScripts and CSS can enhance it but should not be required.
Accessibility functions are also helpful; if designed well then it would be helpful for everyone (not only if you are blind or other disabilities), in many possible circumstances.
I have a theory that "accessibility" is just a euphemism for "usability", when it's so bat that a noticeable portion of your userbase is locked out.
I've started getting traffic on my website only after I re-build it with a locally-brewed MD parsing engine that uses Astro to spit out the final version of the site.
I guess the main argument is how easy it is for an LLM to ingest the content, since I can bet all of the crawlers are llm-enabled one way or another.
I teared up at the PSP talk. I feel terrible that life requires a level of technology that not everyone is capable of affording and it doesn’t seem right.
It doesn’t seem right because it isn’t .
I had a PSP long before a cell phone, and the built-in browser was like a peek into the future. It really was janky, and could only scroll a page at a time, like an e-reader, but back then web pages didn't need a top-of-the-line computer with gigabytes of ram, to display text and the occasional image, so it was extremely useful when a laptop wasn't available. The button mapping was pretty good, and navigated similar text-based browsers like Lynx, but with the benefit of seeing images.
> […] it always worked even without javascript. He was appalled and said, “but that’s a lot more work for us.”
Is it more work?
> Javascript and modern CSS should be used to enhance the experience
When messing around with my blog's Javascript, this mantra is so thoroughly embedded into writing it, that I try to include "enhance" in function names where it makes sense. I might have to do likewise with my CSS.
The landing page for our latest tool is a static website (exported from nextjs). It has no marketing on it. It just has simple instructions to copy a prompt into ChatGPT / Claude.
That's it. I will report back if it works.
They replaced an ASP form on the website with something better.
To apply for their services, customers could either use an old ASP form on the website, or follow a manual process
Two failed React attempts before this. Shows how chasing fancy frameworks over solid basics can cost millions. Simple HTML wins for public services every time.
but it's not simple html, it's a npm-package
All the text is invisible for me in Firefox on Linux when the `--font-body` is set to `"Atkinson", sans-serif`. Setting it to `"Atkinson Hyperlegible", sans-serif` fixed it.
I read the article in the source code mode and thought it was intentional until I came back to the comments
P.S. your solution seems to have disabled the custom font instead of fixing it
You're right. Seems like it fails when the font is correctly selected. Another machine running Firefox on Linux didn't have a problem.
It's not just you, I have the same problem.
Someone should send this doc to papajohns.com, which has overcomplicated their website to the point it doesn't even work in Firefox anymore.
Nice clickbait title.
He was appalled and said, “but that’s a lot more work for us.”
This made me really, really angry.
I want to work with people like this. Build the right solution to the problem with the simplest technology you can.
Interesting they went with Astro.Makes sense for a form-heavy site. No JS until you need it,and it handles page transitions cleanly.
There are truly an amazing amount of red flags in this otherwise well meaning and short post.
Most of my apps are now simply HTMX + Go + SQLite. I've found it's enough for most projects.
> form submissions and redirects took a while to explain to my colleagues
This is so sad
Open your eyes: the "web" was stolen by the 'whatng cartel'. Their web engines are abominations, the c++ language is making things even worse because now it requires a compiler of an obscene complexity to handle "~right" the absurd and grotesque complexity of the c++ syntax.
We have to eat the bullet, there is only one way out: restore noscript/basic HTML interop in "security" infrastructures (can still have a non-mandatory web app on top). And it will probably require super strong _technical_ regulations and expect the 'whatng cartel' to fight hard, because they won't like critical web sites not being web apps then forced to run on their massively complex web engines...
Don't forget, a few years back, most, if not all, online services were able to run on 1D or 2D (simple table) HTML documents.
I still to this day is baffled by all the idiot geniuses who thought it was OK to have "Please enable javascript" when opening a website without JS enabled. A good chunk in many pages are just static content. You should be able to render HTML. Ashte!
I wish more people take this approach, specially public services.
UK government services guidance is to use progressive enhancement
https://www.gov.uk/service-manual/technology/using-progressi...
What a great article!
> Shipping them 20MB of javascript before we even render a form would be a ridiculous thing to do.
> I have seen teams waste person-months of effort wrangling React validation libraries.
> It is not acceptable to bounce users on old browsers, users with bad network connections, users using assistive technologies.
> Build a web application that works on a playstation portable on a 3G connection - if you do, it will work for all your users, and it will still work 30 years from now.
The other day I added a fix so that the website would work in a PS5. Before that I didn’t even know that PS5 has a browser.
Great work. I love it. We need more developers like you.
Everyone reinventing what Rails has been saying all along...
OMG its JavaScript, I can't even.
in the bio ... "has over twenty years of experience building highly accessible and usable web applications"
why not take the html5 standard (see https://html.spec.whatwg.org/ ) and if needed (dont think so for these use cases... "for clients ranging from energy companies to political parties") htmx or alpinejs ...
I understand people need to make arguments for things they like but provide more please.
What were some of the downsides? Illuminating the tradeoffs would elevate this post from good to great.
The downside mentioned by the author's replacement in the article is the unfortunate explanation for why this is rare in practice.
> "but that’s a lot more work for us."
And it's not that any individual or team is lazy. Most teams have a constant barrage of priorities to balance and are paid by companies valuing efficiency over everything. That said, I think the article makes a great case for adjusting our prioritization. Going a bit slower won't kill anyone, in fact doing so will probably save some.
> When we launched, the number of people completing the form doubled.
I don't want to be that guy, but the title is misleading. The number of users completing the form doubled.
No, it's actually people. FTA: 'My client was a utility company, and they had a big problem. To apply for their services, customers could either use an old ASP form on the website...'
Ie customers of the utility company were completing the form, not random users from the internet.
FTA? Free Trade Agreement?
From The Article
Maybe this is heretical in today's AI hype climate but...weirdly due to the rise of AI, then AI-slop polluting everything, a lot of old fundamentals are coming back. Clear, well-structured, descriptive content on a well-built page has a better shot of being picked up for SEO/AEO/whatever which are the same best practices from 2005. A lot of these tips and tricks and hacks just aren't going to move the needle as much anymore imo.
SEO and accessibility laws have always been the most effective way to convince someone to build clean, well-structured webpages. Guess what, both are measures of how easy it is for a machine to extract content from your pages. AI is just the latest machine that wants to slurp up your soup of tags.
That this article even has to be written proves how stupid web development as a whole has become.
I loathe this area of software development, loads of unnecessary frameworks and spinning gears that add complexity while making less and less functional applications
> form submissions and redirects took a while to explain to my colleagues, on account of everyone being used to heavily client-side web applications.
Ah yes, when you have to explain to your esteemed web developer colleagues how the web works xD
If you're a "React person", as the article puts it, friendly reminder that you can render components to HTML and serve that to the user.
I have done exactly that on a project that was under similar constraints. The UI models live in .tsx files and the browser gets pure HTML with zero JS by default.
Beautiful story!
It shows just how far gone webshit is when the obvious must be stated time and time again
"I took a very bold decision and built a new version of the site using Astro"
We are still in the early days of software and web development. This is the food service equivalent of a restaurant operator discovering that if they serve dog poo vs edible food they get more return customers.
HTML doesnt have hundreds evangelists writing blogs about how cool it is. So it doesn’t really matter what the benefits are if juniors are going to keep showing up writing client-side react components. And the product managers letting them because of their sparkling (but naive) personality.
I will never stop singing the praises of plain HTML. It's accessible, it's portable, it's simple, but for some reason we need horrid JavaScript nonsense to operate.
It will still work 30 years from now! 300 years! 3000 years. There will be no strange error messages in the log, no browser updates breaking stuff.
Personally, rather than this luxurious approach, I just do one giant form and store all values in local storage. If something is wrong have one message at the top listing which fields failed validation and why. Generate some css to put a red border around the fields.
Local storage might not be a good idea for such sensitive data but if you can get away with the simplicity it's lovely.
I loved this post. Awesome commitment to users. Breath of fresh air.
nooo
It's true. Also, if you despise bloat, you may like my JS-free LLM site: https://ch.at/
Totally agree, gov pages should be widely accessible. Also gov services should NEVER mandate internet access. There should always be a way for tech-illiterate people to ask someone, and fill their forms
FTA: 'To apply for their services, customers could either use an old ASP form on the website, or follow a manual process.'
>> There should always be a way for tech-illiterate people to ask someone, and fill their forms
Isn't that more open to fraud and abuse though by the "someone" whether that is a gov employee or otherwise.
If it's a government employee (as it should), it shouldn't be open to fraud and abuse, no. There should be a trail of what happened
Yes, there 'should' be a trail. And there's someone and a process to check that trail. And a process to find the issues, correctly so, and fix, and do all that on a timely basis, and reimburse the person for damages, ...
PS: I have actually suffered through some of this, badly so, though in an unrelated setting.
It comes back to which system is more robust/mistake-proof and more practically recoverable.
Sure, but that's how Governments worked for decades before widespread access to laptops / mobile phones...
It'll be replaced by a new react app within a few hires lol
Use Next.js Bro just know React and complaining it.
"And then the whole bus clapped..."
Use Next.js!!! Bro just know React and complaining it.
>She’s connected to the complementary WiFi and is browsing the GOV.UK pages on Housing Benefit. She’s not slicing fruit; she’s arming herself with knowledge.
>The PSP’s web browser is - charitably - pathetic. It is slow, frequently runs out of memory, and can only open 3 tabs at a time.
Alluring, an annoying property of private software development is that making websites and software in general inaccessible to lower end hardware is actually a positive effect, as it filters out 'undesirable' lower-income prospects.
That, along with pressure to produce fast, without much concern for quality (with notable privileged exceptions of luxury software like Apple or 1B+ user software like Google), as well as a disregard for sourcing "I don't care if you do it yourself, or npm install software from effectively unpaid volunteers", ends up in a state of software lacking craftmanship, software that one is not proud of to work in.
The best way to filter out unwanted users is to make them install software that just displays a webview of what could have been a completely open web page. That way, you only get the ones you can track, which is more important than their wealth, as poor customers often end up spending more on commodity items than someone who is wealthy.
In my experience, Apple and Google are the worst offenders at software bloat, maybe because they can afford to create releases every few weeks, so the bloat accumulates faster.
So funny to me that the kids nowadays are rediscovering HTML lol.
Having been building websites since the mid 90's, I laugh at terms like "HTML-first website"
Reminds me of “pre-jit”
ie "aot"?
Same, and it has certainly made me realize that I am now officially entering my "old man yelling at cloud" phase of my life, and I'm "only" 38!
I’m sorry I can’t hear you over the Flash animation splash pages I was forced to sit through before being able to look up hours of operation.
I did some work for a company that spent nearly a grand on a Flash animation for their title page of a red bouncing ball that would bounce from right to left along the letters of the word "Yipee" (yeah totally not ripping off Yahoo! were they?) until it landed in the crook of the Y, where it would spread down the middle - the finished logo had the Y made out of blue, yellow, and red stripes.
Every single person I showed it to including my then-70-something mother said "that just looks like menstrual bleeding".
Every single person said that.
They still went with it. Conversion rate? Dunno, never got numbers high enough to test the script.
As a teenager I remember going to a website for... a city, I think? And their 'sidebar' was a Java applet that did nothing but provide links for you to click with on-hover effects. The page used frames; the applet was in the left-side frame and the content was in the main frame on the right.
The applet took 30 seconds to load. Once it loaded, it showed five buttons to click to get to different sections of the site. When you clicked on one, instead of changing the content frame, it sent you to an entirely new frameset. This, of course, caused the sidebar to take another 30 seconds to load. Hitting the back button did the same thing.
Meanwhile, I knew someone whose friend made a little applet that he showed me; it was a Java applet that you could provide an image URL for and it would load the image and then, below the image, show a rippling effect as though you were looking at something on the shore of a rippling lake. This applet took less than a second to load and ran incredibly smoothly.
Java was a curse, not because Java was bad but because Java applets were written badly and used badly simply because they were neat.
Every language can say that bad developers write bad code with it while good developers write good code with it.
I would like to say the early interweb was just a learning experience, but today's interweb hasn't learned any of the lessons. It's just changed which language the lesson is being relearned
A lot of these tools, like React, are designed to embrace, extend extinguish the web. Why Microslop and Zuckerberg spend millions of dollars of dark PR claiming anyone who doesn't like React doesn't know what's going on is because it makes the web worse and less useful, which means you spend more time talking to Co-Pilot or bots on Facebook.
You forgot to mention that the Java applet doesn't have antialiasing, so the entire menu looks like crap.
It's like chai tea.
explain?
> Chai, a word for tea in numerous languages
https://en.wikipedia.org/wiki/Chai
"Chai" means "tea", so "Chai Tea" is "Tea Tea".
"ATM" means "Automatic Teller Machine", so "ATM Machine" is "Automatic Teller Machine Machine".
Both are mentioned in the animated movie "Spider-Man: Across the Spider-Verse".
PIN number
Town names too: https://en.wikipedia.org/wiki/Montebello_della_Battaglia
Not in the Wikipedia page (but check the Italian version): it started as "Mons Belli" (Mount of the Battle) because of a battle fought by the Romans a few years before the Hannibal campaign. Then the original meaning was lost and it gained another "of battle" in the 1800s. Mount of the Battle of the Battle. Hopefully there won't be another one to add.
Lake Tahoe (Lake Big Lake). River Avon (River River). https://en.wikipedia.org/wiki/List_of_tautological_place_nam...
Actually, in English, Chai does not mean tea, it means a specific flavor of tea. If you don't believe me, try ordering some Earl Grey Chai, see what happens.
Sure, but "chai tea" is still redundant. I have never used that term and ordered chai in many places without confusion.
it's redundant at a place that serves chai, but it isn't redundant at a place that does not serve chai, because you're skipping the "what is chai" question from whoever you're querying.
It's redundant in the same way Earl Grey tea is redundant, though.
If your server is Indian, they'll likely react positively, and get you what you want.
https://www.google.com/maps/search/england+chai+london/
Except places are now offering Chai Latte Coffee so if you don't specifically order Chai Tea Latte, you could get some thing totally different than expected. I learned this the hard way.
ATM Machine
The La Brea Tar Pits => The the tar tar pits
My favorite from Southern California.
OK, I have to admit, that one I didn't know.
It's only a matter of time until someone posts "Torpenhow Hill" -- which does not exist.
https://en.wikipedia.org/wiki/Torpenhow_Hill
All from the Department of Redundancy Department.
The Sahara desert. It's not only repetitive but it repeats itself too as well.
These gems are brought to you by the department of redundancy department.
Naan bread
- Hill Hill Hill (Hill):
https://www.youtube.com/watch?v=NUyXiiIGDTo
With au jus.
I thought this article was missing a (1999) in the title.