Notes on teaching Computer Science
After speaking at a panel, I was asked by a lecturer at USYD to share my thoughts on how computer science could be better taught at the university.
I’m studying electrical engineering with a major in computer engineering and neuroscience at the University of Sydney. I’m a subject away from completing my neuroscience degree and I’ve completed about 60% of my engineering degree, with the remaining subjects being electives in computer engineering. I’ve deferred the past 3 semesters (have deferred a total of 4 semesters) and with the way Streamplate has been progressing, I’ll probably drop out to focus on work. I can always return to university and my back-up plan if Streamplate does fail, has always been to pursue neuro-trauma surgery so I do recognise a fundamental role in tertiary education.
I think the quality of teaching for software engineering/computer science at USYD is summarised in the latest academic results within the engineering department.
I note that all the engineering streams are rightly separated from one another — except for “Electrical and Software”. I’ve only done three software subjects in computer engineering and I think this major is the strongest bridge between both fields, so to merge electrical and software into one is beyond nonsensical. I think the motivation to merge these results is unfortunately sinister. Specifically, I suspect these streams were merged to cover the poor academic results of what I estimate to be the electrical stream. This was merged with the software stream to raise the average.
I also suspect that the number of software students is quite large by comparison to electrical and so this is even more imbalanced and that in isolation, software would also suggest poor-performing results by comparison to other subjects. This is speculation, but from past experiences speaking to other students — I tend to only hear negative reviews about most software subjects with exceptions coming from students that reach high-distinction results.
Additionally, from experience working with software engineers from both USYD, UNSW and UTS — I’ve often found UNSW students to generally outperform the rest. I realise my experience is limited in both expectations and number, but if this is true for the larger population of students, then the question needs to be asked why. Even entertaining the possibility of why other universities might be outperforming USYD is worth considering just to unravel new opportunities.
With this in mind, I’ve thought of a few initial ideas that could improve how computer science is taught. The key idea here is to maximise student engagement with the field of computer science. I’ve also taken inspiration from Stanford’s Computer Science course structure, taking note of its diversity. I think this is really important because computer science is a growing space and the best way to support students is to capture this broadness within the university.
- Allow paired-programming for first-year programming. First year programming classes host a spectrum of students and also realistically, are the most popular. Tutors are inundated with requests and those that are unable to understand preliminary concepts exponentially fall behind throughout the semester — eventually dropping out of the course. An incentive for students to pursue this could be that if they pair up with someone, their final grade is the average of the combined scores with their partner. Secondly, it also encourages students to develop relationships with other students while they learn — seen in this article about Jeff Dean and Sanjay Ghemawat at Google. Note, this should be optional.
- Introduce a new subject in first-year — “Computing Concepts” to calibrate students with the field. Why bits? Why Python? Why Visual Studio? What is “cd”? These foundational questions are usually answered early in first-year but they touch on incredibly profound discussions that only later-year students recognise. I think there’s an opportunity to consolidate the appreciation of computing much earlier than is currently designed. I think this subject should be taught by a younger lecturer — someone that can immediately connect with students in a way that’s reminiscent of this YouTube channel, called Computerphile. This subject is to dissuade people that programming is hard. I’ve always thought that such sentiments arise from a lack of understanding.
- Introduce a Kaggle-like, monthly competition across the entire department with cash prizes for top-performing solutions. The idea is to maximise collaboration and engagement with students from different year groups. Arguably, this competition should be open to all USYD students but it’d require appropriate marketing and support to penetrate other departments which may increase budget. This could be tailored to current situations, eg. COVID-19 modelling, USYD timetable scheduler with the top performing result being the fastest etc. It’s important the rewards are cash-prizes — this will resonate strongest with students.
- Introduce subjects tailored to mobile-app and web-app development and cloud computing. Simply teach students how to build the software programs they’re using most. These subjects should be heavily practical, and made even more relevant by asking students to build apps they’re familiar with eg. Facebook, Instagram, Spotify etc.
- Introduce a series of machine-learning based subjects with a heavy practical skills eg. NLP/NLU, CV, recommendation-systems, game-based AI (eg. ATARI, StarCraft II). Diversify and extend the specificity of subjects on offer at USYD. Bring in leading experts from tech companies in Sydney to be the face of them. This is an example of DeepMind’s CTO, David Silver teaching Reinforcement Learning at UCL in 2015.
- Introduce majors for computer science or software engineering tailored to machine learning, cybersecurity, cloud computing, game development and mobile development. The state of computer science is so diverse that it needs to offer students with exact skills rather than general knowledge because the technicality required in some fields is so immense. I think UNSW is the leader here with their impressive range of engineering degrees eg. quantum engineering, bioinformatics engineering and photovoltaics & solar energy engineering.
- Introduce a set of subjects that are more “peripheral” but act as bridges into computer science. — eg. “Automated Stock Trading” (targeted at finance students), “Automated Drug Discovery” (targeted at pharmacology/chemistry students), “Automated Legal Representation” (targeted at law students), and “Automated Driving” (targeted at general engineering students). These are designed to “hook” students into computer science.
- Partner with AWS, GCP or Azure to give each computer science student credits to use their platforms. This is pretty straight forward. Just like how students today are able to benefit from using Microsoft Office or MatLab while at university, students should also be able to use cloud-computing platforms. Realistically, these services will need to be capped and high-usage monitored in order to maintain contracts with these service-providers. Incidentally, most of these platforms offer free credits like GCP with $300, but it requires a bank card to be attached.
- It’s possible that generally speaking, the higher performing a computer scientist/software engineer is — the less performing they’ll be as a teacher. This means integrating or restructuring the teaching staff to include younger teachers, particularly at the beginning of courses. This is not to say that older teachers aren’t necessary. The problem is simply a communication one and it’s imperative to have great teachers be able to translate that great knowledge that some lecturers have. I think back to this CS50 at Harvard and wonder how much of that course’s success lies in the lecturer’s on-stage energy.
- Integrate practical experience from year 1 to maximise open-mindedness. Each year, a student should be required to work in a new industry eg. start-up, banking, research, IT etc.
- Introduce technical competitions across Australia like the uni sporting events. This should be in its nature “fun” and intriguing — eg. white-hat hacking, developing models for challenges like seen in the protein-folding challenge at CASP. I imagine this could be hosted by a different university annually like it is in UniGames.
- Introduce large-scale projects that need to be delivered within a semester. I think great engineers are agnostic with the tools they use — instead it’s their insight that leaps them above the rest. But this is a skill that has to be built up and it arrises by developing resilience, becoming comfortable while in the unknown, actionable intelligence and growing technical foresight. One way this could be developed at USYD is offering students a chance to complete projects such as this, developing a program to self-drive a car in the video game, Grand Theft Auto V.
These are just a few ideas I’ve jotted down today while thinking about the lecturer’s question during my walk today. If you have any suggestions, please let me know.
Thanks for reading,