Applications ARE the leaky abstractions
Recently, a message called my attention to a classic article from Joel on Software on the Law of Leaky Abstractions. It's a fun article and I recommend it heartily. In this article, Joel argues that most techologies are designed to abstract something more complex under them, but nearly all abstractions are "leaky" in that they fail to completely hide the complexity underneath.
Therefore, you can teach a software developer student about the "higher level" stuff, but sooner or later, they will need to know more about the underlying technology to cope with some unexpected or misunderstood effect caused by a leaky abstraction.
As a result, we cannot forget the underlying technology and "move up" to the new abstraction every time a new library or language appears. We have to continuously cram more knowledge into our brains. This makes all software development increasingly complex.
This little reminder of Joel's classic article came from a developer who complained that software can never be truly disposable, and can never be free, because software is the first, last, and only place where you can document the business process. Every place else, including process diagrams and documents, are leaky abstractions.
I believe that notion is backwards. I believe that software is a leaky abstraction of the business process.
Software, to our end users, is there to solve a problem. The problem is caused by the business needed to implement a business process. Software automates a portion of that business process. In doing so, software must abstract the process details away from the users, hiding complexity. But if the process is complex, or if the software is not able to abstract the process well, it is very likely that the complexity of the business process will "leak through" the abstraction.
In other words, using code as documentation of a business process is a leaky abstraction.
This is just one of the reasons why I do not believe that code is a good place to document business processes.
- As explained above, software is a leaky abstraction of the business process, which nearly always starts with, involves, and ends with human beings accomplishing a business task.
- Code is not accessable to most of the people who actually need the process to change to meet the needs of the business. Especially Object Oriented code, where large portions of the functional bits are hidden in base classes or where a lot of code is spent dealing with Object Relational Impedence. Therefore, the cost of changing a business process increases dramatically due to the need for specialized skills to understand the existing automation.
- Most software modeling technologies focus their strengths on the static and structural elements of software (class diagrams and deployment diagrams) while the business folks want to deal with dynamic diagrams (state diagrams and transition diagrams). As a result, we've refined a language that the business doesn't speak. When you reverse engineer a diagram from code, you usually only get the unhelpful (to the business) static diagrams.
- Code is an indirect representation of the business process steps. A software developer, or team of developers, designed a technical solution to a business problem. There were probably many ways to perform the particular task in technology, yet they chose one. This narrowing is fine when going from general (business process) to specific (implementation) but when going back to general, as we would need to do when using code to document a business process, we would inherently add value to the choices already made. This is flawed thinking that constrains business flexibility needlessly.
You see, my notion of inexpensive software is not just to make it easy on developers. My notion is to create an abstraction that is so good that it provides over 90% of all business problems a "minimally leaky" abstraction. Of course, developers (not just product teams within MS, but IT developers in the field) will need to create this abstraction for our business users.
I believe those abstractions exist in the services spanning layers predicted by Middle Out SOA Architecture.
Of course, there will always be the need for "very deep" software development to expand the boundaries of technology or to create altogether new abstractions for the business to use. We don't put developers out of work. On the contrary, we allow them to lift themselves out of the details and into the language that the business speaks: business process.
Software is the leaky abstraction. It makes poor documentation for a business process.