Building software isn't like building other kinds of things. When you create something — a car, a toy, a chair, a painting, or even digital things like a bitmap or a 3d model — you are producing the end result itself. When you create software, though, you're not creating the end result — you're explaining to a computer how to produce any possible end result given any possible combination of inputs.

Writing software is not like building a car. Writing software is like building a car assembly line.

It's easy to see how people get into the building-a-car mindset, though; the product designer holds up a picture and says "make me this!" and off the engineers go, making whatever they believe this actually is.

Suppose the product designer tried to specify a user profile system for a website. A simple design might be a perfectly laid-out page with some placeholder text for the user's name, image, and some metadata. Already, the process of building that software has to start making assumptions. How does the user edit these fields? What does the page look like when the window is much narrower? How should the page render on a screen reader? The product person envisions some ideal profile page, but the person actually building the software has to work out how to build every possible profile page.

Switch back to the assembly line analogy. The product person makes some seemingly-simple request, like "can you make the driver-side door red instead of blue?". This is misleading — it is easy to imagine the car with a red door. In practice, this is hard — we'll need to adjust the assembly line to support muliple paint colors, add some logic to let it select color based on the part being painted, add configuration somewhere to let the person operating the assembly line choose this new color mode, set up a new supply chain for red paint, buy new paint-spraying nozzles because red paint flows more quickly than blue paint, and arrange for some better health insurance because when the marketing people find out you've made ONE DOOR RED they're going to start throwing things.

The same thing happens in software development. "Hey, this user profile looks great. Can you make it show a message on their birthday?" You get the idea.

When you write software, you're not building, say, a user profile page. You're building an assembly line that takes a bunch of parts and produces exactly the right profile page every single time.