• We’re currently investigating an issue related to the forum theme and styling that is impacting page layout and visual formatting. The problem has been identified, and we are actively working on a resolution. There is no impact to user data or functionality, this is strictly a front-end display issue. We’ll post an update once the fix has been deployed. Thanks for your patience while we get this sorted.

Planning my last year for my CS major

Zeeky Boogy Doog

Platinum Member
Edit: after talking to an advisor, I found I was able to swap the 300 class, updated schedule.

Right now my fall semester is looking like:

= Introduction to Artificial Intelligence
- Parallel Programming
= Introduction to Algorithm Analysis
= 1 credit free elective :roll:


and my spring semester will be:

= a required 300 level class I haven't taken yet
= Principles of Programming Languages
^ required semi-related elective
^ another required semi-related elective



and my backup classes are (all offered only in spring except embedded systems):

? Embedded Systems
? Database Systems
? Intro to Compiler construction
? Computer Architecture

legend:
= keepers
- meh.
^ required, but can change semesters
? eh?

I think the Intro to AI class genuinely sounds interesting, and it uses LISP and PROLOG according to the description, which is good because it's been mostly Java/C++ so far, need to break away from those a little bit.

The PPL class sounds like a good idea, at least rather useful, uses Scheme to write interpreters for C/C++/Java from what I gathered from an old class page.

I figure parallel programming will only become more relevant as the years pass, so that's probably a pretty solid choice. Dropped Embedded Systems from next semester, parallel programming trumps embedded systems in my book (unless someone can absolutely convince me otherwise), and my professor from this semester basically trumps material period, luckily it looks like a good class too.

The Database Systems class I was originally going to pick over the embedded systems class, but I one of my semi-related electives will deal with implementing and managing databases (the database systems class will deal with theory) and I figured one was enough.

So for my question, did you take any of these/similar classes? Did you like them? Have they been useful? Was there one of those you wish you would have taken instead of one you did? If you were signing up for the classes, knowing what you do now, what would you take?
 
I was MIS b/c of some bad choices I made in my earlier college career. I ended up going BA b/c it was easy and changed my mind my senior year and MIS was the only feasible tech route I could do in a year. I had to take 21 hours of MIS specific courses in 2 semesters plus all the other 400 level courses need to go BA-MIS.

I'm a programmer for a large life insurance company. In the perfect world you would have DBA that did all the stuff they say they do in you classbooks. In my world this isn't true. I've had to learn a lot Microsoft SQL Server in my job. Whenever a project starts we create the database and table layout. Our DBA is pretty sharp, but basically monitors the sql servers for locks and blocks.

I had a oracle class in my final semester. I'm not sure what level class it was b/c it's a big blur now 4 years later. This class was very basic and I could have really used some more knowledge with sql and sql management studio.


 
Your choices look fairly good. Intro to AI classes are typically pretty fun -- you end up writing some kind of board game player and learning about common search algorithms. Would recommend a class on parallel algorithms if they actually teach you about design and analysis.

Principles of Programming Languages and Intro to Compiler Construction should go hand-in-hand. In the former you would focus more on type systems and a formal approach to semantics, hopefully. Ideally, a compiler class would be a project-based class and you learn a bit about formal languages, a bit about dataflow analyses, some useful graph algorithms, and management of a reasonably sized body of code. Unfortunately many of these classes turn into "rote learning of how to fill-in LR tables" and other dumb parsing tricks. That can be miserable, and IMO, irrelevant. One sure sign: if you use the "Dragon book" (Aho, Sethi, Ullman) then beware: it is very old and spends almost the entire time focused on parsing techniques because it was written when YACC was the hottest shit around. (sorry for the rant)

It is good that you will learn about programming languages outside the C++/Java mold. There are a lot of very closed-minded programmers out there that you would do well not to imitate, and breaking out of the C++ way of thinking can be very enlightening. The family of Lisp and Scheme languages (not the same) spawned a great deal of others -- basically every "dynamically typed" programming language is a descendant -- and they continued to evolve and are well supported by a community to this day. Presumably, your PPL course will expose you to more ideas too, like properly designed static type systems (hint: C++ ain't one), higher-order functions, and very simple formalisms which are nevertheless very powerful. That course has the most potential to change the way you think about writing programs.

I didn't see any classic Algorithms courses listed. That's probably a requirement (I hope!) and I assume you've already taken that into account.

The last thing you want to do is spend this time learning to become a corporate-owned IT monkey like a MSCE or an Oracle DBA.
 
Originally posted by: dinkumthinkum
Your choices look fairly good. Intro to AI classes are typically pretty fun -- you end up writing some kind of board game player and learning about common search algorithms. Would recommend a class on parallel algorithms if they actually teach you about design and analysis.

Principles of Programming Languages and Intro to Compiler Construction should go hand-in-hand. In the former you would focus more on type systems and a formal approach to semantics, hopefully. Ideally, a compiler class would be a project-based class and you learn a bit about formal languages, a bit about dataflow analyses, some useful graph algorithms, and management of a reasonably sized body of code. Unfortunately many of these classes turn into "rote learning of how to fill-in LR tables" and other dumb parsing tricks. That can be miserable, and IMO, irrelevant. One sure sign: if you use the "Dragon book" (Aho, Sethi, Ullman) then beware: it is very old and spends almost the entire time focused on parsing techniques because it was written when YACC was the hottest shit around. (sorry for the rant)

It is good that you will learn about programming languages outside the C++/Java mold. There are a lot of very closed-minded programmers out there that you would do well not to imitate, and breaking out of the C++ way of thinking can be very enlightening. The family of Lisp and Scheme languages (not the same) spawned a great deal of others -- basically every "dynamically typed" programming language is a descendant -- and they continued to evolve and are well supported by a community to this day. Presumably, your PPL course will expose you to more ideas too, like properly designed static type systems (hint: C++ ain't one), higher-order functions, and very simple formalisms which are nevertheless very powerful. That course has the most potential to change the way you think about writing programs.

I didn't see any classic Algorithms courses listed. That's probably a requirement (I hope!) and I assume you've already taken that into account.

The last thing you want to do is spend this time learning to become a corporate-owned IT monkey like a MSCE or an Oracle DBA.

The only reason I hadn't listed the Intro to Algorithm Analysis class offered was because my 300 level class was offered at the same time, luckily I was able to push that to spring. I had really wanted to take the algorithms class too, simply because my professor for the Foundations of Computer Science class I took this semester is teaching it and I absolutely loved that class, fantastic professor all around.

Thanks for the replies, I'm starting to look forward to next semester, despite how painful it's going to be, lol.
 
Years ago, I took a class called High Performance Supercomputing, which might be similar to Parallel Programming, depending on what their goals are. Personally, I hated it. One reason was that any practical final project for the class required differential equations knowledge. (Basically, knowledge of using Runge-Kutta methods to perform a simulation would have sufficed.) Another reason was the parallelization platform of the professor's choice, MPI/MPICH - in C or Fortran. The C MPI interface is absolutely awful; I kept thinking I should write a wrapper for many of the functions, but I never made much progress on it.

Your parallel programming class may not be like mine, however. If you would be using a single shared-memory machine, that's different. (Most desktops now are shared-memory computers with parallel processors; but a cluster of them is not.) If you can use probably *any* system other than MPI, such as Parallel Python, OpenMP, or even standard Java with threads, that's different. Oh, and my class was basically graduate level, but offered for senior undergrads too, so that may be different.
 
AI was fun, I did two semesters for my BS and another in grad school. Prolog is a good way to stretch your mind and the ideas of search, function optimization, and rule-based systems are useful even if you never build Johnny Five or Caprica Six.

Taking at least one database course seems essential. You'll at least work with them second-hand even if you don't design them.

Parallel programming is worth taking. You'll probably be using worker threads at some point if nothing massively parallel.

Embedded I could see skipping if you aren't interested in drivers, kernel programming or other software for the hardware.

A compiler course is useful in learning about parsing, state machines, and how languages work. I use bits of lore from mine more often than my assembly courses (which included coding for hardware).
 
Originally posted by: Ken g6
Years ago, I took a class called High Performance Supercomputing, which might be similar to Parallel Programming, depending on what their goals are. Personally, I hated it. One reason was that any practical final project for the class required differential equations knowledge. (Basically, knowledge of using Runge-Kutta methods to perform a simulation would have sufficed.) Another reason was the parallelization platform of the professor's choice, MPI/MPICH - in C or Fortran. The C MPI interface is absolutely awful; I kept thinking I should write a wrapper for many of the functions, but I never made much progress on it.

Your parallel programming class may not be like mine, however. If you would be using a single shared-memory machine, that's different. (Most desktops now are shared-memory computers with parallel processors; but a cluster of them is not.) If you can use probably *any* system other than MPI, such as Parallel Python, OpenMP, or even standard Java with threads, that's different. Oh, and my class was basically graduate level, but offered for senior undergrads too, so that may be different.

Well, I can safely (and thankfully) say that we won't have to use any diff eq, I'll remain neutral on the C MPI deal for now, looks like we'll be using it along with OpenMP, the book is actually called "Parallel Programming in C with MPI and OpenMP" lol. Maybe I'll have a look at the MPI interface this summer so at least I'm used to being bent over by the time class starts, lol.

Edit: I'll also mention that one of my classes this semester touched on parallel programming, using the standard java threads, learned some of the basic theory at any rate, deadlock, race conditions etc. and had to write two or three programs using it.
 
You might want to take a pass on that then. MPI and OpenMP are, besides direct use of an API like pthreads, the two worst ways of going about learning how to write parallel programs. MPI's interface is atrocious and will distract you from learning, and OpenMP is fairly limited (most implementations don't even permit nested parallelism!). You can produce high performance code with them, for sure, but again you want to focus on high-level concepts that are widely applicable rather than being bogged down in the dirty details of a specific product.

I was assuming this was more along the lines of a "parallel algorithms" class where you learn to generalize the reasoning taught typically in a "classic algorithms" class. For example, the difference between work and depth, work-efficiency, complexity on a formal model of a parallel random-access machine, how to parallelize various approaches to algorithms typically found (divide & conquer, symmetry-breaking, etc), and those which are not easily parallelizable.

That's not to preclude hands-on work, but it shouldn't be the only thing. Especially MPI and OpenMP (ick).
 
Originally posted by: dinkumthinkum
You might want to take a pass on that then. MPI and OpenMP are, besides direct use of an API like pthreads, the two worst ways of going about learning how to write parallel programs. MPI's interface is atrocious and will distract you from learning, and OpenMP is fairly limited (most implementations don't even permit nested parallelism!). You can produce high performance code with them, for sure, but again you want to focus on high-level concepts that are widely applicable rather than being bogged down in the dirty details of a specific product.

I was assuming this was more along the lines of a "parallel algorithms" class where you learn to generalize the reasoning taught typically in a "classic algorithms" class. For example, the difference between work and depth, work-efficiency, complexity on a formal model of a parallel random-access machine, how to parallelize various approaches to algorithms typically found (divide & conquer, symmetry-breaking, etc), and those which are not easily parallelizable.

That's not to preclude hands-on work, but it shouldn't be the only thing. Especially MPI and OpenMP (ick).

I am looking over the HW assignments from previous semesters, and it appears that most of the assignments require we simply modify sequentially written programs using MPI and OpenMP to allow it to be computed in parallel, asking us to use different algorithms for scheduling or work distribution etc, and analyse the efficiency of the implemented algorithm. Were your assignments comparable, or was it a different issue that caused your troubles with MPI?
 
Originally posted by: Ken g6
Years ago, I took a class called High Performance Supercomputing, which might be similar to Parallel Programming, depending on what their goals are. Personally, I hated it. One reason was that any practical final project for the class required differential equations knowledge. (Basically, knowledge of using Runge-Kutta methods to perform a simulation would have sufficed.) Another reason was the parallelization platform of the professor's choice, MPI/MPICH - in C or Fortran. The C MPI interface is absolutely awful; I kept thinking I should write a wrapper for many of the functions, but I never made much progress on it.

Your parallel programming class may not be like mine, however. If you would be using a single shared-memory machine, that's different. (Most desktops now are shared-memory computers with parallel processors; but a cluster of them is not.) If you can use probably *any* system other than MPI, such as Parallel Python, OpenMP, or even standard Java with threads, that's different. Oh, and my class was basically graduate level, but offered for senior undergrads too, so that may be different.

When I was an undergrad, I did a few projects using MPI. I thought that it was a lot of fun.
 
Originally posted by: Dhaval00
Must do Operating Systems - unless you've other similar courses... my two cents.

^

I'm curious about the Embedded Systems class because I am in a similar quandary. I'm trying to finish my degree as quickly as possible but want to avoid taking classes for the sake of being enrolled or ones that will have little bearing on what I want to do with this degree. Embedded Systems is the only available offering. My eventual career goals are to either gain employment in an internal IT dept at some business (preferably my current place of employment) or a software house developing programs. I am interested in handheld devices, but am not limiting myself to that. I had always thought an Embedded Systems class might be handy for the latter, but now I wonder. Is a course in embedded systems all that useful given the vauge goals I listed?
 
in addition to the OS Dhaval00 mentioned, there are a few classes I like and find it majorly helpful (must more than AI), if you haven't taken them yet definitely take it:

Database Transactions (different from db theory) - You will realize that this is a 2 birds in 1 stone class, it will clear you up on both DB isolation level and the same principal will help you in a multi-threading environment. On top of that it's one of the easier DB classes you will find.

Network Security - majorly deal with protocol and cryptos as oppose to the more trivial System Security which deals with user privileges. If you often read something on Bruce Schneier's website and donno wtf he's talking about, this is your class. Hugely beneficial.

Also, polish up your SQL, you will be asked about that in every interview. It is the thing they used separate the noobs and the pros among the fresh out of colleges.
 
I did terribly in the compilers class I took, but it was completely fascinating to me. Definitely recommend it.

Operating systems is also one that I wish I took.

I took AI and didn't find it tremendously amazing... there's a reason that Lisp isn't the go-to language for very many programmers. Concepts were handy, especially Bayesian stuff. I actually do like Prolog, and was fairly good with it, but we did it in an earlier class.

If it's an option, software engineering is a must, IMHO.
 
embedded systems is a good class to take.

you can learn a lot from making an real time operating system. IMO it makes you a more valuable programmer with the skills you learn.

your code is no longer running sequencially anymore, it get interupted and jumps all over the place.

temp [0] = 5;
temp [1] = 5;

if (temp[0] == temp[1])
updateTemp();

uh oh, the updateTemp() never executed... the fun of RTOS programming.

What can you take away from a class in embedded systems... You become a master of working with the stack.
 
If you haven't already taken a database class, take the database class. The vast majority of programming jobs are pushing data into and out of a database.
 
Back
Top