All, I greatly appreciate the time you took to give feedback in class today. I've read through every line of it, and I wanted to send this email to discuss how I'll be integrating your feedback into the recitation and PAs. This will be a long email. Feel free to skip sections you don't feel interested in, but I will try to make it worthwhile for you to read. I think many of you wrote substantial comments and expressed sincere concerns, and that those concerns deserve to be addressed precisely, publicly, and promptly. At a minimum, [**please fill out this Doodle poll to indicate when we could host additional office hours that would benefit you**.](http://doodle.com/poll/wwfq7wraiu7upzpp) In order of frequency, the most mentioned comments were: * The PA and the class material don't seem to be synchronized * The recitations are mostly great (thanks everyone :) ) * We need more office hours, especially on the weekend * More PAs should start "from scratch" * The PAs are too hard or too easy * How does any of this relate to the actual software industry? I'll address these, in order, below. # PA and lecture content The largest criticism and most repeated comment was that the PAs require information that is not presented in the course. Others said that the PAs seemed to be irrelevant to the content of the course. I'll start with the second view. **We aren't getting to practice what Pito is teaching.** I understand that the current programming assignments haven't allowed you to apply a lot of the object-oriented design principles you've learned in class. A lot of what Pito has discussed about good and bad design essentially cannot be applied to the PAs we've already had, because the structure of the PAs has been dictated. Starting with the graph assignment, I've rolled back a lot of the enforced design decisions that might've been more confusing than they were helpful. Object-oriented design and thinking about program structure are important parts of the course, and the PAs I've presented so far have failed to give you an opportunity to practice these very important skills. There are primarily two reasons for this failing. The first, and most obvious, is my own lack of foresight. I assumed that by demonstrating what good design looked like, you would learn good design. In retrospect, this is nonsense. Clearly, you need to practice good design in order to learn good design. A painter doesn't become great by looking at my mediocre art. The second, and more troublesome, is that providing structure can often be very difficult. Sometimes, we created methods with particular instructions to guide you through the process. As you've now all grown substantially as programmers, this will be less of a problem going forward. Overall, I hope that you will find more freedom to practice design and the principles of software engineering that Pito has discussed in lecture. **The programming assignments require knowledge that is not presented in the lecture.** Writing a computer program is a lot like writing an essay for two different audiences: the computer, who will run your program, and other humans, who will look at your code. And just as a writing course won't give you all the words to put in an essay, we aren't going to give you all the tools you need to assemble quality solutions. A huge part of computer science is taking advantage of external resources available over the Internet. Looking up documentation and researching good solutions to various problems is a much more important than knowing the methods of the `List` interface. The programming assignments require the acquisition of extracurricular knowledge just like a research paper requires you to read outside material that you find on your own. The purpose of the programming assignments is precisely to get you to go "above and beyond" the knowledge present in lecture. In "the real world", the answer to two complex software problems will almost never be identical. Each will require research and investigation into unknown territory. Many of the tools you learn today will be completely outdated in 10 years. The real portable skill we are trying to teach you is how to research and solve problems you haven't previously encountered. Programming is: proofs, not calculus; research papers, not book reports; problem solving, not multiplication tables; critical thinking, not regurgitation. In my best attempt not to sound patronizing, I'll say that I understand that many of you, coming from high school, are new to such coursework. It's a wonderful part of college and I implore you to embrace it, not fight it. That being said, I will begin to focus more on trying to help you develop the research skills you need to solve new problems. This was my goal when I directed you to the Wikipedia page for the 3SUM problem in PA1, and the disjoint-set data structure in PA4. In the future, I try to more explicitly demonstrate and convey the sorts of things you can do to find solutions to novel problems. There's also a fundamental difference in the types of knowledge that you gain from lectures in CS and programming assignments. In lecture, you're hearing from a veteran and decorated programmer who has played a role in industrial and academic computer science progress continuously throughout the last decade. Pito will tell you war stories, teach you lessons that many developers take years to learn, and he will also teach you the formalities and technicalities of the Java language and programming in general. Learning something formally is almost always more difficult than learning something in practice (the proof is harder than the application). That means you can always learn more things pragmatically than you can theoretically. This pattern will continue throughout your career at Brandeis. # The recitations are mostly great Thanks everyone! I appreciate your warm comments just as much as your constructive feedback. As a Ph.D. student and potential future professor, teaching is an important skill that I am grateful to be able to practice. I will continue to hold "advanced topics" discussions after recitations on Monday, and would love if people stuck around for them. At the start of each session, we have a general, no-holds-barred Q&A session. Today, we discussed algorithms for quickly finding medians, graph-based approaches to game AIs, the Google car and Go AI, the history of chess AIs, and we touched on a few cutting-edge topics in machine learning. The conversation varied from highly technical to entirely philosophical. If you have time, stick around -- you might enjoy yourself. No promises though. :) # We need more office hours, especially over the weekend. I totally understand that the office hours are a little sparse. [**Please fill out this Doodle poll to indicate when we could host additional office hours that would benefit you**.](http://doodle.com/poll/wwfq7wraiu7upzpp) If no times listed would work for you, send me an email: [email protected] As for weekend office hours, which have been specifically requested by many of you, I'm going to do my best to get those going, especially with the difficultly of the current assignment. # More PAs should start "from scratch" First, many of the reasons we don't start from scratch are listed in the first section of this email. Second, starting from scratch presents a few difficulties, which I'll try to explain here because I believe y'all deserve an explanation. * It is hard to unit test. Without structured methods with specified inputs and outputs, it is impossible to write unit tests to test code. Unit tests greatly accelerate the grading process, as I cannot inspect all of your code individually. * Not starting from scratch enables our TAs to help students more fully. TAs don't have to figure out the structure of each student's code to help them with a particular problem, which makes for more efficient and effective office hours. Despite these concerns, I absolutely understand the need to learn how to write programs from an "empty file." It's an important skill you will be expected to have in the job force, and it's a skill I've thus-far failed to integrate well into the curriculum. This is absolutely my fault, and in the future PAs (starting with the graph assignment), I'm going to try to drastically reduce the amount of boilerplate code that is provided and maximize your freedom to design and experiment with program structure. As a result, unit tests will get a bit more vague, but by maintaining some weak structure, the unit tests should still be useful. Pito and I have also decided that your last programming assignment will start entirely from scratch. We'll provide some tutorial-like instructions to get going that you can choose to follow or ignore. We think we'll have time to evaluate the last assignment without the aid of unit tests (although you'll also be required to write your own unit tests). # The PAs are too hard or too easy I won't make excuses for myself, but I do want to offer a little insight into how difficult it is to make a programming assignment. The diversity of skills within the course is fairly wide, and tends to be quite bimodal -- there's a large lump of students near the top, and a smaller lump of students who are struggling, and almost no students in the middle. Therefore, assignments targeted at the non-existent mean leave many of you bored, some of you struggling, and none of you happy. In the future, I'll attempt to vary the difficulty of the assignments so that some will be universally challenging (like this graph assignment) and others will focus on simple but "cool" things (like the next assignment -- for whatever I know about "cool"). **Other schools** Five of you also expressed concerns that you were falling behind your friends at other schools. I'm going to brutally honest with you. It's true. A few of our assignments were taken almost directly from Harvard's CS50, a first semester course. Some of our assignments also come from the MIT advanced first semester programming course. Pito and I -- and in other directions, my adviser, professor Papaemmanouil -- are doing our best to bring you up to the level of these elite schools. If it helps, Brandeis University sends a proportional number of students to companies like Google, Facebook, and Microsoft as any of those heavy-hitter schools, and we have extraordinarily good connections with companies like HP Vertica and HubSpot. In terms of job opportunities, Brandeis does well. The size of the computer science has increased drastically in the past three years, and from the point of view of many PhD students, has been playing catch-up for a while. Many of our upper-level courses are going through a transition towards more rigorous material and procedures. It also worth noting that we are drastically out-pacing my alma mater, the University of Arizona. So, are we lagging behind some schools? Yes, but we are ahead of others, and with Pito and the rest of the COSI faculty at Brandeis, you are in good hands. **Struggling** Aside from varying the difficulty of the assignments -- which means some easier and some harder assignments -- all I can do is encourage those of you who are struggling to sign up for extra coding practice, hunker down, and pursue computer science in a rigorous and self-directed way. Take advantage of the resources we are making available, and if they aren't enough, demand that we do better. Many of you may have heard that there are "natural born coders" or "10x developers" or people who are really "passionate" about computer science and are therefore just amazing developers. **This is a bullshit falsehood perpetrated by those who have been spoon-fed the best education, the best opportunities, the best economic resources, and the best mentoring in order to make their privilege seem natural and to cast the often-insurmountable obstacles of others as personal failings or a lack of "passion."** Don't believe for a single second that academic and professional success is out of reach for you. Brandeis is a good school, and you got here because you earned it. We -- the TAs -- are here to help you, not give you poor grades. Will we make mistakes and fail to provide you with what you need? Yes, probably more than once. But we'll also go the extra mile for you when you need us to (and if you ask!). If you feel as though there are currently no extra programming help sessions that work for you, please email me and we'll get things figured out. # Industry Many of you have been asking about how what we're doing now relates to work in the software industry. As an academic institution, Brandeis tries to prepare you both for the job market and for potential research roles. A lot of the formalism and theory you will learn -- or have already learned -- may not be useful in industry. But the level of understanding you will gain by studying things formally will give you an advantage. We've already been showing you the features of Eclipse, a very popular tool in the software industry for writing Java code. A lot of the assignments we give you are, or closely mimic, industry tasks and applications. Some of the future programming assignments will do this more explicitly. I'm not sure what I can do to bring 12b closer to industry than it already is. Part of the problem is that 12b is very early in the CS course, and many things that industry tasks might require simply aren't accessible yet. I will, however, do my best. I'd also be willing to discuss some specific challenges and war stories of working in industry myself after recitation ends next week. # Conclusions You're all at the start of a very long journey into computer science. The Brandeis University faculty is making adjustments constantly to adapt to the ever-changing landscape of software. You are in good hands, despite the occasional appearance of chaos. This is a method to the madness. It'll be a long journey filled with frustrated nights trying to get something simple to work and ecstatic moments when everything finally comes together. Things that seem difficult are good. That means your learning. Focus less on grades and more on learning. For me, I've learned a lot from this feedback. I'll be adjusting the programming assignments to give y'all more freedom to experiment, and I apologize for the overly-rigid structure of the previous programming assignments. I'll also continue to work with the team of TAs to provide additional office hours and opportunities for extra practice and extension. I've dropped the ball a few times, and I appreciate y'all sticking with me as I learn to navigate pedagogy from the other side. Pito has done a good job making sure that my own learning -- and the failings that come with it -- have remained isolated from your education, but I apologize if you feel some has leaked through. I'd also like to plug the post-recitation topic discussions more: show up! Argue with me about the philosophy of computer science, programming, machine learning, etc. Or ask questions and hear about my experiences at Los Alamos and my research here. Engage your peers about new developments like self-driving cars and computers that can beat humans at Go. Learn a new algorithm. Or just relax and crack some jokes in the back of the room. # tl'dr tldr: * Please look for the Doodle link above to request additional office hours. * Programming assignments will continue require to actively pursue new knowledge beyond the course lectures, but will be adjusted to allow you to practice the software design skills Pito has been teaching. * As always, if you have specific concerns or suggestions (I'm serious about suggestions -- many of you have great ideas that you don't express because you think the course isn't adjustable), please email me: [email protected] See you next week, Ryan
Comments