Most important and useful CS courses?

<p>Simple question. What are the best upper-level Computer Science courses a person should take? Let's say this person would like to go into Software Engineering/Development, but really doesn't care about specialization too much. </p>

<p>Here are the classes required for a CS degree at my school (Umich): </p>

<ul>
<li>EECS 203: Discrete Structures</li>
<li>EECS 280: Programming & Data Structures</li>
<li>EECS 281: Data Structures & Algorithms</li>
<li>EECS 370: Computational Organization</li>
<li>EECS 376: Foundations of Computer Science</li>
<li>Bunch of math classes</li>
</ul>

<p>Here are some of the Upper level elective classes (we have to take 5):</p>

<ul>
<li>EECS 373: Design of Microprocessor Based Systems</li>
<li>EECS 381: Object-Oriented and Advanced Programming</li>
<li>EECS 427: VLSI Design I</li>
<li>EECS 442: Computer Vision</li>
<li><p>EECS 470: Computer Architecture</p></li>
<li><p>EECS 475: Introduction to Cryptography</p></li>
<li><p>EECS 477: Introduction to Algorithms</p></li>
<li><p>EECS 478: Logic Circuit Synthesis and Optimization</p></li>
<li><p>EECS 480: Logic and Formal Verification</p></li>
<li><p>EECS 481: Software Engineering</p></li>
<li><p>EECS 482: Introduction to Operating Systems</p></li>
<li><p>EECS 483: Compiler Construction</p></li>
<li><p>EECS 484: Database Management Systems</p></li>
<li><p>EECS 485: Web Database and Information Systems</p></li>
<li><p>EECS 487: Interactive Computer Graphics</p></li>
<li><p>EECS 489: Computer Networks</p></li>
<li><p>EECS 490: Programming Languages</p></li>
<li><p>EECS 492: Introduction to Artificial Intelligence</p></li>
<li><p>EECS 493: User Interface Development</p></li>
<li><p>EECS 494: Computer Game Design and Development</p></li>
</ul>

<p>Pay no attention to the grouping. I grouped them purely based on the fact that it looked nicer grouped rather than one long list.</p>

<p>I was thinking about taking the following five courses:</p>

<ul>
<li>EECS 381: Object-Oriented and Advanced Programming</li>
<li>EECS 481: Software Engineering</li>
<li>EECS 482: Introduction to Operating Systems</li>
<li>EECS 484: Database Management Systems</li>
<li>EECS 477: Introduction to Algorithms</li>
</ul>

<p>What do you think? I picked these five because 381 & 481 seemed like valuable courses for someone going into software Engineering, obviously. I picked Algorithms because I hear it's the backbone of any Computer Scientist. And Databases and Operating Systems...I dunno, they just sound useful.</p>

<p>So what do you think? Which classes would (A) be the most helpful at getting a certain job, and (B) proving useful after getting the job? Courses outside of this list would be helpful too. I have heard some people encouraging certain math classes like combinatorics and graph theory, which sound fairly interesting.</p>

<p>Keep in mind I'm years away from actually making this decision, so your input now would likely be forgotten when it's relevant. BUT I like talking about this stuff. I like planning things out and seeing how components add up, even if I know I'll change my plan completely in the future. It's a hobby of mine; I simply enjoy discussing the details of things like this.</p>

<p>All facts, data, information anecdotes, and first-hand experiences welcomed. Even unjustified opinions are welcomed... I enjoy talking about this stuff as it helps pass the time.</p>

<p>I’m gonna be in 477 next semester. Make sure when you take it, it’s not professor Shi (he taught last semester and apparently it was awful). Next semester is professor Compton who I’ve had before and is great, so it would be a good time to take it.</p>

<p>2nd half of 484 is really boring and not particularly useful IMO. You should definitely know how databases work at a high level and know how to interface with them, but I don’t think the entirety of the class was particularly useful. </p>

<p>I’m not particularly interested so I’m not taking 482, but almost everyone does so you probably should as well. 381 has an insane workload so make sure you prepare for that. I didn’t take 481 but it’s probably fine as a senior design.</p>

<p>Also, if you change your plans up, make sure they don’t include 480 as I don’t think it’s going to be offered again. I don’t think it’s been offered for the past 3 years.</p>

<p>In industry software jobs, every program interacts with the operating system (482) and needs to do things efficiently (477), and most large programs (481) manage data (484), and deal with networks (489). Security is also an important topic (475 covers a portion of it).</p>

<p>A lot of higher level courses seem really specific topic wise. The lower leveled courses usually will give you a glimpse of the upper courses, so your plans may change depending on what you end up liking. Personally as a freshman I started wanting to do game design, but for a course project I had to make a game and surprisingly found it quite boring. However I took discrete maths and saw applications of crypto and a more generalized software engineering course and I really clicked more in those subjects.</p>

<p>You’ll also likely need data structures, algorithms in addition to other courses for interview questions. (Theyre also required at most schools anyways)</p>

<p>Most software jobs will focus on 3 major areas:</p>

<ol>
<li>The manipulation of data</li>
<li>The distribution of data</li>
<li>The storage and retrieval of data</li>
</ol>

<p>Think of “manipulation of data” as programming including usage of correct data structures and algorithms.</p>

<p>Think of “distribution of data” as computer networks including data security</p>

<p>Think of “storage and retrieval of data” as databases.</p>

<p>Also add in that any programming environment, network and database must function over a operating system.</p>

<p>…and you have your most needed CS electives:</p>

<p>Algorithms
Data Structures
Operating Systems
Computer Networks
Database Systems</p>

<p>Notice 3 of the courses are from the 4 core CS courses (Organization of Programming Languages is the 4th). Other CS (and Math) electives that support the above courses are:</p>

<p>Cryptology (may be offered by CS or Math depts or both depts jointly)
Number Theory (math course that gives good prep for Crypto course)
Analysis of Algorithms (a junior/senior course that goes deeper into algorithms)</p>

<p>I actually took 475, and in the end, I don’t feel like I really learned much. I don’t recommend it.</p>

<p>@ Vladenschlutte</p>

<p>Yes, I have heard that 381 was a lot of work. So much that 90% of Umich survey respondents rated it a 4 in workload, on a scale of 1-4. Because of this, I would probably decide to take this course without any other concurrent courses.</p>

<p>But I wonder if it would be better to take two courses (Computer Networks & Interface development, perhaps) as opposed to just Advanced Programming. Would an Object-Oriented & Advanced Programming classes be that valuable?</p>

<p>@Global Traveler</p>

<p>Thanks for the info. Interesting you bring up Number Theory and Analysis of Algorithms since I was considering taking those classes. But I was wondering, would Analysis of Algorithms (the math class) be very similar to Intro to Algorithms (the EECS class)?</p>

<p>

</p>

<p>Since your EECS 477 is at the 400-level, and I was referring to a more advanced algorithms course, I would say that those two courses are very similar. The only possible difference (and it will only be slight) is that an algorithms course offered by the math department only (not joint with CS) may have slightly less programming assignments and maybe a bit more theory.</p>

<p>…but the difference would be very small.</p>

<p>I’d probably recommend the “Programming Languages” course over Database/Operating System courses. Like algorithms, it’s more fundamental and - in my opinion - may prove more useful for writing software.</p>

<p>My “dream team” of 5 would probably be:
Object-Oriented and Advanced Programming
Introduction to Algorithms
Software Engineering
Computer Networks
Programming Languages</p>

<p>But the choice between network/database/OS is largely up to preference.</p>

<p>

</p>

<p>From what people said last semester, 477 was very theoretical with no programming. The professor next semester is a theory professor but he seems to like to give one programming assignment in his classes. </p>

<p>There is a different “Intro to Algorithms” course offered by the Math department, but I’m not sure how they differ. </p>

<p>I’ll reiterate, almost everyone here in CS takes OS. Everyone I’ve talked to has said it’s very important to take it, and that while it’s not technically required, it’s sort of “psuedo” required. So if you want to go into Software Engineering, I’d very strongly recommend you take it.</p>

<p>Algorithms and data structures.</p>

<p>When I was an undergrad in the 1980s, most people were required to take some type of computer architecture class. Perhaps that’s covered in your 370 or 376 classes. If not, consider taking 470.</p>

<p>

</p>

<p>It may depend on whether other CS courses gave the student exposure to the various concepts in such a course. In some cases, the same concepts may be learned piecemeal in several other CS courses that use various programming languages.</p>

<p>[EECS</a> 490: Programming Languages](<a href=“http://web.eecs.umich.edu/~bchandra/courses/eecs490/]EECS”>EECS 490: Programming Languages (Fall 2006)) describes Michigan’s EECS 490.</p>

<p>If I was you I would take </p>

<ul>
<li>EECS 470: Computer Architecture</li>
<li>EECS 477: Introduction to Algorithms</li>
<li>EECS 482: Introduction to Operating Systems</li>
<li>EECS 484: Database Management Systems</li>
<li>EECS 489: Computer Networks</li>
</ul>

<p>Why does your school requires so little CS classes? I have to take 20-25 classes in my school. Also the database system class is very important in the real world. Make sure you take it and learn all the material deeply. If you work on a big software project, the first and most important step is designing and creating the database in my opinion. Computer Architecture is very interesting but you won’t use it much unless you go to embedded dev.</p>

<p>Not sure why. Their program can be seen in further detail here if interested:</p>

<p><a href=“Electrical Engineering and Computer Science at the University of Michigan”>Electrical Engineering and Computer Science at the University of Michigan;

<p>Anyone have any input on the Object-oriented and Advanced Programming class? I am beginning to wonder how useful an “Advanced Programming” class would be*. Wouldn’t I already be doing extensive programming in my other classes?</p>

<p>*AKA: I’m afraid of the large workload and searching for excuses.</p>

<p>@ Yagottabelieve:</p>

<p>Yes, I do believe 370 covers some Computer Architecture. I remember reading a page on Umich that said this. It even called it Intro to Computer Architecture a few times, and it didn’t appear to be a typo</p>

<p>At the moment, I’m considering the following six (2 per semester my last three semesters):</p>

<ul>
<li>EECS 477: Introduction to Algorithms</li>
<li>EECS 481: Software Engineering</li>
<li>EECS 482: Introduction to Operating Systems</li>
<li>EECS 484: Database Management Systems</li>
<li>EECS 489: Computer Networks</li>
<li>EECS 493: User Interface Development</li>
</ul>

<p>I was already considering substituting Advanced Programming with two other courses, since it’s workload is so high. I already had Computer Networks in the back of my mind, so the encouragement here has pushed me over the hump. I would combine it with User Interface Design since that was encouraged on Umich page for Software Engineering (either UID, or Programming Languages, probably). </p>

<p>I was also interested in Artificial Intelligence, but I’m not sure how practical such a class would be. Do many Software Engineering/Development jobs deal with Artificial Intelligence?</p>

<p>Not sure about the software engineering class… Of course when you go out in real life some Facebook youngster may throw a fit if you don’t have the proper software engineering (cough) exposure… </p>

<p>Definitely computer architecture, esp if taught on modern hardware (let’s hear it for the ILLIAC V once again!). Database systems, sure, networks, meh, it’s likely to be too theoretical “I’ll see your topology and raise you two nodes” to be useful. I’d add a class on serious systems programming (maybe part of Operating Systems) and one on the ‘creative’ aspects of CS, be it game design, graphics, and the like. </p>

<p>If the software (cough) engineering class or OOP course covers things like design patterns or uses useful and cool tools and technologies (like DOORS or ReqPro for requirements capture and the like), maybe. </p>

<p>Today I was working on the gadget to cloud connector software. All standard Linux socket calls, virtually identical to what I did 30 years ago on BSD Unix. Scary.</p>

<p>Why Computer Architecture? I always thought that was more for hardware?</p>

<p>And why are you coughing at Software Engineering?</p>

<p>For my senior design project course, I can pick from one of the following classes:</p>

<p>EECS 470: Computer Architecture
EECS 481: Software Engineering
EECS 494: Computer Game Design and Development
EECS 441: Mobile App Development for Entrepreneurs</p>

<p>Architecture seems more for hardware people, and neither Game Design nor App Development interests me. What’s wrong with Software Engineering? Is it not useful.</p>

<p>In today’s computer environments, one needs to at least be aware of what the underlying architecture is, and, if we’re talking about good efficient code, even what the compiler and runtime is doing to take advantage of said architecture. Those who do NOT take such things into consideration end up writing little utility programs for Windows that are a few hundred lines long (say, run once a day and check if there’s an update) and end up taking several megabytes of memory…</p>

<p>This is especially true writing mobile apps, or code that runs in less than stellar platforms (embedded) but in general it is hard to ignore the fact that the code runs in someone’s hardware. And the more you understand about the hardware the better the code can be. </p>

<p>Now extend the term ‘architecture’ a bit and see how your code runs in the whole ecospace. I’m now sending stuff to the cloud over the cellular network, someone who thinks abstract could likely care less about the cost of sending data to the cloud, we have to be aware of how much we send because our customer is paying.</p>

<p>My definition of software engineering comes from the old times, where Edsger Dijkstra himself was quoted as saying that software engineering has accepted as its charter "How to program if you cannot.". In other words, no amount of engineering can teach someone who should have been an accounting major how to write code. The whole idea of ‘writing code’ or ‘programming’ is anathema to many schools that teach all the hoity-toity methodologies and so on. But at the end of the day, the code has to be written, and so on. </p>

<p>Some software engineering programs that teach methodology, requirements gathering, and the like, are useful. If they use modern tools to do so, even better. But at the end of the day someone has to write the code. Software engineering is often taken to mean that just like 10 structural engineers will come up with very similar calculations for a bridge, or 10 mechanical engineers will design the same gear, that 10 software engineers will design the same or close to it system for the same requirements. Not in my lifetime.</p>

<p>

Computer scientists make good software engineers. People who focus on software engineering don’t make good software engineers.</p>

<p>

Who cares? Does every class you take have to help you get a job? Also, ever heard of data analysis or machine learning? Have you heard of Google, Facebook, or other big companies who work with large amounts of data? They use AI. In fact, Google does a lot of funding for AI.</p>