Fred Meyer has a nice post up that outlines the various complexities we face in web development. His purpose is to explain, as best as he can, just why it's so hard to estimate pricing for websites.
He kindly references my post on WordPress website pricing, and his is a nice complement to that. From his write-up:
For a web developer, “complexity” can be defined as: Everything that is impossible or very difficult to know at the beginning of a project, and which only becomes clear during the project itself.
The difference between a haircut and a web project is the degree of complexity. The job of giving a “men’s haircut” can vary a good deal based on the man in question, but the process is largely understood before it is begun, making it easy to price predictably.
With complex web projects, however, almost the whole job is learning how to do the job itself. That’s a lot trickier proposition.