I just finished my second course in the computer science program at Oregon State. Like Intro to Programming I, this course focused mostly on C++ and object-oriented programming principals. Here are my notes.
- Functional decomposition
- Object oriented programming
- Abstract classes and virtual functions
- Access modifiers
- Linked lists
- Files and stream objects
- Stacks and queues
- Searching, sorting, and algorithm analysis
Each week was dedicated to one of the topics above, and each week finished with a lab assignment in which we applied the programming skills we’d learned. Every two weeks we completed a more in-depth project. Here are some of the projects:
- Command-line implementation of Langton’s Ant
- Grocery shopping list
- Dungeons and Dragons-style battle game
- Tic-Tac-Toe game
- Zork-style adventure game
Instead of a midterm and final, this course had four quizzes. I loved that we didn’t have to pay for proctoring, but I found the questions vague and confusing. Not like, ‘I have no idea what the answer to this question is,’ but, ‘more than one of these answers could be right.’ To the instructor’s (Luyao Zhang) credit, when I emailed her about my interpretation of a question that I’d gotten wrong, she credited me back the point.
Another thing that made the quizzes more manageable was the fact that they could be taken twice. If I’d missed a point or two the first time around I always opted to retake. Many of the questions were repeated, so instead of having only 15 minutes to figure out the answers to 20 questions, I’d have 30 minutes to answer about 30 (between the two tests). Since time was always the limiting factor for me on the quizzes (in other words, I was always rushing to finish), this made a big difference and helped me finish the course with a 100 percent on all of quizzes.
At the beginning of the term I sat down and put every single lab, quiz, project, and reading into my calendar. This is easily half the battle to doing well in every class I’ve ever taken. Then, each week I do the following:
- Read the assignment descriptions so I can start figuring out solutions when I’m waiting in line at the store, sitting in traffic, etc.
- Read the assigned text and copy potentially useful code snippets into SnippetsLab
- Read the text again, this time skimming parts I feel like I can skip but also taking handwritten notes on the parts I might want to refer back to
- Program the assignment and check out Piazza if I need help
- If there’s a quiz, take it
- If I have free time at the end of the week, watch the lectures and try to answer questions on Piazza. For the record, I only watched about a third of the lectures because I didn’t find them very helpful. However, reading the slides was helpful for getting an idea of what would be covered on the tests.
This probably seems like a lot, but whenever I skipped these steps it ended up taking more time in the long run because I’d struggle unnecessarily or end up having to reread the chapter.
I would guess that I spent about 15 hours each week on this course. I found the material a little more difficult than 161, mostly because 161 was a review of a lot of things I’d already learned in other programming languages.
If I were leading this course, this is what I would do differently:
- Scrap discussions on Canvas. It’s obvious that people are just posting there because they have to. Instead, reward students for their conversations on Piazza. That’s where all the action is, anyway.
- Provide more opportunities for “above and beyond” work, like implementing an assignment through a GUI library like SFML.
- Write test questions that have clearer answers. Alternatively, provide a free-form response box at the end of the quiz to explain answers, as Tim Alcon did for 161.