The actual solution is a desktop client and a web application used for simple CRUD purposes, each with around 10 screens / pages.
We have a huge suite of tests. We have a large amount of different layers. Gigantic amounts of interfaces inheriting from interfaces, and being passed around as parameters. Partial classes, with implementation spread out all around the application. Everything grandly designed according to design patterns, and every piece of code positioned in the smallest possible unit. Everything in the front end is a user control.
In theory this gives us extreme extensibility, flexibility and code reuse. From an academics stand point, it's well designed according to best practice.
In reality, it is completely and utterly obfuscating the actual code that get things done. Adding another db field to the UI requres modification of data-access layer, business object layer, changes to 2-3 different types of interfaces, additional code to a type conversion class, initialization code in the front-end, additional display logic to a user control, extra custom validation logic etc etc.
I really feel with the author, and can unfortunately confirm it's often the same shit no matter what software you are dealing with.