As time progresses, software development becomes a more mature discipline. With each "new generation" comes a solution to another problem that was found. For instance, the generation of C++, Visual Basic, Delphi, and other similar technologies in the early 90s was the generation of Object Orientation - trying to model real world artefacts with their digital equivalents. Each new generation takes what was provided by the previous generation and builds upon it through abstraction, solving another problem (along with introducing efficiency developer gains), bringing the development paradigm closer to the real-world problem domain:
- Generation 0 is machine code - direct binary (or hexadecimal) encoding of commands.
- Generation 1 is assembler. It's a linguistic abstraction of hexadecimal that makes its representation more human readable. This solved the problem of having a base language. Obviously, the machine code was still compiled into machine code for execution.
- Generation 2 should be languages like Plankalkül, but these were never implemented, so we'll have to skip to FORTRAN and the like. This generation adds the ability to build multiple operations up into statements and group these together. It solved the problem of "operations" - being able to represent a real world action in programmatic terms. Such languages regularly compile down to Assembler before machine code.
- Generation 3 introduces object orientation - a logical grouping of commands and data to represent an entity, solving the problem of dealing with related entities. But these are still made up of extended generation 2 code.
If you look at each of the languages in the final two generations above, you'll see that early attempts were extended by more thorough alternatives as the generation progressed. For instance, Pascal is often considered a richer language than FORTRAN. The same is true of generation 4 - the point we're at now. Generation 4 started with Component orientation - the grouping of objects into collective units - another layer of abstraction. This is now continuing with the introduction of SOA. What problem is being solved now?
With the introduction of OO we're now at a point where we can effectively model the real world and the interaction of items within it. What that's lead us to is a realisation that we have a few more problems once this representation of the world is in place. These problems are:
- Location
- Integration
- Change
The reason that this was difficult with just OO is that encapsulates the logic and internal structure in one place, is platform dependent in its execution format, and externally exposes interrelationships, creating sprawling dependency diagrams making change difficult. Current generation "orientations" get around this by grouping the objects into logical sets that are interdependent, and isolating them from the implementation of further components/services. COA is almost a halfway house that we get for free by designing OO systems carefully, solving some of the change problems, and allowing earlier attempts at decentralisation (DCOM, for instance) to be more feasible. SOA takes the COA model, and extends it by allowing us to define contracts in a standardised format that have no bearing on the underlying data model:
- Allowing for this copy of the data to move between locations
- Allowing heterogeneous systems to interoperate through homogeneous data items and protocols
- Allowing rapid internal change without dealing with the dependency issues of a large OO system, due to the abstraction of the contract.
SOA really is a huge step forwards. In many ways, it's a bigger change than OO if understood and approached correctly.
So, where's this 'blog entry going? Looking to the past, we can predict the future. Firstly we can see what will happen with SOA adoption:
- People will get it wrong and think that simply by using SOA technology, they'll have a good SOA architecture. I've seen some truly non-OO systems developed in C++, and I bet there'll be some lousy SOA attempts than actually just expose objects over Web Services.
- It will add an overhead that some purists won't accept, and it will leave "niches" (quite big ones) in the previous generations for more specialized applications
Secondly, we can take a guess at what the replacement for SOA will look like:
- It'll most likely be in the form of another level of abstraction/grouping that makes use of SOA under the hood
- It'll solve the most common problems that arise when creating SOA applications - the issues that are "worked around", and will make developers a bit more productive in the process.
Having worked on some pretty big SOA systems, the biggest pain I come across is coordination. Services simply don't currently support transactions, especially long-running ones (and in another post I described why I don't think they ever *really* can). There's also an issue I touched on in another post about the standardisation of data and operations. This new architectural paradigm will most likely give us a platform that supports the logical grouping of services into things that can be coordinated together. Microsoft's upcoming Indigo technologies will be part of that journey, as will more mature evolutions of coordinating engines such as BizTalk. Again, we'll be getting closer to the real world problem/solution, by having diagrams of virtual "paper forms" flowing between "inboxes". Personally, I see Indigo being to SOA what components were to OO - an extension that doesn't define a new generation, but does a good job of cosmetic surgery to prolong the shelf life.
To give an analogy, I see the evolution of software systems a lot like the evolution of shopping. Thankfully, others have independently come up with the same comparison (Pat Helland of Microsoft, for instance). You start out with independent shops, which are like unrelated programs. You can work your way through the growth of the 3-or-4 store group (un-connected product suite) that you get in the suburbs, up to the current shopping centres. These are like current enterprises - everything fits into regulation sized slots, and can allow certain things to interoperate across them (services such as security, telecomms, cleaning, etc.), but they're not really fundamentally integrated. The goal is the hypermarket where everything can be bought from micro-stores within the one big store - a single trolley, a single bill, a single payment. (If you're in the UK, think of the Market Street we have at Morrisons). To get to this point, we'd need common definitions for a customer, a bill, an actions such as DebitCard.
That's where I hope the next generation will get us to - the operator and data standardisation talked about.
Having re-read the bold claims made in this about the potential of SOA, I think an entry on what it really means is necessary over the next few days.