Hi. This lecture is an overview about software development. In this I will be learning objectives of this lecture. After this lecture, you will understand how software is planned, managed, and also the developed in practice. In the next lecture, you will learn different software development processes that we can use in software engineering. You'll also understand the importance of using iterative and also incremental software development process when we build a software system. Finally, you will know what are the important components of a good software development process. This lecture is just an overview about software development. You will learn about different types of software and projects that you may encounter in software engineering. Also you will learn about the development life-cycle of a software engineering project and also learn about the four important P's in software development. These are the nature of a software development project. A software development project is largely intangible. That means it's difficult to visualize all the details within the project unlike, for example, manufacturing a car. You can build a model of the car and then you can visualize the details of a car from the model. It's easy and cheap to mass produce use. For software engineering project, the product is usually in terms of source code. If you talk about source code, it's going to be easy to copy to mass produce. The development is labor-intensive. That means the major resources that you need is going to be programmers to help you build a source code. It's easy to physically created and modified by anyone. Anyone who knows how to program can actually modify the source code of the project. Does not wear out with use. Unlike a car, it's going to wear out when you use it. But if you talk about source code, it's not going to wear out when you use it. These are different types of software that you may have to build for your client. For example, it can be generic: that means, let's say Windows 10 or Microsoft Office, or the applications that you can download from App Store or Google Play. They are generic software. Basically all the requirements you get them from market research. So people say that they like this, then you do it for those people. Or you may be building a custom software for some application domain. Let's say you are building a software system for a restaurant. Basically all the requirements come from the client needs. That means they come from the restaurant. The development effort is going to be high because you have to keep all the requirements before you can build a system. The copies in use is going to to be low because it's going to be just a restaurant using the software system. It may be an embedded software system, that means, for example, is an embedded system within a DVD player. The development effort is low because from the DVD player you already know all the requirements. That means you already know all requirements before you develop. The copy in use is going to be high because all the DVD players, they will be using the same system. These are the different types of software that you may have to deal with when you work as a software engineer. Maybe data processing, that means your system has to somehow organize and store business data. Or real- time processing, that means you have to control devices and processes in real-time. Technical system; that means you do not include knowledge about the application domain, about the work procedures and also processes from the application domain. Socio-technical systems; that means you have to learn about the application domain before you can develop the software system. Software engineering focuses mainly on the development of technical system that means generic software or embedded system. In this course we still focus on custom software because custom software is not easy. Somehow we have to capture all the requirements before you can work with custom software. In this course we still focus on custom software because many custom software they fail because they cannot meet user requirements. They fail just because they cannot correctly capture all the requirements at the very beginning of the project. That's why one very important topic that we will cover in this course is how to capture requirements from some application domain. These are different types of software development projects that you may have to deal with as a software engineer. It may be a green field project. That means you have to start from scratch. Or evolutionary project that means you're given an existing system, then based on the existing system you may have to fix defects, adapt to new technology or add some new features or make it more maintainable. You are provided with an existing system to work with. Then finally, you may be provided with a framework. Then based on the framework, you have to adapt the framework to handle some specific requirements from the client. Trust me on that, when you work in the industry later on you will find that most of the projects they are evolutionary projects. It's the most common type. That means you are given some existing system then you have to modify an existing system. This is the software development life-cycle of a software project. After you start developing the project, you have to keep maintaining this over a project until the retirement of the project. Within each life-cycle there are different phases. First you have to define what you have to deal with in that life-cycle. That means what you have to build for your client. Then double-check whether what you are going to build is going to be feasible or not. If it's feasible, you go ahead. If it's not feasible, then you stop and you tell your client that it's not feasible. Then you try to come up with all the details about your design, then build your system, and then you eventually deploy your system. The life-cycle concept structures software development. These are the things that you have to deal with in software development. Phases provide a basis for management and control. You have to define all the milestones and also deliverables for this different phases that we have in a life-cycle. There are four important P's in a software development project. You have to capture all the requirements from the application domain for your project. In your project, you have to work with different people. For example, different stakeholders like clients, users, and also software engineers. Then you have to use different processes within your development. That means a set of activities that you have to perform in your project. Eventually you achieve a set of artifacts as your product. For example, different diagrams, different models that you use in your software system source code or even user manuals. These are the four important P's involved in a software development project. A software development process is a template that needs to consider different situations. For example, different people that we have in a team, different processes that we're going to use in development and different artifacts that we're going to have in our product, etc. As a software engineer or as a project manager the first task that you have to do is to define the scope, the objectives, and also the constraints of your project. Scope means what you have to do or what you don't have to do within your project. You have to define exactly what are the requirements of your project and the objectives, what you want to achieve in your project. Also constraints. Usually in terms of budget and time of a project. Then in your project plan you have to define the problem and then set up design goals. In the very first lecture we have said that at the very beginning of the project you have to choose a few design goals. When you design your system, you design the system based on the design goals. You have to analyze the requirements. You have to capture all the requirements from the application domain. Prepare some diagram, for example, a class diagram to capture audit on data objects that we have in the application domain and also a use case diagram to capture all the functionalities of the software system. It's going to give you an overview of all the requirements we have in the system. Finally estimate the timing and effort required to deliver the product. Again, usually are in terms of budget and also time as scheduled.