CSE Undergraduate Curriculum: Information for Faculty
Last updated: February, 2019
Author: Dan Grossman
About
About this page
This page is designed as a brief, unofficial overview and pointer to
additional information for Allen School faculty about the school's
undergraduate curriculum. It emphasizes recent changes. Near the
bottom it has more antiquated information that isn't otherwise archived.
It is hopefully useful to veterans who can't remember how things have
changed and to new people unfamiliar with our curriculum. It
favors brevity over extensive rationale. It will be perpetually
outdated. Tell Grossman how it could be improved, but remember
everybody has a different sense of what, “everybody already
knows.” Skip around to find the parts you need.
This page is publicly available.
Course Information
For every course we teach, we have the following information:
-
Catalog descriptions:
These are official 50-word descriptions and pre-requisites.
It is a pain to change the descriptions, so we keep them general.
On the plus side, they are really brief, so
you can read our entire set of offerings in 5 minutes.
-
Teaching schedule:
Some courses are offered every quarter, others less than once a year. You can look at
schedules for previous years to get a good sense of which are which.
-
Course home
pages: These include the public materials for each offering and
who the instructor was. You invariably end up asking past
instructors what really happens in the course. Links below about
individual courses point to these pages.
- ABET
syllabi: In the materials we prepared for the ABET accreditation
of our Computer Engineering program, we have syllabi for our majors
courses. These were last updated in 2013. They are brief and
probably less helpful than course home pages, but people looking for
a list of learning outcomes can consult them. (The story behind ABET
— what it is, why we do it, and how we do it — is too
complicated to describe here; you can
see http://www.cs.washington.edu/ABET/,
but it doesn't have the “short answer” you're looking
for.)
-
Old-timers will remember “standard syllabi” for 100-level
and 300-level courses in terms of precondition
concepts/abilities/skills and postcondition
concepts/abilities/skills. We no longer have these (none were
updated more recently than 2007, which was prior to redoing our
entire 300-level majors courses around 2010), but creating new ones
might be a good exercise.
Undergraduate Stages
Rough Stages in Undergraduate Coursework
Think of the courses our undergraduates take in these categories:
-
Our 2-quarter intro sequence (programming in Java):
CSE142 and
CSE143.
Some students self-select to skip CSE142. These are large courses serving
the broader University population. Roughly 90% of CSE142 students and 75% of CSE143 students will not end up
CSE majors. Some of our majors took these courses before intending to be CSE majors.
Our other 100-level courses are primarily intended for non-majors although our majors do sometimes take them, particularly CSE154 (web programming).
-
Our 300-level courses are taken during students' first few quarters in the major. In 2010-2011
we transitioned to a new set of courses, with new numbers and substantially new and
rearranged content. It used to be that all 300-level courses were required of all majors.
Now there are still 4 300-level courses that everyone must take, others that either CompE
or CS students must take, and still others that nobody must take. However, “not required”
does not mean “unimportant”. Not-required courses can still be highly recommended courses taken by the vast majority of students. They
can be pre-requisites for important 400-level courses.
-
Most of our 400-level courses are “senior-level courses” in various “areas.” Students
take at least 4 of these, but usually more like 7-9. Most 400-level courses don't have other
400-level courses as pre-requisites.
-
Capstone Design Courses and Project Courses (both also at the 400-level) are courses where students synthesize what
they have learned by designing, implementing, evaluating, and presenting. A Capstone Design Course must meet many of the ABET
assessment requirements, whereas a Project Course need not, though for many years we referred to both as “capstones” and
are trying to move away from this confusing terminology. CompE students must take at least one Capstone Design Course, but we recommend CS students take one too.
-
Relevant requirements outside the school (e.g., math courses, writing requirements, etc.)
-
Relevant electives outside the school. For courses in other departments that count toward
CSE elective requirements, see this official list.
-
Other: Those are just the broad categories. We also have:
- Courses not at the 100-level that are for non-majors and which have at least CSE143 as a pre-requisite. The largest is CSE373 Data Structures. Other courses cover algorithms, artificial intelligence, data management, machine learning, programming languages, computer systems, and more.
- Advanced undergraduates who, with instructor permission, take graduate courses.
- Independent studies, senior theses, etc. Have an advisor explain the difference between CSE498a, CSE498b, and CSE499.
- Seminars (usually pass-fail and just 1 or 2 credits)
- Other stuff
Degrees
Degrees and Degree Requirements
We have two undergraduate degree programs: A Computer Science major in
the College of Arts & Sciences (“CS”) and a Computer
Engineering major in the College of Engineering (“CompE” or “CE”).
The degree requirements are different, both within CSE, and, more
substantially, outside of CSE (to satisfy the colleges'
different requirements). Most faculty can ignore this: you never need
to know who in your class is in which college. Our CompE degree is
ABET accredited, which complicates how we structure our CompE degree
requirements and how we assess our curricular goals. Currently, over
80% of our undergraduate majors are CS.
The
degree requirements have all the details and are complicated
enough that it's unwise to try to summarize them. The CS and CompE
requirements are in separate PDF files and you are probably more
interested in the right columns, which contain the CSE courses.
We also have an integrated 5th-year Master's program
(“BS/MS” or “5th years”) where students are admitted prior to their
senior year and stay for roughly an extra year to earn a Master's
degree. The early admission allows them to plan their final two
years together. Students in the BS/MS who have finished their
Bachelor's requirements often refer to themselves as graduate studentsb
and they are graduate students. They take both 400-level and
500-level courses. Approximately 10% of our undergraduates participate in this program.
A few historical facts, not necessarily relevant going forward:
- In 2015, we completed a revision of the CompE requirements that
better aligns with the Electrical & Computer Engineering department so that
students in both CSE and EE (the ECE department's degree program is still Electrical Engineering at this time) have more electives available and the we can better share teaching cycles. The details of this
change are in a separate section below.
- Prior to Spring 2011, CompE had separate tracks in Hardware and
Software, but at that time we agreed to more flexible Computer
Engineering degree requirements that subsume both tracks (i.e.,
students can now mix-and-match between what were the tracks).
- Prior to Spring 2010, the 300-level courses were almost entirely
different and the same courses were required for CS and CompE.
- It's pretty neat that our web pages have all versions of our degree requirements back to 1977.
The 300-level
Here is our current collection of “300-level” courses
and their pre-requisite structure. This reflects the CompE updates in 2015 and is current as of February 2019:

Course web pages:
Back in 2010, we also developed a 2-3 page course description that
explains the vision, goals, and approximate topics of each new course.
Naturally, converting a short description into a 4-credit course is
non-trivial and courses evolve over time, so at this point, these
descriptions are historical documents. But since they aren't
linked to anywhere else, here they are:
Course Prerequisites
Prerequisites for courses at the 400-level should be up to the
relevant cadre of instructors.
The current
list may be suboptimal. If so, please speak up and suggest
changes. However, keep in mind:
- If at all possible, agree on pre-requisites with all other
instructors. It is problematic at best for the students and advisors
when different instructors assume different pre-requisites in general.
(A particular student in an unusual circumstance, however, can always
be handled specially with your support and help.)
-
Most of our 400-level courses have only 300-level courses as
pre-requisites. “Deeper chains” do exist and should exist
if pedagogically optimal, but it makes it more difficult for students
to take the course before graduation. Similarly, require all
300-level courses that are important for offering a substantial,
successful course, but pre-requisites that are not required courses
can have some negative pressure on enrollment in a course.
Learning More
Confused about how our curriculum works? Ask a colleague or one of our wonderful
undergraduate advisors. It is a system with a lot of moving parts where nobody has
complete information — but together we make it work to graduate hundreds of great students a year.
Big 2015 Changes
In Spring 2015, we completed a 2-3 year process to align several
courses with Electrical Engineering in order to make more senior-level
courses available to majors in both CSE and EE and to share teaching
burden.
The biggest change is to remove CSE352 (4 credits), our first
“hardware lab” course and replace it with CSE369 (2
credits) and CSE/EE 371 (5 credits, cross-listed). CSE369 is a
“bridge” course that builds on the circuits and
finite-automata in CSE311 to cover enough “lab skills” to
have our students take 371 while the EE students take EE 271 before
371. This is a key point of coordination -- from 371 students can
“launch” in different directions toward computer
architecture, embedded systems, etc.
The other changes, in rough order of importance:
- Embedded systems changes from CSE 466 to CSE/EE 474 (cross-listed
with a common number). The pre-reqs drop to just CSE 143 because
that's important to EE. We navigate this by having students
without C experience participate in a [second weekly] recitation
section on C programming. Students who have taken CSE351, CSE374, or
CSE410 probably will not need this optional section, which we will
make clear on the time schedule.
- Computer architecture, which was much of CSE352 and all of
CSE471, splits into CSE/EE 469 Computer Architecture I and CSE/EE
470 Computer Architecture II.
- The embedded systems capstone is renumbered to CSE/EE 475 for number-consistency across CSE and EE.
- We removed CSE468 and CSE476 from the course catalog (we haven't
taught them in ages). CSE students with the right pre-reqs will be
able to take VLSI courses EE476 and EE477.
- As a bookkeeping convenience, we moved a long list of courses out
of the degree requirements to a web page. Future changes
to this list will still need faculty approval, but will not require a
university-level process. This is the Computer Engineering Systems Electives list.
Big 2010 Changes
This is for historical purposes and for when an old-timer reverts to thinking in pre-2010 terms and needs a refresher.
In Fall 2009, we approved a major revision of our 300-level courses.
It retired 7 courses:
CSE303,
CSE321,
CSE322,
CSE326,
CSE370,
CSE378.
While CSE341 remained, it became
recommended rather than required.
The 300-level revision changed what material is included and reorganized the material. Here is
a high-level list of notable changes:
- CSE303 went away. The Linux skills, makefiles, and such moved to 391, a 1-credit non-required credit/no-credit
course. Most students
take this course, but students who learned these tools on their own can skip it.
-
CSE311 draws on material from CSE321 (logic, induction, discrete math), CSE322 (finite state machines,
undecidability), and CSE370 (boolean logic, finite state machines). Compared to 321, the counting and
probability moves to CSE312 whereas CSE311 does more to cover topics essential to hardware that were previously in CSE370.
-
CSE312 is very different from CSE322, most of the material from CSE322 moves to CSE311 or disappears from the 300-level
(instructors for CSE401, CSE421, and CSE431 should take particular note). CSE312 covers computing applications of
probability and statistics, as well as P vs. NP and NP-completeness. (In 2014-2015, the P vs. NP and NP-Completeness moved to CSE332, where it is closer to the other course material.)
-
CSE331 provides substantial software-project and software-design/implementation experience in Java.
This is a more substantial exposure to high-level software development, including specifications, testing, and design patterns, than anything pre-revision.
-
CSE332 removed about 2-3 weeks on less common data structures and algorithms to make room
for parallelism (using more processors to increase throughput) and concurrency (controlling access to shared
resources). This is done at a high level, for example in Java with locks and lightweight threads. (In 2014-2015, the concurrency piece beyond a contrast with parallelism moved to CSE333.)
-
CSE344 is a new course that will led to a revised CSE444. It lets students interested in using databases and
other data-management tools have a useful course and then let CSE444 focus on designing/implementing
database-management systems.
-
CSE351 is not a hardware course, focusing instead on exposing students to the key levels of the system
stack below Java (C, assembly, O/S, hardware) and how they connect to each other. There is no lab.
-
CSE352 is a lab-intensive hardware course, drawing on hardware material previously covered in
CSE370 and CSE378, as well as putting more emphasis on embedded systems and systems integration.
As a trade-off, there is less material on processor design and virtual memory at the 300-level. (It went away in the 2015 CompE revision.)
-
CSE333 is a new course to provide more significant systems-programming
experience (in C and C++). Whereas CSE351 is less “about
C” than CSE303 was, CSE333 has CSE351 as a pre-req and will
focus on systems-level software. It has aspects of teaching C/C++
programming but also aspects of teaching systems-software issues like
performance, IO, and asynchrony. (In ~2014, CSE333 took on an
introduction to concurrency and synchronization when it left CSE332.
Earlier than that, CSE333 became a pre-req for CSE451.)
-
Not requiring STAT390/391 (while requiring CSE312 instead). STAT391 gained special status as a CSE core course and later (~2014) gained a CSE312 pre-req.
-
CompE students used to have to take EE215 and the hardware track also had to take EE233. Those
are both still options, but as a replacement we encourage EE205 Signal Conditioning. We feel
EE205 is a better match for what CompE students need, but EE215/233 is also suitable and can
work better for double-majors or for scheduling reasons (since EE205 is offered only once a year).