Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Appreciating the value of good design [closed]

Having recently worked with a bunch of people (from two different companies) right out of school or with 1-2 years experience, I was initially quite impressed with their knowledge of the various industry buzz words and design patterns etc. Furthermore they each had a good understanding on OO design principle and use of interface.

To cut a long story short…. In just a few days of working with them I found that things were not as they appeared.

Let me define some terms I’ll use here Knowledge – Something you learn either in school or book or on the Internet etc.

Experience – The amount of time you’ve been doing something

Skill – Only gained through experience. That is acquiring skill (over time) and knowing how to apply the knowledge you have

What I found was that even though they knew this stuff, they really didn’t know how to apply this knowledge. You’d have all these patterns waving in your face but any code they had to write of their own accord had basic flaws with it. They could tell you the virtues of a certain design pattern and could come up with somewhat of an implementation but could not recognize basic flaws in the design.

Of course I had my fair share of the “One who knows not that he knows not –Confucius”.

Each night I’d spend a lot of time re-iterating everything that was said during the day trying to understand who was saying what and why, trying to figure out what I could do by way of examples during training or code review. But frankly I was quite puzzled.

After about 2-3 weeks I started to figure it out. Anyway, the questions first 1. Have you experience this sort of thing? 2. How did you (or do you) tackle this?

My conclusion was that either schools are doing a bad job or Google is their friend and they’re getting all this “knowledge” and think they know.

But I feel

  1. In order to be able to recognize and appreciate good design one MUST write code that is well,… not so well designed. Struggle with it and then fix it to know the pain and therefore recognize good and bad design and appreciate it

  2. Practice and Experience – you just can’t beat that. There is so much that experience (and the quality of experience) brings to the table that you just can’t match it with just knowledge or a little bit of experience.

Some other things I experienced: “Why is this an interface and not a base class” – you’ll get all kinds of answers but none of them is the right reason.

Why this design pattern and not that, or forget design patterns for a minute and just design (they’re utterly lost – that’s when you see their real design coding skills)

Over engineering – don’t recognize it and can’t appreciate they it could be a maintenance nightmare as the system grows. I found this to be a big issue. It's as if everything has the potential to change. A simple process of sending an email has 3 classes in addition to the various classes the in the .NET framework you'd use to send an email.

Using all the new features in the framework or language just because (I’ve even seen this in some of Microsoft’s source code for a certain framework for which source code is available)

So 10 years from now, everyone writing code is writing it using all the fancy framework or language features using all the possible design patterns, such that “legacy” code is well written and well designed. Or is it? What do you think?

Does anyone else feel that 10 years from now we’ll just be shifting through a different kind of muck. Muck that’s scattered about in a dozen more code files then it used to be because now we’ve got classes and so called loosely coupled code but it’s just a different kind of mess and in fact harder to clean up?

like image 533
Shiv Kumar Avatar asked Nov 15 '10 04:11

Shiv Kumar


1 Answers

Interesting deliberations. I have always felt that with time we are over engineering our systems with all the patterns flying around. An extra layer of abstraction means more failure in understanding in future. My personal approach is to keep things simple and only introduce complexity if it is required. Decouple if decoupling is required. Many of the design requirements do flow in systems because we blindly put in requirements document that it should be maintainable, reliable and all *able. It's also necessary to understand the degree in which we want these *ables and more importantly how they impact our budget and business values both in shorter and longer term.

One important aspect is always to keep a very tight focus on business requirements, at every stage, both in terms of functionality and budget.

like image 144
lalit Avatar answered Nov 17 '22 01:11

lalit