1 00:00:00,000 --> 00:00:05,880 NICOLE: I am from Seattle, and my name is Nicole. 2 00:00:05,880 --> 00:00:13,530 So my question is, I wanted to know what are some of the common traits or skills 3 00:00:13,530 --> 00:00:16,560 that you notice in those programmers who are 4 00:00:16,560 --> 00:00:20,910 considered to be top programmers, or very skilled and advanced. 5 00:00:20,910 --> 00:00:25,210 What's something that you see as the commonality they all 6 00:00:25,210 --> 00:00:26,480 have that you've noticed? 7 00:00:26,480 --> 00:00:33,000 That may be something I can look to see if I can incorporate for myself. 8 00:00:33,000 --> 00:00:33,870 SPEAKER: Absolutely. 9 00:00:33,870 --> 00:00:35,287 A couple thoughts come to my mind. 10 00:00:35,287 --> 00:00:37,590 Let me go to Brian first, though, for his, especially 11 00:00:37,590 --> 00:00:40,667 since he's been teaching multiple classes this past semester. 12 00:00:40,667 --> 00:00:42,250 BRIAN: Yeah, this is a great question. 13 00:00:42,250 --> 00:00:45,063 I think, with really skilled programmers that I've 14 00:00:45,063 --> 00:00:46,980 had the chance to interact with and work with, 15 00:00:46,980 --> 00:00:49,350 I think some qualities they have are-- 16 00:00:49,350 --> 00:00:52,552 one is, they're always trying to find the best way to solve a problem. 17 00:00:52,552 --> 00:00:55,260 But oftentimes, ehrn you're dealing with a computational problem, 18 00:00:55,260 --> 00:00:57,907 there are lots of options you have for how to solve it. 19 00:00:57,907 --> 00:01:00,240 I often find that I really admire people that are always 20 00:01:00,240 --> 00:01:02,910 looking for the fastest, to the most memory-efficient, 21 00:01:02,910 --> 00:01:05,950 or just the most elegant way to try to solve a problem. 22 00:01:05,950 --> 00:01:08,040 And I also know that really skilled programmers 23 00:01:08,040 --> 00:01:10,617 are good at anticipating possible edge cases. 24 00:01:10,617 --> 00:01:12,450 When you're writing code, you have one sense 25 00:01:12,450 --> 00:01:15,600 for what you expect the code to do, but very skilled programmers 26 00:01:15,600 --> 00:01:18,870 will often be able to think about what could possibly go wrong, 27 00:01:18,870 --> 00:01:21,480 and to try to be able to handle those situations. 28 00:01:21,480 --> 00:01:26,380 Because otherwise bugs may arise in your programs later on down the line. 29 00:01:26,380 --> 00:01:30,830 SPEAKER: The first thought that came to my mind was a good tendency, 30 00:01:30,830 --> 00:01:32,560 I think, for a good programmer to have is 31 00:01:32,560 --> 00:01:35,320 a desire to want to understand everything 32 00:01:35,320 --> 00:01:39,052 that's going on in their code, even if they're using third party libraries. 33 00:01:39,052 --> 00:01:39,760 So case in point. 34 00:01:39,760 --> 00:01:44,525 One of CS50's own web applications broke the other day, when none of us 35 00:01:44,525 --> 00:01:46,150 had actually touched the code recently. 36 00:01:46,150 --> 00:01:47,530 So it seemed a little strange. 37 00:01:47,530 --> 00:01:51,100 So we thought maybe that one of the APIs we were using changed, 38 00:01:51,100 --> 00:01:53,590 or one of the libraries ultimately changed. 39 00:01:53,590 --> 00:01:55,960 And through trial and error, I realized that if I 40 00:01:55,960 --> 00:01:58,990 downgraded one of the libraries we were using, 41 00:01:58,990 --> 00:02:00,940 everything started working again. 42 00:02:00,940 --> 00:02:01,750 And that was great. 43 00:02:01,750 --> 00:02:04,330 And I could have just saved the code, pushed it to GitHub, 44 00:02:04,330 --> 00:02:05,800 and sort of called it a day. 45 00:02:05,800 --> 00:02:10,810 But I was so determined to want to understand this that I dug in deeper. 46 00:02:10,810 --> 00:02:14,290 I asked Brian for his second opinion, and indeed, Brian 47 00:02:14,290 --> 00:02:18,940 chased down the issue to being a very small change in this other library. 48 00:02:18,940 --> 00:02:22,420 But it was so gratifying, and, I think, enlightening for both of us, 49 00:02:22,420 --> 00:02:25,990 certainly for me, to realize, oh, that's what happened, 50 00:02:25,990 --> 00:02:27,730 and that's why the code broke. 51 00:02:27,730 --> 00:02:30,040 And I think the opposite of that is a bad trait. 52 00:02:30,040 --> 00:02:33,430 I think it's always disheartening when we see in some of our students, 53 00:02:33,430 --> 00:02:36,590 or even some of our teaching fellows, a sort of attitude of like, 54 00:02:36,590 --> 00:02:39,340 oh, I changed this line of code, and I don't know how it fixed it, 55 00:02:39,340 --> 00:02:42,100 but it works now, and being content with that. 56 00:02:42,100 --> 00:02:46,300 And I don't think you should be content with not understanding lines of code 57 00:02:46,300 --> 00:02:50,300 that you wrote, or even any of the dependencies that you might be using. 58 00:02:50,300 --> 00:02:52,990 So it's so frustrating and it's so time-consuming 59 00:02:52,990 --> 00:02:55,720 to go down these rabbit holes of understanding, 60 00:02:55,720 --> 00:03:00,500 but I think it really will make you a better programmer, ultimately. 61 00:03:00,500 --> 00:03:01,000