2016 12 5 21 50 0 ethics

Computer Science Education

I think the ACM guidelines for a computer science program are pretty on point. There's some hefty talk about programming languages, a great amount of mathematics, and just enough idealism to keep the spark alive. What satisfies me the most is the distinction between core knowledge areas and single courses.

It is naturally tempting to associate each Knowledge Area with a course. We
explicitly discourage this practice in general, even though many curricula
will have some courses containing material from only one Knowledge Area or,
conversely, all the material from one Knowledge Area in one course.

This isn't a unique thought, but oftentimes I feel like some courses at Notre Dame strictly cover the material required for that area. As a result, those disparate courses do not mesh well with the others, and they create riffs throughout an otherwise seamless education. For me, it would have been more beneficial to see how the material in my courses intertwined as I was taking the courses, rather than after the fact. Now, as I have had a chance to go back and TA for the courses I enjoyed, I can see both the miniscule and dramatic ways different courses relate. There are people who complain about Logic Design, but they don't see how the material relates to Discrete Math or Theory of Computing. There are people who complain about Computer Architecture but don't see the connection to Operating Systems. And the worst type of people are the ones who complain about Theory of Computing, but don't realize how embedded that material is inside all their courses, and how it creates the foundation for what we know as computing. I think if our courses didn't shy away from relating to one another, I think our computer science education would just be one big 'Aha!' moment, where everything fits together and makes beautiful sense. I think a side effect may even be less complaints... LOL who are we kidding

As for the mathematics....

There is a deep and beautiful connection between mathematics and many areas
of computer science.

I think Notre Dame could give more opportunities to explore mathematics. I think Notre Dame does a good job for the computational-sciences-type CS majors, but I think there is a discrepancy for the real-analysis-type CS majors, the ones who want to study algorithms or complex networks or a different theoretical field.

On to the most important part (cough my favorite part): programming languages. I do not think Notre Dame spends enough time on teaching students the dramatic influence a programming language has on your work, being the single most important tool or weapon a programmer has to do their job. I think languages are taken for granted. A favorite, or easiest, is chosen and the rest are pushed aside. (I am also guilty of doing this.... #pythonista). But a wrong choice in programming language can vastly alter the complexity of your program and the ease of your programming, which can make or break you as a programmer. Knowing one language is not good enough. I think the idea behind our Programming Paradigms course is good, but I think the execution has been bad. Most of what we learned from the class is how to use PyGame. I don't even think many people remember what functional programming is! I think the real testament to being a good decision maker with excellent design thinking, is being able to harness your tools in the most effective way possible. We missed that. And on top of it all, our Compilers and Language Design course has such a reputation for being difficult that not nearly as many students take it as there should be. This is a problem.

But our courses do not completely define our education, as weird as it may sound. I am a huge proponent of the philosophy that your education, no matter what school you attend, is as deep and meaningful as you make it. Sure, our courses give us a foundation, but you can skate through most of them without retaining a single idea. On the flip side, you can go through them soaking up every last bit of knowledge that you allow yourself, morphing your education into what you want it to be. Yeah, I complain about not having a Distributed Systems course or a Programming Languages course, but I do not need them to gain knowledge about those subjects. Hell yeah it would be nice to have them, but they don't define me. What does define me is how I build off the information and opportunity given to me, and this type of motivation is something that a few people in our major lack. This is also a problem.

Sources

ACM

There is a deep and beautiful connection between mathematics and many areas
of computer science.

It is naturally tempting to associate each Knowledge Area with a course. We
explicitly discourage this practice in general, even though many curricula
will have some courses containing material from only one Knowledge Area or,
conversely, all the material from one Knowledge Area in one course.

Matt Might

Programming languages rise and fall with the solar cycle.

A programmer's career should not.

While it is important to teach languages relevant to employers, it is
equally important that students learn how to teach themselves new
languages.

The best way to learn how to learn progamming languages is to learn
multiple programming languages and programming paradigms.

The difficulty of learning the nth language is half the difficulty of the
(n-1)th.

Yet, to truly understand programming languages, one must implement one.
Ideally, every computer science major would take a compilers class. At a
minimum, every computer science major should implement an interpreter.