if you fail to plan you plan to fail — Benjamin Franklin

The Benjamin Franklin saying, if you fail to plan you plan to fail, is true in life experiences and software engineering is no different.

Software engineering differs from other kinds of engineering and since it mostly deals with intangibles, it can easily change and seem very malleable. For instance, customers can ask for late minute feature additions or last minute changes that may even involve switching hardware platforms.

Therefore to manage these contingencies and have a great ribbon cutting ceremony, there is a need for software engineers to make a plan and follow it judiciously.

The first task of software product design is the requirement gathering. One can be tempted to say it is the most important stage of a project but keep in mind that a software project can also fail at other stages.

Requirements do set the stage for everything that follows, so it is definitely an important step. This is why John F. kennedy said that efforts and courage are not enough without purpose and direction.

Requirements are the features that your application must provide and one very effective way to gather these requirements is using the five W’s questions ( Who, What, Where, When, Why) and one H (how).

These requirements helps one to figure out what is needed to be built. Throughout development, the requirements are used to guide development and ensure it is headed in the right direction. At the end of the project, one uses the requirements to verify that the finished application actually does what it’s supposed to do. Some features of a good requirement include : clarity, unambiguity, consistency, priority etc.

Design is not just what it looks like and feels like. Design is how it works —Steve Jobs.

Design is a way to show the implementation of the project requirement. There are two types of design namely; high level design and low level design

High Level Design

High‐level design provides a view of the system at an abstract level. It shows how the major pieces of the finished application will fit together and interact with each other.

High‐level design sets the stage for later software development. It deals with the grand decisions such as:

  • What hardware platform will you use?
  • What type of database will you use?
  • What other systems will interact with this one?

The high level design is meant to specify - Security, Hardware, user interfaces, Architecture ( monolithic, client/server, component-based, service-oriented, data-centric), Databases, Structure diagram(class diagram, object diagram, component diagram, package diagram), etc.

Low Level Design

Low‐level design fills in some of the gaps by providing extra detail and definitions for the actual logic for every system component that’s necessary before developers can start writing code. It gives more specific guidance for how the parts of the system will work and how they will work together. It refines the definitions of the database,the major classes, and the internal and external interfaces.It is based on High Level design but digs deeper, going into the separate modules and features for every program in order to document their specifications.

Simply said, High‐level design focuses on what while Low‐level design begins to focus on how. Low level design focuses mostly on object oriented design and database design (Normalizing the database to get the best design).

It is important to note that the line between the low level design and high level design can be a bit blurred since low level designs are high level designs but with greater detail.

As the whole idea of software products is to solve problems, it is necessary to keep in mind that a problem well stated is a problem half solved - Charles Kettering