I Want an A - Now What?
or
John's Guide to Success in Comp. Sci. Classes
General Requirements
- Come to class. Especially in summer, evening, or large classes where you think you won't be missed, its tempting to go off and do something "more interesting" - even more so if the Professor makes prepared materials available. This is something you'll always pay the price for; things always go on in class that won't be in prepared materials. You can't learn if you aren't there!
- Pay attention in class. Surprise! Physical presence just isn't enough. We don't learn through atmosphere, so try to follow what's going on. If things go over your head, ask about what seems to be missing. One of the things that I try to do is gauge in real time who seems to be getting things and who isn't (which is why people who aren't paying attention at all is tremendously distracting), but there's only so much of that you can do in real time. One of the biggest hurdles to get over in a University environment is getting up the nerve to ask questions, usually out of fear that the answer is obvious and you'll look less intelligent than everybody else simply for asking. Get over that: if you're thinking that, chances are there a ton of other people that will breathe a sigh of relief if you ask, since they're having the same problem. And if everyone gets over it, then that spreads the asking around too.
- Good notes can be your lifesaver. Even a great student doesn't always get everything the first time around. That's what class notes are for; things that may seem less-than-significant when you first look at them may be vitally important later. A good instructor should always explain the connections between the topics you take so that you can see the significance of everything, but you won't always have that benefit. And when things seem to get over your head, that's the time to take your notes and go back to where you were last comfortable with things. This may be a long way back! Humbly speaking, I've had classes where things were intricate enough that I had to to back to the beginning once a week and go through notes to the current class just to know where things were coming from. There's nothing wrong with this: that's what notes are for!
- Understand, don't memorize. Memorization of a concept or algorithm will let you regurgitate it verbatim when asked, but its not likely what you're going to be asked to do. In order to have concepts you learn today serve as a foundation for what you're going to learn tomorrow, you have to understand them; that means you can see their basis in things you've learned earlier, can take the concept and relate it to others you know about, and can modify the concept to fit new situations. And these things are what any proper examination, test, or real-life scenario will require you to do! If you don't understand something, don't memorize it. Talk to me, your classmates, or others to ensure you do reach an understanding of what's involved. There is no substitute.
- Be Confident in Tests and Exams. Anybody who's ever been in one of my classes has heard me rant about this one. Assuming you've followed the above tips during the run of the course and understand the material involved, there's absolutely no reason to walk into an exam expecting anything less than a great mark. And if you don't walk in with that attitude, half your battle is already lost. Be confident that the knowledge is in there somewhere and you will stay more relaxed and alert and you will be able to remember things you wouldn't be able to otherwise; memory is affected by stress! And no matter how confident you are, you will likely be weary and ready to go by the time the exam is over, and that confidence you walk in with can keep your energy level and focus up enough to see you through to the end! Note also that your confidence in tests and exams can be greatly boosted by following the points earlier in this list!!!
Getting good marks (without going insane) on assignments
This isn't as hard as it sounds. In fact, it involves most of the material you learn (but too often ignore) in first year computer science. In fact, if you are having major debugging problems, its probably because you're ignoring one (or most!) of the following points, and I will point that out when you come and see me with your program, so be prepared!
- Don't touch the machine until you at least have some idea of the solution. That doesn't mean you have to have a complete, monolithic design before you start coding, but it doesn't help to sit in front of a machine bashing out code if you don't have any idea of how to begin tackling the problem at hand. This will only cause frustration, anguish, and grief. Work out how to solve the problem on paper first. Sketch an algorithm (or an approach if an algorithm sounds too detailed) first, program second.
- Design before Implementation.. This goes hand in hand with the previous point. Remember that the point of using modules is to break things down into manageable pieces. That means you do that FIRST, not get a partially working program that's a total mess, and then decide how to split it up to get a good mark for the assignment. Implementing your program in manageable pieces requires that those pieces be thought out beforehand. Again, this is not going to be perfectly done ahead of time, but keeping that concept in mind makes the design process go a lot more smoothly.
- Incremental testing. Throwing all your modules together in hopes the entire complex system will work perfectly is futile. Test systems in pieces and ensure each works before putting pieces together!
- Document as you Implement. There are very few things that will make me more frustrated than being shown a large program that has no documentation whatsoever as to what various parts of the code do. Comments are not meant to be added to a finished working program! They are there to remind you what you are doing, so it's easy to pick your program back up after you've sat it down for awhile and work on it further, or to modify it to provide different or additional functionality. If you have no documentation, chances are you aren't completely comfortable with how it works either, which may be the root of your problem!
- Take a Break. No, not all the time, but regularly. There will always be times when you are frustrated enough to just turn the machine off (or worse) and walk away. Don't do worse than turning the machine off, and don't walk away permanently, but do walk away, regularly. Nothing will lower your frustration level more quickly than a short walk around campus (or whereever) to cool down and approach the problem a little more relaxed and refreshed. Don't let your problems here or anywhere else overwhelm you (a tip from my upcoming book Programming is Life) [No, I'm not serious about that part]. Keep things in perspective.
- Ask for help when you need it, but don't rely on it completely! I am always here as a resource for you when you need assistance. However, I will (hopefully obviously) focus on making you understand the basic concepts involved rather than doing your assignment for you! I also encourage you to use your fellow students as a resource. However, know where to draw the line. Handing in other people's work as your own is plagiarism and will be dealt with severely. It will also make absolutely zero contribution to your understanding of the concepts involved, which is of course what you are going to be examined upon and what you are going to be expected to know in further courses and in the real world. There is nothing wrong with getting assistance when you have a nasty bug you can't find, or even when you need some hints as to how to start off. But you will learn nothing by letting others find solutions for you.
Tips for Tests and Exams (again, not just mine!)
- Don't have too much faith in old exams. Courses change. Typos get into exams. There is no guarantee that the exam you are studying from is correct or even relevant. So don't use them as your primary focus. They can sometimes be a good source of sample questions but much better is....
- Focus on Examples and Assignments. Every assignment could have 10,000 variations. Look at your old assignments and think about variations; know how to tackle them (it goes without saying that you've actually done all your assignments). Chances are your instructor made up your assignment questions, so they will likely reflect the kind of material he/she will select for exams. While not everything in the scope of a class can be asked for on an assignment (though we wonder sometimes!), the examples you see discussed in class provide an additional window into things your instructor is likely to ask. In addition, every textbook has lots of questions at the end of each chapter that are geared to the level of material you are at. They are more likely to be of use to you than ancient exams.
- Know your Instructor Whomever your instructor is, he or she will have preferences toward certain types/styles/wordings of questions. Look at the examples they did; ask questions about your instructor. What did he or she seem to find the most interesting? What did he or she beat to death in class? What has he or she asked you before? You can actually get very good at anticipating the kind of things an instructor might ask. This is actually the place that old exams may come in handy, if you can find some that were written by your instructor. Not for specific questions, but to get further exposure to his or her styles and preferences (one big tip - watch for exams written by a group, since your instructor may have had only a very small part in it).
- Focus on what you don't know. Everybody should know what they're weak on - the problem is, that's also generally what you have the most difficult time focussing on while studying. By definition though, it's also what you need to work on the most! If you don't understand a particular concept, work with it over and over.
- Practice. Programming is like playing the piano, the more you do it the better you will get. Programming courses are not something you can just hope to pick up at the end; you have to keep working with it constantly. You will find you get rusty quickly when you leave it for awhile. So keep working with it. That's what the assignments in a course are usually for, to give you mark-based motivation to practice. But there's no reason you can't practice further on your own.