Discrete Mathematics

Survey Questions (Part 2)


Here are my (in progress) responses to more questions submitted in the registration surveys (see Part 1 for the first set of responses). Sorry its taking a long time to answer these questions, but there are lots of great questions submitted, and I will eventually get to them all.

How to get better
Practice! (This applies to pretty much everything). But, its important to practice in a way that maximimizes benefit and avoids getting stuck in local maxima. The best kind of practice involves honest and direct feedback, and interaction with people at both levels above and levels below yourself. We hope the problem sets in this class will provide plenty of opportunity for effective practice.

The syllabus said that students who do exceptionally well will be offered positions in your research group. I am interested in encryption research and I was wondering what I would have to do to be considered for a position in your research group.
Excellent! Thanks for reading to the end of the syllabus.

I’m willing to consider anyone who expresses interest for a summer position in my research group, but want to try and have a good expectation that it will be a positive and worthwhile experience for both of us before offering a position. The main things I want to see are curiosity and initiative. Beyond that, it does help to show that you can do well on the content in the class, but it is not necessary to be the best student or to do consistently well. Much more valuable to do one impressive thing (which could be something in the class like solving a challenge problem, or something you’ve done on your own, like building an interesting mobile app or writing a blog, etc.).

I would like to learn everything I would need to know to be able to build big programs.
This class is more relevant for building small programs that do a lot, than for building big programs.

The main challenge in building big programs is managing complexity and the best tool for managing complexity is to define clean and limited interfaces between components. This class might help some for that, at least in terms of the underlying skills, becuase it should improve your ability to think clearly about precise definitions and to strive for minimal requirements.

If you want to learn how to build big programs successfully the best thing to do is to actually try building progressively bigger programs, and to join and contribute to open source projects where you’ll get mentoring from people with experience building (and maintaining, which is often the hardest part!) big programs.

I love interesting classes, but I also get really stressed about grades. They don’t matter as much as I have been told they do, but my mind is conditioned to value them. I just hope this class will be more interesting than stressful! The article we just had to read definitely fell into interesting and I would have enjoyed that on my own.
When you were in high school, you were probably told that grades were essential to getting into a good college, and you followed this advice well and were smart enough to do well, that’s how you ended up at UVA.

In college, grades have much less significance. There is, unfortunately, one exception to that which is getting into the CS majors. I hope this will change, and also encourage students to not accept being turned away from their desired major without a fight, but for now the unfortunate reality is that slots in the CS majors have been capped, and admissions are decided nearly entirely based on arbitrary GPA cut-offs.

Otherwise, there is very little that depends on your college grades (as long as they are respectable enough that you don’t run into trouble with academic probation or anything like that).

If you want to go to graduate school (in computing, at least) after college, it is a little better to have great grades than to have mediocre grades (although perfect or near-perfect grades will probably count against you), but far more important to have an impressive accomplishment and reference letters. Being a significant author on a research paper is the most important determiner in getting into the best PhD programs, and having letters from known researchers who can provide a lot of detail about interesting and impressive things you have done is the next most important thing. Most reviewers of PhD applications won’t even look at grades, or GPAs, except to possible check grades in a few key courses, and if the reason for getting poor grades in some less important classes is that you were more focused on doing some exciting research, so much the better!

If you want a software development job in industry, there are some (mostly big, old) companies that will have GPA cut-offs in their hiring searches, but generally the more interesting and worthwhile the company you are seeking to work for, the less they care about grades and the more they want to see evidence of what you can accomplish on your own initiative. Contributing significantly to an open source project, building your own interesting web/mobile app, initiating and leading a student club, providing a technical and leadership contribution to a service organization, etc., are all much more impressive and meaningful evidence that you would be a valuable employee for most companies and any number of As in your classes.

As for what we can do in cs2102, I do try to make things less stressful for students, but sometimes things intended to reduce stress are misinterpreted and actually increase student stress. I believe being somewhat vague about what is expected and how grading is done is highly beneficial for learning. My favorite quote about this is from John Stigloe (who was a professor at Harvard, but it applies equally to UVA students):

This generation of students got into Harvard by doing exactly and precisely what teacher wants. If teacher is vague about what he wants, they work a lot harder to figure out what they want and whether or not it is good. The vaguer the directions, the more likely the opportunity for serendipity to happen. It drives them nuts! (Harvard Professor John Stilgoe on “60 Minutes”, 4 January 2004)

That said, I understand that uncertainty is one of the main things that causes stress for students (and I don’t really want to drive students nuts!). I hope students will view the vagueness in my courses as meaning there are many and varried opportunities to show that you deserve an A in the class, and that I can be trusted to treat everyone fairly.

The other main cause of grading stress, I believe, is students fearing that even though they understand the material well and are putting in a solid effort, that they are at risk of getting less-than-desired grade because of making little mistakes. Grading done where each question is “out of” some number of points, and there are various ways to lose specific numbers of points for making mistakes, and the grade is computed as the total of all the points over all the questions, exaccerbates this stress in two ways.

First, it means students are mostly focused on getting to the threshold “full credit” answer and fearful of anything that might cause point deductions. This stifles creativity and ambition.

Second, over the course of a set of assignments, it means it is nearly impossible to recover from one misstep. If 90% is needed for an “A” grade, it takes 3 grades of 95 to make up for one 75, and 5 grades of 95 to make up for one 65. With the grading system I use, one great assignment (or one successful challenge solution), is enough to make up for several poor assignments. I’m looking for evidence that students have understood important concepts and shown that they can use them effectively, not for signs of occasional slip-ups.

I hope students find the grading systems I use to be less stressful, and more conducive to ambition and creativity.

People tell me if discrete doesn’t “click” for me I will not do well in the class. What can I do to make it “click”?
I don’t think anything worthwhile for you to learn “clicks” right away. Usually when something “clicks”, it is because of lots of struggling and effort beforehand, setting up your mind for the “click” to happen.

So, the main thing I would say is don’t be distressed if you see other people getting things more quickly than you do. Its probably not because they have some magic discrete math gene that enables them to understand things that you are lacking. I’m pretty sure no such gene exists. Instead, when someone learns something quickly it is probably because they had a lot of previous experience that gave them the context necessary for the new concept to make sense.

When things seem overly hard to learn, instead of getting frustrated, your goal should be to figure out what context you are missing that is making it hard to learn. Rather than getting stuck on the new concept, go back to the previous ones that it is building on and make sure you really understand them (a great way to do this is to try and explain them to someone else who might be confused on them).

Don’t just assume you understand things because you can read solutions to problems and they seem to make sense, make sure you do by working out the problems yourself and then comparing them to others’ solutions. The collaboration policy for the assignments in this class is intended to encourage this, and I hope students will take advantage of it, and use opportunities to work with others as ways to improve each other’s understanding.

Will this course be focused solely on mathematical proofs, or a broad range of proofs (i.e. Evaluating conspiracy claims)?
We will concentrate on proofs about mathematical propositions, with a focus on ones that are (at least loosely) relevant to computing. The nice thing about mathematical propositions and proofs is that they can be stated precisely and umambiguously, and the methods of reasoning are well established and universal. Many of the reasoning methods we’ll see for mathematical proofs are also relevant to discussions about things in the physical world, but the “rules of evidence” and methods of reasoning are much less clear and much in dispute (e.g., outright lying seems to have become pretty much acceptable in our current political discourse, but assuming any falsehood would completely invalidate any mathematical proof). I would encourage everyone to take a philosophy class to look more deeply at how formal reasoning can be used to understand things in the real world, but for this class we will mostly stay in the safe world of mathematical abstractions.

As a double major in Math and CS, I am also taking the Transition to Higher Mathematics course this semester. Do you believe these proof-based courses would work in conjunction?
I would expect so! I’m sure there will be lots of connections between the two classes, and would encourage you to share any extra insights you get with me and the class.

whats your middle name
I provide that only on a “need-to-know” basis.

How much of a computer/computing/etc. background do I need to succeed in this class?
You are expected to have at least some programming experience (enough to understand and write simple programs), and I also assume everyone in the modern world has had a lot of experience using complex computing systems. I think some parts of the class will probably have more relevance to people with more programming experience, and I’ll try to relate some of the abstract concepts in the class to things that some students may have encountered in programming (but others will not have yet seen), but it is not necessary to have substantial computing background to do well in this class.

The only official prerequisite is cs11xx or equivalent, so if it seems like anything is ever unfairly assuming more CS background than you should expect to have by satisfying that prerequisite, you should make sure to let me know.

Is there any actual coding involved in the course?
Its possible there will be some problems that involve programming, but it will not be a major part of the course. There will be challenge and optional problems that might be infeasible to solve without programming.

It will definitely be possible to earn an A in the class without doing any programming.

I always enjoy hearing about the instructor’s life/achievements. I feel like it makes them seem more human ,and also makes me feel excited to learn under such a distinguished person in their field.
Wow, that’s flattering! (I’m not sure if it is more flattering to seem human, or to be a “distinguished person”, but either way, I appreciate the question.)

As for my life, it is mostly focused around my children (a four-year old daughter, and 17-month old son). Since having children, I view any professional accomplishment as inconsequential compared to my hopes of being a good parent and raising decent and fulfilled children.

As for my achievements and experiences in computing and teaching, the ones I think are most significant are:

  • When I was an undergraduate at MIT, I was an undergraduate researcher in Marc Raibert’s robotics lab where I worked on making physically-realistic animations of kangaroo-like creatures. One day Prof. Raibert came into the lab and told us we should make the creatures look like dinosaurs instead, but he couldn’t explain why. A few weeks later he came back from a meeting with people in Hollywood, saying he thought he had convinced them it would be possible to make a sufficiently realistic animated dinosaur for a movie (which turned out to be Jurassic Park). As an undergraduate, I also had an opportunity to work as an intern in John Backus’ group at IBM Almaden, on a functional programming language. John was a UVA dropout, who had gone on to lead the Fortan project at IBM, develop what is now known as Backus-Naur Form, and then lead a programming language research group at IBM Almaden.

  • The main research I did as a graduate student at MIT (which didn’t end up actually as part of my PhD dissertation) was to develop a tool for lightweight static checking, that would take advantage of annotations added to C programs to be able to warn programmers about likely programming errors. The tool I mostly built ended up being quite widely used, and included in many Linux distributions. (The work was mostly done in 1993-1996, with some more doing after I came to UVA in 1999-2001, but I still get bug reports form people using the tool. Some of the ideas we had for checking memory use in C programs are now being used, in farily similar form, in the Rust programming language, although I have no direct involvement in this.)

  • One of my first goals after starting at UVA (where I joined as a professor in 1999) was to develop a new introductory computing course targeted for College of Arts and Sciences students and intended for people who were only expected to take one computing course. This started as a University Teaching Fellowship Proposal, and the first course was offered as cs200: Computer Science from Ada and Euclid to Quantum Computing and the World Wide Web in 2002. Initially, there were about 20 students in the class, but more than half of them dropped out after the first problem set which was not well designed. But, the remaining 9 students stuck with the class and over the years it developed. Since some students who took it wanted to continue into other computing courses but were not allowed to in the curriculum we had then, I created a follow-on course (initially offered as cs201j: Engineering Software, and with Snakes!), which could lead into our other CS courses (it counted as what is now cs2110, and satisfied the prerequisite for cs2150).

  • Based on the success of these courses and the quality of students we were finding in the College, I pushed for creating a CS major that was open to CLAS students. In fall 2005, I was given support from my Department Chair to lead an effort to create a CS degree for the College, and after putting together a committee to help with this and designing a curriculum, the Interdisciplinary Major in Comptuer Science (BACS) degree was approved in 2006, and we graduated our first three students in 2007. By the time I stepped down as BACS director, the BACS had grown to be larger than any other major offered by the Engineering school.

  • I wrote an open textbook based around the cs200/cs150/cs1120 course, Introduction to Computing: Explorations in Language, Logic, and Machines. Although it was not widely adopted, it does have some eager readers and I get occasional emails from people who have used it as a self-study book. It also was the main thing that led to me being recruited by an open education startup to teach their first course. (You can read about my experiences as the first VP of Education for Udacity here: CS101: One Year Later, and my favorite article about this is Professors without borders: Will online learning spell the end of universities?, not just because it somehow claims I have “Monty Python humour”.)

  • I’ve had a chance to teach many remarkable students who have gone on to do amazing and wonderful things. Although its always hard to know how much impact one actually has, one of the joys and privledges of being a professor is to follow the careers of your students and to feel like you can claim some credit for them. Some of the students who have worked in my research group include Adrienne Porter Felt (UVAToday article) (who works on social network privacy and web browser security when she was an undergraduate in my research group, and now leads the Chrome security team at Google), Yan Huang (who worked on secure computation for his PhD in my group, and is now a professor at Indiana University), Karsten Nohl (who worked on RFID security for his PhD in my group, and went on to found Security Research Labs and expose high profile security vulnerabilities in phone systems, payment systems, USB, and GSM), Nate Paul (who work on malware security for his PhD in my group, and has gone on to do work on medical devices and embedded security at Oak Ridge and University of Tennessee), and many others.

  • I’ve led or been involved in research projects that have come up with some cool ideas, a few of which have led to lots of other research as well as use in industry. The most significant are our work on making secure multi-party computation practical, improving software security (e.g., ScriptInspector, Perracotta, PHPrevent, and Split), and mobile networking.

  • I’ve been involved in a few start-up companies, one as a co-founder (when I was a grad student), one as an early employee (with Udacity, growing from 5 to ~50 people), and many as an advisor. I’ve learned from these experiences (mostly that academia is much more pleasant than industry!), but also have lots of opportunites to work with great people and see different aspects of companies at various stages.

  • I’ve written a baby book on theoretical computer science, make some fun videos, and received an award from Tim Kaine (back when he was a lowly governor).

Hope that helps! Thanks for asking.

who’s your favourite scientist?

Grace Hopper (really enjoyed Kurt Beyer’s biography. I would also mention Claude Shannon, Alan Turing, and Richard Feynman as runner-ups.