6 January 2018
In December 2017 I graduated from BYU with a CS degree. I had a good education, but I've thought a lot about how to make things better.
Summary: students don't have enough time to work on personal projects, and there isn't enough peer-to-peer interaction. We can solve both these problems by allowing them to either 1) get more credit for personal projects or 2) work on personal projects as a part-time job, and by facilitating collaboration on these projects.
My education has benefited greatly from three separate areas: classes, jobs and personal projects. Unfortunately, it was difficult to find time to work on my own projects. These projects are beneficial for several reasons.
First, you choose what to build, so you can learn about things that interest you. That helps build enduring motivation. Furthermore, you aren't restricted to what the curriculum offers. For example, the current curriculum emphasizes object-oriented programming, but there's almost no mention of functional programming. I learned functional programming by using Clojure in my personal projects.
Second, because personal projects aren't so deadline-driven, you can afford to spend time learning in an exploratory style instead of just trying to complete the requirements as quickly as possible (as opposed to class projects which often result in ugly code). You can take time to learn the best, most elegant way to do things.
Finally, personal projects potentially have real users. You can practice identifying users' needs, coming up with a possible solution, getting feedback and revising the solution. You can find out how hard getting users is but how gratifying it is to build something that improves their lives. This is a powerful experience.
But between a full load of classes and a part-time job, there's not much free time left over for personal projects.
Networking with other students is also critical. As a would-be startup founder, I need to build relationships with potential cofounders. But regardless of specific life goals, everyone needs to know other capable students. This results in better opportunities to work on important things together later on. However, I hardly knew any of the other CS students. The core curriculum doesn't foster much student interaction. There are extra-curricular activities like clubs and hackathons, but I rarely had time for those things.
The general solution to this problem is to help students carve out time for personal projects and to facilitate collaboration on those projects (there's no better way to know someone else than to work with them).
For students to have time for personal projects, the projects need to replace either some classes or a part-time job. (Replacing a social life would be another option if any CS students had one). There are two possibilities:
Give students credit for personal projects. For example, a student could be allowed to get up to 3 credits per semester for these projects. This option obviously would have to be implemented by the CS department.
Pay students to work on personal projects. Instead of having a normal part-time job, they could be sponsored by a company to work on their project outside of classes. This could be a valuable recruiting opportunity for companies. Summer internships already provide industry experience for students, so students wouldn't be missing out by not having a regular part-time job.
To facilitate collaboration, students need a way to freely share ideas about projects and form teams. One possibility is a Slack workspace dedicated to personal projects. Each project has its own channel which is used for progress updates and other communication about the project. Students can browse current projects, and they can join one or make their own.
Students can already get some credit for personal projects by taking various upper-level classes (CS 497R and 498R, and possibly 494 and 495), but you can't take more than two semesters of them. I took two semesters of 497R and it was a great experience. A good strategy for the CS department could be pushing more students to take classes like these and gradually allowing students to take them for more semesters.
I recommend that the department create a Slack workspace like the one mentioned above and advertise it in their department emails. It would be a place where students could form teams and then apply for 497R and 498R projects together. If results are good, the department then can work on setting up a better system for these projects so there isn't a large burden put on faculty mentors. Then the department could start increasing the number of semesters that students can do these projects for, and they could start pushing younger students to participate.
For companies, I recommend taking advantage of CS 494 and 495, the capstone courses. But instead of giving students a project to work on, let them submit applications to work on their own projects. Help students form teams and choose the best projects for them to work on. This would help the company identify and attract full-time job candidates, and the students that do join full-time will be able to give better referrals. If things go well, the system could be scaled up by paying students to do the same things as a part-time job.