Welcome to the first lecture of the Software Architecture Course. In this course, you will learn what software architecture is, why it is becoming more important every day, and how it relates to software design. Software architecture used to be the domain of a handful of experts. However, today many organizations are going through a digital transformation and software has pervaded everything that we do, touch, or use. In addition, the competitiveness of our businesses depends on high performing software systems. Together, these trends drive the need for more qualified software architects. The evolution of the European automotive industry shows the impact of digital transformation. A decade ago, the cost of electronics and software in cars represented less than 20% of the total cost. Today, it is as much as 35% according to Manfred Broy, Professor of Informatics at the Technical University of Munich. But, more importantly, software intensive systems account today for more than 90% of the innovations and the added value of a car. Now when we board a commercial aircraft for a business trip, our main concern is to arrive safely and on time. We usually do not think about the technical complexity and the system engineering challenges involved in building these aircraft. However, when you look into the cockpits, the number of digital displays, combined with the many command and control devices should give you a first idea of the complexity that is needed to operate such aircraft. In the cockpits, the mechanical and analog indicators are replaced by digital instrument displays that are controlled by a software-based flight management system, that can even adjust the display with on-demand flight information. The traditional flight instruments are replaced by a large number of electronic sensors that operates under the control of the air data management system. This software subsystem also integrates the radar system, and the GPS, with the communication equipment and the login systems. Now a commercial aircraft can be equipped with up to 10,000 sensors that each collects one data point per second. This data can be used to improve the safety, the fuel efficiency or the passenger comfort. Per flight, this can add up to terabytes of data, data that needs to be transmitted, stored, analyzed and more importantly needs to be acted upon. In addition, avionics needs to be extremely full tolerant and safe while the system lifecycle of a commercial aircraft can be over 25 years. From this example, it is clear that avionics systems are among the most complex hardware and software systems that you will encounter as an engineer. But why is this example relevant for this course? Avionics is the domain of a number of highly specialized experts, while the vast majority of software engineers will never be confronted with such a level of complexity. Or will they? Well, for sure the complexity of files sharing applications, e-commerce sites, and even mobile banking applications are of a different and less complex nature. However, the evolution of the internet of things, or IoT, adds a complete new dimension of complexity to mainstream software engineering. The internet of things provides the potential to connect everything. IoT makes machines talk to other machines and collects data about them in a continuous real-time data stream. Just think about the self-driving car or the delivery of your pizza using drones. Those systems have inherently the same complexity of avionics or air traffic control systems. If you want to operate them in a secure, safe and user-friendly way, you will need to follow similar software engineering methods and approaches to build them. The complexity of a software system has many different dimensions. The first dimension comes from the technical complexity. Interactive applications are less complex than embedded full tolerant or real-time undistributed systems. And a city guide is simpler to build than collaboration software, such as Google Docs or the real-time software for Curiosity, NASA's Smart Rover. The second dimension of complexity comes from the future systems operating context. The more external interfaces it has to support, the more difficult it becomes to design a future-proof system. External systems can change. They can be replaced. Or they can even become obsolete. For example, the air traffic control system for the drones will have to interoperate with any new drone during its entire lifecycle. Though management structure and project size adds another level of complexity. A software team of 100 people, working from five locations across three time zones, faces different challenges than five engineers working on a project during three months from their garage. The software systems for the internet of things tend to have a flavor of each of these complexity dimensions. IoT software has a distributed in real-time nature. It interoperates with many external systems and processes large volumes of data. Internet of things applications are also typically built by large, multi-disciplinary teams in a global context. Now in this course, we will demonstrate that software architecture provides a solid basis for the mitigation of many of those complexity-related risks. Increased complexity implies more risk for failure. And looking back at the track record of software projects during the last ten years, we observe that still 25% of the projects will result in complete failure with a loss of millions of Euros for every year. So why is it that projects have cost overruns, and deliver only a fraction of the expected functionality? Well, to get a better understanding of this, we will analyze the case of Iridium. Iridium was built by Motorola in the late 90s, and operated a mobile phone network that would cover the entire world with satellite technology. However, when Iridium started selling services, people realized that there was no real need to make calls from Siberia or the Sahara. Iridium filed for bankruptcy in 1999, after burning $7 billion on a project for which there was no customer needs. But the lack of understanding of the value of software for the users and the customers, combined with the failure to align the many stakeholders, account for the vast majority of failed software projects. ADD, the Attribute Driven Design methodology that we use in this course for creating software architectures, takes the qualities and the value of the system for its stakeholders as the starting point for the design. As such, value and quality can never be overlooked. Now today, software intensive systems and internet of things applications have entered and transformed every possible sector from logistics to agriculture, from health to entertainments and in manufacturing just to name a few. And modern systems also drive innovation and impact competitiveness in those markets. So this really means that organizations and businesses can no longer consider software platform as a simple technical tool that supports their business operations. Now, software systems are strategic assets that are key in achieving business goals. And as a consequence, software architects need to understand those business goals, and assess the impact of every decision they make on the business of the customer. Though in such a digital landscape, stakeholders, customers, and end-users have high expectations about the quality of software systems. Mobile payments needs to be secure. Medical files should always be protected from unauthorized access. And self-driving cars can never collide. So it is the role of the software architect to translate these business goals and user requirements into high quality software architecture. The architect connects the business view with the technical world. And ADD, the Attribute Driven Design methodology based on quality attributes, will support the architect to achieve this.