[MUSIC] In order to understand web application frameworks I'd like to talk with you a little about programming and why we do it in the first place. I'd like to also talk with you about the trends that are taking place in programming. So to start with, what is programming? Well, it's the process of creating a sequence of instructions in some programming language that enable the computer to do something. And why do we do this? Well, we want the computer to solve some problem that's useful to us. Let me talk with you a little bit more about my philosophy associated with programming and where it's going. So we can think of programming as the process, or art form if you like, of mapping a problem from a given problem domain, to a solution in a given solution domain. So here we have a real-world problem that we're trying to solve. And we have the tools associated with a given programming language at our disposal in order to solve this problem. Now I believe most of the advances that have occurred with respect to programming languages over the years are simply efforts to bridge this gap between these two. In order to make this more concrete Let's take a look at the Eniac computer. This is the first electronic digital computer that I talked about in a previous lesson. Here's a picture of someone programming the Eniac computer. They did this by flipping switches and plugging in cables, as you can see here. In essence, they were hardwiring the machine to execute a program and it took weeks of effort to get everything right, even for what today we would consider a very simple program. So we can think of this as machine level coding. The programmers were actually flipping bits. Now the gap between machine code and the math formula that they were trying to implement was quite large. Larger than the gap say, between a Fortran program or some other high level programming language that we use nowadays and that same math formula that they were trying to solve. The gap between some object oriented program and say a discreet advent simulation, is even smaller than this. In this case objects in the program tend to be objects in the real world. So the bottom line is this, it's much easier to solve problems when you're programming language better matches your problem domain. And this is what has happened over time with advances in programming languages. Let's talk a little bit more about the evolution of programming and, more importantly, where software frameworks fit in. So we've seen that machine level instructions involve setting bits, a very tedious and error prone process. The next evolution in programming was assembly language programs. Assembly language programming is one of the first advances that we had and it involved collecting a number of machine level instructions together under some pneumonic, for instance The mnemonic MOV might stand for move and could be used to move the contents of one memory location to some other memory location. Now this assembly language distraction might involve a handful of machine level instructions. Programmers became much more productive when they started using assembly language programs. You might be able to write a more efficient program by using machine code. That is, a program that runs faster or uses less memory, but it's going to take you longer. So, assembly language programming made the programmer more productive. Now the same thing happened with the advent of high level programming languages or HLLs as I show here. What I'm referring to are things like Fortran, COBOL, BASIC, or C. In this case, a single instruction in a high level programming language generally corresponds to mini assembly language instructions, and once again the tradeoff is programmer productivity against the efficiency of the program itself. The same thing can be said for the advent of object oriented program languages such as C plus plus or Java. I remember when these object oriented languages were first introduced. Many argue it against their youth because they felt they were inefficient. But once again, as machines become more powerful, programmer productivity usually wins out over program efficiency. While we're on this topic, let me say that there is no one best programming language. In general certain programming languages are better suited to solving certain types of problems than other programming languages. In addition, they're constantly changing and evolving and improving, so get used to it. The world of software and programming languages is constantly evolving. And as a software engineer if you want to stay relevant you have to try and keep up with this. One more thing. Arguing about the best programming language or web application framework, because like Arguing about religion or art. There's no right answer. It's often a matter of the problem that needs to be solved and individual preferences. That's not to say we can't have discussions about the relative strengths and weaknesses of various program languages or frameworks when they're use in various context. I'm happy to do that. But at the end of the day, you just can't say that one programming language than all the other programming languages. So finally, let's talk about software frameworks. A software framework provides a whole environment that is aimed at a specific domain. For instance, most operating systems have a software framework for developing applications that will run in their environment. Microsoft has the Windows Presentation Foundation, and this is a framework for building Windows-based applications. Apple's has the Cocoa framework for doing the same. In Linux, there's the Gnome Or KDE frameworks that allow you to build these windowing frameworks. So software frameworks are just a natural evolution in the programmer productivity program efficiency trajectory. We'll talk more about application frameworks, next.