Forgive me for asking, but I fear I may be mentally ill :-)
I've spent many years working on web based IT systems, and I think in every case, there have been serious issues with the (a) the way code is organised, (b) the responsibilities assigned and (c) coupling. I have to say, somewhat sheepishly, that I've even left projects because I was sick of the maintenance issues a/b/c caused.
Since about 2008, a trend I have observed is that presenters at user groups and conferences use completely trivial scenarios to illustrate "the way we should be doing things". There is also heavy emphasis on the likes of MVC, or Entity Framework, or other next-big-thing technologies. To me, these are all peripheral. (I admit they are good fodder for conferences etc, they're just are a means to an end).
No business gives a crap about MVC, NHibernate, NoSql, Angular.js or insert-your-pet-js-lib-here etc. For years now, all of that has been distracting developers from what really matters.
What businesses care about is having software that models entities AND processes that matter to the business, that can change and evolve over time (be maintained) and stay robust.
Why isn't there more focus on that?
Anyway, what I find when I look at existing code across many businesses is this:
1. There is often significant use of static methods in business model objects which effectively dead-end any attempts to cover the code with automated tests.
2. Static methods in business model objects call static methods in other business model objects willy nilly to achieve their ends.
3. Minimum dependency injection. Often token use of a DI container because it's the done thing without concern for appropriate container use.
4. Sometimes I find all the logic moved from business model objects (all properties and no methods), and heaps of "services" or "managers" containing methods and no state.
It seems to me what's needed are some reference implementations that make it clear where different kinds of behavior live, in a specific context like an e-commerce site; something sufficiently complex yet familiar.
I'm not looking for the one-architecture-to-rule-them-all, but it would be very valuable to contrast the design decisions that went into different implementations based on the same problem domain.
I also have another holy grail:
How to design systems based on simple objects and methods so that I can focus on the interactions and dependencies without regard to caching, dependency injection (tooling) and persistence and the heap of other concerns that get in the way of understanding what the system does.
I want to put what the system models and what the system does at the center and push or defer all these other concerns until I absolutely need them.
I want to be able to focus on test-first or specification-first, where the production code is almost a side-effect of defining tests and/or specs, and where the tests don't necessarily have to deal with faking web contexts and other infrastructural concerns.
I don't want to be starting implementation by adding code to a controller action. In fact I don't really want to test controllers (and deal with all the context mocking that entails).
Concrete reference implementations for this holy grail?
Are there any that are publicly available that deal with read/write persistence?
Are there any available via courses?
Are there any available that show how different objects in the system should interact? e.g. how one collaborator is used via the "caller".
I must be one of thousands of developers who have come to this realization.
BTW I've been watching bob's videos and I'm up to 25 or thereabouts. I find the occasional mention of Interactors tantalizing and feel this is a step in the right direction but I would like a larger example that covers multiple interactors with read and write scenarios.
Most of the work I do is brown-field. I used to think any code base could be rescued and made clean, but now I think that some code bases are beyond economic repair.
Regards, Ian.