Hi there, This question is subjective and can reasonably only be answered by those seasoned developers with leadership experience and management personnel with a sound technical proficiency.
For the past year I've pursued educating myself extensively in OOD to become a stronger programmer. In particular, reading and applying knowledge attained in SOLID priciples and Domain Driven Design - understanding industry best practices and essentially "refactoring to patterns".
I'm 25 and work for a rather young company whose development team is around the same age if not younger. Although I've much to learn, I've taken what I've gained from the writings of Robert Martin, Eric Evans, Martin Fowler, Tony Sneed, Julie Lerman, Dino Esposito, and a host of other phenomenally brilliant and talented programmers / bloggers (to whom I'm ever grateful), and have begun to incorporate these concepts at work.
I'm well aware of the hazards of over-complicating a design and criticisms towards architects who remain perpetually designing for business requirements which don't exist. YAGNI! Or as Joel Spolsky calls them architect astronauts.
My question is one I've yet to find much information on and I will get to it in just a moment. The company I am with has been virtually exploding in growth. The development team consists of young guns fresh out of college, as are our project management. The developers have little to no knowledge about design patterns, or N-Layer architecture in general. Our code simply consists of "Spaghetti with Meatballs"... the meatballs being domain-like classes living within an App_Code folder. There is no separation of concerns, with nearly all business logic being done inside code-behind files and "meatball" classes.
The developers/management have all looked to me to provide guidance in going about re-structuring our development practices, however, as those with N-Tier experience know - there is no one golden solution to fit every business model. I've tried explaining the different facets to the makeup of DDD and what each part's functional purpose is to our developers. It was impromptu, yet they were able to come away with a general understanding of the different pieces in play but not how to implement them of course.
In a few weeks, I would like to start giving continuing educational in-house speeches. Most involving just the dev-team, but also project management and our CEO; who plays an intricate role in the life-cycle process by allocating development resources and deciding feature sets. It is here which I am rather unsure how to proceed...
How do you convey the long term benefits of applying an architectural framework to non-technically savvy personnel or developers with little OOD experience?
How do you illustrate the costs for maintaining a poorly written software will eventually hamper product development 5 years down the line?
Applying domain driven principles will NOT help the company see another dime in the short scope of things, but will allow for application extensibility; how do you explain extensibility in terms of business, not code?
We currently have problems with "feature creep" in our agile iterations. Design is always pushed into the background "if there is time to clean up later". And we are at a point in which future plans for the software incorporate a SOA.
Much thanks in advance and sorry for writing an essay! I hope the development community finds this useful.
I've tried to create a basic illustration for the team to visually see what one example of a DDD application might comprise of. I have left out other key elements including Service Locator, Unit of Work, State Management, etc on purpose. Many of the aspects pictured are not required or can be added in time.
[EDIT]
I should note the following:
The company, like any young expanding enterprise is going through growing pains ... which is a wonderful thing in business. Please understand this as resources are not unlimited and development iterations are highly dependent on client needs and feature sets. What I'm ideally looking for is others who have experienced similar situations where they had to find a balance in continuing down a development road led by sales - which would knowingly only lead to product instability, and that of veering a new course of re-factoring and implementing new design.