Are deadlocks always a symptom of design flaws or are they an unavoidable occurrence even in well designed systems with high data writes/reads? A complete redesign proposal is experiencing deadlocks in its prototype. I am of the opinion that deadlocks are always the symptom of design flaws. I do not want to go into the specifics of our system; I just want to know others'opinion in general situations.
If a system is experiencing deadlocks on volume testing at such an early stage in its development, should the design be reevaluated?
I am of the opinion that deadlocks are always the symptom of design flaws


With READ COMMITTED SNAPSHOT set, and foreign keys supported by indexes, deadlocks should be treated as application bugs.  

That's not to say you'll never see a deadlock, or that you won't have to introduce locking hints to serialize access to objects.  

But with RCSI, deadlocks should be rare enough that they can be individually diagnosed and remediated, as opposed to using a retry loop or resorting to dirty reads.