Construction has never been easy. Hundreds of years ago, there were buildings that were being constructed which were absolutely amazing and complex structures. They were complex even by today’s standards. Take a look at the Cologne Cathedral for example. It is one of the largest cathedrals in the world, composed of many thousand and thousands of stones and worked on by thousands and thousands of workers. It is roughly 515 feet tall, which is the equivalent of about a 35 to 40 story building! So what is the difference between this structure and a modern 35 story building?
There are quite a few differences actually. First and foremost are the materials. In a modern building our construction materials would include steel beams, glass sheets, concrete, drywall, cinder block, etc… This is quite different from the stone, brick, and stained glass that a cathedral would be made out of. We know that building materials have changed over the centuries, and we also know that there are many reasons for this. From ease of assembly, ease of manufacture, strength, weight, etc… it all boils down to the fact that these materials have made construction easier. And by making it easier, it reduces the time it takes to construct a building.
And that is the biggest different between the Cologne Cathedral and a modern sky scraper. All of the physical details aside, the time and cost required to construct the Cologne Cathedral is absolutely astronomical compared to modern buildings. The Cologne Cathedral’s construction was started in 1248 and wasn’t completed until 1880! Even if you consider the fact that there was an almost 400 year halt in construction, it still took almost 200 years to build! Contrast that with the Taipei 101, which is currently the world’s tallest skyscraper, and it only took from 1999 to 2004 to build with a cost of 1.76 billion. If it would have taken 200 years to build the Taipei 101, then at that rate it would have cost 149 billion dollars to build! That is almost three times Microsoft’s yearly revenue!
But how does this fit into software development? Well, I think that people in software development are sometimes afraid of easy. People in the construction world are never afraid of easy. They have actively sought out materials and manufacturing techniques to make their jobs easier because they know that they will be asked to build larger and more complex buildings on shorter timelines and leaner budgets. Often times it seems that people in the software world actively seek out a complex solution to a problem, simply because the complex solution is seen as requiring more technical ability. Other times software developers will choose to build something that has already been built, simply because they want to have more control over the process without consideration (or at least under-consideration) of how much wasted effort is going to go into it.
Imagine if every time someone wanted to construct a building they set about to design the wall outlet again. First of all we would end up with a hideously large number of different outlet types, and nothing would ever plug in right, but secondly the cost and effort involved would be such a huge waste. The socket has been designed and built over and over, just go get one from the store. Now that may sound silly, but many people do this on a daily basis in their software. They repeat the same code for the same basic processes over and over. Part of it is that they have not taken the time to identify a problem’s constituent parts so that they can separate the repeatable parts.
For some items this may be intuitive, but let’s look at the wall outlet analogy again for a second… imagine if you had never built a building before and you were told to identify what is repeatable. You look at the outlets and they are all connected to a bunch of different length wires going to other outlets all over the house. You designed these outlets from the ground up, so these wires are physically connected to the outlets, which means you see this network of outlets strewn throughout the house as a single system. Surely you can’t mass manufacture these items, each one of these outlets requires different length cable to be connected to it in order to reach the next outlet! It is only when the builder starts looking at the wires and the outlets as separate systems do they realize that each of these items can easily be stamped out in large numbers.
For us, looking at a modern outlet, we have screws on the back where we can attach a wire. Then we can also go buy wire, wire strippers, wire cutters, and a screw driver. The system is broken down for us, we have the tools we need, we just need to make it happen. In software these tools are becoming more readily available to us on a daily basis. We have Inversion of Control containers, object relational mappers, AOP tools, refactoring tools, etc… Most of us need to start seriously looking at our tool-belts and asking ourselves if we are using the tools that will make our jobs easy. But even with all of these fancy tools, we still need to take the time to look at our software and try to ascertain what is repeatable. And trust me, it isn’t going to be all ponies and gumdrops, you will have to put some serious effort into finding patterns and leveraging these tools effectively. But once you do, you will never look back. Just as our most of our friends in construction would never dream of going back and hand chiseling a piece of stone.
Loved the article? Hated it? Didn’t even read it?
We’d love to hear from you.
I think buttom-up programming is a powerful way to tackle the problem: http://www.paulgraham.com/progbot.html This idea has helped me a lot to keep things simple in my programming. You start with the language and the library functions and build layers of abstraction from there. The resulting classes, methods or functions can be combined more flexibly than if you would have started top-down. This method works especially well with Lisp but also with other languages such as Java.