Software engineering, what is it, what are the aspects, and how do you perceive it. An early definition of software engineering was proposed by Fritz Bauer “The establishment and use of sound engineering principles in order to obtain economically software that is reliable and works on real machines.” Another definition given in the IEEE Standard Glossary of Software Engineering Terminology is“Software engineering is the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software; that is, the application of engineering to software.” It is an outgrowth of hardware and system engineering. Its three key elements are –methods, tools and procedures-that enable the manager to control the process of software development and provide the practitioner with a foundation for building high-quality software in a productive way. Software engineering methods provide the technical “how to’s “ for building a software, that include gathering data for project planning and estimation, system and software requirements analysis, design of data structure, program architecture and algorithm procedure, coding, testing, and maintenance. Often a special language-oriented or graphical notation is introduced, along with criteria for ensuring software quality. Software engineering tools provide automated or semi-automated support for methods. Today, tools exist to support each of the methods noted above. When tools are integrated so that the information created by one tool can be used by another, a system for the support of software development, called computer aided software engineering (CASE), is established. CASE combines software, hardware, and a software engineering database ( a data structure containing important information about analysis, design, code, and testing) to create a software engineering environment that is analogous to CAD/CAE for hardware. Software engineering procedures are the glue that holds the methods and tools together and they enable rational and timely development of computer software. Procedure define the sequence in which the methods will be applied, the deliverables(documents, reports, forms, etc.) that are required, the controls that help ensure quality and coordinate change, and the milestones that enable software managers to assess progress.
The classical model for software building is sometimes called “the waterfall model”, which is a systematic approach to software development that starts at the system level and progresses through analysis, design, coding, testing and maintenance. System engineering and analysis: This involves establishing requirements of the system elements and then allocating a subset of these requirements to the software. This system view is essential when the software must interface with other elements such as hardware, people, and databases. System engineering and analysis encompasses requirements gathering at the system level with a small amount of top-level design and analysis. Software requirements analysis: The gathering process is intensified and focused specially on software. The software engineer (analyst) must understand the information domain, the required function, performance, and interfacing. Requirements for both the software and the system are documented and reviewed with the customer. Design: Designing is a multistep process that focuses on various attributes like data structure, software architecture, procedural detail, and interface characterization. The main idea behind designing is to study the various aspects and assessing them for quality before the actual coding begins. The final stage involves documenting the design and attaching it as a part of the software configuration. Coding: This involves translating the design into the actual code, which is the actual software. Many a times, the coding process is divided into various parts, such that each individual process can be coded in a simpler and less tedious way, but ensuring that the communication between the various parts remains hassle free. This, at times may reduce the complexity of software development, at the same time maintaining the complexity of the overall software problem at hand. Testing: This involves testing the code developed, of errors, and making sure that the defined input will produce the actual results that agree with required results. Maintenance: change is a part of life, and it holds for software too. There will be errors encountered which need to be attended to. Then most software models are a part of reality, and as the reality evolves the software should do the same if it doesn’t want to become obsolete. At times, changes may be required because of the advent of a new software or a new peripheral device,
or the customer requires functional or performance enhancements. Software maintenance reapplies each of the preceding life-cycle steps to an existing program rather than a new one. Apart from the above mentioned points, there are various aspects of software engineering which cannot be overlooked. For example the efficiency with which software is developed is of crucial importance. Total cost and development time of software projects is high. Regular cooperation between people is an integral part of programming in the large. Since the problems are large, many people have to work together at solving those problems. There must be clear arrangements for the distribution of work, methods of communication, responsibilities, and so on. Discipline is one of the keys to the successful completion of a software development project. The software has to support its users effectively. The software is developed in order to support users at work. The software should be user friendly and fit user’s tasks. User manuals and training material may have to be written, and attention must be given to developing the environment in which the new system is going to be installed. Software engineering is a field in which members of one culture create artifacts on behalf of members of another culture. Software engineers are expert in programming one or more areas such as programming in Java, software architecture, testing, or UML, but they are not experts in areas such as library management, or banking or petrol pump management etc. but still, they have to develop systems for such domains. Lack of knowledge of these real life domains is a common source of problems in software development projects. Software engineering has many facets. It is certainly not the same as programming, though programming is an integral part of software development. Mathematical aspect plays a role since we are concerned with the correctness of software. Sound engineering practices are needed to get useful products. Psychological aspects play a role in the communication between human and machine, and between humans. Finally the development process needs to be controlled, which is a management issue. Software engineering has a considerable overlap with computer science. It has a similar inclination to focus on clean aspects of software development that can be formalized in both teaching and research. But it also has to deal with such matters as management of huge development projects, human factors(regarding both the developers and the users) and cost estimation and control. Software engineers must engineer software. To conclude, I would like to say, that even though it has many things in common with other
fields of engineering and computer science too, but, it has a face of its own in many ways untouched by the other spheres of engineering or computer science, a face that gives it a separate identity.