I don't know where to start

When I was starting out as a developer, I would often be amazed by how quickly my more experienced peers could take a problem and immediately know where to start. Whether it was a bug to fix or a new feature to build, they seemed to just know what to do. It looked like magic, and it made me feel stupid.

Later I heard people call it “developer’s intuition”. They said it can only be gained with years of experience solving these kinds of problems. That also sounded like magic, and it made me feel frustrated. Why do I have to wait years before knowing where to start?

Some time has passed since then and now, I feel like I know where to start a lot of the time. You could call it intuition, but it isn’t magic. I’d like to demystify that process.

First, you need to know that most important rule to starting is this: You don’t have to know how to solve the problem to start working on it.

In school, you wouldn’t start an essay without knowing the full structure of the argument you’re going to make (topic sentence, supporting paragraphs, and conclusion). But knowing the full structure of a program from the beginning is very difficult in programming, especially if you’re starting out. Trying to figure all that out is stressful and paralyzing.

So don’t. You just need a place to start. It doesn’t have to be the optimal place.

Looking for a place to start? Consider these options:

  1. Google it. I’m serious. You’ll probably end up looking at somebody else’s code, and even if it doesn’t translate well to your project, it’ll give you a good reference point.
  2. Model the code like the real world. There was so much to say about this approach that I turned it into it’s own post.
  3. Start out by hard-coding it. Make a form that doesn’t submit. An error message that doesn’t change. A random-number-generator that always returns the number 6. Then, iterate.
  4. Ask a coworker. Just say “Hey, any thoughts on where I can get started with this?” Asking will save you time and make them feel smart.
  5. Start at the interfaces. What would the API look like for this feature? Can you write code around that API? Maybe write a failing test against it?

Any of these are good, because they get you something. Without something, you’re the tortured artist staring at the blank canvas. Once you have something, you’ll start to see the way unfold before you.