What upper division undergrad courses for CS?

Hey everyone,

I’ll be entering my final semesters this coming year. I, mostly, have only electives left. I have to take at least 5 courses. There are courses I am interested in from a theoretical standpoint, but because I am an little bit of an older student (I will be 30 at graduation, almost 31) I’d like to do something that makes me marketable at graduation. I plan on going to grad school eventually, but I want to pay off my loans first and get experience in the industry.

I’m interested in Software Engineering, Aerospace, AI, and Gaming. However, my primary concern is employment at graduation. While I’m mostly interested in those careers, it doesn’t mean that I will be discouraged if I do not end up there.

I have close (family and long-term good friends) contacts at Riot Gaming, Google, NASA, Boeing, the FAA, TSA, and a cyber security firm (can’t remember the name off the top of my head). I mention that in case that influences your recommendations since I will likely use these people as future references.

I’ve constructed a list of available courses at my University:

I must take at least one from the following:
Compiler Construction
Description: This course investigates theoretical and practical issues in the design and construction of modern compilers. Topics covered include lexical and syntactic analysis, syntax-directed translation, type checking, intermediate representation, code generation, and runtime systems. A major portion of the course involves implementing a compiler from scratch for a C-like programming language.

Human Factors of Computer Systems
Principles and methods in human factors and ergonomics applied to the design and use of computer systems.

Parallel Programming
This course teaches practical aspects of parallel programming. The covered topics include multi-core processors and shared-memory programming, hardware accelerator programming, and distributed-memory machines and message-passing programming. The students will gain the knowledge and skills needed for developing parallel software by writing programs for a variety of parallel computers.

Software Engineering Project
Students undertake a software development project. They work in teams, developing requirements and designs which they will implement and test.

Computer System Security
Course covers practical aspects of computer system security including managing and producing code for secure systems. Theory, such as cryptography, is introduced as needed.

I must take 4 from the following:
Practical Gaming Design
Course teaches practical aspects of computer game design and implementation. Topics include graphics game engines, game physics, AI methods applied to games, and software architectures for computer games. Students will gain knowledge and skills needed for game development via team projects.

Introduction to Artificial Intelligence
An introduction to the basic concepts of artificial intelligence; search techniques, knowledge representation, problem solving.

Embedded Computer Systems
Description: This course studies the architecture of embedded systems, micro-controllers, their peripherals, languages, and operating systems and the special techniques required to use them.

Internet Software Development
Description: A course providing foundations for the construction and design of static and dynamic Web pages with database applications. This will include server-side and client-side software development.

Theory of Automata
Description: An introduction to automata theory, computability, and formal languages.

Computer Networks
Description: A survey of network architectures and their components. Emphasis will be on media access, network and transport layer protocols.

Introduction to Data Mining
Description: This course covers fundamental concepts and techniques in data mining and information retrieval. Data mining topics include classification, cluster analysis and pattern mining. Information retrieval topics include Boolean retrieval, vector space model, and Web search.

Operating Systems
This course covers the principles of operating systems, algorithms for CPU scheduling, memory management, cooperating sequential processes and device management.

Introduction to Database Systems
Introduction to database concepts, data models, file structures, query languages, database management systems.

Unix Systems Programming
Fundamentals of Unix operating systems, Unix file system and environment, C memory allocation, development tools, processes and signals, threads, device drivers, and programming for security

Software Testing
The concepts used in a formal testing of safety critical and high-quality software applications are investigated. Topics include, but are not limited to, test design, static and dynamic testing tools, and formal testing documentation

Introduction to Graphical User Interfaces
This course covers abstract and practical foundations of graphical user interface design, evaluation, and implementation. It discusses the fundamentals of computer graphics and interactive computer/human interfaces. The course includes a survey of usability measures, the major GUI standards, and GUI tools

Introduction to Recommender Systems
This course covers the basic concepts of recommender systems, including personalization algorithms, evaluation tools, and user experiences. We will discuss how recommender systems are deployed in e-commerce sites, social networks, and many other online systems. Additionally, we will review current research in the field.

Introduction to Green Computing
Reducing energy consumption of mobile devices, cloud computing platforms, and supercomputers is a paramount but daunting problem. This course covers fundamental concepts and techniques in green computing, including a hardware energy efficiency roadmap; energy efficient software design, resource management, and storage solutions; and green data centers and mobile computing.


The ones recommended to me so far are Software Engineering Project, Recommender Systems, Compilers, Parallel Programming, and Software Testing.

I appreciate any advice.

From the first group:

  1. Software Engineering Project will basically be your job as a developer. Great time to practice, so take that.
  2. Compilers and Computer Security stand out as very generally helpful courses - the won't make you more marketable, but both of those can be helpful in general software engineering. Security is the more practical, but a good understanding of compilers is surprisingly applicable conceptually. Just something to keep in mind. If you're looking to go the SE route though, the SE class will likely be the most useful to help in an interview and work environment.

For the second group, some observations:

  1. Networks and Operating Systems are both very important courses. Understanding how your OS works is crucial. Understanding internet protocols and beyond is crucial. These classes (especially systems) are usually required for many programs, not optional.
  2. AI is a strong likely take class. You're interested in it, it's a hot field right now, and generally its just interesting and fun.
  3. Software Testing will be good if you want to go the aerospace route exclusively. I assume you have been exposed to testing before, so an in-depth class like that is only needed if testing is a huge part of your job, like with aerospace. In the same vein, embedded systems will be important primarily for aerospace.
  4. Internet Software Development will be good if you want to go into web development. You could learn this on the job, but having the skills at the start will make you a lot more attractive to companies.
  5. I assume you have encountered databases before - I don't think a whole class here would be a good use of time.
  6. Recommender Systems and Data Mining both fall a bit tangential to AI and are useful, but again would be going in a specific direction.

In summary, you have so many varied interests that you will need to make a choice. If employability ease is what’s important, I don’t think aerospace or games is the right choice, as both markets are very competitive and may take more experience to even get your foot in the door. General software development will be the best way to be generally prepared for the most jobs and able to pick up new skills as needed. AI is a good addition to that.

For that reason, I would recommend the SE route. I’ve also left my recommendations for aerospace and gaming accordingly for reference in how the paths differ.

Common Courses:
Operating Systems
Networks

SE + AI Route:
AI
Internet Software Development

Aerospace Route:
Software Testing
Embedded Computer Systems

Gaming Route:
AI
Practical Gaming Design


If you can take more than those 5 without overloading yourself, consider Recommender Systems and Data Mining for both the SE/AI route and the gaming route.

I would suggest the following courses as being useful for any direction you may want to take:

Operating systems – every program either interacts with the operating system, or is part of the operating system
Networks – many programs interact through networks with other programs
Databases or data mining – many programs have to manage large amounts of data
Computer system security – almost every program needs to be concerned with security; consider attackers trying to bring down an airplane or cheat at a game
any course with a project* – real world software development involves large projects

*The software engineering project course is one that is obvious (and presumably focuses on project methodology), but it looks like the compiler course also includes a project, so you can get project experience while also learning about compilers. The game development course may also be suitable.

Of course, you can take additional courses beyond the above, depending on your interests.

Would it be correct to assume that you have already taken an algorithms and complexity course?

If you want to take both theory of automata and compilers, take theory of automata first, as it will be helpful when you do the compiler front end (parsing the language).

Knowing how compilers work will make you a much better programmer, but there aren’t a lot of jobs that require knowledge of compiler construction or theory of automata.

AI and recommender systems are very hot right now. Lots of jobs in internet software development, too.

Knowledge of databases and operating systems is essential for anyone in software engineering.