The design engineer mindset
The design decisions that become visible when you build and use the interface yourself.
I design interfaces and write the code that makes them work. Often I'm implementing something I sketched earlier that day, then changing the sketch because the implementation exposed a problem.
That's the part of design engineering I value most. I can test a decision before it becomes a finished mockup or an expensive dependency.
A screen is only one state
A mockup might show eight rows, short names, and a successful response. The running product also needs to handle an empty account, a long company name, a failed request, and a narrow phone screen.
Those states affect the design. A table that looks clear with sample data can become unreadable when every row wraps. A save button needs to tell someone whether the change is pending, saved, or failed. If a request fails after the dialog closes, where does the explanation go?
I try these cases while the layout is still easy to change. Realistic content does more for that process than another pass over the ideal state.
One person doesn't have to do both jobs. A designer and an engineer working through the running interface together can make the same decisions. The important thing is that neither treats implementation as a transcription exercise.
Build the interaction before judging it
Timing is hard to evaluate in a static file. A transition that feels pleasant once may feel slow when you use the control repeatedly.
I check whether feedback starts immediately, whether the motion explains what changed, and whether I can interrupt it. Opening a menu shouldn't require waiting for an entrance animation to finish. Closing a panel should leave focus somewhere sensible.
Loading needs the same attention. A skeleton can preserve the shape of a page, but a flash of skeletons for every quick request can be distracting. Optimistic updates can make an action feel immediate, provided the interface can recover when the request fails.
There isn't one correct duration or loading pattern. I need to use the interaction at the speed a person doing actual work would use it.
Components need boundaries
I like reusable components, but I don't want every rectangle with a border to become the same component.
A clickable product preview and a billing summary may look similar while having very different behavior. Combining them too early produces an API full of exceptions. Shared spacing and color tokens may be enough.
The useful extractions tend to have a stable responsibility: a field with its label and error, a menu with keyboard navigation, a button with clear interaction states. I can change their appearance without asking every caller to solve accessibility again.
Check beyond your own setup
My browser and screen are a small test environment. I need to see what happens with larger text, a slower connection, touch input, and keyboard navigation.
A few checks regularly change my designs:
- Tab through the page without a mouse. Can I see focus, reach each control, and leave an open panel?
- Zoom in and use long content. Does the layout still have a readable order?
- Enable reduced motion. Is any information now missing?
- Throttle the connection. Can I tell what is loading and what I can already use?
These checks belong in the design process because they can change the structure of the interface, not just its final styling.
Learning enough of the other discipline makes those conversations easier. A designer can start by building one interaction. An engineer can compare spacing and type choices in a screen they use daily. I find the running product a better place to learn than an argument about which title owns the decision.
Keep reading
Want to work together?
I help companies design and build products from the ground up. Let's talk about your project.
Get in touch