Why Software Design Matters

If you are in the software development business, I’m sure you have heard that “Design” is important and you should always design first and code later. This “belief” is not accepted by all anyway. I don’t blame them, because we can’t really make good designs most of the time, so why bother anyway? I will try to explain you why you should bother. I think the title of the article might have been, “When you shouldn’t Design Software” too. So keep up with me!

Once we start to a project, we meet with the customer or whoever is the one giving us the job and try to understand what he really wants. I think this is the hardest part in the software development life cycle. But I will come back to this part later with a little bit more detail.
You have met the customer and you understood what he wanted and you started to code it. Yep, no design because we don’t need it, right? What the customer wanted was so easy and there was nothing to design anyway. You showed the customers some prototypes, he liked it and you kept coding. At the end of first milestone (so you know a little bit more about project management then software design, nice), you explained the customer how was your system, how they could use it, how it matched their needs. Customer looked at you and said: “No that’s not I had wanted. I actually wanted this and this and that. Not that and this and this.”
Dammit! So now you have to find where all the parts customer wanted to change, rewrite/reengineer/refactor these parts, make more tests, find the other parts of the code which could have been affected etc. It’s a helluva job right? Boring and hateful.
What I’m saying you is not that, if you had designed, this problem wouldn’t have occurred. It would. Really! It’s not a design problem but we will come to that. But the importance of the “design” comes with this communication problem. If you had designed, you would have wasted less time. Because you would have thought before getting your hands dirty and perhaps you would have noticed something was wrong and was able to fix it during the customer meetings before you had “wasted” any time with coding.
Design is important because it always takes more time to write something from scratch then changing something that is already there. With good design the time you spend to change something is also minimized. It’s a win-win situation, right? Customer is happy because you can make the changes as fast as possible and you don’t curse your code for not allowing you to customize it easily.
I hope you now agree that design is important, however as I had mentioned, bad design is not actual problem in the software project: It’s the communication. The moment you think that you have understood your client, is probably the moment you have made a terrible mistake on some point and it will probably cost you in terms of time, effort and money.
Many software developer are not good with their social skills and that’s a terrible thing. There is no more the cowboy coders we have seen on the TV. The usual nerd guy who never goes out and hacks all the systems with ease. There is no such guy in reality. You need a team, a collection of people to actually make something. It’s not a one man show anymore. It’s a circus and you need all the help you can get from many different people, including domain consultants, project managers, business owners, work flow managers, R&D departments, document writers, testers, users,… There is helluva party in the software business now, go and grab your party hat instead of your horse’s saddle!
What we are really missing is the communication part. Design matters because we can’t communicate effectively with each other. Some small points we miss during the meetings, causes big problems later in the life cycle. With good design we don’t really solve the “real problem” but one of the symptoms of the actual problem. By “fixing” the symptoms you might loose your chance of finding the actual problem.
Let’s take a look at the future now. Design is important because it takes a lot of time to write something from scratch. But what if it weren’t? I mean what if it had taken less time to write a software from scratch then changing it? Wouldn’t that be cool? It would and honestly, design wouldn’t matter anymore. You can start from scratch within minutes so it doesn’t really make sense in trying to design it. And now we have reached the real title of the article, design is important “now” and probably will be important for a decade too. However it won’t be relevant after some time. Why? Because of the CASE tools. Even now there are tools that helps you write the code with an already conventional design. Of course there will always be custom specified software where you will have to write code but they will be very specific software and then of course you will have to design in them. But the real “cream” of the software will be requirement engineers, the guys who really tries to understand what the customer actually needs and they will still be needed in specific software too. As the specific software has some very specific requirements, probably they will have a higher salary then the designers and coders anyway.
I’m not an authority in the software, yet from my experience, we should really get better with our social skills. We should really be able to understand others and to be understood by others. We should express our ideas betters.
Communication is important and please invest on your social skills as well as your technical skills. I don’t hire guys who can’t talk or express their ideas. There are many “bright boys” who put words after each other that doesn’t make a sentence. Stop reading this article and go out now. Have a beer with your friend instead of playing WoW. Honestl,y having a beer with a friend and talk to him will help you more then spending that night trying to write some code. Your friend might even give you a better idea which solves your problem anyway.