Simplifying technical designs

Simplifying technical designs

Someone recently shared with me that they really appreciate my ability to take a massive, complex problem or design and find creative ways to simplify it, making it easier and faster to build and reducing the overall maintenance costs and risks.

As often happens with me, I hadn't actually thought I had that skill or that it was anything special...

Anyway, I thought I'd share a few tools in my toolbox that I use to try and bring problems down to a reasonable, hopefully achievable size. And who knows, perhaps these can be useful for you...

Clarify and hone requirements

First of all, do you have a clear sense of what problem you're trying to solve? And if so, have you written them down, gotten them reviewed, and gotten alignment with your stakeholders and the development team?

That in itself can be incredibly effective at achieving clarity and focus and potentially simplifying the solution.

Look for requirements that can be dropped or modified

Often intractable design problems can be "unlocked" by loosening or dropping requirements.

For example, maybe it's ok if a small percentage of requests to fail as long as they can be retried.

Or maybe the price or availability on a search page can be stale, as long as they are correct and up to date when you go to the detail page and are ready to buy.

Maybe we don't need that ...

A common thing I see is a design that takes on too much all at once, or adds too much optionality.

I know we could implement both GraphQL and REST interfaces. We could provide the ability to reconcile two browser tabs making changes to the same document.

But maybe we don't have to, at least to start.

Stick with the minimum of what we need to do to deliver value.

Look for enabling constraints

Sometimes if you create a constraint about what you can do with a system, it can really simplify your design.

For example, set a rule that you can only update entities by providing a full copy of the object, versus being able to provide just the fields that are being modified.

Or set a rule that you can only roll back a change by applying a new, compensating change, rather than try to implement some kind of undo functionality.

But what about...

As engineers we are good at thinking about all the possible wacky edge cases that can happen.

If a user starts creating a calendar entry in Germany but then gets on a plane and then tries to finish it in New York, what happens? Hm, ok, but maybe we don't need to worry about that just yet.

As long as the general design looks good, we can set aside the edge cases.

I once heard someone say that in some cases the best recovery strategy for an error is an apology.

Getting something working and delivered can be much more valuable than spending precious time trying to design a system that completely eliminates every potential edge case.

In my experience, the edge cases that do happen are always a complete surprise. We're not going to solve all of them anyway.

Giving yourself permission to relax and adapt

In general, just have a stance of giving yourself space to relax and be flexible.

Don't assume what is handed to you as requirements is immutable.

Don't get fixated on offering lots of options or solving every possible problem.

Give yourself space to find a way to tweak things and as a result have a much cleaner, easier to implement solution.

Lucas Mercado

Follow for org design & socio-technical insights. Fmr. CTO & Co-Founder at Daybreak Health (YC S20)

1 周

A quick, concise, actionable list with examples. These nuggets are _exactly_ why I liked working with you all those years ago!

Matthew Stevenson

Application Developer - Customer Communication Management

1 周

Love this philosophy David! It's easy to become overwhelmed trying to solve every potential problem. I'm going through this right now with a new design. Ultimately I try to focus on the path of least resistance - what is the core thing you're trying to do and solve for that. But always keep in mind how you might tackle some of those edge cases so you can leave yourself room later to handle them.

要查看或添加评论,请登录

David Van Couvering的更多文章

  • Choosing a backend language, choosing a culture

    Choosing a backend language, choosing a culture

    Somebody was talking to me about choosing a backend programming language for their startup. I was realizing that in…

    2 条评论
  • A set of coding standards

    A set of coding standards

    We have decided to focus on improving coding practices within my team, and I wanted to provide a digestible summary of…

    7 条评论
  • How big should a service be? The age-old problem

    How big should a service be? The age-old problem

    It happened again. I was in a conversation with a colleague, and they were trying to decide whether to make something a…

    8 条评论
  • Crossing the distributed systems chasm

    Crossing the distributed systems chasm

    A large part of my career has been helping an engineering organization evolve from a single monolithic system that…

    3 条评论
  • Your job on ADD (AI-Driven-Development)

    Your job on ADD (AI-Driven-Development)

    In a recent article I mused about how AI will impact our jobs as software engineers. I was realizing things were…

    8 条评论
  • Deciding how frequently to deploy

    Deciding how frequently to deploy

    I was talking with a colleague last week about whether they should increase or decrease their deploy frequency. They…

    4 条评论
  • Turn out the lights when you leave...

    Turn out the lights when you leave...

    I have been having some interesting conversations with my developer colleagues as they are starting to see how well the…

    3 条评论
  • Politics and sales as a software engineer

    Politics and sales as a software engineer

    Politics and sales can definitely be a dirty business. Some people will say anything if it is to their advantage.

    1 条评论
  • Changing coding habits

    Changing coding habits

    Over the last few years, I have been working with teams trying to help them change their design and coding habits. I am…

    1 条评论
  • So busy but nothing gets done

    So busy but nothing gets done

    In my last post I talked about value streams and how we can use this concept to change how we think about building…

    2 条评论

社区洞察