[MUSIC] Hello, welcome to the Programming Languages course. I'm Dan Grossman and I'm so glad and excited that you've chosen to participate in this course. As you might expect in a very first video for a course, I want to welcome you and just give you some basic information on how the course is organized and what will come next. So in one slide, this course is about an opportunity to learn the fundamental concepts of programming languages and we're going to do it in a way that will I believe, make you a better programmer in any programming language. And in fact, in programming languages that we're not even going to use during this course. The idea is really to learn the ideas around which every programming language is built and understand precisely the different ideas that we use when we program, and how those ideas are expressed in lots of different programming languages. So it's common when you look at courses like this to hear people say, that's the course where you learn ML, Racket and Ruby, which happen to be the three languages that we'll use through programming languages overall. But in fact, that's really not the point as I'll emphasize throughout the course. It's really about getting past the surface level distinctions between languages and getting at the core ideas. So, I hope that excites you. I hope you'll find that challenging and enriching, and we'll get back to actual programming languages in a little bit. But like in any course, we first need to talk a little bit about mechanics and structure and make sure you can find everything you're looking for. So, we'll do some of that in this video and they there'll be six more introductory videos. I'll tell you a little bit about myself, if you're interested. You can ignore that one if you like. We'll motivate the course a little bit, although I'll explain that it's really hard to motivate this material until we've done some of it. So, we'll get back to that a little later in the course. We'll discuss recommended background. You'll have noticed that the title of this course was actually Programming Languages Part A, so I'll explain why there's a Part B and a Part C. We'll talk about grading policies and I'll try to give you a very high-level roadmap of all the main topics in the course, so that you can have a little better sense of what your getting into. So here's a to-do list on things you should be making sure to do, as you dive into the course. Of course, there's getting used to the web page and looking around and finding what's there. Whether or not this is your first course on Coursera, there are a number of things in this MOOC that are run a little bit differently and you'll want to make sure you notice those. Please watch the videos and read all the announcements and messages, so that you don't miss something by assuming it's like another course you took. We're not doing different things just to be different, but we have a reason to do certain things and we want to make sure you know about them. There's a fair amount of software installation for doing the homeworks here in Part A and you'll want to do that soon, so that when you get into the videos in the first real section of the course, you can follow along and try out programs and do things. You'll need both a text editor. We do everything in the videos and have installation instructions for Emacs, so we recommend that in some sense. But if you don't like Emacs and you prefer another text editor that can be used for ML program, that's fine. And the related software installation materials make that clear and there's even some videos, if you want to watch me install slightly older versions of the software on windows just to get a sense of what the written instructions are about. And then the last thing you don't need to do right away, but I want to point out to you is that we have an optional Homework 0 that isn't really a homework. We ask you to change one character in one file and then go through the process of uploading your solution for the auto-grader, and participating in peer assessment. So that before you do a lot of work on homework one, you understand the mechanics of uploading the homeworks for this course, because they're a little bit complicated. There is a lot of material we have made available, so I want to explain how those fit together. The obvious thing is there will be a lot of video lectures that will look a lot like this, except there will be a lot more code writing and a lot less staring at PowerPoint. If a video is ever optional and not needed for the homeworks and other stuff in the course, I'll be sure to label that very clearly and that's an opportunity to explain some additional things that may be of interest to some of you. One thing that's not as common in online courses is that I also have reading notes for all the material that's covered in the videos. Those tend to get underutilized. So, I really recommend using them as a second resource. A way to get a written down explanation of what I'm talking about. A more thorough explanation. A more precise explanation sometimes. They're optional, because the video should have everything that you need, but it's a good resource that you want to make sure you don't forget about. I also post all the lecture code. So anything that you see in the videos, you shouldn't have to retype in. I'll make those files available, so that you don't have to do a lot of unnecessary copying and pasting or typing something out of a video buffer. There's homework assignments and as we'll explain in more detail in an upcoming video. We both have an auto-grader that it's correct and also sometimes that you use the language features we tell you to use, but then we also ask you to participate in peer assessment to look at certain stylish use in the code. And also, so that you can learn from looking at each other's solutions. And then we do have some exams for things that cover topics better in a format other than written homeworks where all you do is write code, so there's one exam at the end of Part A of the course and another one at the end of part C and we'll have a lot more information on those when we get there. In terms of the homeworks, there's basically one per major course section. So, this is I'm like an online course where you do a problem here and a problem there. This is much more like in a traditional university course where you might have one homework each week where you do all the problems together, and then turn them in all together. The homeworks that way, let you synthesize a lot of the topics and have it all fit together. The disadvantage is you don't get a lot of feedback along the way that you're doing okay so far. So, that's a tradeoff and we made the decision that the homeworks kind of come in big chunks. They break down into individual problems, but you turn them in all together. When you go to do the homework, the thing that people tend to do is just write the code you're asked to write and turn it in and see how you did. And I want to say here in the very first video that often times, if you do that, you'll be making the homework harder and less fulfilling than if you take sort of a more complete approach to doing the homework problems. That a great first thing when reading a homework problem is to understand what part of the course is this problem probably involved with, is it connected to? Because there should always be a connection. We don't have videos about one topic and then homework that are about something totally different. So instead figure out what we're asking about, then work on writing the code, then test it out, try it. Probably the most important thing you can do for your learning is take a solution you think is correct, make it wrong and check that it's wrong in the way you expect. Play around with variations, try different things. And then when you're confident, you understand the question, then you're probably done and it probably didn't take any more time than just trying to get it done as quickly as you possibly could. A couple other details, we do have some challenge problems in the homework. Those are clearly identified and they are not worth very many points. So those are optional, but a great opportunity to go a little further. Then of course, because I want every one to get as much out of this course as they can. If your sample solution from when you did the course is one Google search away, it's going to be really unfulfilling for other people. So, it's your responsiblity not to post your solutions in public places. Final thing about the homework that I'll just say quickly is I've learned from experience in talking to former students that they're somewhat surprised at how precise and concise our homework problem wording can be. So, I do that on purpose. I try to make things, as technically accurate as when you're writing code and just realize that it's not the kind of homework assignment that you'll get a lot of out skimming. You really need to read the whole thing, I try to keep them as short as possible. Be as straight forward as possible not trick anyone. So, try to read things carefully. And then by all means in the discussion forums, ask if something is confusing. If you are unsure about a certain case, that's perfectly natural. That's perfectly welcome. And then once your confusion is cleared up, hopefully, you'll go back and see that the assignment was written in a way that made it possible to understand that. And if not, let us know and we'll improve the write-up for the homework assignment. So with that, let me just say, welcome. And then on online course like this, particularly one with as much content as this one has is a great adventure not only for you, but also for me and I really want to welcome everyone. This is in many ways the most exciting thing I've ever done professionally is taking this material, which is my favorite material in all of computing, something I'm deeply passionate about and making it available and kind of sharing with you my perspective on how to think about programming languages. And why I think that's such both an effective way to think about software, but even a beautiful way. There's something deeply artistic and elegant in the way programming languages fit together and I want you to stretch your mind, and I want you to look at this course as a fresh way to look about software. A fresh way to think about programming that you've never thought about before. We're going to make you uncomfortable. We're going to do things in a strange way. And I hope that by the end of the course, it'll all connect back to what you may have already loved about programming and get you to love programming even more by giving you the unique perspective that studying programming languages gives you. So, welcome.