Software design sits at the technical core of software engineering and is applied regardless of the software process model that is used. The design task produces a data design, an architectural design, an interface design, and a component design. Abstraction A solution is stated in large terms using the language of the problem environment at the highest level abstraction. The lower level of abstraction provides a more detail description of the solution. A sequence of instruction that contain a specific and limited function refers in a procedural abstraction. A collection of data that describes a data object is a data abstraction. Architecture The complete structure of the software is known as software architecture. Structure provides conceptual integrity for a system in a number of ways. The architecture is the structure of program modules where they interact with each other in a specialized way. The components use the structure of data. The aim of the software design is to obtain an architectural framework of a system. The more detailed design activities are conducted from the framework. Patterns A design pattern describes a design structure and that structure solves a particular design problem in a specified content. Modularity A software is separately divided into name and addressable components. Sometime they are called as modules which integrate to satisfy the problem requirements. Modularity is the single attribute of a software that permits a program to be managed easily. Information hiding Modules must be specified and designed so that the information like algorithm and data presented in a module is not accessible for other modules not requiring that information. Functional independence The functional independence is the concept of separation and related to the concept of modularity, abstraction and information hiding. The functional independence is accessed using two criteria i.e Cohesion and coupling. Cohesion: Cohesion is an extension of the information hiding concept. A cohesive module performs a single task and it requires a small interaction with the other components in other parts of the program. Coupling: Coupling is an indication of interconnection between modules in a structure of software. Refinement Refinement is a top-down design approach. It is a process of elaboration. A program is established for refining levels of procedural details. A hierarchy is established by decomposing a statement of function in a stepwise manner till the programming language statement are reached. Refactoring It is a reorganization technique which simplifies the design of components without changing its function behavior. Refactoring is the process of changing the software system in a way that it does not change the external behavior of the code still improves its internal structure. Design classes The model of software is defined as a set of design classes. Every class describes the elements of problem domain and that focus on features of the problem which are user visible.