Flat feels work well for traditional industries, such as construction. I.e. if you are doing a kitchen remodeling, you can easily calculate the number of cabinets, shelves, etc. The time it takes to install doesn’t fluctuate that much.
Software engineering is more like scientific research. The scope is never fully understood and there’s a constant state of uncertainty. That’s why engineers don’t like fixed bids – they don’t want to pay for consequences of that uncertainty by their time and lost opportunities. Business guys don’t want to pay for that uncertainty either by pushing engineers into fixed bids.
That’s where Agile comes in. It allows to do flat fees in the state of uncertainty by using the trick of prioritization: you build what’s really important and everything else is optional.
Also, Agile encourages to dump the traditional client-service provider relationships and form a partnership, where everyone’s feeling each other’s pain.
If there’s no true partnership, as a service provider, I will have to manage scope and spend management effort on making sure we fit the budget. This is how agencies typically operate. I’ll need to be paid for that management time, which takes resources away from engineering. However, if making the budget is more important than a good product, that’s a sacrifice worth making. Also, once the scope is somewhat determined, we can’t make any changes, which some clients find frustrating.
I think we should be transparent about this, and as long as we are, everyone can make informed decisions about how they want to run their projects.