 Welcome to module 9 of the software engineering course in which we will discuss model based engineering of software. So we have discussed initially that models can be used for a variety of things and we covered for example communication, you have a model and you discuss you for example explain to a client or to a fellow engineer what is going to happen, how things are going to implement, what kind of trade-offs you are having. We have seen in the architecture and design part that you can use models for analysis so you can use them to reason about the system, how is the performance going to be, how are we going to separate the system into sub-components for example. And there are a number of other things we might consider for example for certifications you might have to have models or at least they are encouraged in the automotive industry that is not uncommon. But you can also use models for I would say a bit more advanced purposes so you could use a model to actually simulate your system or part of the system or the environment of the system and finally you could actually use models to generate things. And here we are thinking about things like code, you can generate code, you can generate test cases, of course also code but it is slightly different usually but you can also generate documentation or a lot of other things. And the question is if you want to go down this road, if you want to do more things with a model what exactly do you need? And well the first thing you obviously need is a model that describes whatever you want to do for example if you want to generate code you need some kind of model that describes this. What you also need is some kind of formal modeling language so it is not enough to just draw a picture and even if you are using a language like UML that is formal then it is not enough to just draw a picture of it but you actually need the right file, the right format. You need to have some kind of format that is readable for example an XML file or some kind of other standardized way of reading in the model because in the end of the day you have to process it automatically and for that an image might not be enough so this is when we have to get away from the whiteboard or from the paper or from any drawing tool to actually use a real modeling tool. And then finally we need something that is called a transformation, a model transformation. So what we do is we read in our model, we know what the language is so we somehow understand it and we have some kind of program that takes the model and transforms it for example into running system code or into a markdown or HTML file that is used for documentation and well the transformations can generally be in a general purpose language so we can write this for example in Python or C++ we can just write a program that reads in the XML file and because we know that it is UML we can parse it in a certain way but there are dedicated transformation languages as well that make this a bit easier. So these are most likely languages you have not heard of yet because they're not that common but it's specific languages that can be used exactly for this purpose. Read in a model, push out something else, transform it into something else and they usually lack of course a lot of things that a general purpose language would have that are simply not needed in this context. So this is generally what we need and overall this process of using models and transform them into something else basically use model as a really important part of your overall software engineering process this is what is known as model-based engineering. So you base your software engineering on models and the abbreviation here is MBE. So model-based engineering there are a number of similar terms that you might sometimes have heard as for example model-driven software development, MDSD or model-driven engineering. The differences here are really not that large so it's usually for example model-driven engineering is considered to be a bit stricter so there are more models used that basically used for everything but in the end of the day people use these words interchangeably more or less. So why would we do this? Why would we write models instead of code? What do we do with that? The general idea is that we can improve our overall development and what we in particular would like to achieve is a higher quality. So quality goes up. We would like to reduce our costs. We would like to increase the reuse of the models and the software and in a way we would like to improve our engineering capabilities so we want to be able to use more engineering techniques to reason about things for example use simulation and so on we're not just coding and see what it works but we're doing this in a bit more systematic way. And the idea is basically the costs are reduced because you can generate things automatically because you can reuse the model for several purposes for example you could generate tests and documentation from the same model you don't have to write it. You only have to maintain the transformations and the models but you can generate a lot of things out of it. The quality goes up because you have a separation of concerns. You can focus on the model, you can focus on the transformation and if you for example have tested your transformation well enough then there will be less bugs in the development and that's essentially the reasoning around why we want to do model based engineering. So in the next video we go a bit into where is this used, what are the advantages and disadvantages about it and what are generally the challenges we are having with model based engineering and after that we dive a bit more into the details of how does this actually work.