Category | Difficulty |
---|---|
HW | 7 |
Exams | 7 |
This class is designed to be taken after 15-112. This is an introductory programming course that introduces basic data structures and algorithms as well as proofs to ensure correctness of computer programs. The course starts out in C0, which is a simplified version of C with inbuilt support for proofs. The course transitions to full C near the end. In addition to the prerequisite of 15-112, this course has a co-requisite of 21-127. 15-122 is a prerequisite for Intro to Computer Systems (15-213, 18-213, and many other course numbers).
- Homework: There are two weekly homework assignments, written and programming. Written assignments are typically due on Mondays, and these assignments tend to cover proofs and more high-level details about data structures and algorithms. Programming assignments are typically due on Thursdays and cover the implementation of topics discussed during the lectures. Programming assignments are not due on exam weeks, but shorter-than-normal written assignments are.
- Exams: There are two midterm exams and one final. The first has a greater emphasis on the proofs taught near to the beginning of the course, while the second has a greater emphasis on later lecture material, e.g. more data structures. As the shift to C from C0 occurs mostly after the second exam, the final exam typically has a lot of material testing knowledge on data structures implemented in C instead of C0.
- Labs: The labs count towards your participation grade in the class, and generally aren't too difficult. You don't need to go to all of them to get a 100% participation score, but it is recommended to go to as many labs as early as you can, in case things come up as the semester goes on.
- Put a lot of effort into paying attention during lecture. This can help save significant time doing the homework assignments because you will generally be less confused. If you have trouble paying attention during lecture, read the lecture notes. They're posted on the course website, and they go into deep detail regarding the lecture material.
- Make sure to use good time management: the doubled weekly assignments can make it easy to miss a deadline for either the written or programming assignments. Start all of the assignments, particularly the programming assignments, as early as you can! Office hours regarding programming help are not offered on the programming due dates, and prior to the due date office hours are typically very full and have super long wait times (you'll only be able to ask one question, if that). Consider starting before or during the weekend because weekend office hours are relatively very empty.
- Read programming assignment writeups carefully. They are detailed, and many questions you may have on the homework can be answered by the writeup itself. Keeping the lecture notes/slides open when doing the writtens is also very helpful. A lot of the answers can be found there, so it can be helpful to review them before beginning the writtens.
- Some units have extra review sessions on difficult topics, e.g. amortized analysis. Attend the review sessions if you find yourself struggling with the topic.
- Recitations also offer good review and practice on the material discussed during the week. If you're confused, definitely go to recitation, but keep in mind that recitation attendance is not necessary if you understand the topics well.
- The first exam tends to be particularly difficult for students. Most students do not have prior knowledge of writing proofs for computer science, and much of this exam is on proofs. Make sure to study and go to office hours and review sessions as necessary to understand this material.
- Students tend to do more poorly on written assignments than the programming assignments. For the written assignments, make sure to give very complete answers and ask questions in office hours as needed. Many mistakes on the written assignments can be caught by making sure that you're answering the question being asked, so make sure to check over your work carefully before submitting.
- Make sure to follow the style guide. You can lose points after the fact for style, although the homework writeup will usually describe these penalties. Style is only graded on one of the programming assignments, but practicing good style will help you become a better programmer for future CS classes that will grade on style for every single programming assignment.
- Some of the more commonly notorious programming assignments are Speller, Peg Solitaire/Lights Out, and Huffman/Ropes. These are all perceived as difficult by students in their unique ways, but just keep in mind that these programming weeks might be harder for you than other weeks. If you can, start a little earlier than you typically do to help set yourself up for success.
- The C0vm assignment is the culminating project of the course. It is generally more time-consuming as it is the only programming assignment that students are given two weeks to work on, though not significantly more difficult, than other programming assignments. Although you're given the most time to complete this homework assignment, do not wait until the last minute to start. It comes right before finals week starts, so it is to your advantage to start and finish this particular assignment as fast as you can so you can study for the 15-122 final as well as any other finals you might have. There is also a large opportunity for extra credit on this assignment, and if you start early enough it is very doable to achieve this.
- If you're having trouble understanding lectures, use OLI to cement the concepts near the beginning fo the class. The OLI has additional practice questions and goes into more depth on the concepts for the first 10 topics or so.
- Make sure to understand what the writeups are asking for. For example, format your output as specified exactly by the write up else autolab won't be able to grade correctly!
- Double check your proofs and written answers before handing them in. Check on Diderot if stuck, there might be people with the same question as you! Checking posts on Diderot generally is also a good practice because you can learn from the questions that other students are asking.
- Again, START EARLY! This gives you time to go to OH, offered every day of the week, for help.
- Try to make a weekly schedule of when you will do work for this class as it will greatly help you to stay on top of the work for this course. For example, aim to start the writtens and programmings on particular days of the week.
- Never underestimate OH! TA's are there to help you with concepts, writtens, and debugging. Don't be afraid to go.
- This class is very challenging, and you're not alone if you feel that you're struggling in this class! This class can be particularly discouraging if you're super stuck doing a programming assignment. In this situation, remember that the programmings are designed to be difficult and time-consuming, but the TAs are very good, and they are very willing to help you get your code working.
- Never underestimate the exams! They can be very tricky. Definitely set aside at least several days before the exam to adequately prepare.
- Review Sessions may not be enough! Grind old exams, practice midterms, past writtens, and past recitation handouts. This seems like a lot of work, but yhey build intuition and a lot of the time similar questions will show up on the exams! This will also help you work fast as exams are viewed by the majority of students as a time crunch. Historically, it's common for students to not finish the exams in the time alotted, so keep this in mind when you're testing. Work as fast as you can while still making sure to carefully read questions and write your answers. If you get stuck, mark the question, quickly move on, and then come back to it later. The final exam is not a time crunch like the first two exams, but since all of the exams are tricky, use the entire three hours to check your work as carefully as you can.