There are many aspects to software design, and many varying methodologies. I will not be examining any particular methodology - rather, I will attempt to discuss why software design (regardless of the facet) is important.
I started programming at the age of 8 using BASIC (on a Tandy TRS-80.... don't laugh!!!). Even then, I had a very logical mind, and I planned and designed any significant programs I wrote.
Now I work in the software industry as a consultant, and I am constantly horrified by the number of young programmers these days that only know how to "hack" together a program. I am not suggesting they are bad programmers; on the contrary - they are likely to be some of the brightest and most creative coders. The problem is that without adequate planning any large project will get out of control.
This is just an overview article - and does not go into great depth.
Facets of design
When attempting to produce any piece of software (and particularly a large and complex one) it is vital to consider several areas. Many people only look at a small component of this when "designing" their programs. Why? Either they are not aware the other components require design, or they cannot be bothered to do it.
What "components" am I referring to? The main components in software include:
- required functionality
- additional (optional) functionality
- user interface
- internal data structures
- external data structures
- program/object structure
Without applying design principles to these (and often other) areas, you end up with a lot of common software problems: scope creep, poor functionality, unwieldly or difficult to use UI, poor performance, over-sized data files, overly complex processing, impossible to maintain code.
"Design" of required and optional functionality is traditionally the Specification phase of a project/program. The remaining areas should occur during the Design Phase of a project and be revised during Implementation (or post-Prototype). The exact timing and processes will
depend on the methodology being used, but all should occur.
In the early stages of a project or program, the "functionality design" or specifications need to occur. Without specifications, the development is unguided. It is difficult to know when the program is complete - and impossible to accurately measure progress. It is also difficult for a programmer to be motivated when the task is not well defined.
It is just as important to perform this stage when writing software for yourself as it is when writing for a client.
User interface design is one of the most considered aspects of software design. Everybody is aware that without a usable interface, no software product will be widely used. It is important plan the user interface, and discuss or demonstrate it to the end users - something that you may consider appropriate may not fit well with the way they expect your product to work.
Even if coding for yourself; plan what information needs to be displayed and entered, how it relates to other information, and how to efficiently present that information.
Without performing UI design (whether graphical or command-line), a program will seem unprofessional, and most likely will have over-crowded and difficult to use screens.
Program design refers to the
strucure of the program. The methods here will vary greatly (particularly for OO vs procedural languages). A well designed program will be easier to implement; easier to distribute; and easier to maintain.
Internal and external data structures refer to how the data used by your program is held and handled within the program, or when stored for later use, respectively. Well designed data structures make it easier to handle the information within your program. More importantly, they make your program more flexible and easier to add or change functionality. They can also have a huge impact on the performance of your completed application.
Using design patterns may help solve certain problems, but if used improperly, they add complexity where not required. However, when used correctly and as part of the complete process, design patterns can save a lot of work in the program and data structure design areas.
There are many facets of design to be considered when putting together an application. They cannot be considered in isolation, and should be performed for any sizable project.
Many tools, techniques and methodologies exist to aid with design - and not all are appropriate for all situations. However, the design of a product is of vital importance for it to be complete and usable, and robust.
This article was originally written by reesylou