Hi. Now, you might see a bus, but I see computation everywhere. The engines on this bus are run by a computer. The driver's console has a computer telling them where to stop next, whether they are on time. The security system, the cameras and the microphones, are run by a computer. The display on the side is run by a computer. There's a bunch of computers making this bus run. That construction site is the new student center. Right now it looks like trucks and concrete. But there's a ton of computation behind that. The architects and engineers who came up with the diagrams for it, were all sitting at computer workstations, of course. The did simulations of the traffic patterns in the building to see how to layout the rooms so that it would work well. They did simulations of the light entering into the rooms to see how that would work and to use light effectively. When I get my coffee in the morning, there's computation there too. The cash register's a computer of course. The credit card machine's a computer. The credit card itself has a computer in it. My name is Gregor Kiczales and I'm really excited about this course in Systematic Program Design. Walk with me a bit and we'll talk about it some more. So now that I've had my coffee and we're in a quieter place. Let's talk a bit more about why you'd want to take this course, why you would want to learn to design programs. We've seen one reason. Computation's everywhere. And one of my goals with this class is for you to be able to understand the world around you a bit better by understanding how those programs might work inside. If you could program, you could write a program that goes out on eBay and collects information and displays it to you a way that you want to see it. You can analyze data from physics or bio or chemistry and present that in a way you want to see it. You could even write an iPhone app and make a lot of money. Artists design pieces of work and performances. Lawyers design strategies, coaches design season strategies and training strategies, writers design outlines for their book, all disciplines design. And any time you learn a design discipline, which is what we are going to learn in this class then you become a better designer in any other discipline that you might work. Sciences like physics and math describe the world. They come up with equations which describe what happens in the world. But with computation, you can actually make things happen. So you can make simulations of the real world happen and you can also make unreal worlds happen. It's the difference between what's called analytical models and computational models. Once you have a way of thinking about the world in terms of computation, it's going to fundamentally change the way you think about the whole world around you. And really, when this course is done, you'll never see the world the same again. When I learned how to program, we kind of had to learn by osmosis. They would show us good code and bad code and say write good code. But a lot has changed since then. For one thing, we have a lot if empirical evidence about what really good code is. For another thing, we have what are called design methods. Design methods show us how to produce good code. Michael Jackson, in particular, has done a lot of work on design methods. And this course is based partly on those design methods. I mean a different Michael Jackson, British, wears a tweed jacket, doesn't dance as well probably. What a design method does is that it systematizes the process of going from a poorly defined problem to a well structured solution. And it does that in two ways. First, it helps us break down the problem into pieces and the solution into pieces. Any process of designing a program will do that, but when you have a method, it breaks it down another way, which is it breaks it down into stages of the process. So what you end up with is kind of a cross-cutting decomposition of pieces of the solution and pieces of the process. And that, breaking it down both ways really gives us a very fine degree of granularity for tackling really hard problems. By the end of this course, you won't need this design method to write the programs we're going to write at the beginning. But because you have the design method, by the end of the course, you're going to be able to write some truly hard programs. Another point I want to make 'cuz I know some of you may be concerned about it is that you don't need to be good at math or science in order to be good at program design. There may be some specific programs where you need to know some math or science. But there's other specific programs where you're going to need to know about some other kind of domain knowledge. You don't need to be good at math or science to do the programming we're going to do in this class. Now, here's my last point about the course and this is really important. This is the kind of thing that you learn by doing. You don't learn by watching. So, what I want you to be sure to do, as we work through this, is after you see me work a problem, turn off the video and try to work it yourself. Or take the practice problems that we'll give you and work them from scratch without looking at the solution. If you just watch me do it, you won't learn how to really do it yourself. Nobody ever got to be very good at playing the violin by watching somebody else play the violin, and this is the same kind of thing. It's a learn by doing skill. I hope you enjoy the course. I'm really excited about it, the TAs are really excited about it. We hope you're going to get a lot out of it. And we look forward to hearing from you on the course forums about how things are going.