Advice to young web developers

I’ve been making websites in some form or another since 1995. After 25 years of experience I think I’ve accumulated enough knowledge to know a few things. Here’s some things I’d like younger developers to think about, in no particular order.

  • Sometimes a website is just a website.
  • The browser is already a client; HTML is its language.
  • The web is built around server-side rendering.
  • You can provide your data in more than one way; consider HTML to be one of several possible data representations.
  • Scaling your server helps everyone. Expecting client-side scaling only helps people with the fastest computers and Internet connections.
  • Not everyone has (or can use) a mouse.
  • Not everyone has (or can use) a keyboard.
  • Not everyone has (or can use) a touchscreen.
  • Not everyone can see colors or pictures the same way you can.
  • Not everyone can process information the same way you do.
  • It is inhumane to move things around on people.
  • The browser’s native HTML parsing is far faster than anything you can write in JavaScript.
  • HTML is already an ideal representation of DOM nodes.
  • HTML is a rich framework.
  • You can probably do that layout change in CSS.
  • Before you roll your own UI component, consider that HTML probably provides it. If it doesn’t provide it, that’s probably for a reason. Attaching DOM events to a <div> or <span> is probably not the best way of doing things.
  • Not everything has to be a “single-page application.”
  • Even if you need to preserve client state between page loads (for e.g. music or video playback) you can let the browser do most of the heavy lifting by fetch()ing a new page and replacing your content container at the DOM level.
  • Infinite scrolls are inhumane. People need to be able to reach “the end.” There are forms of eternal torment described in religious texts that are less mean.
  • If you must do an infinite scroll (and you don’t), make sure that there’s nothing you need to reach at the bottom.
  • Give people consistent but random stimulus and you will be habit-forming. Getting people hooked on your product might seem like a good idea, but the tobacco industry feels the same way.
  • If you design with CDNs in mind, then a server round-trip won’t be slow.
  • It is okay to use multiple languages in a thing. Not everything has to be isomorphic.
  • Always validate your data server-side; anything that comes from the client is suspect.
  • To the developer, “isomorphic” code breaks down the barrier between client and server. To a malicious client, it means they potentially have control over the server too. Be sure about where your data is coming from.
  • Browsers change. Relying on browser-specific behavior means you’re relying on that one browser at that one point in time. Code to the standard, and test everywhere.
  • Use polyfills to support browsers that don’t yet support the standard you’re using.
  • It’s okay to copy others; it’s how we learn things. Just remember to learn from it.

UPDATE: Welcome Hacker News. rickpmg brought up a very good addition to this list:

And make sure the back button works?

Also a few folks were wondering what I meant about preserving client state between page loads. This isn’t intended to be a tutorial but what I mean is you can do something like this:

<title>Div replacement test</title>
window.addEventListener('DOMContentLoaded', () => {
    []"replace")).forEach(elem => {
        elem.addEventListener('click', event => {
                .then(response => response.text())
                .then(text => {
                    var parser = new DOMParser();
                    var other = parser.parseFromString(text, 'text/html');
                    document.title = other.querySelector('title').innerHTML;
                    var content = document.getElementById('content')
                    content.innerHTML = other.querySelector('#content').innerHTML


<section id="content">
<p>Here is the content container. <a class="replace" href="replaced.html">The other document</a></p>

<iframe width="560" height="315" src="" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


Just a rough sketch (and of course this breaks the back button, tsk tsk) but you get what I mean, I hope. (And if you want things to be even more lightweight you could have the other page be represented by a JSON blob as fetched through an API or whatever.)

Another update: This isn’t really webdev-specific, but:

  • Not all users or developers are men


Before commenting, please read the comment policy.

Avatars provided via Libravatar