Computer software has become a driving force in our life, everyone uses it either directly or indirectly. The role of computer software has undergone significant change over the last 50 years. Software affects nearly every aspect of our lives and has become unavoidable part of commerce, our culture and our everyday activities. It serves as the basis for modern scientific investigation and engineering problem solving. It drives business decision making. It is embedded in systems of all kinds: entertainment, office products, transportation, medical, telecommunications, industrial processes, etc. Software as a product delivers the computing potential embodied by computer hardware. It can be considered an information transformer producing, managing, acquiring, modifying, displaying, or transmitting data. Software provides a connection to worldwide information networks Internet and makes it possible to acquire information in all of its forms [ 1 ] [ 4 ] [ 14 ] [ 15 ].
As the importance of software grows, the software community continually attempts to develop technologies that will make it easier, faster, and less expensive to build high-quality computer programs. Some of these technologies are targeted at a specific application domain such as web-site design; others focus on a technology domain (for example object-oriented systems); there are technologies that deliver dependable software. However, we have yet to develop a software technology that does it all. The technology encompasses a process, a set of methods, and an array of tools that we call software engineering. Software engineering has been an engineering discipline, it focuses on the cost effective development of high-quality software systems.
The notion of software engineering was first proposed in 1968 at a conference held to discuss what was then called the software crisis. This software crisis resulted directly from the introduction of new computer hardware based on integrated circuits. Dramatic improvements in hardware performance, profound changes in computing architectures, increases in memory and storage capacity, have all led to more complex computer-based systems. The resulting software was orders of magnitude larger and more complex than previous software systems. Due to the high demand for complex software systems the individual programmers of the earlier periods has been replaced by a team of software developers, each focusing on one part of the technology required to deliver a complex application. At large-scale systems developments, that requires extensive co-operation of developers to complete developments within a prescribed duration of time, it has become increasingly apparent that the existing development methods were not good enough to efficiently drive the development processes.
Development projects were sometimes years late. The development cost was over the budget, software was unreliable, difficult to maintain and performed poorly. Hardware costs were consumedly decreased while software costs were rising rapidly. This phenomenon was recognised by software developers and they stated that the software development practice was in crisis. To solve problems it was necessary to recognize that software has become a product, and similarly to other products a technology was required to develop it.
What does it means that software is a product? It is that:
Software has to provide services and functionalities as it specified.
Software has quality attributes.
There is a cost of its production.
There is a time limit for developing software.
New techniques and methods were needed to control the complexity inherent in large software systems. These techniques have become part of software engineering and are now widely used. Software industry has made tremendous progress since 1960s and the development of software engineering has significantly improved the quality of software. The activities involved in software development have been much better understood. Software engineers and development organizations have developed effective methods of software specification, design and implementation. However, the large number of different types of systems and organizations that use these systems means that we need different approaches to software development.
Computer software is the product that software engineers design and build. A software product is composed of computer programs, data and documents. A definition of software can be given by these items as follows:
Software consists of computer programs that when executed provide desired function and performance.
It includes data structures that enable the programs to adequately manipulate information.
It has a documentation that describes the operation and use of the programs.
There are two fundamental types of software product:
Generic software. These software are produced by a development organization and sold on the open market to any customer.
Customized software. These software are developed especially for a particular customer by a software contractor.
The main difference between these two types of software is the following. In the case of generic software products the organization that develops the software specifies the software requirements. For custom products, the specification is usually developed and controlled by the organization that is buying the software.
The breadth of software applications can be indicated by the following software areas: system software, real-time software, business software, engineering and scientific software, embedded software, personal computer software, web-based software and artificial intelligence software.
A software process also known as a software development life-cycle is composed of a number of clearly defined and distinct work phases which are used to design and build software. Development phases represent four fundamental process activities that are common to all software processes:
Software specification. During this activity customers and engineers define the functional and non-functional requirements of software to be produced.
Software development. It is the development activity for designing and implementing software.
Software validation. In this activity the software is checked that it works faulire free and to ensure that it provides the functionalities what the customer requires.
Software evolution. The aim of software evolution is to implement changes to the system due to the changes in user and market requirements.
These fundamental activities may be organized in different ways and described at different levels of detail for different types of software. Use of an inappropriate software process may reduce the quality of the software product to be developed and may increase the development costs.
A software process model is a simplified description of a software process that presents an overall view of the software process. Process models may include activities that are part of the software process, software products and the roles of people involved in software engineering. Most software process models are based on one of the next general models of software development:
The waterfall approach. The waterfall model is a sequential design process in which progress is seen as flowing steadily downwards through the phases of software development such as requirements specification, software analysis and design, implementation, testing, etc. Development only goes on to the following phase when the preceding phase is finished, reviewed and verified.
Iterative development. The basic idea of this method is to develop a system iterative through repeated cycles in smaller portions at a time. At each iterations, design modifications are made and new functional capabilities are added. This approach interleaves the activities of specification, development and validation. An initial system is rapidly developed from very abstract specifications. The goal for this initial implementation is to create a product to which the user can react. The initial system is then refined with customer input to produce a system that satisfies the customer’s needs.
Component-based software engineering. It is a reuse-based approach of software development. This technique assumes that parts of the system already exist. The system development process focuses on integrating these parts into a system.
Functional quality of software reflects how well it complies with a given design, based on functional requirements or software specifications. Besides functional quality, software has a number of other associated attributes that also reflect the quality of that software. These attributes are usually called non-functional attributes. They reflect the behaviour of software while it is executing and the structure and organization of the source program. Examples of these attributes are the maintainability, reliability, efficiency, etc. The specific set of attributes expected from a software system depends on its application. Some essential quality attributes of a software system are the following [ 13 ]:
Maintainability. Maintainability is defined as the ease with which changes can be made to a software system. These changes may be necessary for the correction of faults, adaptation of the system to a meet a new requirement, addition of new functionality, removal of existing functionality or corrected when errors or deficiencies occur and can be perfected, adapted or action taken to reduce further maintenance costs.
Dependability. Dependability of software includes characteristics such as availability, reliability, safety and security. Dependable software should not cause physical or economic damage in the event of system failure.
Efficiency. Efficiency is the ability of the software to do the required processing on least amount of system hardware such as memory or processor cycles.
Usability. Usability is the ability of a software to offer its interfaces in a user friendly and elegant way.
Reusability. Reusability defines the capability for components and subsystems to be suitable for use in other applications and in other scenarios. Reusability minimizes the duplication of components and also the implementation time.
Testability. Testability is a measure of how easy it is to create test criteria for the system and its components, and to execute these tests in order to determine if the criteria are met. Good testability makes it more likely that faults in a system can be isolated in a timely and effective manner.
Explain software crisis!
Give the definition of software!
What is the difference between generic and customized software?
What is the software process?
List the main activities of software process!
What does the software process model mean?
List the main types of software process model!
What is the meaning of component based software development?
List five quality attributes of a good software!
What is the meaning of software maintainability?
What is the meaning of software reusability?