What is top 5 most valuable courses in a CS Degree?

Reynaldo Veras on September 19, 2018

Greetings Everyone! Once again I am overwhelmed with a ton of noob questions. I am pursuing a CS degree and I want to make sure I am taking the b... [Read Full]
markdown guide
 

I feel for you regarding all the busywork and apathetic attitude on the part of professors/instructors. If you push yourself and surround yourself with friends who are also passionate about the subject, I think you can still learn a lot in college - both from the courses, and perhaps more importantly, on your own and with your friends. Here are the courses I would recommend not missing out on:

Core:

Optional:

  • Introduction to Logic and Reasoning: Not formal logic, but rather the course that focuses on understanding logical fallacies and arguments - sometimes it's a philosophy class. I think being able to understand correct and fallacious thinking and also to appreciate rhetorical devices that are psychologically convincing but logically wrong is super useful in many aspects of life. I wish everyone had to take this type of course in school. It would hopefully make people much more aware of when they are being fooled or manipulated.
  • Human Computer Interaction: Most of the above core topics are very technical, and they will put you in the mindframe of solving problems from an engineering perspective. I think a quality course in HCI and Human Factors is very helpful to correct a bit for that; so that you always remember that ultimately software is for people; and that concept should be included at the very core of any design, no matter how complex and technical the implementation might be.
  • History of Computing: This is obviously not of huge practical importance, but I find the history of computing very interesting. If there's a course like this at your school, and you have room for it, I think it could be refreshing to look at computing from this kind of perspective. You'd learn about ancient computing devices, like for keeping track of time or looking at the stars; things like slide rules; Charles Babbage and Ada Lovelace and the first designs of truly universal computers; early architectures of both analog and digital computers from, say, the 1920s to the 1950s; and so on. I think that could be nice palate cleanser if you're taking a lot of really hard technical courses.

Textbook links are just possibilities for anyone reading this who may want to study these topics on their own. For autodidacts, I have found that researching such topics online can be very helpful also.

I think these would form the core of a solid foundation that allows you have a lot of flexibility in what you end up doing in the future - whether that means doing a masters/phd or entering the workforce. I've omitted formal logic and computability. I don't think this is as important unless you're really interested in theory. If you're specifically interested though, certainly go for it! If you're interested in an in-depth study of compilers, taking a compilers class or looking into the famous compilers dragon book could be a good idea.

Probably at least some of these courses are required, but I thought I'd list the things I consider to be the most important. If I started my own CS Program, I would just cover these subjects in depth, and then assume that was enough for people to cover whatever else they were interested in on their own :)

Good luck!

 

The classes that lent themselves most to what I do everyday now are:

1) Graphics programming - I don't do graphic programming or game development, but it did teach me the best overall picture of real-world software development. How do you take some abstract idea (drawing a 2D or 3D scene), break it down into smaller, easier to solve problems (lighting, shading, drawing different types of objects, reading graphics models from a file), and then assemble them into a larger working whole.
2) A capstone project - Universities don't typically teach students modern development frameworks or technologies, as it is simply too hard for professors to stay up-to-date with this rapidly evolving landscape, and ultimately universities want you to come back to their graduate programs, not to the working world. At least mine did that. But I digress.... That being said, capstone courses are some of the only classes that even attempt to get you working with real-world, modern technologies, rather than trying to re-implement them yourself. This is really important, because it will teach you how to search documentation and learn to work within constraints. It also helps you learn that you don't need to know everything every aspect of a technology in order to successfully use it.

The classes that I wish I could go back and learn better, now that I've been developing professionally for several years:

1) Systems Programming - While I don't do any systems-level programming, I do work a lot in Java and Android, where many of these systems-programming terms are common. I vaguely understand IPC, networking, threading, filesystems, and memory optimization, enough to get by, but certainly not well enough to actually do any of those things well. Having a better understanding of what the OS is actually doing would make me much more confident approaching tasks involving these.
2) Databases - A capstone project of mine involved building a small database engine, but I never took a full course on it. I really wish I knew more about how databases worked, so that I could do things like understand how to speed up slow queries, know how to properly set indexes, and structure the tables efficiently. Nearly every project you work on will have some kind of database in it, so you should probably know enough about them to be comfortable setting one up.

 

If you want to become a Computer Scientist, you should consider courses that provide a well-rounded exposure to various aspects of Computer Science.

  1. C / C++

  2. Discrete Math

  3. Data Structures

  4. Algorithms

  5. Computer Architecture

  6. Network Programming

  7. Operating Systems

  8. Image Processing

  9. Compilers

  10. Co-op / Internship in the field

 

For me, it would be the following concepts, preferably in order:

  1. The obvious "intro to programming" course in whatever language - Basically the very basics of how code works, control flow, etc

  2. Introduction to object-oriented programming - Would most likely be taught in Java - Wouldn't get into design patterns, but would introduce the basics of how classes work in a naive approach (i.e. "Dog and Cat extend Animal")

  3. Introduction to functional programming - Would probably be best taught in something like Javascript due to its support of functional programming while still being familiar to someone who's used Java/C - Would introduce the concepts of functions as first-class datatypes and what you can do with them

  4. Data structures and introduction to algorithm analysis/efficiency - Could probably just go back to Java for this - Would solidify the idea of interface vs implementation, and how to analyze/improve basic algorithms in data structures (find, insert, delete, sort, etc)

  5. Design patterns - Could also be done in Java - Basically the big "You know the concepts, now here's how to do it right in large codebases"

At that point you have a really strong core that will give you a baseline to learn everything else you'd need. Further concepts could include:

  • Web dev (JS and appropriate frameworks)

  • Low-level dev (C)

  • Databases (More of a theory course, but labs could be done in Python/JS for library availability)

  • Testing/QA (Java/C#)

 

Let me just throw in one: Models of Computation - state machines, automata theory, context-free grammars etc. These are pretty much the foundation of computer science, leading on to things like parsers and compiler design. It's so nerdy, but surprisingly useful when you write your own stateful code, file loaders, and more.

 

Literature with a critical bent, something in the studio arts, library skills, an introductory/survey psych or sociology course, and discrete math. I'm serious.

 

I agree with this wholeheartedly! I took a bunch of East Asian history courses (enough to get a minor in it) in my undergrad and they were among the most important courses that I've ever taken with respect to my understanding of the world.

I think that it's important for developers to be human beings first and programmers second.

 

A lot of this is going to boil down to what exactly you want to do in your career, but I'll try to be as general as possible.

  1. Algorithms and/or Discrete Mathematics
    • The math of logic. This type of course teaches theory behind common tasks in programming including graph theory and set theory
    • You will probably be required to take one or both of these kinds of courses
  2. Object Oriented Programming
    • OOP concepts can be tough to pick up on, but they are incredibly important to most modern languages in common use
    • You probably already took this, or will soon as it's required for many degrees
  3. Operating systems or compilers
    • These are pretty low level classes, but will help in fundamental understanding of how programming and computers work
  4. Anything that teaches Linux
    • Linux is the most widely used operating system in the world, you will most likely be expected to use it at some point
    • A basic understanding of command line/BASH is very important to many kinds of programming, especially web programming
  5. Software Testing
    • I'm not actually sure if this would be available as a class, but code testing is one of the things I wish I had learned in college. If there's a class on testing code, take it

This is from my experience, others may recommend other classes. My experience is also a little different, so take my suggestions with a grain of salt 🙂

 

I never got a degree - my life just took a different path - although I did attend college. (I did three full-time semesters, with an unbroken 4.0 GPA, before I left to focus on business pursuits instead of racking up more debt.) I took calculus, CS, psychology, and a slew of other courses.

My own experience aside, I've had the privilege to work directly with CS professors at major local universities, and to be an instrumental part of the career growth of many CS students and graduates through my company's internship program. Therefore, I'm no stranger to the CS degree, albeit via a different means than most.

I would say that, adding to many of the fantastic suggestions here, communication classes are by and away the most important courses you can ever take in college. When I was attending college, I took Public Speaking, Interpersonal Communication, Intercultural Communication, and Non-Verbal Communication. I have used what I learned in these four courses every single day since, and they've done more for my programming career than even the math and programming courses I took.

So, while I definitely echo the recommendations to take copious classes in math, CS theory, and various technologies - these are undoubtedly critical - make time to take any and all communication classes you can! (Bonus, they count towards your required elective humanities at most colleges.)

code of conduct - report abuse