DAVID MALAN: All right, and why don't we begin even as others join us? So my name is David Malan. I'm here with CS50's own Brian Yu for what are called office hours. Here on campus, what office hours traditionally are is an opportunity for students at Harvard to drop by a professor's office literally and chat about the course, chat about a problem set, chat about the real world more generally. And so what we thought we'd do today, as we've done a couple of times thus far online, is hold Zoom-based office hours so that CS50's community around the world has an opportunity to meet with each other as well as chat up me and Brian here on Zoom. If you are not familiar, just a couple of features of Zoom you should know-- odds are, in the bottom left-hand corner of your laptop or desktop, if you're not using a mobile device, there's a mute button and a start or stop video button. Do turn on your video if you haven't already, just so that we get a sense of who's in fact here. This time we've automatically muted everyone by default. Otherwise, as we've experienced in the past, there's quite a bit of background noise. So Brian, and I, and CS50's team will be able to unmute you for you when it comes time to ask a question. And in the middle of your Zoom window, there's probably a participants and/or a chat button. And if you click on the chat button, you should be able to interact via text with other people who are here on the call. And Brian and I will occasionally, this afternoon, use the chat window to paste in any URLs that might be of interest to you. One other change, this time, that we thought we would try out is rather than do virtual hands using Zoom's feature, which got a little overwhelming for me and Brian to keep track of who was asking questions, CS50's own Ramon Galvan is going to help us manage the questions by soliciting questions in advance from everyone here via this URL. So if you'd like to ask a question of your own, please take a moment now or at any point over the next hour to ask it via that URL there cs50.ly/question. That will lead you to a Google form where you can ask your question. As before, please forgive if we can't quite get to everyone's questions in the time allowed. We'll invariably do more of these in the future. So we'll do our best. And in fact, Ramon's going to help us cluster similar questions together so that if multiple people, this time, have asked the same question, we'll try to answer them all at once. So feel free to take a moment to ask your question there. We won't be using Zoom's blue hand feature. But please feel free to chat in the chat window during today's session. And we're so pleased to see. It looks like we have some 360 CS50 community members from around the world. So welcome to all. RAMON GALVAN: When is the next episode of the CS50 podcast coming up? DAVID MALAN: That is a really good question. For that, let me turn to my friend Brian. BRIAN YU: Yeah, it's a very good question. For those of you who don't know, David and I co-host a podcast that used to be hosted by CS50's own Colton Ogden as well. You can find those episodes on YouTube, and also on most podcast players. Because of the current global health situation, we've been outside of our normal office in Cambridge. And we've been working from home. So we haven't been able to meet up in person to record the podcast the way we normally do. But certainly, we're hoping to get back on another episode soon. DAVID MALAN: Indeed. If you are a Spotify user, allow me to go ahead and paste the URL of the podcast if you'd like to check it out. Previously, I did this with CS50's own Colton Ogden, and then most recently, Brian. So if you Google "CS50 podcast" as well, you can find it on iTunes, you can find it on YouTube, and a bunch of other channels as well. All right, who do we have next? Ramon? RAMON GALVAN: All right, we have Priyah up next. AUDIENCE: Hello. DAVID MALAN: Hello. Would you like to ask your question? AUDIENCE: Yeah, I was wondering, after I do the CS50 cour-- sorry, the course-- what do I do next? Because I've really been enjoying it. And for my GCSE stuff, I took computer science, but I didn't really understand half the stuff. And then I did this. I'm on week two, and I get so much. So thank you, everyone who is on the CS50 team. So yeah, just wanted to say that as well. DAVID MALAN: Great. And Priyah, where in the world are you from? AUDIENCE: I am studying in Thailand, but I'm originally from the UK. DAVID MALAN: OK, well, nice to meet. Well, for those following along via chat, I've pasted one URL into the chat window which just shows other courses of CS50. Often, here at Harvard College, a common next course for a student to take would be, here at Harvard, what's called CS51. And what that is, a course on what's called functional programming as well as object-oriented programming, which is to say, a common next step for a student after taking a class like CS50 would be to learn a different type of programming. In CS50, we tend to learn what's called procedural programming. You sort of write your code line by line, step by step. But there are other ways of thinking about solving problems in other languages, with which you can solve problems in a conceptually different way. So CS51 itself is not online. But there are other classes on functional programming and on object-oriented programming, which would be a good next step. And then there's more application-oriented classes that you can take. For instance, Brian teaches a class on web programming that I'll let him speak to next, which is, indeed, freely available already. BRIAN YU: Yeah, so at the URL that David posted in the chat, which is edx.org/cs50, you can find some of CS50's follow-on courses that you can take after completing the regular course. And one of those is a course that I teach on web programming where we pick up where CS50 leaves off, diving a little more deeply into how to build web applications, and some of the security ideas behind that, and thinking about how you think about scaling web applications as they start to grow larger as well. So depending on your interests-- CS50 will introduce you to a lot of different fields and aspects of computer science-- there are a lot of different directions that can take you after completing the class. AUDIENCE: Thank you so much. DAVID MALAN: Yeah, thanks for the question. Let's see who we have next. RAMON GALVAN: Well, David, I'm going to cluster quite a few questions. But a lot of people are interested in learning what courses CS50 offers after CS50. Especially of interest is the AI course. DAVID MALAN: Yeah, so for this one too, I can toss to Brian. In addition to the web course that he alluded to, he also teaches a course on artificial intelligence, which is another apt follow-on Brian? BRIAN YU: Yeah, so the artificial intelligence course is also designed to pick up from where CS50 leaves off. And it's specifically about using Python to be able to write artificial intelligence programs, designing computer programs that are able to do intelligent things that you might ordinarily think are reserved for just people. So for things like playing games, or for things like understanding human questions and trying to be able to answer those questions, or for trying to figure out what's inside of an image by using self-driving car type of technology to identify what road signs are, for example, those are the sorts of questions that we explore in the artificial intelligence class. And over the course of the class, you get a sense for what some of the common strategies are for trying to solve these sorts of problems. And you get to write some of your own Python code to be able to create artificial intelligence of your very own. DAVID MALAN: And let me ask, before we move to our next question, if you did submit a question via cs50.ly/question, do make sure your video is on. Because we much prefer to have you ask the question on video than just us reading it aloud. But with that said, who do we have next? Fernando, would you like to-- where in the world are you from? And what's your question? AUDIENCE: I am from Chile. DAVID MALAN: Nice to meet you. AUDIENCE: And my question is, what can I do once I finish the course later on for not getting stuck or going further in my programming skills so I can have like a more solid way of taking this seriously in the future? DAVID MALAN: Yeah, so that's a good question. And I would propose we answer it from a non-course-directed-- it's very common for students online especially to wonder, what course should they take next, what course should they take next? And this is sort of an endless cycle. And you never actually necessarily do something with all of the knowledge and skills you've acquired. So I would say one of the best ways to proceed after taking one or more courses like CS50 is to find some project of personal interest to you. Maybe this is your own personal home page. Maybe this is a web application for your parents' small business. Maybe this is an application for a student group that you're involved in. In short, find some problem that can be solved by software, or perhaps even hardware, that you think you have some of the skills to solve, and then figure out everything that you don't. Like, very early on when I was in college, the way I learned C all the more was by writing a program for letting other students on campus find the upcoming shuttle buses. So Harvard has a lot of buses that drive all around campus bringing students from point A to point B. And one of the most gratifying projects I took on that really taught me more about programming was to write a program that helped people look up the days and times of those next shuttles. And so wherever you see a problem that can be solved with software, I would try to take that on. And better yet, take on a project that you don't necessarily know how to do yet yourself. Like, it should scare you a little bit. You should have, maybe, no idea where to start. And hands down, that will be the most rewarding way of learning something new when you really have to teach yourself most of it. AUDIENCE: Thank you. DAVID MALAN: That helped. AUDIENCE: Thank you so much. DAVID MALAN: Sure. Let's see, who do we have next here? RAMON GALVAN: Give me one second. Ooh, I think he just left the chat-- or left the video feed. Let's see. Well, I can ask the question. The question was, are there any teasers for the upcoming updates for CS50 Web? BRIAN YU: Sure, I can take that question. Yeah, so the web programming class, which is currently available on EdX, is due for a refresh that will be launched over the summer on July 1, I believe, is the day that will happen. And there are a couple of changes to what's going to be included in the new version of the class. A lot of the big ideas are still the same about thinking about how to go about designing a web application and how to think about all of the pieces that need to come together to make a web application work. But among the new things are going to be an increased focus on Django, which is a Python web framework just designed to make it easier to get set up with web applications that deal with a lot of data. So if you're imagining a web application that might have a lot of users that have a lot of data associated with them, something like a social networking website or an e-commerce website for example, we'll spend some more time focusing on that. In addition, the new class also covers a JavaScript framework called React, which some of you may have heard of. And React is a framework that is designed to make it easy to build really interactive user interfaces. So if you're using a lot of modern web applications nowadays, where things on the page are changing all the time, without needing to reload the page, you're seeing notifications pop up and chat messages pop up, a lot of that is because of a reactive web framework. And so over the course of the new CS50W, we'll spend some time focusing on what that really means and how you can build those sorts of user interfaces. DAVID MALAN: And in fact, if you would like a sneak preview, I've pasted into the chat window the URL of Brian's new version of Web 50 at Harvard Extension School. You won't be able to submit the projects yet. But starting on July 1, the new version of that cause will be freely available on edx.org as well. All right, Ramon, who do we have next? RAMON GALVAN: We have Vasu, or "Vashu." AUDIENCE: Yes, sir. Hi, sir. DAVID MALAN: Yes, hello. Where are you from, and what's your question? AUDIENCE: I am from India. So I have the question. So after doing the CS50 course, what all I will learn through it? And I'm basically new to computer science. So I am just very-- I want to ask what all we will do around the course. DAVID MALAN: Sure, so CS50 itself is-- or CS50x, on EdX-- is meant to be an introduction to computer science itself, which means you'll learn a lot of the fundamental ideas of computer science. For instance, how do you represent information? How do you solve problems using a computer? How do you represent large amounts of information efficiently to facilitate what are called algorithms, step by step processes for solving problems? As such, we'll talk about how computers search very large data sets, how computers sort very large data sets, the exact kind of problems that the Googles, and Facebooks, and Microsofts of the world do every day. Toward the end of the semester, we'll transition from those primitives to applications thereof. We'll introduce a bit of web programming using a language called Python. We'll use a framework, which is a free library, called Flask. And we'll also introduce students to languages like SQL for databases, HTML, CSS, and JavaScript for web programming so that you ultimately, at the end of the semester, are able to build something of your very own. So with that said, while it's an introduction to computer science primitives, it's very much a hands-on software class. And so at the end of it, you should be very well prepared to go on and take other classes in programming and solve problems using your own devices. Thanks for the question. AUDIENCE: Thank you. DAVID MALAN: Let's see, who do we have next, Ramon? RAMON GALVAN: Coming up is someone that has their video currently shut off. So I think I will have to find someone else. Give me a quick second. Again, please, if you want to ask a question, do have your video turned on so we can have you on screen. Here we go. DAVID MALAN: Eric, you're live. Would you like to say where you're from and your question? AUDIENCE: Hi, I'm from New York. I was going to ask about continuing classes, but it seems that we've already kind of covered that. But I was curious more about continuing for Mac OS and iOS development, or maybe if we were going to use Python for Bash scripting or that kind of stuff. DAVID MALAN: Yeah, and how you can go about learning those? Or what's the question precisely? AUDIENCE: Just like what courses you would recommend to look into that stuff. DAVID MALAN: Sure, so on the iPhone front, if you have an iPad, or iPhone, or the like, the course that, years ago, I first learned iOS development on was Stanford's. I did a quick google here. That might not be the very latest URL. But Stanford's course, that I just pasted into the chat window, is called CS193p. And that should be freely available online. It was a wonderful, rapid-fire introduction to a lot of the basics of iOS development. Brian, do you want to speak to the Python front? BRIAN YU: Yeah, sure. Just to add on a little bit with regards to iOS and Mac OS development, most of development for native Mac and iOS apps are done in a programming language called Swift developed by Apple. And so if you're interested in learning Swift, I think Apple's own documentation and Apple's own website on this matter does a very good job of trying to introduce the language for beginners who haven't seen it before. So that URL over there will take you to Apple's developer page for how to learn the Swift language. And getting a good understanding of that language is a good first step, because it's really a language designed to make it easy to then go and build applications for the Mac or for iOS. And then if you're planning to develop-- so then, if you're planning to write your own Python scripts that run on your computer as well, for that, you don't need a programming language-- a full graphical interface like what developing a Mac or an iOS app will give you. But the Python scripts that you've written in CS50, for example, might be a good starting point there for just getting a sense for the types of problems that you can solve. So in the class, you'll, for example, write Python scripts that can analyze DNA samples, for example, and open up CSV files, and be able to process them. And so those are some of the building blocks of a lot of other scripts that you might write. So depending on the problem you might try to solve, you might look for what aspects of those problems you know how to solve using the tools you've learned in the class, and then go out and do some research as to what missing pieces you might need to fill in in order to solve the problem you're trying to solve with the script. AUDIENCE: Thanks. DAVID MALAN: Thanks for the question, Eric. All right, who do we have next, Ramon? Musadique, if I'm pronouncing your name correctly? AUDIENCE: Yeah, you are right. DAVID MALAN: Sure, you would like to tell us where you're from and what your question is? AUDIENCE: Yeah, I'm from Pakistan. And my question is-- that is a general type of question-- what are your productivity hacks, especially when you're learning something new and complex, when it is really difficult, at times, to stick with your goals and to keep the momentum? So how would you explain your time schedule or your productivity hacks to learn better? DAVID MALAN: Yeah, it's a really good question. Let me start with Brian, because he was smiling the most, and perhaps has the best ideas, first. BRIAN YU: I like this question a lot. I think a lot about trying to figure out how to manage time and how to make sure to stay productive on things. One thing I do, which I don't think a lot of people do-- but I find it, personally, very helpful-- It's something called time tracking, where, basically, I keep track of how much time I spend on any particular task. So if I'm learning something new, I'll keep track of how much time I'm spending on that. If I'm working on a particular project, I'll keep track of how much time I'm spending on that project. That does a couple of things for me. One, it helps to keep me accountable, because I'm keeping track of how much time I'm spending wasting, not doing something productive. And I'm also keeping track and really holding myself accountable to how much time I'm spending working on things. And it's also a useful reflective tool. So at the end of the week, I can go back and look at what I spent my time on in the past week and think about if that's really what I wanted to be spending my time on or not. So I think the takeaway there is just access to data about what I am using my time for has been helpful for me, personally, in thinking about how to make sure I'm productively using that time. DAVID MALAN: Brian do you want to paste the URLs of one or two of the software programs that you've found useful for that? BRIAN YU: Yeah, so the one I personally use is called Toggle. I just pasted the link for that there. It's a web app. It's got mobile and desktop apps as well. But basically, you just click on a button when I say, oh, I'm going to check my email now, or I'm going to work on trying to learn how to program in this language right now. And at the end of the week, or at the end of the month, it produces some nice reports where you can go back and look at how you were spending your time. DAVID MALAN: And Musadique, I would propose that my approach to life, for better or for worse, is a little more organic. I am amazed by Brian's level of organization, as evinced by that software there. But I would say there's two things, at least for me, that tend to help me keep on track. Certainly, when I want to work toward some goal, I try to make sure that I have decided in advance on at least one thing that I want to accomplish during the day so that I have a well-defined goal, especially if it's a large project that I know I'm not going to finish in that given day. And so I try to decide that, OK, I'm going to fix this bug, or I'm going to implement this feature. And in fact, that relates to my second rule of thumb, which I actually learned from one of CS50s former teaching fellows. This was a fellow. Some of you might remember him from past shorts of CS50. His name was Tommy MacWilliam. And he was extraordinary when it came to writing software, because he could be in the middle of an airport waiting to board a flight with his laptop open, implementing some feature or solving some bug. And it always blew my mind just how he would make use of every possible moment of productivity like that. Whereas I-- at least when it comes to writing software, generally, I need to clear my desk. I need to get everyone out of the room. I need to have like eight hours straight so that I can actually focus. And so I've been trying to get better at that and trying to be more like Tommy's approach by saying, all right, I know I can't solve this whole problem today. But you know what, I'm going to have this list of issues in GitHub or in some other tool. And I'm just going to bite off one, maybe two, maybe three. But I try to quantize it step by step so that I at least feel good about making some progress. That's a really good question. Thank you for asking that one. I think we have Emmeline next. If, Emmeline, you'd like to say hello and where you're from and ask your question? AUDIENCE: Hi, my name is Emmeline Wong, and I'm tuning in from Dallas, Texas. And I really appreciate all the resources that you've made available for us to be able to take CS50. The app, the web app, everything's awesome. I was trying to find out how to get a copy of all the questions I asked, so I'll just go by memory. So I was curious-- so I like what you mentioned about how the way you stay motivated is to have a personal project where you can practice the skills on. So the two questions I had were, what's a good way for us to assess ourselves to know that we're ready, for example, to participate in a hackathon or to contribute to an open source community like Cloud Native Computing Foundation? I know that's way down the line. But I just thought, for example, with language-- I speak Mandarin-- there's HSK levels. And I was curious, from a computer science standpoint, what do you and Brian recommend for us to test where we are? Is there some kind of standard in the industry? Thank you. DAVID MALAN: Sure, I mean, I would say, short answer, no. And I think if you're already thinking about doing something like a hackathon, you're ready. No one's going to keep you out of it, and no one's going to stop you from participating. And even if, upon participating, you realized, wow, everyone to the left of me and to the right of me really seems to know more, that's a good thing, to surround yourself by people who can teach you a little something new and who can challenge you a bit more when it comes to whatever project it is you're working on the hackathon. And I think that if you wait until you feel ready, that day might never quite come. Because odds are, there's always going to be something more to learn and more comfort that you think you can achieve. So if you're already thinking about it, I think now is the time. And then just to give you a more concrete data point, at Harvard, we have the so-called CS50 hackathon, which is at the end of the semester for us, which means, after three months, CS50 students are ready to participate in a hackathon. Granted, our hackathon focuses on CS50's final projects. So it is not necessarily an open-ended project that you don't all find out about until you get there. But I think a more concrete rule of thumb would be, after CS50 itself, after three months, you're certainly ready and encouraged to try something like that out. Brian has, in fact, taught at and participated in a few of these things and can perhaps give you a more personal perspective too. BRIAN YU: Yeah, I mean, I would definitely agree with the idea that hackathons and these types of experiences are really learning experiences. You're not expected to know exactly how to solve the problems that you're trying to solve when you enter the hackathon. It's meant to be a collaborative opportunity where you can talk to other people about the problems you're trying to solve and get feedback and ideas for how you might approach them. As for working on open source projects and trying to contribute to those projects, what might be a good first step is to first start just by trying to read some of the code in other people's projects. It's a very different experience writing your own code from scratch than it is to look at someone else's code and try to read and understand it. And that's a good skill to develop as well. It's one of the reasons why, later in CS50, we have you start to read some of our own distribution code for problem sets that we give to you as practice with reading other people's code. And reading other open source project code can help you to better get a sense for how they work and can be a good stepping stone if, later on, you then want to contribute to those projects as well. DAVID MALAN: And I-- AUDIENCE: Thank you. DAVID MALAN: Yeah, and on the open source front, I've just pasted the URL of a website that is super simple. This is a project that someone made just to help people look up their GitHub user ID. In addition to your GitHub username, everyone has an integer that's their unique identifier that can be useful for certain types of projects. And so I found my way to that website. And as of a few months ago, there was a bug in that website, and it wasn't quite displaying information correctly. And I realized, wow, wait, I can probably fix this. So I found the GitHub repository in which the code was stored. I literally made one change to one line of code and submitted what's called a pull request, which is a request for the owner of the code to actually merge it into their code base. And I was just so happy when he actually said yes, like, thank you for the change, and merged my one-line change into the project, which is only to say that if you start using other people's tools or free and open source libraries in your own projects, when you discover that that program or that library has a bug, or it's missing some feature, I think one of the best ways to get involved in the open source community is try to go implement that feature or try to go solve that bug yourself and submit what's called a pull request, just like I did. And it's the most gratifying thing, which is admittedly a very geeky thing. But it was a lot of fun just contributing to a project and learning something new about someone else's code. So I would encourage you to try that too. Solve problems in things you, yourself, use. All right, up next, we have Asher. If you'd like to say hello, and where you're from, and your question? And we just need to unmute you. Asher, go ahead. AUDIENCE: Hi, am from New York City as well. And just answering Emmeline's, at the last office hours I asked a similar question. And then afterwards, there was a bug with the-- there was a feature request for the submit50 program. And I submitted a single pull request that changed one line. And it was the best feeling ever, just to have your code running when you run that. But my question is, I always seem-- I always seem to do well on the problem sets. But whenever it gets to projects, I have trouble figuring out ideas or just getting started. So do you have a sort of process for doing that? Or is it just find what needs to be solved? DAVID MALAN: Personally, I have a to-do list that seems to be infinitely long that I will never get through by the time I'm done programming. So thankfully, I'm in a position where I just have more projects that I want to take on that I can. But I think your own instincts are just right. When you see something, that's an opportunity to jump on it. And very quickly, I think, will you start to see more, and more, and more opportunities or projects that you want to get involved in. And then the harder question is going to be which of those to prioritize. Brian, you've taken on some of these yourself too, yes? BRIAN YU: Yeah, so actually, what you just pointed out, I think, is a really good suggestion, which is keeping a list, just some sort of to-do list of things you would like to do someday. Because oftentimes you'll notice something that you wish existed or that you wish were slightly different. But you're out and about. You're not really at home, sitting in front of a computer in a position to actually start writing some code to work on a project. And just the idea of maintaining a list of things that you want to do so that when you notice something you can write it down, that's really helpful such that, later on, you can go back to that list and refer to it. I find checklists and a list of things to do is a very helpful organizing tool to make sure I'm organized about the things that I'm doing, and also very helpful just for being more aware of things that I might want to do some day and then remembering those later instead of forgetting them. DAVID MALAN: Yeah, and to Brian's point about a list, this past weekend I spent updating my own personal website for, like, the first time in 10 or 15 years. And even once I finished it, I already had a list of, like, seven, or eight, or nine more to-dos that I still want to get to. It's sort of diminishing returns. Like, it's smaller features or slightly more information and I want to add. But that is just to say that if I wanted to, I could spend all day long tackling some of these to-dos. And you'll start to see that, I think, if you start making a list. AUDIENCE: Thank you DAVID MALAN: Sure, up next, we have Jabock, if you'd like to say hello and where you're from. AUDIENCE: Currently, I am taking CS50 web development course. And I am amazed by how Brian Yu teaches us. And I love him very much. And my question is, as the project begins to grow bigger and bigger, how do we plan so that we can quickly plan and work on that project? DAVID MALAN: Can you-- can you elaborate? I'm not sure we followed exactly. AUDIENCE: I mean to say that as the project begin to larger, supporting CS50 web development final project. DAVID MALAN: What to do? AUDIENCE: How can we manage the-- how can we manage the project and think about in terms of database and all of those? DAVID MALAN: Sure. Brian, do you want to speak to that? BRIAN YU: Yeah, sure. So I think this is sort of in two parts. One is in, when you're planning for a large web application, it's often helpful to think about, before you even start writing any code, what the different components of the application are going-- is going to be. What do you want to-- what features should the application support? What should users be able to do? What kind of data do you need to store? So thinking first about those questions is probably a good step. And then what you might want to do is to divide some of those features into different milestones for yourself. Likely, it's not going to be feasible to take a big web application and just write the entire thing in one afternoon. But rather, you'll build incrementally in the same way that, in the first weeks of CS50 with your Scratch project, you probably built it incrementally, adding a few scripts, and testing it out, and seeing what happens, then adding a little more, and testing, and seeing what happens. The same principle holds true for larger applications as well. You'll probably set milestones for yourself such that the essential features happen first. You work on writing those. You work on testing them and seeing how they work. And once you're comfortable with those, you can begin incrementally adding to that project as well. But going into the project with a general plan and being willing for that plan to change, I think, is a good place to start. DAVID MALAN: And even though in CS50, we have everyone sign up for a GitHub account, as you know, we don't really use GitHub that much. Although other courses that follow on from CS50 do use it a bit more. But having the right tools in place, I think, is really helpful too, Jabock, such that I just pasted two URLs into the chat window for github.com. And there are alternatives. You can use GitLab and Bitbucket. And there's other third parties as well that provide the same services. But if you look at a couple of those URLs, if you're not familiar, a lot of these tools like GitHub make it easier to build large projects and to collaborate with other people. I alluded to pull requests with Emmeline's question earlier and the ability to submit your code to someone else to incorporate into their project. There's the notion of a code review, which is an opportunity for a friend, or a colleague, or a random stranger on the internet to provide you, or in my case, me, with feedback on the code that you are trying to contribute to a project. And then there's what are called issues, or projects, or project boards, which are features that sites like GitHub support as well that help you organize, to Asher's point earlier, a lot of your ideas and to-dos. And you can assign them from one person to another. So getting the right tools in place, I think, can help you be all the more productive as well. All right, next up, we have Bryna, if I'm saying it right, if you'd like to say hello. AUDIENCE: Hi, yes, you're saying it right. DAVID MALAN: Nice to meet you. Where are you from, and what's your question? AUDIENCE: Well, I'm from Atlanta, Georgia. DAVID MALAN: Nice to meet. AUDIENCE: Thank you. Well, my question is, in regards to data analysis-- that's where the-- that's the path that I want to put myself into-- what other courses or what kind of path do you recommend for somebody pursuing that career? DAVID MALAN: Ah, that's a good question. So I think the buzzword du jour would be data science these days, which is an amalgamation of programming, of statistical methods to larger data sets so that you can ask questions of that data. Brian, do you perhaps have some go-to links or courses offhand? Otherwise I can try to find on my side. BRIAN YU: Yeah, so I've heard-- I haven't taken the class myself, but I know that Coursera offers a popular class on data science. So I've pasted that link there as something you might look into. So you can certainly do data science in a programming language like Python, which CS50 teaches. This course in particular uses a language called R, which is also very popular for writing statistical programs and doing data analysis with programming. And so that language I'll also paste there, for the website for the R Project, which is the project that organizes that particular language. So that might be something worth looking into as well. There are definitely multiple options you have in terms of languages to use for data science. But Python and R are both quite popular for that. DAVID MALAN: Yeah, and also, on the database side too, SQL is also very powerful as well. We look at it a little bit in CS50 and in Brian's web class. But getting more comfortable with analyzing large corpuses of data using SQL can be very powerful as well-- very popular area right now. All right Emmanuel, you're up next from UK, I gather. AUDIENCE: Yes, hi there, Professor Malan, Brian, all the CS50 community. I'm a professional musician, a classical guitarist specifically. I've been taking CS50 as an introduction to coding during these times where we're staying at home trying to develop a hobby, and potentially a side profession, let's say. And just to say, it's surpassed any expectations I had about programming and just how exciting it could be. So my question is, what have you seen as overlaps between arts and coding? And are there perhaps overarching trends that you may have observed, perhaps amongst your CS50 alumni community? DAVID MALAN: Yeah, it's a really good question. Brian, do you want to speak to this first given your musical tendencies? BRIAN YU: Yeah, sure. So speaking more generally about the arts, David and I actually, a couple years ago now, were teaching a class on programming in the digital humanities. So the digital humanities is an entire field that's really all about the intersection of humanities, and the arts, and computing. So there's a lot of interesting work that's going on there. With regards to music specifically, CS50 actually had a problem about music a couple of years ago. I'll paste the link to that problem there if you're interested. AUDIENCE: Thanks. BRIAN YU: But that was a program where you could write some C code, and it would-- oh, I see David posted the link too-- where you can write some C code to actually generate some music of your own based on some representation of sheet music. But especially now, with artificial intelligence, the intersection between computation and music is getting very interesting where there's actually artificial intelligence, in particular, variants of neural networks, that are able to generate musical compositions that are almost indistinguishable from compositions that a human might have composed themselves. One of the most famous ones there is OpenAI's MuseNet, which is a neural network that can be used. I just posted a link to it there. But you can hear samples of music that was generated by artificial intelligence. And this, I think, is one of the really interesting powers that some modern techniques in artificial intelligence are now able to do is they can generate compositions like that. DAVID MALAN: Yeah, and suffice it to say too, there's this intersection of computing and music certainly, when it comes to consumer applications. If you have Shazam, for instance, on your phone, this is a piece of software on iPhone and Android that you can hit a button and figure out what song is playing in a restaurant, or at a friend's house, or the like. And it does that generally by quantifying the music into small, little signatures or fingerprints that can then be looked up in a database. YouTube, and Facebook, and others are using computing to detect when copyright has been violated and someone has maybe uploaded, when they shouldn't, a copy of some song by looking at patterns that uniquely identify that song as well. And at the risk of maybe embarrassing, but hopefully flattering, Brian himself is quite the musician. And I've just pasted, into the chat window, 60 seconds of Brian playing the piano on the stage of Sanders Theatre at Harvard. And in fact, it was Brian's talents a few years ago that inspired that new music problem set that he, too, pasted earlier. All right, well, thank you, Emmanuel. We have up next Ben carpenter, if you'd like to say hello and where you're from. AUDIENCE: Hi. yeah, so I'm Ben Carpenter. I'm from western Massachusetts actually. So I was hoping to ask what you guys thought the best option for when you're trying to work through a problem set and you just kind of can't get something. And hopefully you've hit the 70% plus on check50. When is it the right time to just kind of say, let's move on? DAVID MALAN: Yeah, that's a really good question. My personality is such that 100% is usually when I would quit, which is tough. Because there's often diminishing returns of your time where you might spend 10% of your time on 90% of the problem set, but 90% of your time on 10% of the problem set. But gosh, the sense of gratification, honestly, for me, for that last 10% or 30% is really where I think a lot of the sense of pride and accomplishment is for the very reason that it's so much harder sometimes to solve those final bugs or figure out that corner case. But I think the upside of trying to adopt that behavior in general is that you just get so much better over time at solving problems in your own code. And the peak, I think, is when you become a sufficiently comfortable programmer that no matter what your bug is, you are confident that if you just give it enough time, you will figure it out. You don't need to ask a teacher. You don't need to ask a friend. You don't need to post on Stack Overflow. You begin to acquire a confidence that you've done bugs like this before. Yes, they take a long time, but you know you can solve it. And so I think that's the upside, I think, of conditioning yourself, training yourself to try to go past that 70% point. Now in the real world, of course, there's trade-offs, and there's other demands on your time. Maybe you have other classes you want to do in well. Maybe there's work or family matters that you need to attend to. And that's more of a personal judgment call. But I would encourage you not to be satisfied with satisfactory performance alone and to push yourself that additional 30% or even 10%. AUDIENCE: Would you say that-- sometimes when I get stuck on a problem, right, my instinct is to move on and come back. Like, I've been trying to do the image filtering problem set for a long time now, like almost all week. And I've just-- I've gotten everything except for the blurring. And it looks like it's coming out right, but the math with the actual check50 is coming out wrong. So I'm wondering if it's a good time for me to just move on to the next one before making the submit. DAVID MALAN: So personally, I wouldn't deprive yourself of that sense of satisfaction of actually figuring that out, especially since you've been so determined. But I would encourage you to consider that maybe you're doing something wrong in the sense that, if you keep spending more, and more, and more time on it, maybe you're not putting very good-- very-- you're not using that time very smartly. You're doing the same thing again and again and expecting something to change, when really, what you should maybe be doing is sitting down with a family member, or a sibling, or friend and talk them through the problem, right? Teach them what it is your code is doing. This is the equivalent of the rubber duck, a photo of which I just pasted into the chat window. Just hearing yourself talk through the problem can work wonders. And I do this all the time with Brian, with Kareem, with others on our team, just talking to them about what I'm working on. Then all of a sudden, I have that aha moment. I don't even need Brian or Kareem to be there. But the fact that they let me talk at them helped me understand where I was going wrong. And so maybe that's helpful in your case. I also find it helpful to go for a jog, to go to sleep, to just do something else, but kind of put it on the backburner. And I've lost track of how many problems I've solved literally when I'm just getting ready to go to sleep. I sit up and, like, oh, that's it. And then three hours later, I'm still awake, but I've made progress. So whatever you keep doing, don't do that. Try to shake things up a bit somehow. All right, let's see. Next up, we have Yousef, if you'd like to say hello and where you're from. AUDIENCE: Hello, this is Yousef from Tunisia. I took CS50 last year in July and finished it successfully. I want to thank you, all the CS50 teams, for this amazing course. And I want to mention Kareem for helping me, fixing the CS50 IDE defined issues. Thank you, Kareem. So I have a couple of questions here. So my first question is about JavaScript in this time of the year. Especially the TypeScript is a new language. So will JavaScript still be successful and used? Or will it flow down? And my question is, when I want to go for an internship, for Google, for example, and I'm a JavaScript developer, I don't find that they are interested in JavaScript developers. They just want you to be a Python or Java. So what do you think about this? And my final question is how to contribute to CS50 on GitHub. Thank you. DAVID MALAN: Sure, I think on the last question, if you want to go to github.com/cs50 and look at some of our open source repos, many of them have open issues, which you're welcome to contribute to or ask questions about. As for JavaScript, it is an incredibly popular language right now. It's not going anywhere, I think, anytime soon. Brian, do you want to speak to it and its application in the real world? BRIAN YU: Yeah, certainly one of the most popular languages out there at the moment in terms of what's being used. Every year, Stack Overflow does a developer survey of what are the popular languages right now. And if you look at the most popular languages list, JavaScript is at the top of that list for this past year. I just pasted the link in the chat there. And it's been at the top of the list for a fair amount of time. Now what you might notice is that Stack Overflow also has a most loved languages list. And JavaScript does not rank very highly on that list, in particular because, with all the different versions of JavaScript, with all the quirks of the language, it's very easy to write JavaScript code that you think will work but doesn't quite work the way that you would expect. And it's for that reason that, as you mentioned, there have been a lot of extensions to JavaScript, other languages that are JavaScript-like that end up compiling to JavaScript that can be translated into JavaScript. So among them are languages like TypeScript, which you mentioned, which I happen to personally like quite a lot. Other ones include CoffeeScript, for example. And so these languages try to solve some of the problems with JavaScript while, at the same time, still allowing them to run inside of a web browser the way that JavaScript code normally can be. So I happen to quite like TypeScript in particular. But there are a lot of different extensions to JavaScript that are designed to try to keep the practical side of JavaScript while adding some additional features, adding some safety features to make it easier to use. DAVID MALAN: And one of the upsides of JavaScript is arguably that it can increasingly be used both on the client side and the server side. In CS50, we introduce it to students on the client side whereby it's running within the browser itself alongside HTML and CSS. But thanks to a runtime called Node, or Node.js, you can use JavaScript on the server side. And that, as a principle, is just very compelling. Because if you and your development team can all work in the same language everywhere, it decreases cost arguably, decreases time. So it's a very vibrant ecosystem, but it does change very frequently. There's always something new in that world. All right, up next, we have Louis, is you'd like to say hello and where you're from. AUDIENCE: Hey, hello, guys. I am from France. Actually, I'm Brazilian, currently live in France. I have a question about frameworks as we talk about web development. We show a lot of discussion on Twitter about React and Angular that are two different kinds of frameworks. So I would like to ask, which one is better? I mean, we see a lot of people saying that React is better because it's easier to-- I don't know-- to learn, and also many people saying that Angular is better. So which one is better, then? DAVID MALAN: Either way, you're not going to get an officially accurate response here. Because this is very much one of these "religious" debates. But Brian, want to speak to this given your experience with the web class? BRIAN YU: Yeah, so React and Angular are both frameworks that are designed to do similar things. Both of them are JavaScript frameworks that are designed to make it easier to build interactive interfaces on the web. React happens to be developed by Facebook. Angular happens to be developed by Google. Both of them have learning curves. Both of them have their advantages and disadvantages. So you're really never going to get a definitive answer on which one is best. Ultimately, it might vary a little bit based on what it is that you want to be working on specifically, that especially, if you're contributing to a project that already exists, it may already use Angular, or it may already use React, for example. So both are very popular. Both are definitely in demand. They do use different languages. They both ultimately use JavaScript, but React uses an extension to JavaScript called JavaScriptX, or JSX, that makes JavaScript look a little bit more like HTML. And Angular uses a language called TypeScript, which we mentioned a little while back, that specifically adds more strict types to the JavaScript language too. So trade-offs to both, and they're just used in different circumstances. I don't think you'll get a definitive answer about which one is necessarily better than the other. But everyone has their personal preferences. I personally like React, but people will disagree. DAVID MALAN: Yeah, React does have a lot of momentum lately. And honestly, if you aren't working at a company that already uses one framework or the other, and you're just trying to decide for yourself which one to learn, honestly, I would take a look at tutorials online for both, implement the equivalent of hello world in both, or something more advanced, and just see which one seems more pleasant to you. Odds are you'll fall on one side of the fence or the other as well. All right, next up we have Nitten, if you'd like to say hello and where you're from. AUDIENCE: I'm Nitten, from Mumbai, India. And my question was that I have been learning computers since the past three years now in school. But I didn't really get my basics right. Like, I've been learning Java and C++. So what books, or resources, or language would you recommend so that I can get my basics and concepts right? DAVID MALAN: Yeah, I don't think those are bad languages at all. Both of them are what are called object-oriented programming languages. They're both very common as first languages, either in high schools or universities. So I don't think you're going wrong there. With that said, I think Python is very much in vogue these days. And learning it is-- probably opens up possibilities for you as well. As Louis pointed out, JavaScript-- or someone earlier-- JavaScript certainly is very trendy now as well. But I think it should depend on what you want to get out of it. Because you are currently studying C++ and Java, which are very similar languages in spirit. Syntax-wise, they're very different, but they can do similar things. So to one of the first questions that was asked today about other types of classes to take, I would encourage you to look into what might be called functional programming. This is something that you can learn a bit with JavaScript. You can learn it somewhat with Python. You can learn it with more specialized languages like Lisp, for instance, or ML, or OCaml. Those are classes-- or those are languages-- that force you to learn how to program in a somewhat different way. But I don't think you're off on a bad start in any way by starting with Java and C++. So next up, we have Sukantra, if I'm pronouncing it right, if you'd like to say hello. AUDIENCE: Yeah, hello, I'm Sukandra. I'm from India. And my question is, how would you advise the students to approach the problem sets, particularly which involve coding? DAVID MALAN: Can you read it once more? I was having trouble hearing you. AUDIENCE: My question is, how would you advise the students to approach the problem sets, particularly which involve coding? DAVID MALAN: Oh, how to approach the problem sets, especially those that involve coding. Brian, do you want to take this first? BRIAN YU: Yeah, sure. So I think with CS50's problem sets in particular, it's a good idea to start by reading the background section for the problem set, which will usually introduce any of the necessary framing to understand what the project is and what it is that you're supposed to do. And then after that, with any problem that you try to solve it-- I mentioned this a little while back too-- but a strategy that I find very helpful is just to work on building it incrementally. So if you're trying to work on the Mario problem, for example, you need to take an input, and make sure the input is valid, and build a pyramid of that height. Rather than write all of that code and then try to run it, start by just writing a program that takes in user input. Make sure you can do that. And once that's working, go ahead and build the next piece on top of that. If you write all of the code at once, it becomes a little bit harder to think about and a little bit harder to debug if something doesn't quite work right. Whereas if you start small and then add to that, that can make it a little bit easier to know, when something goes wrong, what might be going wrong and just make it easier for you to think about trying to solve the problem. So while the problem sets might be vague, breaking them up into smaller pieces can be helpful for that. And the walkthrough videos that we associate with each of the problems try to help you towards that too, trying to break the problem into smaller steps that might be more easy to implement independently and then putting all those pieces together. DAVID MALAN: And that's a good question, in fact, very similar to one other that Julie Lee, if I'm pronouncing your name right-- if you'd like to ask your related question here. Julie? AUDIENCE: Hi, I'm Julie. I'm from Oklahoma. And my question is kind of similar. So I've been taking computer science for the past two years now, and I've learned, like, three different languages. And I always get stuck at one point and try to give up. So like, I have a problem looking at a bigger picture, because I try to focus on the smaller parts. But I have a hard time implementing it altogether. So how do you work through getting stuck at a certain point? And how do you get better at looking at a bigger picture? DAVID MALAN: Yeah, and by getting stuck, do you mean with a particular feature, or fixing some bug, or something else? AUDIENCE: I think it's like when I am stuck on a certain logic, just not knowing how to code the logic that I need to figure out if that makes sense. DAVID MALAN: Gotcha. Yeah, Brian, do you want to take that one first? BRIAN YU: Yeah, so I think this will depend a little bit on your personal strat-- your personal style for solving problems. I often, when I'm struggling with the logic of a problem, find it helpful to write things out on paper just to-- sometimes just writing something down or drawing a diagram or a picture of what my computer's memory might look like, for example, or what data is being stored where can often be helpful for me when I'm trying to think about solving much larger problems. Of course, that'll vary a little bit by the problem. But I find being able to look at something more visual helps me personally. I learn very visually, and I think very visually. And so that's useful for me. But it may-- that may be helpful for you. You may find that other strategies work for you as well. Certainly, other tools like debuggers exist for helping you to step through your code line by line and get a better understanding. David mentioned rubber duck debugging as well, just talking the problem out loud. Sometimes it's helpful for making your thinking a little bit more precise and a little bit more formal. And that can sometimes reveal where your bug might be or how you might go about modifying your logic. So all of these are strategies that may prove helpful. DAVID MALAN: Yeah, and I can't emphasize enough the idea of talking to someone else, or if need be, a rubber duck. I mean, even in CS50's office hours on campus, when students come to me, and Brian, and the courses teachers, teaching fellows for help, very often, we'll just ask the student to explain their code on their screen and ask them, what do you mean for this code to be doing? What are you trying to accomplish? And so often, just by asking the student to walk through their logic verbally so that they, themselves, are thinking about it step by step, they too have that aha moment. And they realize where they've gone wrong. So you can waste a lot of time, honestly, by just sitting in your room or your dorm room just banging your own head against the wall. But honestly, taking a step back and talking to someone, or talking to a duck, can really help speed things up, honestly. So as before, change the approach you're taking, and see if that helps gets you to a better solution. I think we have time for just another question or so. Can we call on Angelia, if I'm pronouncing it right? AUDIENCE: Yeah, hi. I'm Angela, from Jakarta, Indonesia. DAVID MALAN: Nice to meet you. AUDIENCE: Yeah. My question is, I say, from the courses that Brian and David are really patient when they are teaching. So my question is how to develop such expertise. I mean like public speaking and teaching CS combining and solve, and always technical skill. Thank you. DAVID MALAN: Well, thank you. You're too kind, I think. So one of the reasons I, at least, went into teaching 20 years ago was honestly because I wanted to get better at public speaking. As you may have heard me say in one of CS50's classes, at the time, I had run for the undergraduate council at Harvard, or the student government if familiar, student council at the school, just kids that generally try to accomplish goals on campus. And I ran for this election and lost miserably. Like, I did not win the election. And part of that, I do think, was because I was very ineloquent at the time. I had trouble conveying my ideas. I performed very poorly in one of the on-campus debates. And so I was really kind of angry at myself that I wasn't better-spoken at the time. And so I started volunteering as a teacher for one of the undergraduate student groups that allowed me to teach classes to other students, like HTML, and CSS, and other such technologies. I then was a teaching fellow, or teaching assistant, my fall of my senior year of university. And then I was fortunate to be able to teach my own class my spring of my senior year. And so it really honestly was just practice, practice, practice. And teaching particularly really helped me organize my thoughts, allowed me an opportunity, again and again, to try to communicate clearly to other people more so than if you're just giving a speech or just presenting in a class. Having to teach, I think, was really a key ingredient. And I think it helped technically that I just enjoyed what it was I was teaching. I really enjoyed programming. I really enjoyed computer science on the whole. And so being able to teach something I was passionate about just really helped. Brian, what was the case for you? BRIAN YU: Yeah, I think I would agree with just about all of that. I think the practice is the key thing that helps make you a better teacher. Just getting experience, even if it's just explaining something to a friend or to a peer, that helps you to start to think about how to take the ideas that might exist in your head, and put them a little bit more precisely into words, and in particular, to be able to explain something in a way that is accessible to someone who hasn't seen the topic before. But I often think about, when I was first learning some of the material, the types of explanations that worked and didn't work for me and trying to come up with explanations that can help to explain very technical topics, but hopefully in a bit of it easier to understand and more accessible way. And it definitely helps that the topics that I get to teach are things that I find really interesting. With the artificial intelligence class that was released this month on EdX, I had a lot of fun preparing that class and thinking about what topics I wanted to cover. Because they're all topics that I personally find very interesting and exciting in computer science right now. And so the opportunity to be able to teach about those topics and to talk them through in a lot of detail I found very exciting. And so I hope that does come across in the classes. And I'm glad that you've been enjoying it. DAVID MALAN: And I hope you'll all forgive if we don't-- if we haven't quite gone to everyone's questions. We're going to have to log off momentarily.