DAVID MALAN: This is CS50's office hours with, today, David and Brian. If unfamiliar, office hours are an opportunity at Harvard on campus for students to visit professors' offices, literally, and ask questions about the courses they're taking, about computer science, more generally, or life after courses like CS50. So we thought we would try to do the same here on the internet, especially while everyone is home. We do hope that everyone is doing well and is feeling healthy, and family and friends, too. And the goal of today really is just to have a chat about topics of interest to you. Ramon has brought some questions that classmates have asked in advance, too, in case we need to call upon those. And let me just give you a quick tour of Zoom, if unfamiliar. In the bottom left-hand corner of your Zoom window, there should be a Mute or Unmute button. If you do ask a question today, do be sure to Mute or Unmute yourself accordingly. Next to that should be a Start or Stop Video button. Do, if you have a webcam or camera of some sort, keep it on during office hours so that we get a sense of who were chatting with. In the middle of your Zoom window is probably a chat icon so that you can chat textually on your keyboard with classmates who are in the room, as well, or see links that we might paste during the chat. And then last but not least, let me go ahead and ask you, everyone, to do this. Click on the Chat button and click on Participants so that you see the names of everyone else in the chat room. And below the list of participants on your screen, you should see a hand icon. That represents raising your hand. If everyone could click that button just once so that we know who's here. Wonderful. So if you have a question at any point, please feel free to raise your digital hand that way and Brian and I will do our best to call on you. And please forgive if there are simply too many questions to ask during this hour. We do hope to do more of these in the future. [BACKGROUND TV NOISE] Just to begin. And we're going to also try to keep everyone's microphones muted, generally, so we don't hear background noise or TVs or traffic, but allow us to start right away here. Prenab, can we start with your first question for Brian or myself? PRENAB: Yeah. Hi, am I audible? DAVID MALAN: Yes, we can hear you. PRENAB: Hi. So a quick introduction of myself. I'm Prenab Sabla. I am a 14-year-old student from India, Bengali, India. And firstly, I'd just like to thank both of you, professor David and Brian, especially because I took the CS50 course last year, the CS50 introduction one. I'm doing the mobile development one, and so [INAUDIBLE] the content is very accessible, especially the way both of you explains. Thanks a lot. DAVID MALAN: I'm really glad to hear. PRENAB: Yeah. And secondly, my question is-- so I have a few questions. And firstly, the first question I had was that every year, this year's 50 introduction cause has so many different problems. However, there's one problem, mainly, that's been going on for years, and that's speller. And so how come speller's being that one constant problem that's been going on? I mean, I've noticed that it's one of the most hardest problems in the course. And my second question is that this year, so I was trying to help some students here and I was looking at the week 8 problem sets. And so unlike last year, where you had only one problem that was finance, this year you had a whole rock barrage of problems, encompassing web, iOS, Android, and games. And so what was the idea behind the complete addition of problems? Because it's been so much more interesting, and I myself really want to retake the course just to see, because there were so many changes this year, especially that one. So what was the idea behind changing that and keeping the speller problem, however, in there? DAVID MALAN: Sure. Why don't I try to answer the first question and then turn to Brian for the second question. So speller has indeed been with the course I think since 2007, when I first started teaching CS50. It has, indeed, always been a good challenge, but it's really meant to be a very climactic problem for students to solve in the very last week that we spend on C, the programming language. I think it's incredibly empowering for students in a class to actually implement their own hash table, specifically. Or in the past, students had the choice of implementing a try, alternatively. And I think the competitive part of it has been appealing to a lot of students. If unfamiliar, this problem set allows you to implement your very own spell checker, for which we give you a big dictionary of 140,000 plus English words, and you have to implement the fastest spell checker that you can and the one that uses the least amount of memory. And then we have a competition of sorts, a big board, a leaderboard, where students are ranked, if they opt into this, based on how little RAM or how little time their code has used. And that seems to be a fun way of not making the course competitive, but making one small piece of it so. And Brian could perhaps speak best to piece set 8 and how and why it changed so much this year. BRIAN YU: Yeah, sure. So this past year in CS50, we've introduced at the end of the class what we call our various different tracks. It used to be that at the end of CS50, everyone would learn a little bit of web programming, which was a lot of fun for many students and let them build some really interesting and exciting projects. But one of our goals this past year was to experiment with the idea of students building other tools and other applications that are interesting to them. And especially nowadays, where so much of where programming is happening and development is happening in mobile apps, like iOS and Android apps, for example, we thought it would be nice to give students an opportunity to learn to do that, too, if they wanted to. So students now have an option at the end of the semester to choose between web programming or iOS app development or Android app development, or even game development, too, since new tools and graphics libraries that have been developed over the years are really making possible some really exciting game tools and technologies that can be used to build games that you can actually play. So these various different tracks we hope are an opportunity for students to really see the wide variety of applications of the skills you learn in CS50, to be able to apply them to mobile context and through web context, and more beyond that, too. DAVID MALAN: Allow me to ask a question now of everyone. If you open up your Chat window, I've just pasted the URL of a Google form. We would love to know where everyone is from and what courses of CS50 you have taken or are taking. So if you're comfortable, taking a moment to submit that form. We'd love to take a look at the data after. And if you do give us your email address, what we'll do is when there's a future office hours with me, myself, or any other members of CS50's team, we'll send you a quick email, like I did for folks yesterday, to remind you of the day and time. Let's go over next to Asif. And let me just ask, just so that we can field as many questions as possible today, do start by asking just one question and we'll do our best to come back around or keep in touch over email, or the like. Asif? ASIF: Asif [INAUDIBLE] here. DAVID MALAN: Yes. Can you say again. Your mic is a little close to your mouth, I think. ASIF: Yeah, OK. So my question is related to artificial intelligence. Can you hear me? DAVID MALAN: Say again? ASIF: My question is related to artificial intelligence. DAVID MALAN: OK. Let's turn to Brian for this, who, as you may know, his course on AI just launched yesterday. ASIF: Yes. Have you seen that movie Matrix? [INTERPOSING VOICES] DAVID MALAN: I have, yeah. ASIF: Yeah. In that movie, the humans are being plugged into a machine. That machine is kind of a virtual role. DAVID MALAN: Correct. ASIF: Yeah. And so my question is that is it possible to create such a virtual world, with its own population of people? In that movie, we are actually plugging in the real people-- I mean, creating virtual people with their own behaviors, their own characters, a whole world with your own programming skills. Is it really possible? BRIAN YU: OK. I think I misheard your question the first time. I actually have seen that movie, now that you mention it. So the question is about simulating people. In short, a lot of what-- [INTERPOSING VOICES] ASIF: I did not mean simulating. I mean actually creating people. Characters created in that world believe that they are really living. They have no idea that they are being created by a program. [INAUDIBLE] BRIAN YU: Oh, real people in a simulated world? ASIF: Yes. BRIAN YU: Well, OK. I guess that's gets a little bit less about artificial intelligence and more into the world of like virtual reality, is probably the closest thing we have to that now, in terms of you have the ability to put yourself into a virtual space and experience-- [INTERPOSING VOICES] ASIF: That was the thing I was saying. The fact is that we cannot go-- we cannot actually interact with that world. I mean, that world is virtual. The people inside is also virtual. We are just playing God. [INAUDIBLE] BRIAN YU: Yeah. So you want to just really just recreate an entire virtual world that you can actually interact with? At the moment, I think that's more in the realm of science fiction, but you never know what happens with technology in the future. DAVID MALAN: Thank you for the question. Can we go over next to Ziad? I'm sorry if I'm not pronouncing your name right. Malik? ZIAD: All right. It's OK. It's OK. DAVID MALAN: And if you don't mind, when asking your question, can you also pronounce your name for us and tell us what country you're from. ZIAD: All right. My name is Ziad Malik. I am from Austria. And yeah, I participated in CS50 because I want to be a leading computer scientist one day, hopefully. And now the first question is, I started with CS50 last week, and I'm working pretty good with it. But the problem is that when I work with a problem set and when I try to solve a problem, sometimes on the more comfortable problems, I struggle. For example, the credit problem on week 1, I sat two days in front of that. And I was really confused at the end, so I ended up submitting only the cash problem. And I wanted to ask, is there a way to improve my problem solving, or can I learn it? DAVID MALAN: Yeah, that's a really good question and not uncommon. And don't get discouraged. The more comfortable problems in the course's homework assignments are, indeed, meant to be more challenging by design. I think the best strategy, especially if you're finding yourself hitting a wall, so to speak, where you're just not sure how to solve it and you have tried reaching out to anyone you might know locally or online for help, come back to it later. Honestly, I think a very good strategy is to do all of the less comfortable problems throughout the semester, and then once you get to the middle of the semester, or maybe even end, then go back and do the more comfortable problems. And I bet you will feel yourself much more capable of doing those problems and they will come much more easily. But I think if you do them only within the individual week, it's hard to solve some of them because you're not yet more comfortable, but you will be after more weeks of practice. ASIF: Thank you. DAVID MALAN: Sure. Good question. Can we go over next to Shokiz. I'm so sorry. I'm not going to be able to pronounce this correctly, but I think you see me going there. Do you want to pronounce your name for us, [INAUDIBLE]? Just remember to unmute yourself. Still muted. STUDENT: Hello. DAVID MALAN: Actually someone-- oh, there we go. Go ahead. Yes. STUDENT: Hello. My name is Shaqi Jaquan. Shaqi Jaquan. DAVID MALAN: Yes. And where are you from? STUDENT: Shaqi Jaqan. DAVID MALAN: Jaquan. Where are you from? STUDENT: I am from Uzbekistan. That's central Asia. DAVID MALAN: Wonderful. What's your question? STUDENT: My question related to, also again, improvement, That is lacking of ideal or logical thinking in my mind to when I'm solving any problems, relative to maybe algorithmic equations. I am going to solve any problems related to maybe sorting or such kind of arrays and graphs. I want to solve any problems related to algorithmic. It doesn't matter what kind of resources you recommend me to improve my logical thinking. BRIAN YU: Sure. That's a very good question and very broadly applicable to computer science, in general. I think I have two pieces of advice to give there. Piece of advice number one is when you're tackling a big algorithmic challenge, it's often easiest to start by thinking about, what are the smaller stepping stones I can try and get through first along the way? In other words, try and break down a bigger problem into smaller problems. Ziad, for instance, was earlier talking about problems at one credit, where you're trying to figure out what credit card company produced a particular credit card number. And that's a bigger challenge, but a smaller challenge you might start with is, OK, given a credit card number, figure out what the first two digits of the credit card number are, for example. That might be a smaller problem that's a little bit easier to tackle, a little bit easier to reason about. And by breaking the bigger problem down into smaller problems that are easier to tackle, you can hopefully build your way up to the answer to the bigger problem. And the other strategy, I think, is just more longer term, and it's about just getting practice with solving more problems. The more problems you try and practice solving, the better equipped you'll feel to deal with more problems in the future, because you'll start to notice patterns. You'll start to realize that this problem you're trying to solve now is very similar, or has some things in common with a problem you've already solved before, and that might guide you towards figuring out what tools or algorithms and strategies you might use for solving your current problem now. DAVID MALAN: And I imagine you mean the computing problems specifically, but it's perhaps timely to us today, I've just pasted into the chat window the URL of CS50's annual CS50 X puzzle day. Honestly, the entire design of that event is to empower students to just solve problems more collaboratively. So if you haven't seen that yet, you might enjoy solving some problems this weekend. Thank you for that question, too. Can we go next to Christine? STUDENT: Next question? DAVID MALAN: Yeah, from Christine. I think she's unmuting her mic. Yes. CHRISTINE: Hi, everyone. Yes, I'm Christine and I'm from Dubai. So my question is so I took communication in university, back in the university, but I had my minor elective, and I was supposed to go through the computer science route. So is there a reason why any computer science courses has to start with C? Because that's always been my struggle. So after C, I think I was supposed to take JavaScript after and then web development, but then C has always been my struggle. I always struggle with it, so it kind of discouraged me. So I ended up changing my elective, my minor elective after that. Because my worry right now is if I am struggling right now with the C part of the course, so my worry is, can I actually take on the other languages that's in the syllabus? So I'm quite scared about that. DAVID MALAN: Yeah. It's certainly understandable. I would try not to be scared. I would take comfort in the fact that many, many, many students at Harvard and beyond have that same emotion. I've just pasted into the chat window an answer I wrote on Quora, actually, some time ago about why CS50 uses C. Most intro courses these days don't, to my knowledge. And in fact, it's much more common these days for introductory courses to use Java or Python, which I do admit can be more accessible, a little easier to pick up, because they don't have pointers. They don't have as many of the same pitfalls as a language that C has. And they also have more features that make a few things more easy, more easily done in code. So I wouldn't get discouraged. I think if you can take some other course first, maybe in some other language, that's totally fine, if your school allows, and then come back to a course in C. What many universities do is they don't start with C, but if you are interested in what's called systems programming, low level programming, then you will learn C as your second or maybe third language. So it really depends on the institution. So certainly, don't get discouraged. Certainly don't equate C with computer science, or even CS50 for that matter. But if we come full circle to the question earlier about pset5, our spell checking problem sets, it's pretty rare for students, I think, in an intro class to be implementing their own hash table only mid semester. And that's indeed meant to be a challenge. So if and when you're ready to get to that point, I think you'll find C very enlightening and empowering, but definitely challenging at first. Don't get discouraged. It just takes time and practice. Can we go next to how about Ron W.? If you'd like to say your name and where you're from, too. RON: Yeah, it's Ron. I'm from Germany. I'm the flight nurse. So I'd like to know why and how did you become a programmer, and what tips do you have to stay motivated? DAVID MALAN: It's a good question. I think we can possibly each answer this differently. I don't think of myself as a programmer, per se, even though I enjoy doing it. I will admit, I don't think I personally would enjoy doing it full-time as a software development job. I've never really had that interest. What's most gratifying for me about programming is being able to literally solve problems that are of interest to me personally or professionally. A lot of the code that I've written, certainly in recent years, is all related to CS50 in some way, either creating tools or adding to tools that our students use or that our teaching fellows or staff use. And so for me, I just get a real kick out of writing software that other people use. But I don't think, personally, I would want to do it all day long, even though I have many friends who do exactly that. Brian? BRIAN YU: Yeah. I mean I also don't consider myself-- like I'm not a programmer professionally. I do write some programs, but most of my job is in the education setting. But I first really stumbled across programming just by taking my first class in it. In high school I took my first computer science class. And just found it very empowering, in terms of the problems it enabled me to solve. I remember very early on just building some very simple programs that were able to be useful to me and to other people. And I think that was the motivating thing for me, is the power that programming has to enable you, with just a couple lines of code, to be able to build something that was actually impactful or useful or meaningful in some way. DAVID MALAN: And as for practice, I think I would just solve as many problems in code as you can. If you're not taking courses, keep an eye on open source communities. That is freely available code on GitHub and GitLab, and the like. And those are good ways to practice, is by contributing to other people's code bases and getting feedback from them as well. Can we go next to Jacob? If you'd like to say hello and where you're from. Still muted, though. JACOB: OK. Hi, everybody. I'm from Nigeria. So I've not had any prior experience in coding. I took CS50. I did a bit of Python. And C has been a bit tough for me as a newbie. And I find it very difficult to solve most of the set problems. I'm just talking pset2. I've not been able to move past one. And I don't know how long it took me to solve those problems. And secondly, I'm thinking if I should go into web development or AI machine and data science, but I'm not too sure. So how do I decide on what to do? Is it best to figure out what to do or just keep learning and then, I don't know. DAVID MALAN: Sure. I think my short answer is that you should really pursue courses that are of genuine interest to you and not simply do them because you think you should. JACOB: OK. DAVID MALAN: Generally speaking, the advice we give students here, at least, is that once you've taken two rigorous courses in software-- whether it's CS50 and some other class or two different courses altogether-- generally speaking, after learning a bit of procedural programming, which CS50 teaches, and functional programming, which other classes teach, or object-oriented programming, once you have a breadth of background, you really are able to then start taking on part-time opportunities in programming, maybe even full-time entry level positions. But a common next step, too, is data structures and algorithms. As for web and AI, let me turn to Brian because he happens to teach CS50's own versions of those two options. JACOB: OK, thank you. BRIAN YU: Yeah. So certainly, if you're interested in web programming artificial intelligence, we do offer courses about that, too. I'll go ahead and paste the links for both of those in the chat, for anyone who is interested in those. There's the AI class and the web programming class as well. And those are really just meant to serve as introductions to the field of artificial intelligence and web programming. So if you'd like, you can take a look at those lectures there to get a sense for what AI is all about and to get an opportunity to write some AI programs of your own. The goal of both of the classes is really to provide that sort of introduction so that if you are interested in pursuing either of them in the future, you'll have some projects under your belt. You'll have some foundational knowledge to then go forth and work on your own projects as well. DAVID MALAN: And this is such a common question, honestly. I mean, there's an infinite number of courses out there you can take, either in universities or for free these days, and it's not clear at what point you should stop. But honestly, I think once you've taken a few courses, it really is time to leave the nest, so to speak, just like a baby bird would, and start to fend for yourself and say yes to some project or say yes to some opportunity that scares you a little bit. And you might not even be sure how you're going to do it, but once you then get your footing and get your confidence, I think you'll find that you can start taking courses to fill in gaps in your knowledge, but not necessarily to prepare you for opportunities that you don't yet know about. Thank you for that question. Can we go next to Nadia? NADIA: Thank you. Thank you. So my name is Nadia. I am from Ukraine, from Kiev. And thank you for the upcoming puzzle day. I'm really excited. It's the second year of mine. And I was really bad last year. Hoping for something better. So I just actually found myself-- I completed the CS50 first introductory course last year, and I was really excited about it, and I found myself really worried that I lacked some theory. And what I did, I bought some theory books, downloaded them, started reading, and I did not really find a lot of value in those because I could not fit all the information into my brain. So how do you think that after completing the CS50 course, what would be the best way for the student-- who I'm not from the computer science. I did not have the computer science degree. I'm a teacher. So what it would be the best thing, to start different other courses on computer science, maybe to do some logic tasks, or go to the leak code, or actually fill in the gaps with the books on the theory? So how can I move after that? DAVID MALAN: Yeah. Let me paste one link that I often recommend. Some friends at Princeton teach this course here, which is freely available. I just pasted it into the chat window on Coursera. It's Princeton's introduction to algorithms part 1, and there's also a part 2. That's a very common next step when you want to learn a bit more computing theory after taking one or more programming classes. More fundamental than that to computer science itself is this one. I'm going to go ahead and paste the link of a book on Amazon. This link might not work in all countries, but you should still be able to see the title there, by Michael Sipser, who's a professor at MIT. And the book is called Introduction to the Theory of Computation. This, for those unfamiliar, really gets to the heart of what computer science is and what is possible with computers. And I actually used that book when I was a student some time ago, and Harvard uses it now in their introductory course, or has over the years. And that's a good, pretty accessible book, but you would benefit certainly from doing some of the problems in the book or from a course. And Brian has taken more courses more recently, who can perhaps speak even better to these options. BRIAN YU: You actually stole my recommendation there. I was also about to paste the Theory of Computation book by Michael Sipser. If theory of computation is something interesting to you, in terms of what computers can do and what and how you think about computers, a little more theoretically, a little bit more mathematically, that's a great book that I would definitely recommend. NADIA: Thanks a lot. Thank you. I unfortunately have to go back to work, but it was a pleasure to talk to you. And thank you for your course and the upcoming puzzle day, once again. DAVID MALAN: Yes. Good luck on the puzzles. Practice makes perfect. NADIA: Thanks. Thank you. DAVID MALAN: Can we go next to Guillermo? If you'd like to say hello and where you're from. GUILLERMO: Well, hi. I'm from Uruguay. You said my name right, I'm surprised. DAVID MALAN: Thank you. GUILLERMO: So basically, my question is to you, David, I was thinking, you know how many people admire the way you explain your classes? Basically what I'm trying to say is that when you have to teach all these people, you have to teach us, people without experience, or maybe you like very experienced people, how do you find a balance to explain something like computer science to all of us? What's the key element in teaching? I don't know if I can-- do you get what-- DAVID MALAN: I do. I do. No, thank you for the kind words. It's not easy, and I don't know if we do a great job all the time. But I think the simple answer is empathy and remembering what it was like to not understand material yourself, and remembering what it was like to feel like everyone else in the room or in the class was smarter than you or knew better the material. And to try to put yourself into the shoes, so to speak, of that student, to help them with a narrative, both verbally and in the course's homework assignments and slides, and so forth, get from the starting line, so to speak, to the finish line without letting go of their hand during that process. And I think it takes practice. I think it takes sensitization. For instance, even though this course, CS50, happens to be taught to our college undergraduates at Harvard, I first got my start for teaching in a lectureship role at Harvard's extension school, which is a much broader demographic of students-- young students, old students, everyone in between, who have gone or who have not gone to college. And so it was a much more diverse audience of students, both in Cambridge and online. And I think that, too, helped sensitize me to different learning styles. I think we have always-- I have always-- had students who are of different backgrounds, geographically, socioeconomically, academically. And I think that helps, too, not assuming that your student body is all of the same type or of the same mindset. So in short, empathy. STUDENT: Hi, David. DAVID MALAN: Yes. STUDENT: And Brian. I'm from India. I had a couple of questions. I am [INAUDIBLE] for the CS50 course and it was amazing. I had an amazing experience. I haven't had any experience with the other courses, as compared to this one. And I was pretty much interested in the Harvard courses, so I searched on the Google and got some Harvard courses related to CS50. That was CS20 and CS124, for [INAUDIBLE] mathematics and BSA. Have you any plans for showcasing them in the edX? DAVID MALAN: Really good question. Let me turn to Brian, too, in part, because we've been talking about this quite a bit. BRIAN YU: Yeah. So CS20 and CS124 are the courses you mentioned, are theory of computation classes that are taught at Harvard. CS20 is more of an introduction to the mathematics of computer science, and then CS124 takes that a little bit further into the analysis of algorithms and the efficiency of those algorithms in studying data structures. So CS50 itself does not have a specific course that is about algorithms, but if you are looking to take similar courses, David, earlier in the chat, pasted a link to the Princeton Coursera algorithms class, which covers many of the same topics, and CS124 does as well. And so that I would suggest, as a class, to potentially look at, if you're interested in continuing to study algorithms as well. If you're also interested in algorithms, I can tell you the textbook that is used for CS124, the algorithms classes at Harvard, as well as other algorithms classes. It's this one that I just pasted here, Introduction to Algorithms by Cormen, Leiserson, Rivest, and Stein, often abbreviated to just CLRS for the initials of the authors. That's quite a popular and famous book about algorithms and it's very comprehensive. So if you're interested in studying and learning more about algorithms, I would definitely suggest that book as well. STUDENT: One more question. DAVID MALAN: Sure. Go ahead. Go ahead, [INAUDIBLE]. STUDENT: Are there any extra problem sets related to the CS50? DAVID MALAN: Problems sets related to CS50? STUDENT: Yeah, apart from the CS50 problem sets? DAVID MALAN: Oh. Not per se, but if you go to this URL, which I will paste into the chat window, we have previous years of homework assignments. The problem sets have changed over time, and if you look at previous years, you'll see some older problem sets. They're not maintained, as well, anymore, though, so things like check 50 might not work anymore, but they're there. STUDENT: All right, thanks. Thank you. DAVID MALAN: Sure. Can we next go to Sabir, if you'd like to say hello and where you're from. STUDENT: I have a question. DAVID MALAN: Let's go to Sabir first, if we could. Still muted, though. There we go. [INTERPOSING VOICES] SABIR: Hi David. Hi, Brian. Nice to meet you. DAVID MALAN: Hello. SABIR: OK. I am Sabir. Currently in Turkey, but I'm from Nigeria. I'm studying in Turkey [INAUDIBLE] studying masters in software engineering. DAVID MALAN: Wonderful. SABIR: OK. My question is, currently I'm doing a research on artificial intelligence. But actually some of the lectures here, they [INAUDIBLE] language. So [INAUDIBLE] not good in English. So what kind of book do you recommend me for me to learn artificial intelligence? And again, see, I kind of have interest in C programming language. And what increased that interest is you and Brian and the way you teach. It's wonderful. I almost lost that passion, but when I saw the way you teach, it's kind of encouraging. So what book can you recommend me, in terms of this C programming language, to learn more of it. [INAUDIBLE] C programming language, and so on. Thank you. DAVID MALAN: Sure. Brian, do you want to start? BRIAN YU: Yeah, certainly. So thank you. I'm glad you're interested in artificial intelligence. Again, I think I posted this already, but yesterday we just launched a course about artificial intelligence. So if you're interested in an introduction to some of the ideas in artificial intelligence, that course we cover topics ranging from how you would solve various types and search problems to how AI can play games to you how AI can understand human language and translate languages, for example, as well as topics in machine learning, like neural networks and other popular topics there, too. So that's something that you're interested in, that course is available as well. And I think you also asked about textbooks. The artificial intelligence textbook that I happen to really like, and the one that shares a lot in common with the course that we teach, is called Artificial Intelligence-- a Modern Approach by Stuart Russell and Peter Norvig, and I've pasted the link to that book as well. So if you're interested in a textbook about artificial intelligence, that book is quite good. And if you're looking for more videos, we have videos and problems on the course on edX about artificial intelligence as well. DAVID MALAN: And I'm not sure if you mentioned C also. I've just pasted into the chat window a link to a book called Hackers Delight, which is a fun book on learning C and all the lower of a level, as well as algorithms, more generally. Thank you for that question. Can we go next to Cabon, if I'm pronouncing it right? If you'd like to say hello and where you're from. CABON: Hi. I'm from the US. Wow, I did not expect that. First of all, I'd like to thank David and Brian. I finished CS50 recently. It was the best course I've ever taken. I noticed Brian released CS50 AI yesterday. I looked at the first lecture. And I tried to prom set. However, I noticed that when you tried to download the distribution code, the code doesn't actually function on CS50 IDE. So I was wondering, after you finish CS50, what IDEs or what terminals do you recommend to move on? DAVID MALAN: Sure. Brian, do you want to field that one? BRIAN YU: Yeah. So I'll start by just pointing out that for that very first problem in the AI course, you should be able to run the program. We distributed two data sets with that problem, a smaller data set and a bigger one. You should be able to get the smaller one working on the IDE, but for the big data set, a lot of AI now is about analyzing big data. You're unfortunately a little bit constrained by the fact that the IDE is running in the internet and has a limited amount of memory available to you. So the big data set actually is too much memory than will actually fit the IDE. And for that reason, it might be a good idea to start-- we want to encourage students to start programming on their own computers as well. And so the way to get started with that is really just to start with a code text editor, and there are a whole bunch that are quite popular. Probably the most popular are the three that I'll paste into the chat now. There's Visual Studio code, developed by Microsoft. And then there is Atom, which is developed by GitHub. And then there is Sublime Text, which is also quite popular. They used to be a little bit more popular. Any of the those three editors, which will work on Macs or on PCs are on Linux, are probably good text editors to get started. They have all the syntax, highlighting, and the managing of different files and terminals that you can run code in. And so those might be a good place to get started, in terms of editing code on your own computer instead of on the IDE. Yeah. Someone else also mentioned PyCharm. That's another popular one, in terms of an IDE for Python specifically. There are definitely others other than the ones we've just mentioned, too. There are many different choices that you have available to you. Here are just a couple of the popular ones that I happen to like. DAVID MALAN: And I also just pasted the URL of Python itself. Sometimes computers do come with versions of Python, but it might be older. So you can also download and install Python from their website directly. Can we go next to Lori? If you'd like to say hello and where you're from. LORI: Hi. I'm Lori. I'm originally from the Dominican Republic, living here in the States for a couple of years. My question is in regards to just resources. For example, it's hard to be a college student, especially first generation college students. So as professors, what are some, for example, communities that you guys would recommend us to join or look into, just so that we have kind of that camaraderie or that help, especially now that we're quarantined, we can't have face to face. DAVID MALAN: Yeah. It's a really good question. I have been following on Reddit a number of communities, which are nice. I don't know if they are strictly university-oriented. Odds are it's a broader demographic than that. But let me see if I can paste the URL of at least one subReddit here. If unfamiliar, Reddit is a popular site for discussion. So Learn Programming is actually a really nice one. I've found the discussions there to be pretty healthy and very supportive of students. There's another one-- let me see if I can find it real quick-- about computer science education more generally. I'll see if I can find that soon. Brian, do you want to chime in, though, with some thoughts, too, while I look for that? BRIAN YU: Yeah. The other thing I'll mention is just CS50's own communities, if you're interested in interacting with other CS50 students who are currently taking or have taken any of our courses. And there is a link to all of our various different communities. It is definitely a very active group of students that are on Facebook that are communicating and forming community together, as well as on Discord that are always chatting about CS50 or programming or any of the specific problems. And so that can be a place where a lot of our own students online have been able to find community. And we've noticed that these has been even more active now that more and more people are staying indoors. So definitely other people there. LORI: Yeah. I have the Discord chat, and it's been really helpful, especially like I said now that we're indoors. So it's nice to have that camaraderie again. DAVID MALAN: Indeed. And I can paste the link of all of CS50's communities, which should appear in the chat room in just a moment. That's a link to all of our own specific ones. And then the other subReddit I was thinking of, which talks about life after college in computer science is this one here, CS Career Questions on Reddit. You might like that, too. Both those communities seem very supportive of people asking questions of each other. STUDENT: I am from Hong Kong. Right now I am in Taipei due to various reasons, political unrest in [INAUDIBLE], or whatever. I have some questions. I have a couple of questions about the recent project, and also a personal project, if it's OK if I ask. The personal question is really short. I'll just start with the technical question. I always work around web developers in coffee shops when I try to code in Python, and doing more of analytic works, or even also a bit of financial derivative predictions with my client, because my client knows math. I don't know math. But I find it very difficult to communicate with my web developers, in the sense that recently, I was trying to use fast API to build a server interaction to automate some Excel spreadsheets via GUI. And then I built an authentication endpoint, where I locked myself out during the development of my API. And then the web developers were like, may I look at your cookies? And I was like, are those cookies gluten free? So it gets to the point where it starts, as a Python, it's very hard to communicate with JavaScript developers or other people of different domains. Is Python just to obstruct? Python, you might as well think of it as English, and you can just search Google and there would be a documentation for every single thing. And it's just a different structure and way of thinking in Python. That's my first question. DAVID MALAN: Not really, honestly. I think you won't have that same impression of the language once, I think, you have more familiarity with other languages. There are so many similarities among a lot of these more popular languages today. Python can be used procedurally. It can also be used partly functionally. Those are terms that I used earlier as well. And I think you'll find that each of these languages or environments or frameworks just has different ways of solving the same problems. Something like cookies has nothing to do with programming languages, per se. It has only to do with HTTP, which is used by web browsers and web servers. So if you're feeling that way, I would try to just give yourself more exposure to other languages. Take a very short course or read one or more tutorials on JavaScript. Read a little bit about C++ or C#. Just give yourself a little more breadth of exposure and I don't think you'll put as much weight on Python as being a standout, which I don't think it really is. STUDENT: Yeah. DAVID MALAN: Can we go next to Rashab? If you'd like to say hello and where you're from. RASHAB: Hey, David. I'm Rashab from India. So I took CS50 a couple of years ago, and after that I've taken various courses, but every year I keep coming back to CS50 to look at the new problems and the new content. And this year I think it was really amazing. My question to you is I have moved on to doing research, and I see a lot of undergraduate students who are interested, but just started out in computer science, who are interested in research. So I started a community, so where we did like small projects and contribute to open source, or [INAUDIBLE] students to see [INAUDIBLE]. So what do you recommend, or are there students at Harvard, graduate students, who are participating in research, or would you recommend I do [INAUDIBLE]? DAVID MALAN: Yeah. Let me turn to Brian for this, because he's done this more recently and more personally, too. BRIAN YU: I didn't catch the end of the question. So I heard how do undergraduates doing research do what? Can you repeat the end? DAVID MALAN: Still muted, Rashab. RASHAB: Yeah. Hello? Yes. How can I encourage undergraduate students to participate in research, where they started out starting with computer science, or get them in a community where small projects are [INAUDIBLE]. BRIAN YU: Oh, yeah. That's a great question about encouraging undergraduates to do research. Just a second. Yeah, about encouraging undergraduates to do computer science research. I think one of the challenges with starting to do computer science research just after taking one or two classes in computer science is that there's a big learning curve to be able to get up to speed on everything you need to know about the research project and all the background information for whatever the field of research happens to be. And so if you want to encourage undergraduates to be able to work with a particular research project, I think trying to come up with smaller tasks that are more easily graspable by someone who may not have much experience in that particular domain of research can be quite helpful. I know that definitely when I was just starting computer science and starting to do a little bit of research, that's what a lot of faculty helped to do for me, was not require me to understand the entirety of the project, but give me some smaller piece of that project where I could focus just on understanding that and tackling that, and then over time, start to get a better sense for what the larger project is. But diving into a big project all at once can definitely be a little bit intimidating. DAVID MALAN: Can we go to Roan? ROAN: Hello, David. I want to thank you all for-- can you hear me? DAVID MALAN: Yes, we can. ROAN: OK. I want to thank you all for you and your team, for your effort, and I really appreciate that. I'm from Egypt. My name is Roan. My question is, do you recommend a specific website for training? I know there are a lot of websites. I want to know what you recommend the best ones are. DAVID MALAN: For learning computer science and programming, specifically? ROAN: For practicing. DAVID MALAN: Oh, for practicing. It's a good question. A couple come to mind, and everyone else who's on the call should feel free to paste your links in to the website. Sometime ago, we started playing with HackerRank, which, despite its name, as has a nice collection of introductory problems and more sophisticated problems alike. Brian, do you know some more recent options, too? BRIAN YU: HackerRank is definitely quite a popular one. The other one I really like, just because it has a big range of problems that you can solve in any programming language, is Project Euler, so I'll go ahead and paste that in there as well. Project Euler basically just asks you a whole bunch of questions, and in order to answer the question, it usually involves writing some code in order to solve the problem. And in that sense, you can code in any language. You could write the solution in C or in Python or any other programming language that helps you get to the right answer. And so I find that to be a pretty interesting way to find interesting computational problems to solve, and after you solve it, to then think about how you might go about solving it more efficiently or solving it in a different language. And there's a nice community around those problems as well. And I see in the chat, there are many other suggestions that people have that might be worth taking a look at, too, for other sources of problems to solve. DAVID MALAN: Simon, can we go to you next? SIMON: Hey. Yes. Thanks very much for your time. I'm Simon. I'm from London, England. I'm currently in my third year of an undergraduate degree studying computer science. And I'm doing my master's next year, but I still have no idea what part of computer science I really want to go into. It's something that Jacob touched on earlier. Do you have any tips for exploring different areas, whether it's systems or ML or logic? Because I've done modules in each of them, but I'm struggling to really pick a topic to do my dissertation on and further research. DAVID MALAN: And is that because you like too many of them or you don't like enough of them? SIMON: Well, I think it's because I like them all neutrally, but none of them I really like a lot. DAVID MALAN: Yeah. I think when it comes to dissertations or theses or capstone projects, I think if you have the ability to connect with one or more professors and work more closely with them or with their research group, that can tend to help crystallize your idea. I think talking with faculty, too, about projects they're working on is a nice way of you figuring out if, oh, I would really like to work on that project, too, and you can have a more visceral reaction to the opportunity. Barring that, Brian just went through this and published his own dissertation about a year ago, if you'd like to chime in as well. BRIAN YU: Yeah. I think my approach to this, very similar in spirit, was to look at what faculty around me were working on. So I was at Harvard, so I looked at like Harvard faculty and MIT faculty, who were nearby, just to see what types of research projects they were working on. And for those that I thought they had interesting projects, I just reached out to them by email, just strike up a conversation. And not all of them got back to me, but some of them did. And that was the beginning of a conversation, some of which led to some research opportunities that I wouldn't have thought of. And I think that can be an interesting approach, as opposed to just starting from thinking about what domain you want to work in, because the faculty are usually actively working on one or more different projects that are at the cutting edge of research, and so being able to hear from them about what they think is interesting and exciting can often be a way to get inspired, as well, in terms of the types of projects that you might be interested in working on, too. DAVID MALAN: And I hope you'll forgive. We have a few minutes left here and we're doing our best to get through as many questions as we can. We'll invariably do another one of these. So if you haven't already, please do fill out the Google form that I've pasted, again, into the chat window with your email address so that we can let you know in a week or two when the next one will be. But we have time for a couple more questions I think. Can we go to Joshua? JOSHUA: Hello. My name is Joshua. I'm from a country called Rwanda. My question is I just started CS50 about two months ago. I'm in like week 4. DAVID MALAN: OK. JOSHUA: I was wondering if you could give me some resources that can help me understand coding better on like websites or applications, that can help me understand coding better. DAVID MALAN: OK. Are there websites to understand coding better? JOSHUA: Yeah. DAVID MALAN: Yeah. I would definitely take a look at the chat a moment ago with a number of the practice websites, which are really good. We certainly distribute CS50 and CS50's courses on edX, where there are dozens, if not hundreds, of free courses nowadays. And I think taking a look at some of the topics of interest to you on those websites is a good place. Coursera.org is another good one as well. That's where the Princeton class is as well. I think it's an amazing thing right now. It is so hard to not find something that's freely available and of interest to you. I would start with some of those URLs that we've pasted into the chat window. Just scroll back through and maybe copy and paste it if you'd like to save it today as well. JOSHUA: Thank you very much. DAVID MALAN: Sure. STUDENT: I think it's my number. DAVID MALAN: Can we go next to Asher? If you'd like to say hello and where you're from. ASHER: Hi. I'm from New York City. I am 15. And my question was, I've had some experience with coding, about a year, and I'm doing the tracks in CS50 now. How would you recommend getting started with projects? Are there any good websites where people put like offers out, or how would you go about doing that? DAVID MALAN: Projects, final projects in particular of your own design? ASHER: Either that, or let's say once we finish with CS50, as you said, after you take a few courses, you want to do projects and then take courses to fill in the gaps. Where would you recommend finding those projects or finding people to do projects. DAVID MALAN: I think there's certainly the freely available courses you can pursue and any number of the practice problems that people have been pasting into the chat window today. But more than that, I would encourage you to seek the open source projects. For instance, in CS50, especially in the Python portion of the class and the web portion of the class, you might recall that we used a number of packages, or libraries, code that other people wrote. Flask is one of them, and we used a number of others. If you look in our requirements.txt files for a couple of the final problem sets, you'll see what other libraries we used for those homework assignments. And so that is to say you've been using a number of free open source libraries of code already. Seek those out on GitHub. Google the name of the library and the word GitHub to find its repository online to see if it's there. And then look on the Issues tab on GitHub and GitLab and other sites. There's usually an Issues tab or similar that shows you all of the missing features or bugs or problems with a library or an open source project. And one of the easiest ways to get started is to look through those issues and see if you can solve one of them. GitHub, for instance, even has labels that they use that will indicate, for some repositories, good first contribution or good first timer, something like that, relatively easier problems that you can figure out. And the upside of this is you learn how to read someone else's code. You learn how to collaborate with other people. You get feedback for free from really smart people who are working on that project as well. So try to find one or more open source projects. Even if it's just one line of code to contribute, I think you'll get a big kick out of it. And I certainly have. I think it's the coolest thing, when some popular open source tool has added even one line of code that I've contributed. ASHER: Thank you so much. STUDENT: Hi, David and Brian. First, I'd just like to thank you guys for doing a wonderful job with CS50 and how all the students of being able to benefit from your teachings. So I have two questions. One is a short one. So my first one I'd like to start out as a joke. For your lectures 0, for scratch, how many phone books did you tear in total by now? DAVID MALAN: That's a good question. I've been teaching the class for 13 years now, so I've torn at least 13 of them in the very first lecture of the class. But I tend to use that demonstration elsewhere, so let's say it's maybe 100 at this point. Oh, still muted, if you'd like to unmute yourself again. Question? STUDENT: OK. And my next question is for Brian, regarding AI. So my question is, will there ever be a limit for AI to really understand the world? BRIAN YU: Yeah. This is a really good question, and one that nobody has a definitive answer. The question is about how good could AI be, potentially understanding the world? And that starts to get into what we generally call artificial general intelligence, like a generally intelligent being that is comparable to human intelligence. And the answer is that people aren't really sure. We've been able to create AI to solve very small scale problems, like understand how to translate texts from one language to another or understand how to play chess better than any other chess player. But the problem of a general purpose intelligence, that can learn the way humans do, that can adapt to new problems, that's something that doesn't currently exist, and people debate about what would happen if it ever did. A really good book, if you're interested in this type of thing, is a book called Superintelligence by Nick Bostrom. It's a quite popular book on the subject. I've pasted the link to that there as well. And that really explores the question of, is it possible to create an artificial being that is as intelligent as people? And if so, what are the implications of that? Could it be more intelligent than people potentially are, as well, and what would happen as a result of that. So I don't have a definitive answer on that. I don't think anyone really does, but it's definitely something that people are discussing and talking about. DAVID MALAN: Well, we want to be mindful of everyone's time. And I know we haven't gotten to all the questions, but we'll definitely do another one of these soon. Do fill out the Google form that's in the chat to give us your email address, if you'd like to let us know. I've also just repasted the communities link. If you have questions that Brian or I might be able to answer online, we're happy to do our best. He and I are active on all of those communities. Please join us for CS50 X puzzle day this weekend, if you would like. And again, all of our best to you, your family, and friends, especially now. Let me turn things back over to Brian to say a final goodbye. BRIAN YU: Yeah. Thanks, everyone. Sorry, again, we didn't manage to make it to everyone's questions, but we'll definitely try and do something like this again. So if you didn't get your question answered today, hopefully you can in the future. But it was great to talk with all of you and chat with all of you, and looking forward to seeing you at a future office hours or in any of our online communities as well.