 Hi! In this video I will talk about software engineering and software project management in general. First, let's talk about motivation. Why do we need to use software engineering methods, although we can create software without using it? Let's see a video for a minute. Sometimes the temperature of an altitude will reach 60 below. It's brisk, it's refreshing. You never know what you're going to come across up here. Canadian geese, owls. These people back here, that's why I come to work. That's why I build airplanes in the sky. We're building a dream. I love this job. Fair enough to see that little kid and look in his eyes. That's all the things I need. This video is called If programmers have to make a plane. Is the situation familiar to you? Well, if you already developed the software, some moments might be familiar. Is this way to develop the software? Of course not. There are more jokes. Many of them include comparing building and software construction. Why is that? I guess it's because buildings, at least most of the time, are trustworthy creations while software, even from respectable companies, fail more often. Why? It's because the civil engineering discipline counts hundreds of years while software engineering just a few decades. So it is important to use software engineering methods. Is the situation improving now? Look at the diagram on the left. The summary of failed, challenged and successful projects. Successful are the projects which were finished on time with given resources. Challenging are the projects which were finished but constraints were violated. For example, the project was not delivered on time or more budget was required to complete it. And the failed projects are the cancelled projects. As you can see, the situation improved until the year 2002, but later the progress stopped. This is because the software we created years ago and now is different. We will investigate the key challenges that are related to this diagram, but now I want to stress two things. First, increasing software complexity. As new software engineering techniques help us to build larger, more complex systems, the demand changes. System have to be built and delivered more quickly, larger, more complex systems are required. And second, many companies still do not use a disciplined approach and software engineering methods. So, what is software engineering? There are many definitions. I want to outline two of them. The software engineering is an engineering discipline, just like the civil engineering, concerned with the theory and practice of processes, methods and tools for professional software development. In this course, we will investigate all of these building blocks. Another definition is provided by the IEEE organization. Software engineering is the application of systematic, disciplined, quantifiable approach to the development, operation and maintenance of software. That is the application of engineering to software. So, software engineering is an engineering discipline concerned with all aspects of software production. From early stages of system specification to maintaining the system after it's gone to use. And engineering discipline means using appropriate theories and methods to solve problems bearing in mind organizational and financial constraints. All aspects of software production means not just technical process of development. Also, project management and development of tools, methods, etc. to support software production. If we are talking about software engineering, let's see how the software is defined. From a software engineering perspective, software is computer programs and associated documentation. There are two types of software products. Generic products that are marketed and sold to any customer who wishes to buy them. In this case, the specification of what software should do is owned by the software developer and decision on software change may be made by the developer. And customized products that are commissioned by a specific customer to meet their own needs. In this case, the specification of what software should do is owned by the customer and we make decisions on software changes that are required. A major aim is to build good quality software. So, what is a good software? I will talk about the essential attributes of a good software. Maintainability. The software should be written in such a way so that it can evolve to meet the changing needs of a customer. This is a critical attribute because software change is an inevitable requirement of a changing business environment. Dependability and security. Software dependability includes a range of characteristics including reliability, security and safety. Dependable software should not cause physical or economic damage in the event of system failure. Malicious users should not be able to access or damage the system. Efficiency. The software should not make wasteful use of system resources such as memory and processor cycles. Efficiency therefore includes responsiveness, processing time, memory, utilization, etc. Acceptability. The software must be acceptable for users. This means that it must be understandable, usable and compatible with other systems that users use. So, these are essential attributes of good software. I want to stress a word essential because there are many more attributes. Take a look at McCall's software quality factors, BIM software quality model, ISO, IEC software quality standard for a systematic view on software quality attributes. Another question is what are the fundamental software creation activities? The activities needed to perform while created software in a disciplined way. The first activity is software specification. The customers and engineers define the software that is to be produced and the constraints on its operation. Software development during this phase, the software is designed and programmed. Software validation. The software is checked to ensure that it is what customer requires. And software evolution. Software is modified to reflect changing customer and market requirements. Now, let's talk about some key challenges. And the first couple of key challenges is heterogeneity and scale. Increasingly, systems are required to operate as distributed systems across networks that include different types of computer and mobile devices. The software has to be developed across a very wide range of scales from very small embedded systems, importable or wearable devices to internet scale cloud based systems that serve a global community. Nowadays, the company might end up creating software that must work in desktop and laptop computers, smartphones and tablets, watches, smart TV sets and virtual reality devices. To do that, developers might need to use different frameworks and languages. The second key challenge is business and social change. Business and society are changing incredibly quickly as emerging economies develop and new technologies become available. We need to be able to change their existing software and to rapidly develop new software. So the software companies need to cope with reduced cost delivery times and increased scope while developing quality software. And here, the so-called iron triangle comes into play. Normally, if you make a change to one constraint, whether it needs to be adjusted accordingly, otherwise quality will suffer. The only way to cope with increasing demand by breaking the iron triangle without losing a quality is to improve processes, methods and tools. If the software is intertwined with all aspects of our lives, it's essential that we can trust that software. Nowadays, the software stores data in the cloud, which is not controlled by the user. It might have some access to user payment information, many house devices can be controlled using the internet of things. It might have access to our social and lifestyle data, and of course, there is a software that must ensure our safety. It's essential that software engineers pay enough attention, although the security, safety, trust requirements are non-functional. Another key challenge is software engineering method diversity. There is no universal set of software techniques that is applicable to the creation of all of the software systems. That is, there is no silver bullet. The software engineering methods and tools used depend on the type of application being developed, the requirements of the user and the background of the development team. It means no one can expect to master one process and use it always. A professional software engineer needs to know the variety of software engineering methods to be able to choose the right ones. When talking about the professionals which are creating the software, many terms are used interchangeably. Is there a difference? It depends on your views. In general, it is regarded that a software engineer has the widest understanding. It is a professional who applies the principles of software engineering for all the software development activities. In the beginning, I spoke about project failures. One specific topic that is directly related to the success of a project is project management. It is concerned with activities involved in ensuring that software is delivered on time and on schedule and in accordance with the requirements of the organizations developing and procuring the software. In this course, we will present a broader view regarding the project management because the software project managers must have a deep understanding of software engineering. It is time to summarize everything we talked about. The key points are presented in a form of frequently asked questions. What is software? It is computer programs and associated documentation. What is good software? Good software should deliver the required functionality and performance to the user and should be maintainable, dependable and usable. What is software engineering? It is an engineering discipline that is concerned with all aspects of software production. What are the fundamental software engineering activities? It is specification, development, validation and evolution. What are the key challenges facing software engineering? Basically, it is coping with increasing diversity, demands for increased scope, reduced cost, delivery times and developing quality software. What are the best software engineering techniques and methods? Actually, there is no silver bullet. While all software projects have to be professionally managed and developed, different techniques are appropriate for different types of systems. Thank you for watching. I hope the software processes methods and tools will be a beloved topic in your professional life.