It’s relatively easy to generate good high-level ideas, but shaping those ideas into a good first version—deciding exactly what to build and how, and what not to build—is much more difficult. It’s where things go wrong most often.
The most common mistake is succumbing to the temptation to add too much complexity. People want their ideas to seem important and valuable, so they think it’s better to add a lot of features. I am here to tell you that this is a destructive impulse.
The only thing that matters is whether a user A) finds out about it, B) immediately understands why it’s useful, and C) intuitively understands how to use it. Complexity is a drag on each of these. People don’t tell friends or coworkers about complex products that are hard to understand. They certainly don’t sign up for them. And if a lengthy explanation is required to learn to use the product, hardly anyone will bother.
So how can we achieve simplicity? You may hear that simplicity takes a lot of complex effort, but that’s not necessarily true. You don’t have to design 100 variations to arrive at the perfectly simple thing. Often, I scope a v1 in a way that feels obvious to me, and it works.
I can’t tell you exactly why I thought those features were most important while others (like templates or custom fonts) weren’t. It comes down to intuition, which is usually sufficient when you’re building a product for yourself. If you’re building for others, you’ll need to spend more time and energy doing user research, and you shouldn’t expect to be able to achieve the same depth of fit.
Products are like works of art, in that every single detail matters and either support or detracts from the overall gestalt. If you’re not designing for yourself, it’s going to be hard to compete on equal terms with someone who is—especially if you’re operating in a market where decisions are more likely to be made based on feelings than lists of features. It’s one reason why I almost exclusively work on things that I want to use myself. (The other reason is that I find it more fun and motivating to build things I think are cool than to solve someone else’s problems.)
Software is a living system that should continuously evolve. Sure, we can stick a flag at a moment in the timeline and call it a “ready-to-launch” v1, but that’s a somewhat arbitrary point in time.
Your most important decision in this step is whether your priority is building cool products or learning cool engineering techniques. It’s alright to be interested in both, but it helps if you have a gut feeling about which is more important to you. I love writing code, but I will always care about product more. Code is a means to an end.
Most engineering advice is still going to generally be good, but you should take it with a grain of salt, because most of the time it’s targeted at people who write code professionally inside large organizations. Most of the principles they live by will also be useful to you, but not all of them.
For example, if your goal is to have an engineering career working at tech companies, it helps to stay on top of new languages and frameworks. But if you just want to build a cool product, stick with what you know.
Pieter has a distinct approach: he does everything himself and doesn’t build VC-style businesses that are going to IPO. But even for founders wanting to go the VC route, his approach is underrated.
The biggest mistake a startup can make is having a technical co-founder who is more interested in engineering than product-market fit. While these types of people will never come out and say that explicitly, you can infer it through their actions.
The fastest way to learn how is to get a mentor. Find someone who is a good engineer and get them to review your code. If you don’t have a friend who fits the criteria, you can hire someone. It’s much less effective and more time consuming to try to learn all of the best practices on your own from blog posts and books.
It’s a waste of time. I know this may be an unpopular opinion for some people, but no-code tools are often just as complicated to learn as code—except there is a low ceiling on what you can accomplish with no-code, and learning one no-code tool barely translates into any other tool. Code has a compounding advantage because the same patterns come up over and over again, and there is no limit to what you can build. I’m thankful that no-code wasn’t around when I was getting started, because I probably would have wasted a lot of time, and it would have been a dead end.
I reject the distinction between “learning as you go” and “establishing a baseline before you get started.”
You’re always going to ping-pong between acquiring skills and using them. Sometimes the loop is fast (e.g., looking up how to sort an array in JavaScript, then using it), and sometimes it’s much longer (e.g., deciding to use Ruby on Rails to create your web app, then buying a book and doing an extended tutorial before you write one line of code for your own app).
(By the way, this cycle never ends. Coding is a constant loop of looking stuff up every 5-10 minutes, writing code, then looking stuff up, over and over.)
When I’ve spent too much time “building background knowledge” before I started building, I was procrastinating. I was psyched out by the daunting task in front of me, so I gave into the temptation to fiddle around. This same challenge will present itself to you over and over in life, in many different forms. It’s best to see it for what it is, stop fiddling around, and get started.
You’ll learn so much faster if you feel free to start from scratch building the same idea 10 different times. And you should expect to do this. When you approach it this way, you give yourself permission to try to do the first step even though you know you’re probably going to screw it up. And that’s a good thing—because when you get stuck, you will have identified the gaps in your knowledge that are holding you back.
When designing software, there’s a temptation to use off-the-shelf UI toolkits and CSS frameworks. I would be careful about this. Stock UI is never quite right for your specific needs, but it’s so easy to use and so close to “good enough” that it’s tempting to keep going with it. The furthest I go toward modularity is to use a good icon set, like Google Material Symbols or Apple’s SF Symbols library.
I find it easier and more satisfying to start from scratch than to wrestle with pre-made components. But the most important benefit is that it’s easier to achieve simplicity.
The more complex the design, the harder it is for a user to understand it. Have as few elements as possible—and make them count. The same principles I wrote about in the context of selecting which features to build also apply here: less is better, move quickly and based on your intuition without overthinking it, and show the product to users to uncover problems and solve them iteratively.
Over time you can develop your intuition to learn what people will understand and what they’ll find confusing, but the only way to improve is to observe people use your designs. When you’re sitting next to someone as they navigate your product, it becomes visceral just how confusing everything is. Your mirror neurons activate, and you can more easily empathize with what it feels like to see your product through the eyes of a new user.
Design is a little bit about aesthetics, but mostly about clarity. I want as little friction as possible between a user and their goals. The best way to do this is to pay close attention to how other websites and apps are built, and copy the patterns.
The main role of aesthetics is to inspire trust and to support an overarching vibe. If a product feels like it has too much of the wrong personality, it can be a distraction. The best “personality” is not achieved by in-your-face choices like loud fonts or animations; instead, personality shines through when the interface allows the functionality to come through clearly. Such an interface makes the personality more about functionality than style, which is almost always better.
It might be a cliché to end on a Steve Jobs quote, but it’s perfectly apt: “Design is not just what it looks like and feels like. Design is how it works.”