Course Pathways

CSE is an ever-growing field, and a CSE degree provides an amazing breadth of opportunities. To meet the needs and career goals of our unique students, we have designed our degree requirements to be quite flexible, particularly at the 400-level. We want our students to talk to advisors and professors to determine what courses they will find most useful and enjoyable.

However, many students find some structure and guidance useful. Degree requirements are naturally important, but what you must take to graduate differs from what you ought to take to achieve your goals. It may be unclear which courses are particularly relevant for some of the more common job titles or career paths you may be considering.

We therefore designed this page to be a starting point in directing you toward specific employment specializations.

General Advice

A few recommendations apply regardless of career interest. Most students benefit tremendously from doing internships. Internships complement coursework by allowing students to work intensively on a single project using modern technology. Likewise, capstones are valuable for most career paths, again, because employers value project experience in addition to understanding relevant concepts. Research experience is useful regardless of whether you intend to pursue a graduate degree, because the ability to work independently is valuable in many career contexts. It is also an ideal way to get to know individual faculty -- and have them know you so they can give you personalized advice.

Many employers care deeply about "soft skills" -- written and oral communication, teamwork, time management. Communicating your ideas and organizing yourself are necessary for your technical skills to be useful. Gain experience in these areas.

We encourage you to take courses that interest you even if (or especially if) they are not listed for your career of interest -- a fresh perspective is often the seed of creativity.

In a fast moving technical domain like computer science and engineering, continuing education (either formally or informally through self-directed learning) is a necessity -- the courses of studies listed below are intended to help you get started in a topic. They are by no means a complete set of everything you need to know to have a successful career in any of these areas.

More specifically in terms of our curriculum, most students should take more than the minimum number of 300-level courses. The minimum is allowed for students who want to move quickly into a narrower specialty. In particular, while 331 is not required for CompE and 352 is not required for CS, we believe most students should take both courses. Software-development skills and knowledge of hardware are extremely valuable. Because this advice applies generally, 331 and 352 are not explicitly listed under most of the specializations.

Specializations

The following list of "specializations" are typically either areas of computing or job titles or both. Unfortunately, most job titles are not used consistently by different companies -- as one example, "software engineer" can range from meaning "entry-level programmer" to "advanced software architect." Nonetheless, we try to follow the most common usage.

For each specialization, we list the most important elective courses. Thist does not imply that other courses are not equally important, but these are the key courses that cover topics that define the specialization. We also list other recommended courses for each specialty.

Databases

There are multiple facets to working with databases, and different jobs may emphasizes different facets. The application facet requires you to have a good understanding of database design, SQL, XML, jdbc: definitely take 344 and strongly consider 484 and 403. If you want to be a true expert, however, it will tremendously help you to know how databases work inside, how they are implemented, so make sure to take 444! 440 may be helpful for creating applications that are easy to use, so you should consider it. For the server facet (database administrator) you must have a good understanding of query processing techniques, types of indices, transactions, and anything that deals with systems performance; take 344, 444, 484, and very strongly consider 451. For the data analyst/data-intensive computing facet, you need to have some exposure to massively parallel data processing techniques such as MapReduce, or Pig Latin, and some basics in data mining: take 344, 444, 446.

Data Mining

Machine learning and data mining are increasingly important activities and there is extremely high demand for people skilled in these areas. For example, data mining is used to tune Web search engine ranking functions, to evaluate the merit of credit card applications, to determine when a retail store should reorder products, and even to optimize the energy efficiency of advanced CPU architectures. A strong background in statistics (eg, STAT391) and algorithm design (421) will be very useful when designing data-mining systems. 446 is the core course in the area and 473 will broaden your knowledge of AI methods. Frequently, the data to be mined is stored in a large relational DBMS; deep knowledge of database design and implementation (444) will let you create a much more effective system. If you are interested in Web applications of machine learning, consider 454.

Embedded Systems

Embedded systems are designed to fit into the fabric of the environment around us. An embedded system is distinguished from a general-purpose system by some very important properties: (1) an embedded system usually interfaces computing with the physical world (sensing and actuation); (2) it is not intended to be reprogrammed by the user although some parameters may be specified; and (3) it has user interfaces that are optimized for the task so as to be as seamless as possible. A good example is an anti-lock breaking system in a car where sensors measure the performance of the brakes and a micro-controller computes the pressure to actuate on the brake disks; the manufacturer may occasionally update the software but not the car owner; and the user interface is the simple brake pedal with which drivers are already familiar. The distinctions between embedded and general-purpose systems are not always so precise. A modern mobile phone is certainly programmable (the user can download new apps as with a PC) but there are components such as the GSM module (performing the communication between the phone and cellular infrastructure) whose software elements are rarely changed or upgraded. Similarly, the GPS module of the phone performs the specific function of determining a position on Earth from signals sent by orbiting satellites. An embedded system designer is likely to focus on these task-specific modules while coordinating their use in the more general-purpose phone. Other excellent examples of embedded systems are modern video game controllers that use a user's physical gestures (sensed through embedded accelerometers or cameras) to control game elements. Embedded systems designers and engineers work in a variety of industries and on varied applications ranging from medical instrumentation and aerospace to mobile devices and smart environments.

The most core courses to an embedded systems career stress a deep understanding of how devices connect to the physical world and how real-time control software can be used to control physical systems and manage highly concurrent tasks.

Graphics, Vision, Games, and Animation

These exciting specialties require creativity, as well as computer science and math skills.

Computer graphics engineers develop software for creating images,videos, and even 3D worlds. Computer vision engineers analyze 2D, 3D and even 4D data with goals such as object recognition, video analysis, content-based image retrieval, 3D reconstruction and more. Game designers use graphics and HCI skills to create video games for people to play and enjoy. Animation production encompasses the whole process of creating animated films. Our animation capstone sequence is interdisciplinary, including students from other departments.

Informations and Communications Technologies for Development (ICTD)

In many nations around the world, computing systems are seeing a radically different development and evolution than what has happened in heavily industrialized nations. For example, the dominant computing device is the mobile phone rather than the laptop or desktop. Phones are more mobile, more easily powered where the power infrastructure is less developed, and have communication capability for both voice and data (SMS and GPRS). Arguably, the phone is the truly personal computer that everyone around the world carries with them. A new engineering discipline is emerging that solves problems using appropriate technology for the many environments around the world that have many fewer resources than our own. It often explores a very different range of designs and solutions than what might be appropriate within our familiar environment. The field of ICTD focuses on deploying technology to help spur economic and social development as well as improving health and education services. Application areas cover improving public health (both clinic and community outreach efforts), educational applications (traditional schools as well as adult education), helping illiterate populations bridge the digital divide, and facilitating financial instruments that operate with the smaller amounts of poorer economies. ICTD systems must carefully account for economic, cultural, and language aspects of the communities and users where they are deployed. ICTD is one of the more inter-disciplinary branches of CSE.

The core courses for ICTD (from a CSE perspective) are very close to those for embedded systems design but with a stronger emphasis on information system design. Many courses in the Information School and Department of Human-Centered Design and Engineering are also very appropriate as are courses in areas of public health, economic policy, and education (depending on student interests). You may also want to attend the Change seminar on Thursdays at noon (CSE590C1) to hear speakers talk about work on ICTD both at UW and elsewhere - attendees are undergrads, grads, researchers, and faculty from around campus and the greater Seattle area.

Interactions with Biology, Bioengineering, Medicine and Genomics

One of the most exciting aspects of computer science today is its promise to cross over from the "core" to make significant contributions in disparate application domains, and biology/medicine are among the most promising of these connections. They are undergoing a sea change, with new technologies such as genome sequencing providing floods of data that will elucidate fundamental biomedical truths, if we can provide the appropriate computational tools to expose them. This encompasses a very broad landscape, including:

Bioinformatics/computational biology are aimed at knowledge discovery from such data sets.

Biomedical and health informatics works on using electronic biomedical data and information to advance research and improve health.

Computational neuroscience seeks to understand how the brain works through computational models and simulation.

Brain-computer interfacing involves using signals from the brain to directly control external devices.

Neural engineering utilizes techniques from engineering to both understand the brain and build systems that interface with the brain such as neural prosthetics and implants. It encompasses areas such as computational neuroscience and brain-computer interfacing.

Given the breadth of the agenda above, no one curriculum will suit every student, so be flexible, talk to advisors and faculty, and consider the following courses:

The motivation for many of the courses above will be self-evident, but to amplify a little, the scale and nature of the data make databases, statistical approaches, and algorithms very relevant, and common use of a wide variety of languages, e.g., Perl, Python, R, Matlab, motivates 341. There also are many relevant courses in Chem/Biochem/Biology/Genetics/Bio Engineering/etc. Unfortunately, most have significant prerequisites, but if they fit your schedule, go for it! As just one of many examples, BIOL 180/200 (Intro Biology) -> GENOME 371 (Intro Genetics) -> GENOME 372 (Genomics and Proteomics) -> GENOME 373 (Genomic Informatics) would be a great series for anyone with an interest in computational biology.

Mathematical Foundations

Ph.D. in CSE

An option for every student to consider is further study in CSE after graduation. This can be any combination of self-directed study, a masters degree program, and/or a Ph.D. program. It is not possible for us to fit everything worth learning about CSE in the scant number of credits available in the undergraduate degree program. Instead, our aim at the undergraduate level is to provide a foundation for students to be able to learn more, either on their own or as part of a graduate degree program. The field of CSE moves ahead quickly! It is crucial to stay current with new technologies to stay productive.

Masters degree programs largely fall into two flavors: primarily coursework, or a mixture of coursework and independent research. Graduate coursework generally focuses on bringing students to the state of the art in a particular sub-area of CSE, while independent research targets the creation of new knowledge in the construction of leading edge computer products and services. Clearly, to do research in an area, a student needs to understand the current state of knowledge in that area. At UW, the Professional Master's Program (PMP) is primarily coursework; students in the UW CSE fifth year masters program can pursue either path; and students admitted in the Ph.D. program focus on research while completing several courses early in their graduate career.

Ph.D. programs in CSE are primarily designed for those interested in research careers. Although most Ph.D. programs involve coursework, the main focus is on pushing beyond the state of what is already known. Creativity, insight, teamwork, self-motivation, leadership, presentation and writing skills are all highly valuable to researchers, and in fact, the technical leadership of most companies excel at many of these same qualities. There is often a blurry line between academic research and new product development. Startups in particular value students who are able to solve technical problems where the solutions are not well-understood in advance. There is no textbook that says how to design an iPhone. It is not an accident that the CEO of Google has a Ph.D. in computer science; half of all Google hires from UW have advanced degrees. Thus, research experience is valuable, even if you do not pursue an academic career.

Almost all students entering CS Ph.D. research programs will have some research experience before entering graduate school. Research experience can be gained in a number of ways. Independent study with a faculty member or graduate student is the most common. However, it is not a requirement that you complete an honors thesis in order to apply to graduate school. Other paths include capstone projects and work experience. For example, capstone projects often involve independent study and creative problem solving. Working at an early stage startup is another good way to practice research skills -- basically any environment where the problem is poorly specified, the solution is unknown, and success in uncertain -- in other words, the opposite of a typical undergraduate class! It can take years for research ideas to make their way into practice, if at all, so the ability to sustain motivation and progress in the absence of deadlines is essential.

Advice on applying to graduate school could fill a book, so it is best to talk specifically with a faculty member, preferably your research advisor, well before you apply. Applications are typically due in December, so it is best to start planning by the end of junior year. Some students work for a few years before applying to graduate school; this added experience can be quite helpful. We should note, however, that it is more common for students to apply to graduate school in their senior year. It is also possible to apply to graduate school as a senior, and then to defer for a year to work in industry.

Many graduate schools are extremely competitive. For example, UW CSE receives over 1000 applications for new Ph.D. students per year. On the other hand, several UW CSE undergrads enter Ph.D. programs each year, and probably an equal number beyond that would be able to be admitted to a competitive grad school but choose to go directly to industry. The CSE faculty are very knowledgeable as to which schools have strong programs in your area of interest, so make sure to consult them before applying. This type of information is very difficult to unearth on your own.

For graduate applications, various factors are considered. In rough priority order: recommendations from faculty who worked directly with you on a research project; recommendations from faculty who taught you in a class or two, or for whom you have TA'ed; verbal/math GRE score; GPA; personal statement. In particular, the GPA is not particularly correlated with success in graduate school, except in one respect: most graduate courses run at two to three times the speed of a typical undergraduate course, so graduate schools do consider whether you would be able to keep up. Some schools are now conducting phone interviews of some candidates; for this it helps to attend research seminars (590) in your area of research, and to practice by talking to graduate students about their work and your work. Finally, to complete a Ph.D. literally requires you to write a book, and so there is a huge advantage to becoming an accomplished writer before entering graduate school.

Scientific Computing

An increasing number of areas, not just traditional areas like physics, need high-performance computing that typically involves solving large numerical problems using large-scale parallel processing. People in this area benefit from expertise in applied mathematics as well as computer systems and software development. Despite increasing overlap with data mining and other areas, high-performance computing remains a distinct community.

Security

Computer-security issues span almost all of computer science. Computer-security practitioners work at the hardware level, with embedded systems, with software, and with improving the usability of computer security systems.

Computer security training can also be a valuable complement to anyone working in computer science, since -- unfortunately -- computer security issues arise all too frequently with deployed computer systems.

The courses below provide a core foundation in computer security. 484 is the keystone course. However, one tenet of computer security is that it is much harder to defend systems than attack systems. That is because an attacker needs to find only one way to succeed, whereas a defender needs to protect against all possible attacks. Computer-security issues can also affect all parts of a system, from the hardware to the user interface. Therefore, a computer-security practitioner should have as broad of a working knowledge in computer science as possible.

The most salient characteristic of systems software is the need for reliability. If your operating system breaks, the user typically can't get anything else done, and it might even corrupt their data permanently. The flaw might even provide an opportunity for a hacker to gain control over the user's computer. The need for reliability is equally true for data-center software, the network, the compiler, and so forth. Making this even more challenging, systems software is often inherently complex; for example, the back-end software for a data center must deal with concurrency, recovery from node failures, resource overload conditions, and attacks from miscreants.

Thus, central to the curriculum for a systems developer is systems construction experience (via project oriented systems classes like 333 and 451, as well as internships and software capstones), breadth of knowledge of how systems work and how they break (461 and 484), principles of software engineering practice (331 and 403), technology trends (352 and 471), and specialized courses depending on time and interest (e.g., for compiler construction, one would want 341, 401).

Software Engineering

Software engineers design, build and evolve software in a broad variety of domains. Although many focus on specific aspects of the software lifecycle -- requirements engineering, architecture and design, testing and analysis, etc. -- software engineers collectively address software systems from "womb" to "tomb." Software engineers need to understand the needs of users, design approaches to manage software complexity and to ease change over time, ways to assess the properties that the software product does or does not have, algorithmic and implementation techniques to build efficient software, and more. Making effective trade-offs about issues ranging from performance to reliability to availability to ease of change (and more!) is part-and-parcel of a software engineer's job.

Many of the other specializations (such as systems developer, web developer, etc.) overlap significantly with what software engineers do: indeed, these others are in some sense specialized software engineers. This suggests that, along with the basics, you should take courses about the kind of software you may be interested in engineering.

The curriculum for a software engineer is heavily, but not solely, experiential. 331 and 403 are essential courses, as is one or more software capstone courses (and, when possible, internships or coops). Understanding the context for software from top-to-bottom is valuable for any software engineer, making courses like 341 and 401, 333 and 451 and 461 , 440, 344 and 444, 484, and 421 worthy of serious consideration. Students should also consider taking Business or Communication courses as possible general education courses.

User Interface and Human-Computer Interaction

User interface design or user interface engineering is the design of computers, appliances, machines, mobile communication devices, software applications, and websites with the focus on the user's experience and interaction. The goal of user interface design is to make the user's interaction as simple, efficient, satisfying, (and possibly) fun as possible, in terms of accomplishing user goals—what is often called user-centered design. Good user interface design facilitates finishing the task at hand without drawing unnecessary attention to itself (unless it is a game!). Graphic design may be utilized to support its usability. The design process must balance technical functionality and visual elements (e.g., mental model) to create a system that is not only operational but also usable and adaptable to changing user needs. Interface design is involved in a wide range of projects from computer systems, to phones, to cars, to commercial planes; all of these projects involve much of the same basic human interactions yet also require some unique skills and knowledge. As a result, designers tend to specialize in certain types of projects and have skills centered around their expertise, whether that be software design, user research, web design, or industrial design. (Adapted from Wikipedia.)

Highly Recommended Courses: CSE 440, 441; also any capstone courses in related areas, such as computing for the developing world or computer support for people with disabilities

Other Recommended Courses: CSE 403, 446, 451, 454, 457, 484

Also see appropriate courses in the other UW departments noted above. Generally, the CSE courses will have a greater concentration on the technical aspects of HCI; the HCDE courses will focus on user experience and user testing; the Interaction Design program takes a design (art) perspective; while the iSchool courses on the relationships among information, technology, and people. So, CSE440 will include some basics of doing a usability study, but for a more complete treatment, see for example HCDE417, Survey of Usability Research Techniques.

Web Development

Many companies need talented web developers. Some are large companies that do web software as their bread and butter, like Google, Amazon, and Yahoo. Others are traditional software houses that have particular web products and services, like Microsoft or Cisco. Still others are regular non-software businesses that need to hire web hackers to create dynamic web sites for the company.

Web developers need to know about many different programming languages and technologies such as HTML, CSS, JavaScript, XML, databases/SQL, PHP/Java/Ruby/.NET, etc. It's impossible to be an expert at all of these things, but exposure to many of them and ability to self-teach are important for many web dev jobs. It's very helpful to know more about the overall process of software engineering, such as gathering requirements, design, and testing (403), since in some cases you'll be building the site or web application by yourself or as part of a small team. Experience with user interface design and HCI (440, 441) are useful for creating effective, usable web sites. The ability to manage and manipulate data, whether in traditional data structures (332) or databases (344, 444) is very valuable since most business web sites/apps manage the business's data.