How students can master Systems Programming
McDonnell stresses the importance of attention to detail. He explains, “one of the ways that the students will succeed in this class is by being a little bit more attentive and more deliberate in writing their algorithms and testing them. They can't really rely so much on the runtime environment to tell them that there's some logical error in their code.”
Alongside this, using the right resources is another key way for students to progress in this field, especially memory. “It's very easy to just say ‘I’ll just throw another gigabyte of memory at this problem.’ But that's not good programming discipline. A deep understanding of memory management and other system issues will undoubtedly help them to become more successful software developers” he notes.
After students complete Kevin’s course, they can take Systems Fundamentals II. This also uses C, but the focus is on Linux APIs, including making system calls, thread synchronization and more, which is even more complicated. Getting students familiar with C is essential to take the next course. Kevin also uses tools like CodeGrade to give students instant feedback “In fact, that's another reason why I like CodeGrade for giving frequent feedback. In the past when this course was entirely in assembly language we would have students make a small mistake and wind up with a zero for the assignment.”
With continuous feedback, Kevin can administer more unit tests to give students more practice opportunities, something that is essential to master programming.
How to engage your students
Kevin employs a variety of strategies to keep his students engaged and motivated. One effective approach is asking questions that challenge their understanding, especially when it comes to a computational problem or a bug in some code. Also, he noticed that students are always interested in discussing assignments in class, which can help address any issues.
Another technique comes from exploring the ‘why’. Why is it important to know how systems are working? Why is this a valuable skill to have? Demonstrating this value to students gives them a sense of purpose to their learning. This can be particularly important for required courses, especially when there is a lot of interest in other areas (there are subjects other than Artificial Intelligence!).
Kevin also creates unique assignments, another great way to capture the attention of students. Authoring assessments gives educators the opportunity to incorporate students’ interests directly into their learning. Including humor goes a long way too!
In introductory courses, Kevin uses peer instruction, which he is looking to bring into his Systems Programming course. Peer instruction is a teaching method where the instructor gives a brief lecture, followed by a question related to the topic. Students first answer the question individually, then discuss their answers with peers. After the discussion, they submit their answers again. This process encourages collaborative learning and deeper understanding.
These approaches not only make the material accessible but also cultivate a deeper appreciation for the intricacies of systems programming.
How can educators prepare for their course?
Kevin gave some great advice for any educators starting their teaching career. “You're constantly working against lots of short-term deadlines, so a high level of organization is really important”, he explained.
If you can master organization, you have more time to engage your students, another area that Kevin suggests educators to keep in mind. Learning a new subject, especially one as different (and frustrating) as programming, can be intimidating. Kevin notes that teachers should “try to be as approachable as you can for the students so that they're encouraged to come to office hours when they need help”.
These insights underscore the importance of creating a supportive learning environment conducive to both academic excellence and professional growth.
Conclusion
Designing an effective systems programming course requires a delicate balance of structured learning objectives, innovative teaching methods, and robust assessment practices. Kevin McDonnell's approach at Stony Brook University exemplifies these principles, offering a comprehensive framework that prepares students for the dynamic challenges of modern computing.