This book provides an in depth coverage of fundamental principles, methods and applications of software engineering. Taking into account the needs of students and practitioners, the book aims at painting a pragmatic picture of Software Engineering methods and tools. Our association with the software industry tells us that there exists a substantial difference between classroom study and the practical industrial application. Therefore, earnest efforts have been made in this book to bridge the gap between theory and practical applications. The subject matter is well supported by examples representing the situations that are actually faces during the software development process.