DEV Community

Cover image for My own worst user
Hideki Mori
Hideki Mori

Posted on

My own worst user

I use the things I build. Not the way you use something to test it — open it, click around, confirm it works, close the tab. I use them to do the actual work, more than anyone else does, for as long as I own them. It isn't discipline. I don't have the temperament for discipline. It's that I can't stand a tool I have to fight, and the tools I end up fighting hardest are always my own.

That's the whole method, if it even is one. I'm my own worst user.


What use does to a screen

Here is the thing I noticed once and can't un-notice. The first time I sit down and actually use a screen to get something done, its shape stops being a decision I make. It decides itself.

Take a usage screen — the kind that tells you how much of something got used, by whom, over what window. The first time I use it, I want a total, so "everything" has to be a state the screen can show. The next time, I want one customer, so I narrow. I don't sit and reason about any of this. The friction of trying to get an answer drags the shape out of me. Whatever stands between me and the number gets filed down, because I'm the one standing there waiting for the number.

That's the part most "use your own software" advice skips over. It isn't that using the thing reminds you to care. It's that using the thing changes what you're able to think. In front of a table, you can think in tables — rows, columns, keys, joins. In front of a task, you can't, because the table was never the thing you wanted. The answer was. You can't keep thinking in records once you've had to do the job.


The tenant was never a constant

Because I use it, the tenant was never a constant.

When I write the query behind that usage screen, I have to write the part that scopes it — which groups this person is allowed to see. And the moment I've written that, the operator's view is already sitting in front of me. It's the same query with the limit taken off. I didn't design two screens, one for the customer and one for whoever runs the place. I wrote one line about who's asking, and the second screen fell out of the first, for free.

So a regular user is an admin with a list of one. (Sometimes the list is longer than one — someone who belongs to a few groups sees a few. Same idea.) "Fixed" and "everything" aren't two screens; they're one control whose options come from permission. A list of one needs no control at all — there's nothing to choose. A list of all is the same control with everything in it.

You get to the same place from the other end. Turn the screen's hard-coded label into a selector, and the selector's options are the set the query is allowed to range over. The dropdown and the WHERE clause are the same set, seen from two sides. It makes no difference whether you start from the database or the widget. You land on one screen.


The other shape

I've seen it built the other way. You sign in, you get a list of customers, you pick one, you land on that customer's page, and to see another you go back to the list and pick again. Nobody — not even the person running the whole thing — can see the whole. It looks like navigation. It's the foreign keys wearing a coat. You aren't navigating; you're walking the schema's containment, one row at a time.

The most naked version I ever saw went further: the screen was the table. A picker per column. A menu that made me pick the engine by UUID. Empty boxes asking me to choose the axes of a pivot. I was being handed the GROUP BY to write myself.

Here's what I keep coming back to, though. You don't need to be clever to fix any of this. You don't need to understand multi-tenancy, or hold a theory about navigation, or read an essay. You need to use it. Use it once, for one real task, and the huh? arrives before any understanding does — wait, I have to go back to the list again? I can't see the total? I'm choosing an engine by UUID? The friction is louder than any explanation.

So the diagnosis isn't that the people who built it didn't get it. It's that nobody sat in the seat.

And the scary one isn't the sloppy version. A sloppy tool just means someone ran out of time; you can see where the rush went. The one that should frighten you is the polished one nobody used — clean layout, even spacing, consistent buttons, and unusable, because careful people shipped it and not one of them tried to do the job with it. Care didn't save them. Only use would have.

Use isn't a magic word, either. You can use a thing every day and go numb — run the back-to-the-list dance a thousand times and stop noticing it's a dance. So it isn't "use it." It's: use it for the real task, and refuse to let the friction become normal.


What you can't hand over

So the fix looks easy. Tell people to use what they build. I've said it. It doesn't take.

Not because they're slow. Because it isn't a technique, and you can't hand someone a technique they have no slot for. It's nearer to a disposition — using the thing, being unable to tolerate fighting your own tool — and a disposition doesn't move from one person to another by being explained. I didn't learn it. I just can't not.

I'm not trying to dunk on anyone. I'd rather it transferred. It doesn't. Maybe that's too strong. But every dead tool I've ever seen was built by someone who could have felt the huh? on the first day and didn't, because they never sat down. The screens I'm afraid of aren't the ugly ones. They're the careful ones nobody ever used.

You can't teach someone to be their own worst user. You can only be one.


Built with Claude (Opus).

Top comments (0)