According to one of Murphy’s Laws: every solution breeds new problems – how to avoid this paradox while implementing architecture and design, or “mistake-proofing” programming. First, why it happens: context, convention and static typing Reflection, Introspection and RoslynCTP Architecture Validation using PostSharp