Software engineering is the discipline of producing software to meet customer needs with the highest quality feasible given resource constraints. It is concerned with the ways in which people conduct their work activities and apply technology to produce and maintain software products and software-intensive systems. Issues of concern include specification, design, implementation,verification, validation, and evolution of software artifacts. Related topics include software metrics, project management, configuration management, quality assurance, peer reviews, risk management, and process improvement. Software engineering is essential for anyone working in development, maintenance, management, or related areas in a software organization.
Software development currently suffers from 3 major deficiencies: (1) software engineering principles and practices, which should be the backbone of the software development life cycle are not fully accepted and followed by academia or industry; (2) straightforward, well established, and universally accepted design standards are lacking for the software development process and for representation of both process and product; and (3) the software development process is empirical in nature and not yet predicated on easily quantified and confirmed mathematical models. The effect of these and other deficiencies has been amplified by the rapid growth in the volume of software being produced and the almost exponential increase in the complexity of the problems now being solved with software. In spite of the need for a strongly structured approach to software's development, in many organizations software development is still basically a freestyle event.
There may be other deficiencies in the software development process, the three that have been cited above are the root cause of many failed software developments. We cannot offer a"silver bullet", but we do, however, can offer the reader, interested in entering the software development field, a realistic preparation for the new software engineering environment.
The overall objective of software engineering is to give the reader a sense of the flow of events in an integrated system and software development effort, and appreciation for and understanding of the software engineer's role in the system development process, and a comprehensive preparation for assuming responsibilities of a software engineer. We have also defined the following five fundamental objectives for the topic: (1) motivating readers with limited application experience by using realistic examples from recent experience and examining future directions for the discipline; (2) organizing and presenting material in such a way that the experienced practitioner will find it an accurate portrayal of the real world of software development; (3) developing a bridge from theory to practice in specific topics of interest to software engineers; (4) providing an algorithmic approach to each task or process carried out by a software engineer; and (5) providing a firm foundation upon which the reader can build.