Computer Science Major (BS/BA)
CS Course Requirements
CS Technical Elective

The courses below fulfill the Technical Elective requirement in computer science.

EECS 301 - Introduction to Robotics Laboratory

A laboratory-based introduction to robotics. Focus will be on both hardware (sensors and actuators) and software (sensor processing and behavior development). Topics will include: the basics in kinematics, dynamics, control, and motion planning; and an introduction to Artificial Intelligence (AI) and Machine Learning (ML). Formerly EECS 295. This course fulfills the AI Depth requirement.

EECS 303 - Advanced Digital Logic Design

Overview of digital logic design. Implementation technologies, timing in combinational and sequential circuits, EDA tools, basic arithmetic units, introduction to simulation and synthesis using VHDL.

EECS 315, 497 - Design, Technology, and Research

Design, Technology, and Research (DTR) is an EECS and Segal learning initiative that empowers students to drive cutting-edge research through the development of systems that shape new experiences with people and technology. Students participate in DTR through fast-paced, quarter-long programs (intended to be repeated). Students work with a mentor to identify a direction of research, explore and iterate over designs, prototype at varying fidelities, build working systems, conduct evaluative studies, and report findings through conference publications. As a cohort, each week students demo their prototypes, provide and receive feedback, and help each other resolve technical challenges. DTR adapts and extends agile development and design-based research practices with scrums, sprints, studio critique, design logs, and pair research. Note: This course is only for IE/MFE students - CS/CIS students are not allowed to register for this course, and it does not carry credit towards the CS/CIS major.

EECS 321 - Programming Languages

This course introduces students to the key features of programming languages. Students implement a series of interpreters that nail down the precise details of how various aspects of programming languages behave. Students are assumed to understand trees and (mathematical) functions that process them; the course builds up to the features of real programming languages from there.

EECS 322 - Compiler Construction

The compiler is the programmer's primary tool. Understanding the compiler is therefore critical for programmers, even if they never build one. Furthermore, many design techniques that emerged in the context of compilers are useful for a range of other application areas. This course introduces students to the essential elements of building a compiler: parsing, context-sensitive property checking, code linearization, register allocation, etc. To take this course, students are expected to already understand how programming languages behave, to a fairly detailed degree. The material in the course builds on that knowledge via a series of semantics preserving transformations that start with a fairly high-level programming language and culminate in machine code. This course satisfies the project requirement.

EECS 325 - Artificial Intelligence Programming

Introduction to Lisp and programming knowledge-based systems and interfaces. Strong emphasis on writing maintainable, extensible systems. Topics include: semantic networks, frames, pattern matching, deductive inference rules, case-based reasoning, discrimination trees. Project-driven. Substantial programming assignments.

EECS 330 - Human Computer Interaction

Introduction to human-computer interaction and the design of systems that work for people and their organizations. The goal is to understand the manner in which humans interact with, and use, their computers for productive work. The course focus is on the interface as designed artifact. The interface is a design problem without a single "correct" solution but which has many "good" solutions and a plethora of "bad" solutions. Class discussion centers on what makes an interface good and proven techniques for designing interfaces that meet human needs. This course satisfies the CS Project Course, CS Breadth: Interfaces, and CD Depth: Interfaces requirements.

EECS 332 - Introduction to Computer Vision

Introduction to computer and biological vision systems, image formation, edge detection, image segmentation, texture, representation and analysis of two-dimensional geometric structures, and representation and analysis of three-dimensional structures.

EECS 335 - Intro to the Theory of Computation

This course gives an introduction to the mathematical foundations of computation. The course will look at Turing machines, universal computation, the Church-Turing thesis, the halting problem and general undecidability, Rice’s theorem, the recursion theorem, efficient computation models, time and space (memory) bounds, deterministic and nondeterministic computation and their relationships, the P versus NP problem and hard problems for NP and beyond. Note: This course will replace Math 374 (Theory of Computability and Turing Machines) which is listed as a recommended way to fulfill the undergraduate theory breadth requirement in CS but hasn’t been taught in several years. The Math department is happy to give it up.

EECS 336 - Design & Analysis of Algorithms

Algorithm design and analysis is fundamental to all areas of computer science and gives a rigorous framework for the study optimization. This course provides an introduction to algorithm design through a survey of the common algorithm design paradigms of greedy optimization, divide and conquer, dynamic programming, network flows, reductions, and randomized algorithms. Important themes that will be developed in the course include the algorithmic abstraction-design-analysis process and computational tractability (e.g., NP-completeness).

EECS 337 - Intro to Natural Language Processing

A semantics-oriented introduction to natural language processing, broadly construed. Representation of meaning and knowledge inference in story understanding, script/frame theory, plans and plan recognition, counter-planning, and thematic structures. This course satisfies the project requirement

EECS 338 - Practicum in Intelligent Information Systems

A practical excursion into the building of Intelligent Information Systems. Each student will develop a working program in the area of information access, management, capture, or retrieval. Project definition, data collection, technology selection, implementation, and project management. Semantics-oriented introduction to natural language processing, broadly construed. Representation of meaning and knowledge inference in story understanding, script/frame theory, plans and plan recognition, counter-planning, and thematic structures. This course satisfies the project requirement.

EECS 339 - Intro to Databases

Data models and database design. Modeling the real world: structures, constraints, and operations. The entity relationship to data modeling (including network hierarchical and object-oriented), emphasis on the relational model. Use of existing database systems for the implementation of information systems. This course satisfies the project requirement.

EECS 340 - Introduction to Computer Networking

A top-down exploration of networking using the 5-layer model and the TCP/IP stack. HTTP, FTP, DNS, BSD Sockets, concurrent servers, checksums, reliable transport with stop-and-wait, go-back-n, selective repeat, flow control, congestion control, TCP, unicast routing, multicast routing, router architecture, IP, IPv6, IP multicast, MAC protocols and LANs, Ethernet , wireless networks, and network security. Over the course of the quarter, students build web clients and servers, a fully compatible TCP/IP stack that can run them, and evaluate routing protocols in simulation. This course satisfies the project requirement.

EECS 343 - Operating Systems

A fundamental overview of operating systems. Topics covered include: Operating system structures, processes, process synchronization, deadlocks, CPU scheduling, memory management, file systems, secondary storage management. Requires substantial programming projects. Approved for Systems Breadth and Depth in the CS curriculum in McCormick and Weinberg This course satisfies the project requirement.

EECS 344 - Design of Problem Solvers

Principles and practice of organizing and building AI reasoning systems. Topics include pattern-directed rule systems, truth-maintenance systems, and constraint languages. This course satisfies the project requirement.

EECS 345 - Distributed Systems

Basic principles behind distributed systems (collections of independent components that appear to users as a single coherent system) and main paradigms used to organize them. This course satisfies the project requirement

EECS 346 - Microprocessor System Design

Structure and timing of typical microprocessors. Sample microprocessor families. Memories, UARTS, timer/counters, serial devices and related devices. MUX and related control structures for building systems. Interrupt programming. Hardware/software design tradeoffs.

EECS 348 - Intro to Artificial Intelligence

Core techniques and applications of artificial intelligence. Representation retrieving and application of knowledge for problem solving, planning, probabilistic inference, and natural language understanding.

EECS 349 - Machine Learning

Machine Learning is the study of algorithms that improve automatically through experience. Topics covered typically include Bayesian Learning, Decision Trees, Genetic Algorithms, Neural Networks.

EECS 350 - Introduction to Computer Security

The past decade has seen an explosion in the concern for the security of information. This course introduces students to the basic principles and practices of computer and information security. Focus will be on the software, operating system and network security techniques with detailed analysis of real-world examples. Topics include cryptography, authentication, software and operating system security (e.g., buffer overflow), Internet vulnerability (DoS attacks, viruses/worms, etc.), intrusion detection systems, firewalls, VPN, Web and wireless security. Students with good performance in the class will be awarded researchship in the academic year and/or the summer. This course can help satisfy the project course requirement for undergraduates and satisfy the breadth requirement in computer systems for system Ph.D. students. This course satisfies the project requirement

EECS 351-1 - Intro to Computer Graphics

First in a 3-course series to teach the core principles, ideas & math behind all forms of computer-assisted picture-making; complementary/compatible with computer-game design interests. After this course you can write your own programs to depict animated 2D and 3D objects that respond to mouse and keyboard inputs, yet run in any modern web browser. We write WebGL programs in Javascript to create GPU-driven high-performance 3D graphics in any up-to-date web browser (Skeptical? try http://www.chromeexperiments.com/webgl/ , http://www.marky.pl/vector-field/) This course satisfies the project requirement.

EECS 351-2 - Intermediate Computer Graphics

Second in a 3-course series on the methods and theory of computer graphics, this project-oriented course explores how to describe shapes, movement, and lighting effects beyond the built-in abilities of WebGL. It includes interactive particle systems, simple rigid-body dynamics, explicit and implicit dynamics solvers (suitable for smoke, simple fluids and cloth) and an introduction to ray tracing (chrome, glass, and diffraction) with a few basic ideas for global illumination.

EECS 352 - Machine Perception of Music & Audio

Machine extraction of musical structure in audio, MIDI and score files, covering areas such as source separation and perceptual mapping of audio to machine-quantifiable measures. This course satisfies the project requirement

EECS 354 - Network Penetration and Security

This course will focus on remote computer penetration (hacking). The class will introduce basic theory for many different types of attacks; then we will actually carry them out in 'real-world' settings. The goal is to learn security by learning how to view your machine from a hacker's perspective. In addition, we encourage students to participate in the UCSB International Capture the Flag Competition. Capture the Flag is a network security exercise where the goal is to exploit other machines while defending your own. In fact, this course should prepare you for any one of many capture the flag competitions that take place year round.

EECS 361 - Computer Architecture I

Design and understanding of the computer system as a whole unit. Performance Evaluation and its role in computer system design; Instruction Set Architecture design, Datapath design and optimizations (e.g., ALU); Control design; Single cycle, multiple cycle and pipeline implementations of processor; Hazard detection and forwarding; memory hierarchy design; Cache memories, Virtual memory, peripheral devices and I/O.

EECS 366, 466 - Embedded Systems

Introduction to the design and evaluation of embedded systems, with emphasis on the system-level aspects of embedded systems. Topics include modeling (models of computation and models of communication), survey of embedded system hardware, software and operating system issues specific to embedded system design, mapping specifications to hardware, and testing and evaluation of embedded systems.

EECS 368, 468 - Programming Massively Parallel Processors with CUDA

This course focuses on developing and optimizing applications software on massively parallel graphics processing units (GPUs). Such processing units routinely come with hundreds to thousands of cores per chip and sell for a few hundred to a few thousand dollars. The massive parallelism they offer allows applications to run 2x-450x faster than on conventional multicores. However, to reach this performance improvement, the application must fully utilize the computational, storage and communication resources provided by the device. This course discusses state-of-the-art parallel programming optimization methods to achieve this goal. Ideally this course will bring together people with strong programming skills, with people with a strong need for solving compute-intensive problems that can benefit from programming graphics processors. The initial part of the course will discuss a popular programming interface for graphics processors, the CUDA programming tools for NVIDIA processors. The course will continue with a closer view of the internal architecture of graphics processors and how it impacts performance. Finally, implementations of applications and algorithms on graphics processors will be discussed. The course is lab intensive, and it will utilize the machines at the Wilkinson lab. Students taking the course for EECS-368 credit will work on labs that utilize advanced parallel programming, data layout, and algorithm decomposition concepts. Students taking the course for EECS-468 credit will work on the same labs and also a quarter-long open-ended final project that draws upon their own interests and line of research. Ideally, in their final project these students will form interdisciplinary teams and complete the first steps of optimizing a real-world compute-intensive problem in science or engineering (e.g., materials science, astrophysics, civil engineering, etc.).

EECS 370 - Computer Game Design

Fundamentals of computer game design. Topics include: Plot, narrative and character, simulation for creating game worlds, AI for synthetic characters, tuning game play. Substantial programming and project work. Approved for the Breadth Interfaces and Depth Interfaces requirement in the CS curriculum. This course satisfies the project requirement

EECS 371 - Knowledge Representation and Reasoning

Principles and practices of knowledge representation, including logics, ontologies, common sense knowledge, and semantic web technologies. Prerequisite: 3EECS 348, EECS 325, or equivalent experience with artificial intelligence. This course satisfies the project requirement.

EECS 372, 472 - Designing and Constructing Models with Multi-Agent Languages

Joint with EECS 372. This course focuses on the exploration, construction and analysis of multi-agent models. Sample models from a variety of content domains are explored and analyzed. Spatial and network topologies are introduced. The prominent agent-based frameworks are covered as well as methodology for replicating, verifying and validating agent-based models. We use state of the art ABM and complexity science tools. This course can help satisfy the project course and artificial intelligence area course requirement for CS and CIS majors, and satisfy the breadth requirement in artificial intelligence for Ph.D. students in CS. It also satisfies a design course requirement for Learning Sciences graduate students, counts towards the Cognitive Science specialization and as an advanced elective for the Cognitive Science major.

EECS 394 - Software Project Management & Development

EECS 394 is focused on the process of software development from the perspective of both rapid prototyping and responsive relationships with clients. We’ll take an Extreme Programming approach in which teams will maintain tight, iterative development cycles that include ongoing interactions with clients. In the style of EDC, the class is project oriented, with teams focused on specific projects during the entire 10 week period. The class also has a studio feel, with team interactions during class guided by faculty and graduate students.

EECS 395 - Economics and Computation

EECS 395, 495 - TBA

EECS 395, 495 - The Art of Multicore Concurrent Programming

- NOTE: 2015 FALL COURSE CANCELLED - You will not get the automatic speedup for your software when you upgrade to a new computer, since the frequency scaling is virtually stopped, and you only get more cores on new machines. For speed, you have to do concurrent programming for multicores. This course will teach you how to do it effectively. We will start with synchronization primitives, mutual exclusion, and consensus, and talk about different programming models such as multi-threading, locking, and transactional memory. We will also discuss how to debug and check concurrent programs, which may give your different behaviors at different executions.

EECS 395, 495 - Algorithmic Techniques for Bioinformatics Seminar


EECS 395, 495 - Computational Auditory Scene Analysis

Computational auditory scene analysis (CASA) is the study of how a computational system can organize sound into perceptually meaningful elements. Problems in this field include source separation (splitting audio mixtures into individual sounds), source identification (labeling a source sound), and streaming (finding which sounds belong to a single explanation/event). This course is an advanced graduate course covering current research in the field.

EECS 395, 495 - Optimization Techniques for Machine Learning and Deep Learning

Fundamental machine learning algorithms are now baked into almost every moment of our digital lives. Machine learning is there when we surf the web using Google, when we upload photos to Facebook and our friends are automatically tagged, or when Amazon recommends products to us. And machine learning is the lynchpin of many? ?technologies? ?that? ?lie? ?just? ?over? ?the? ?horizon? ?-? ?from? ?the? ?self? ?driving  cars,? ?to? ?chatbots? ?and? ?fully? ?formed? ?digital? ?assistants,? ?to? ?fully? ?automated? ?factories.  This course offers a holistic and hands-on introduction to the fundamentals of mathematical optimization for machine learning and deep learning. Using a range of real datasets and basic Python libraries for data manipulation, vector/matrix algebra, and automatic differentiation students will code up - from scratch - fundamental optimization algorithms for popular machine learning / deep learning models including: least squares linear and nonlinear regression, logistic regression, support vector machines, feedforward neural networks, convolutional networks, gradient boosting, K-Means, Principal Component Analysis, and Recommender Systems.

EECS 395, 495 - Introduction to Computational Learning Theory

This course will introduce some of the central topics in computational learning theory, a field which approaches the question "whether machines can learn" from the perspective of theoretical computer science. We will study well defined and rigorous mathematical models of learning where it will be possible to give precise and rigorous analysis of learning problems and algorithms. A big focus of the course will be the computational efficiency of learning in these models. We will develop some provably efficient algorithms and explain why such provable algorithms are unlikely for other models. We will only cover topics which permit a mathematically rigorous analysis and hence mathematical maturity is absolutely necessary. In particular, some familiarity with basic probability (such as linearity of expectation) and basic linear algebra will be necessary. Also, the emphasis of the course will be on proofs, so if you are in this course, you should enjoy proofs and math.

EECS 396, 496 - Computational Geometry

EECS 375, 475 - Machine Learning: Foundations, Applications, and Algorithms

From robotics, speech recognition, and analytics to finance and social network analysis, machine learning has become one of the most useful set of scientific tools of our age. With this course we want to bring interested students and researchers from a wide array of disciplines up to speed on the power and wide applicability of machine learning. The ultimate aim of the course is to equip you with all the modelling and optimization tools you’ll need in order to formulate and solve problems of interest in a machine learning framework. We hope to help build these skills through lectures and reading materials which introduce machine learning in the context of its many applications, as well as by describing in a detailed but user-friendly manner the modern techniques from nonlinear optimization used to solve them. In addition to a well curated collection of reference materials, registered students will receive a draft of a forthcoming manuscript authored by the instructors on machine learning to use as class notes.

EECS 435 - Deep Learning Foundations from Scratch

The last decade has seen a resurgence of deep neural networks as the machine learning tool of choice for many application areas including computer vision, reinforcement learning, and natural language processing. This course offers a holistic and hands-on introduction to deep networks, their many varieties and applications, as well as the algorithms used to train them. In this course we discuss the foundations of Feedforward Networks, Convolutional Networks, and Recurrent Networks, as well as their usage within popular Reinforcement Learning frameworks. Using real datasets and basic Python libraries for data manipulation, vector/matrix algebra, and automatic differentiation students will code up - from scratch - popular examples of each such network architecture and apply them to applications in natural language processing, computer vision, speech recognition, and automatic control.

EECS 395, 495 - Geospatial Vision and Visualization

Geospatial information has become ubiquitous in everyday life, as evidenced by on-line mapping services, navigation software on mobile devices and vehicles, and HD map for automated driving. Behind the scenes is digital map content engineering that enables all types of location-based services. Course material will be drawn from the instructor's research experience at HERE (formerly NAVTEQ), a leader in mapping and location technology. This course will provide comprehensive treatment of computer vision, image processing and visualization techniques in the context of digital mapping, global positioning and sensing, next generation map making, and three-dimensional and high definition map content creations. Real world problems and data and on-site industry visits will comprise part of the course curriculum.

EECS 396, 496 - Data Science Seminar

In this seminar, we will survey the fundamentals of data science by reading state of the art research papers in this area. This class will cover the basics of how to manipulate, integrate, and analyze data at scale. To receive credit, students must give in-class presentations and complete a final project.

EECS 396, 496 - Programming Languages Seminar

This course is a PL reading seminar aimed at graduate students (or undergraduates who have taken 321 and 322 and want more). The content varies from year to year; contact the instructor for this year's topic.

EECS 396, 496 - Special Topics in Swarms and Multi-robot Systems

Advances in technology have begun to allow for the production of large groups, or swarms, of robots; however, there exists a large gap between their current capabilities and those of swarms found in nature or envisioned for future robot swarms. These deficiencies are the result of two factors, difficulties in algorithmic control of these swarms, and limitations in hardware capabilities of the individuals. This class surveys the state of the art research that addresses these deficiencies. Coursework includes reading research papers, student presentations and discussion of select papers, and a final project implementing studied topics in a real or simulated robot swarm.

EECS 323 - Code Analysis and Transformation

Fast, highly sophisticated code analysis and code transformation tools are essential for modern software development. Before releasing its mobile apps, Facebook submits them to a tool called Infer that finds bugs by static analysis, i.e., without even having to run the code, and guides developers in fixing them. Google Chrome and Mozilla Firefox analyze and optimize JavaScript code to make browsers acceptably responsive. Performance-critical systems and application software would be impossible to build and evolve without compilers that derive highly optimized machine code from high-level source code that humans can understand and reason about efficiently. Understanding what modern code analysis and transformation techniques can and can't do is a prerequisite for research on both software engineering and computer architecture, since hardware relies on software to realize its potential. In this class, you will learn the fundamentals of code analysis and transformation, and you will apply them by extending LLVM, a compiler framework now in production use by Apple, Adobe, Intel and other industrial and academic enterprises

EECS 396, 496 - Systems Programming in Rust

Modern, safe programming languages such as Java and Python have become increasingly accepted for application-level programming, but for systems programming, which often requires precise, low-level control of system resources, programmers still turn to C and C++. The new programming language Rust, under development by Mozilla, promises the best of both worlds: the type safety of Java with the speed and expressiveness of C++. Through discussions, lectures, and programming exercises, students will learn how to program in Rust and to use its resource ownership model effectively. Rust is especially well suited for our particular focus, concurrent programming, so students will use Rust as a vehicle for exploring both classic concurrency problems and more contemporary concerns.

EECS 396, 496 - Affective Computing Seminar

Affective computing represents a broad, interdisciplinary research and practice area focusing on a range of topics, including: affect-adaptive human-computer interaction, affective user modeling, computational models of emotion, cognitive-affective agent architectures; emotion sensing and recognition; and emotion expression. The course will also explore applications of affective computing in a variety of contexts, including intelligent tutoring, affect-adaptive user interfaces, affective gaming, and intelligent social robots and virtual agents. Introduction to affective computing will be provided through a combination of lectures, student presentations of selected literature, projects and class discussion. The course content and format will be appropriate for graduate and advanced undergraduate students in computer science, cognitive science, psychology, learning sciences, and human factors.

EECS 396, 496 - Type Systems

The course assumes the background of 321 and will cover various type system material, including the polymorphic lambda calculus, Hindley-Milner type inference, dependent types, subtyping, and substructural types, which form the theoretical basis for the type systems of Java, Scala, Swift, OCaml, Coq, Agda, and Rust. The course will draw on material from the research literature as well as textbooks. Expect to have to read original research papers on some of the topics. Homework will be those readings and two significant projects involving the implementation and use of two of the type systems that we cover.

EECS 396, 496 - Special Topics in Game AI - Logic Programming

Declarative programming languages allow programmers to describe what a solution to a problem would look like, rather than a specific method for finding one. The language’s run-time system then uses a general-purpose search algorithm to find a specific solution or enumerate many solutions. Logic programming is the most popular declarative technique for game AI research, having been used extensively for procedural content generation, game generation, and game design testing. In this course, we will explore two logic programming languages, Prolog and Answer Set Programming, their implementation, and their applications in game AI. We will also discuss general issues in philosophical logic, such as the distinction between sense and reference, the problem of negation, the expressive inadequacy of first-order logic, model theory, and intuitionism.

EECS 396, 496 - Companion Cognitive System Studio

This course enables students to tackle building new cognitive systems based on the Companion cognitive architecture being developed at Northwestern, which incorporates analogical reasoning and learning, a large knowledge base, natural language understanding, and sketch understanding. It will be taught studio-style, with intensive hands-on work and group projects.

EECS 396, 496 - Randomized Algorithms

The power of randomness is one of the most enduring mysteries of computation. In the last 30+ years, several algorithms have been designed which crucially use randomness and beat their deterministic counterparts in terms of efficiency, simplicity and nearly every other computational resource (with the obvious exception of "randomness"). In this course, we start with simple examples such as pattern matching, primality and go on to explore topics such as the power of Markov chains, hashing of high dimensional data and Martingales.

EECS 396, 496 - Multi-Modal Analytics

The course assumes the background of 321 and will cover various type system material, including the polymorphic lambda calculus, Hindley-Milner type inference, dependent types, subtyping, and substructural types, which form the theoretical basis for the type systems of Java, Scala, Swift, OCaml, Coq, Agda, and Rust. The course will draw on material from the research literature as well as textbooks. Expect to have to read original research papers on some of the topics. Homework will be those readings and two significant projects involving the implementation and use of two of the type systems that we cover.

EECS 396, 496 - Quadrotor Design and Control

Centered around a project where teams (1 to 2 students per team) create and program a visually-guided autonomous quadrotor robot, this class focuses on advanced embedded control of an electromechanical system. Topics include mechanical/electrical assembly, programming interfaces between an embedded computer (such as a Raspberry PI running Linux) and external sensors/actuators (such as an IMU, camera, or motor controllers), programming and tuning a timing-critical control loop for stable flight, using pre-existing computer vision software for tracking optical targets, and creating a software stack that interacts with low-level code to create a desired high level behavior.

EECS 396, 496 - Computational Geometry

EECS 397, 497 - Advanced Topics in Compilers

EECS 397, 497 - Digital Forensics and Incident Response

This course will focus on Digital Forensics and Incident Response (Investigations). This class will introduce the basic theory of Digital Forensics and in the lab, we will actually apply the knowledge in practical scenarios. The goal is to learn how to investigate the digital artifacts left on hard drives, logs and other networking devices. The course shall prepare you to conduct data preservation and analysis on Windows, Linux and Macintosh platforms. Students will also get exposure to the Techniques, Tactics and Procedures (TTPs) of the prominent Threat Actors and will learn to conduct digital investigations with a sound process.

EECS 397, 497 - (Special Topics) Innovation in Journalism & Technology

This is a joint projects class with Medill in conjunction with the Knight News Innovation Lab at Northwestern. McCormick students (primarily CS and CE majors) and journalism students will join cross-functional teams to assess and develop, from both an audience/market perspective and a technology perspective, a range of technology projects with the ultimate goal of deployment for impact in media and journalism. Some projects may continue over the summer if students are interested.

EECS 397, 497 - Internet-scale Experimentation

Internet-scale Experimentation is a graduate-level seminar exploring the challenges of large-scale networked system experimentation and measurements.

EECS 397, 497 - Game Development Studio

In this course, students will design and develop games using the Unity game engine, with focus on team-based projects and agile development practices. Lectures will cover game design theory, game architecture and implementation, and the business of game development. Students will participate in class discussion and evaluation of projects in progress, to develop their skills in iterative design and implementation. Please note that this course requires significant amount of programming outside of class.

EECS 397, 497 - Computational Photography Seminar

This course is second in a two-part series that explores the emerging new field of Computational Photography. Computational photography combines ideas in computer vision, computer graphics, and image processing to overcome limitations in image quality such as resolution, dynamic range, and defocus/motion blur. This course will first cover state-of-the-art topics in computational photography such as motion/defocus deblurring cameras, light field cameras, computational displays, and much more!

EECS 397, 497 - Algorithms and Society

This is a seminar course that will examine how algorithms are shaping society (and vice versa). We will cover issues related to income inequality, the 2016 U.S. presidential election, racial and ethnic bias, rural areas, and others topics. The primary weekly activities will be reading "hot-off-the-presses" literature, discussion, and presentation. The primary deliverable will be designing a research project for publication at a prominent scientific publication venue (i.e. this is a research/course "twofer"). This course will appeal equally to students from McCormick and from the School of Communication, and both types of students will be challenged in their domain of expertise.

EECS 397, 497 - Wireless and Mobile Health (mHealth)

With the increasing research activity in the field of mobile health there has been increased interest in passive sensing and activity recognition systems. The ultimate goal of this research is to improve our understanding of human activity and behavior and to design interventions and solutions that improve health outcomes for individuals, reduce healthcare costs and improve quality of life. The number of challenges in designing, implementing and evaluating these mHealth systems is growing, and so is the need for experts in this field.

EECS 397, 497 - Innovation Lab: Building Technologies for the Law

----Winter course is called: CS + X INNOVATION LAB: Building Technologies for the Law (Design and Development) ----Spring course is called: CS + X INNOVATION LAB: Building Technologies for the Law (Getting to the Product) This is a two quarter class in which CS students will work on teams with Law School students to designed, develop and test innovative products in the legal space. The first quarter will be focused on ideation, design and prototyping. The focus of the second quarter will be the development and hardening of the solution. There will be final presentations associated with each of the two phases of the work.


EECS 397, 497 - Social Computing and Crowd Sourcing

This seminar and project course studies the social and technical aspects of social and crowd computing systems. Students read research articles, participate in weekly design charettes and hackathons, develop novel crowd computing systems, and conduct studies of existing social computing systems. The class teaches students about interfaces and design through doing. On any given project (and there is a new one almost every week), students prototype at varying fidelities, test their prototypes on fellow classmates and outside users, iteratively design based on user feedback, and present their results to the class through studio critique. The process teaches students to reason about the socio and technical aspects of developing a social or crowd computing system.

EECS 397, 497 - Inclusive Making

Excitement for the Maker Movement continues to grow. Part of this growth stems from the idea that Making provides a means for democratization of fabrication and invention. While this is true, in part, the practices and people that are typically included under this brand are limited. In particular, issues of diversity, equity and inclusivity are seldom at the forefront of the design and implementation of Makerspaces, the tools used or the artifacts created. Hence, the purpose of this course is to bring issues of diversity, equity and inclusivity to the forefront. In particular, the course will push students to 1) critically explore Making as a practice that promotes democratization, 2) develop interfaces that allow a broader population of students to participate in digital fabrication and 3) co-design artifacts that positively impact accessibility and inclusivity. The course will include guest speakers, laboratory portions and a final project that encourages students to develop publishable scholarship and/or functional prototypes, as they work in interdisciplinary teams.

EECS 446 - Kernel and Other Low-level Software Development

The development of low-level software such as drivers, kernels, hypervisors, run-times, system libraries, JITs, and firmware is very different from the development of applications. The goal of this class is to teach students how such development is done, both in terms of the modes of thinking needed to design, implement, debug, and optimize low-level software, and in terms of how to leverage representative, widely-used tools to do so. Some of the techniques the class covers are also used in the design and optimization of the performance-critical parts of applications.

EECS 440 - Advanced Networking

The Internet has evolved from a small, well controlled, and trusted network, into a gigantic, loosely controlled, and highly uncooperative infrastructure of astonishing scale and complexity. Not only that different hosts or networks have divergent functional or economical interests, but the Internet has become a “playground” for malicious denial-of-service attackers of all kinds. Moreover, its everyday operation is often poorly understood, and existing solutions to many of the classical challenges remain unsatisfactory. Hence, the design of Internet is far from complete, and it is certain that it will continue to change. This class is intended to help you understand how and why, by letting the Internet to become your “playground” for a quarter.

EECS 441 - Resource Virtualization

The bulk of the time in this class examining a virtual machine monitor (VMM) in depth, at the source code level. The course explains the hardware/software interface of a modern x86 computer in detail. A VMM is an operating system that is implemented directly on top of the hardware interface, and itself presents a hardware interface to higher-level software. Students will also acquire valuable kernel development skills. This course satisfies the project requirement

EECS 450 - Internet Security

Cybercrime has exploded over the last decade. In this course, we will start with the basic concepts of network security, then focus on security challenges of network and distributed systems as well as the counter-attack approaches.

EECS 469 - Machine Learning and Artificial Intelligence for Robotics

A coverage of artificial intelligence, machine learning and statistical estimation topics that are especially relevant for robot operation and robotics research. The focus is on robotics-relevant aspects of ML and AI that are not covered in depth in EECS 348 or EECS 349. Course evaluation will be largely project-based.

EECS 473-1 - NUvention: Web + Media (ENTREP 473)

This course satisfies the software development (breadth) and project requirement (NOTE: ONLY IF BOTH QUARTERS ARE FINISHED). NUvention:Web is an interdisciplinary experiential learning program designed to expose students to the entire product and business development life cycle for a software company. Project areas include iPad/Tablet App, Mobile Applications, New Media, Social Gaming, Twitter or Facebook Apps, eCommerce/Deals, Analytics, Cloud, Big Data or ideas from students in the program. Teams will be able to continue to work on their projects after the completion of the course. Past NUvention:Web teams have gone on to make TechCrunch, PCMag, Rolling Stone and GigaOM headlines and join incubators, while others are bootstrapping and building their businesses to this day.

EECS 473-2 - NUvention: Web + Media (ENTREP 473)

This course satisfies the software development (breadth) and project requirement (NOTE: ONLY IF BOTH QUARTERS ARE FINISHED). NUvention:Web is an interdisciplinary experiential learning program designed to expose students to the entire product and business development life cycle for a software company. Project areas include iPad/Tablet App, Mobile Applications, New Media, Social Gaming, Twitter or Facebook Apps, eCommerce/Deals, Analytics, Cloud, Big Data or ideas from students in the program. Teams will be able to continue to work on their projects after the completion of the course. Past NUvention:Web teams have gone on to make TechCrunch, PCMag, Rolling Stone and GigaOM headlines and join incubators, while others are bootstrapping and building their businesses to this day.

EECS 474 - Probabilistic Graphical Models

Probabilistic graphical models are a powerful technique for handling uncertainty in machine learning. The course will cover how probability distributions can be represented in graphical models, how inference and learning are performed in the models, and how the models are utilized for machine learning in practice.