Suggestions for the BYU CS department
A few weeks ago I graduated from BYU with a CS degree. During my senior exit interview with the department, they asked what we would do to improve the program. This essay explains my thoughts on that topic.
Summary: students don’t have enough time to work on important personal projects, and there isn’t enough peer-to-peer interaction. We can solve both these problems by allowing students to get more credit for personal projects while facilitating collaboration on these projects.
It was difficult to find time to work on my own projects. Class learning is alright, but personal projects have other benefits.
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 minimum requirements as quickly as possible. After you get something working in a personal project, you can then revise it so it’s also elegant. But in a class, it doesn’t matter how gross the code is as long as it works. Even if you had time to revise it, why would you? You likely won’t touch it after you turn it in, and you may not be interested in the project anyway. It’s important to learn the best way to do something (not just the first way you think of), and classes aren’t conducive to practicing that.
Third, personal projects can 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 it is to get users but how gratifying it is to build something that improves their lives. This is a powerful experience that you just won’t find in typical classes.
Finally, having substantial personal projects is helpful in getting a good job. They’re a good indicator of if you can handle all the aspects of solving a real-world problem.
Classes provide valuable experiences, but a combination of classes and personal projects is better. Unfortunately, it’s hard to do that when you’re taking 15 credits (on top of a part-time job).
My main career goal is to be a startup founder, so I need to find potential cofounders. However, I hardly know any of the other CS majors. Many fellow students whom I’ve talked to agreed that the CS student body isn’t well connected.
There are some extra-curriculur activities which have potential to facilitate student interaction (e.g. clubs, hackathons, coding competitions), but I rarely had time for any of those things. Unfortunately, the CS curriculum on its own doesn’t foster much interaction.
Networking obviously has benefits for everyone, not just startup founders. For example, it’s hard to land a job at top companies like Google unless a current employee can give you a good recommendation. The lack of connection likely results in missed opportunities for lots of students.
We can solve both these problems by allowing students to get more credit for personal projects while facilitating collaboration on these projects.
Students can already get some credit for personal projects by taking CS 497R. I did that and it was a great experience. But there are a couple limitations:
- You can only take 497R for two semesters.
- Projects must fit in the category of research. 
It just so happened that my project (an improved algorithm for music recommendation) worked well as a research project, but many projects don’t. The next phase in my music recommendation project involves building a cross-platform mobile music app from scratch to house the algorithm. This isn’t research. Even if I could’ve used 497R to work on that phase, I already spent my two semesters on the algorithm.
My suggestion is to allow interested students to get up to, say, 18 credits for personal projects (i.e. 3 credits per semester for three years). In addition, information about students’ projects should be easily accessible to other students. If students want to, they could collaborate on a project. This would be a great way to have meaningful interaction with other students—there’s no better way to get to know another coder than by working with them on a project you both care about.
The first big question is what to take out of the CS program to make room for 12 more credits of personal projects. I think some good candidates are CS 224, CS 252 and PHSCS 121. The remaining credits could be covered by electives. This would be opt-in; students would take the regular classes by default unless they requested to work on personal projects instead.
Next, how do you make sure students don’t use the extra flexibility to slack off? To some extent, I don’t think you can. Giving people more freedom to make good choices necessarily allows them to make bad choices. I think the right solution for this problem is to not worry about it too much. CS 497R already has some structure in place to make sure students aren’t being set up for failure. More restrictions could be added as long as they don’t compromise the freedom and flexibility that personal projects are supposed to provide.
Also, CS 497R requires a faculty mentor, and it would be difficult for faculty to mentor so many projects. Changes would need to be made to accomodate the load. Instead of providing mentorship, the faculty could focus just on helping students to be accountable. For example, students should be keeping a log of time spent, writing progress reports, etc. TAs can assist here. As needed, the department could facilitate peer mentorship using other students (this would be another venue for meaningful student interaction).
All this would need to be reasonably publicized since it won’t do much good if none of the students know about it.
I’ve received enthusiastic feedback about this essay from other BYU CS grads who have experience in grad school, industry and startups. The benefits of making these changes would be substantial. The changes also wouldn’t be hard to make. The department has already made great progress by allowing 497R to be taken for two semesters. We can start out just by gradually increasing the number of credits that can be spent on personal projects.
 CS 498R (section 1, undergrad special projects) seems to allow students to work on a non-research project, but I didn’t take that course so I don’t know how close the experience is to 497R. Also, it can only be taken for one semester.
Got feedback? firstname.lastname@example.org