Good Design – High Level or Low Level

Software Design is one interesting topic for coders like me and that is the reason I started exploring this topic. I explored various sources to get information on this topic. Before starting to work on any item as per general
practice we want to understand what is the end result we have in our mind.  So end result what I am concerned is design. There is no perfect design so design created by one person will be different from design created by other person. Since design created by two person may be different, we can only say whether design is good or bad. So I should say end result in my mind is a good design. Good is very generic word and being in software development for various years I am taught by my experience to not make assumptions. So good design for different people can be completely different. We need to understand what are the design goals which we want as end result. So a good software design as certain attributes which determines whether
is it is good or not.

  • Correct – Design should be correct to it’s requirement. So design should achieve what is stated in requirement of software system. It should fulfill functional and non functional requirement.
    You can have look at below classification to get more detail of requirement classification which needs to be addressed through implementation for which we are preparing design. I have left detail of these requirement since topic of discussion is not requirement elicitation.

    • Functional
    • Non-Functional
      • Product
        • Usability
        • Efficiency
          • Speed
          • Throughput
          • Memory
        • Reliability
        • Portability
      • Organizational
      • External
  • Robust – Implemented software should be tolerant to misuse. So if there are faulty data/ parameter/ action is passed to software there should be provision to handle that.
  • Flexible – This is very important aspect of good design. Making software is different from other engineering disciplines like Civil.  In case of software, requirement changes over the period of development of  software. So when we start working on software project we have different requirement and during development lot of these requirements change. We can not control them because business keeps changing on very rapid pace and software are made to fulfill requirement of
    business. So only workaround is , to manage those changes. So software design should have provision for these changes and should adapt to shifting requirement. During change we identify where we need to change, then change and then test that change.  There are various detractors of flexibility like complex code, improper responsibility assignment to classes/methods, unreadable code and repetition in code.
  • Extendable – If there are any enhancement for the software comes in future, design should have provision to accommodate that. This will also have similar impact as above. So if design is good,
    features can be added without much hassle or adding new feature may result in breaking some existing feature.
  • Reusable – In today’s software development world we have rapid development cycle. So reusable components are very important for rapid software development. It also saves cost of software
    development. If there are some reusable component development during development of one software can definitely help in reducing future software development time. Microsoft Patterns & Practices Enterprise library is one good example of these kind of reusable components.
  • Efficient – Good use of processor and memory
  • Reliable – The system developed by design should be reliable. Reliable means how long software can perform without error in specific environment.
  • Usable – When we develop software systems, these are used by human. There are people who make their livelihood by working daily on this software in case of business application.  Software which is more usable make people more productive.

As for good design attributes, there are attributes which defines how can we say this is a bad design. According to Robert Martin (http://www.objectmentor.com/omTeam/martin_r.html), below are the attributes of bad design.

  • Rigidity – It is hard to change because every change affects too many other parts of the system.
  • Fragility – When you make a change, unexpected parts of the system break.
  • Immobility – It is hard to reuse in another application because it cannot be disentangled from the current application.

I tried to consolidate end result attribute and then we need to start design.

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top