Software Engineering:
Software Engineering is the study and application of engineering to the design, development, and maintenance of software.The term "Software Engineering" was first used in 1968 as a title for the worlds first conference on Software Engineering, sponsored and facilitated by NATO. The conference was attended by international experts on software who agreed on defining best practices for software grounded in the application of engineering. The result of the conference is a report that defines how software should be developed [i.e., software engineering foundations]. The original report is publicly available.
The discipline of Software Engineering was coined to address poor quality of software, get projects exceeding time and budget under control, and ensure that software is built systematically, rigorously, measurably, on time, on budget, and within specification. Engineering already addresses all these issues, hence the same principles used in engineering can be applied to software. The widespread lack of best practices for software at the time was perceived as a "software crisis".
Barry W. Boehm documented several key advances to the field in his 1981 book, Software Engineering Economics.The book analyzes sixty-three software projects and concludes the cost of fixing errors escalates as we move the project toward field use. The book also asserts that the key driver of software cost is the capability of the software development team.
These include his Constructive Cost Model (COCOMO), which relates software development effort for a program, in man-years T, to source lines of code (SLOC).
The modern generally accepted practice for Software Engineering has been cataloged as a Guide to the Software Engineering Body of Knowledge (SWEBOK) which has become an internationally accepted standard ISO/IEC TR 19759:2005.
Subdisciplines
Software engineering can be divided into ten subdisciplines. They are:
1)Software requirements: Th elicitation, analysis, specification, and validation of requirements for software.
2)Software design: The process of defining the architecture, components, interfaces, and other characteristics of a system or component. It is also defined as the result of that process.
3)Software construction: The detailed creation of working, meaningful software through a combination of coding, verification, unit testing, integration testing, and debugging.
4)Software testing: The dynamic verification of the behavior of a program on a finite set of test cases, suitably selected from the usually infinite executions domain, against the expected behavior.
5)Software maintenance: The totality of activities required to provide cost-effective support to software.
6)Software configuration management: The identification of the configuration of a system at distinct points in time for the purpose of systematically controlling changes to the configuration, and maintaining the integrity and traceability of the configuration throughout the system life cycle.
7)Software engineering management: The application of management activities—planning, coordinating, measuring, monitoring, controlling, and reporting—to ensure that the development and maintenance of software is systematic, disciplined, and quantified.
8)Software engineering process: The definition, implementation, assessment, measurement, management, change, and improvement of the software life cycle process itself.
9)Software engineering tools and methods: The computer-based tools that are intended to assist the software life cycle processes, see Computer Aided Software Engineering, and the methods which impose structure on the software engineering activity with the goal of making the activity systematic and ultimately more likely to be successful.
10)Software quality: The degree to which a set of inherent characteristics fulfills requirements.

Controversy
Over definition
Typical formal definitions of software engineering are:
1)"the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software".
2)"an engineering discipline that is concerned with all aspects of software production"
3)"the establishment and use of sound engineering principles in order to economically obtain software that is reliable and works efficiently on real machines"
The term has been used less formally:
1)as the informal contemporary term for the broad range of activities that were formerly called computer programming and systems analysis;
2)as the broad term for all aspects of the practice of computer programming, as opposed to the theory of computer programming, which is called computer science;
3)as the term embodying the advocacy of a specific approach to computer programming, one that urges that it be treated as an engineering discipline rather than an art or a craft, and advocates the codification of recommended practices.
Criticism
Software Engineering sees its practitioners as individuals who follow well-defined engineering approaches to problem-solving. These approaches are specified in various software engineering books and research papers, always with the connotations of predictability, precision, mitigated risk and professionalism. This perspective has led to calls for licensing, certification and codified bodies of knowledge as mechanisms for spreading the engineering knowledge and maturing the field.
Software Craftsmanship has been proposed by a body of software developers as an alternative that emphasizes the coding skills and accountability of the software developers themselves without professionalism or any prescribed curriculum leading to ad-hoc problem-solving (craftmanship) without engineering (lack of predictability, precision, missing risk mitigation, methods are informal and poorly defined). The Software Craftsmanship Manifesto extends the Agile Software Manifesto[45] and draws a metaphor between modern software development and the apprenticeship model of medieval Europe.
Software engineering extends engineering and draws on the engineering model, i.e. engineering process, engineering project management, engineering requirements, engineering design, engineering construction, and engineering validation. The concept is so new that it is rarely understood, and it is widely misinterpreted, including in software engineering textbooks, papers, and among the communities of programmers and crafters.
One of the core issues in software engineering is that its approaches are not enough empirical because a real-world validation of approaches is usually absent, or very limited and hence software engineering is often misinterpreted as feasible only in a "theoretical environment" which is not true because engineering approaches in general can be applied to solve real-world problems more efficiently and effectively than craft. It is the higher education which is failing to promulgate the true meaning and curriculum of software engineering because the focus of universities is to teach critical thinking and reading / research.
Dijkstra refuted the concepts of "software engineering" and "software maintenance," arguing that those terms were poor analogies for what he called the "radical novelty" of computer science:
for easily learning check following site
introduction of s/w engg
what is s/w engg
