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 best classes for my electives in case it isn't part of my curriculum. If my school does not provide these courses, I would still make sure I am learning after college.
Bonus
Random Rant:
I can't wait to finish school so I can really start learning what I want to learn. I hate college and it really kills my motivation. I'm motivated to finish soon so I can have freetime to focus on gaining an actual skill. I feel depressed because college shouldn't be a piece of paper to help me get through the H.R filter but a place where I know I am getting the best of the best in a education in technology. It's sadly not living up to my expectations.
I feel like I am my own teacher and a student because non of my teachers taught me anything. Heck one of my teachers barely spoke english and had a super strong accent and I had no idea what he said all semester. most of my teachers just give me an assignment and I get it done and thats pretty much all they do for me.Sorry for the long rant I just needed to vent and was hoping at least someone out there knows what I am talking about.
Top comments (7)
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:
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.
C / C++
Discrete Math
Data Structures
Algorithms
Computer Architecture
Network Programming
Operating Systems
Image Processing
Compilers
Co-op / Internship in the field
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.)
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.