This post is about a complex set of programming topics.
If you read the first sentence and deep down, behind the locked doors of your mind, liked the fact that you were going to do read something 'really important' this post is about you. Notice however, that I didn't mention the word 'important' in the first sentence. I just said I was going to talk about a few complex programming topics.
Complexity is deceptive.
We, as human beings in general and programmers in particular, tend to associate the word complex to words like important, accurate or correct almost implicitly when in reality complexity has no direct connection with these words.
Steve McConnell in his book Estimation: Demystifying the Black Art describes this human trait with the example of this effort calculation formula:
He explains why the human brain inherently tends to fall for things which sound complex:
Our natural tendency is to believe that complex formulas like this (the one above) will always produce more accurate results than simple formulas like this: Effort = Number Of Requirements * Average Effort Per Requirement
If you're at work, look around. Chances are that you'll easily find a colleague or a team working on a project which is a confused mesh of a Gazillion technologies all of which are collectively doing nothing but boosting up the ego of the programmers who work in that team.
I’ve talked to countless programmers, have witnessed multiple such projects and tried to figure out why we as developers keep making the same freaking mistakes, including the one of confusing complexity with correctness or accuracy.
As programmers, the inherent feeling of being involved in something ‘complex’ seems to give us a sense of pride and an ability to distinguish ourselves from the rest of the world which we seem to look down upon as ‘stupidly simple’. This is also probably why most consultants out there use unnecessarily complex Jargons.
Somewhere deep down inside, we believe complexity is good and we associate words like correctness or even accuracy to complexity.
Liking complexity seems to be an inherent part of human nature; which is probably why we like relationships in our personal life and complex processes in our professional life instead of focusing on the simple things in life and even simpler facts of software development.
We love complex; but only till the time we have had enough and things begin to get out of hands. It’s then that we start making desperate attempts to simplify things.
Besides our inherent love for it, complexity has another rather interesting feature. It happens.
It is in fact, to a large extent, this feature, that describes why we inherently love complexity.
Building something complex is easy. Building something simple, well, that requires a lot of hard work and is a whole new ball game; and that, I believe, is why we humans, lean towards complexity when it comes software and life.
Humor me and I'll do my best to prove my point. I promise.
Jeff Atwood sights an example of a complex piece of User Interface built by a software programmer:
How do you think the UI came about? I wasn’t exactly there peeping over the programmers shoulder but here’s my best guess on something like this comes about:
- Mr. Developer throws some controls on forms.
- Mr. Developer realizes that the application needs some more features.
- Mr. Developer throws some more controls on the forms.
It's easy. See? No Thought Process, No White boarding, No worries or thinking about usability. Simply put, something as complex as the user interface about 'just happens'.
Simplicity, on the other hand involves a lot of a lot hard work. Thinking, re-thinking and a lot of discipline.
The folks at Tortoise CVS and Tortoise SVN are a classic example of how much thought process goes into it before you can just right click a file and check-it-in.
During the Project of the month interview the folks at Tortoise CVS, Torsten and Francis describe their ongoing challenge of keeping it simple to use, through remarks like:
What are a couple of notable examples of how people are using your software?
Why do you think your project has been so well received?
What's on your project wish list?
What are you most proud of?
How do you coordinate the project?
Tortoise is a classic example of how you can take something complex like version control and simplify it. If you've used Tortoise to work with CVS or SVN, the hard work that has gone into simplicity clearly shows in the form on elegance of implementation; and WGetUI? Well, one look at that user interface and anyone with any fundamentals of how software development works can tell you that the WGetUI is a software that 'just happened'. It is an example of how you can take a simple problem like file-download and solve it without any thought on usability or user interface; letting the development 'happen' as things pretty much evolve by themselves.
The next time you reach out and proudly announce to your friend, colleague, relatives, family or acquaintances that you’re working on a system that’s very complex, it’s time to do some soul searching. Maybe your so-called-highly-complex-system that you are working on is something that is 'just happening' without any effort on your part to keep it simple; and that, I’m not so sure, is something to feel particularly proud about.