Site news

(No news has been posted yet)

Available courses

Senior Software Engineering Project is a year long course in which students work in teams on a real-life project from industry, University affiliate, or non-profit organization. Rather than participate as a team member, students with significant full-time work experience as a software developer take the fall portion of the course working as mentors for teams. Students working on interdisciplinary projects in other departments take the fall portion of the course with their project component satisfied in another department.

Studies data abstractions (e.g., stacks, queues, lists, trees) and their representation techniques (e.g., linking, arrays). Introduces concepts used in algorithm design and analysis including criteria for selecting data structures to fit their applications. Requisites: Requires prerequisite courses of CSCI 1300 or CSCI 1310 or CSCI 1320 or ECEN 1030 or ECEN 1310 and APPM 1345 or APPM 1350 or MATH 1300 or MATH 1310 (all minimum grade C-). These prerequisites are stringently enforced.


Introduces the practice and research of human-centered computing, including the evolution of human-computer interaction to its forms today and the techniques of user-centered design. The course will survey topics that include social computing; tangible computing; mobility; and more. It will cover computing in society at large with respect to domains such as health, education, assistive technology, emergency response, and environment. Prerequisites: Restricted to students with 27-180 credits (Sophomores, Juniors or Seniors) only.

CSCI 3104: Analysis of Algorithms

Course Objectives

The key course objectives are as follows:

  • Learn a set of ''standard'' or canonical algorithms for abstract problem solving. Learning involves

    • Understand proofs of correctness and other properties of these algorithms.

    • Time and space complexity analysis.

    • Understand the relative merits or demerits in practice.

  • Apply: Adapt and combine algorithms creatively to solve problems that may arise in practice.

    • Learn key tricks (motifs) underlying the design of new algorithms for emerging applications.

Topics Covered

Roughly, we will cover the following topics (some of them may be skipped depending on the time available).

  • Introduction to Algorithms: Complexity analysis.

  • Divide and Conquer Algorithms.

  • Sorting and Order Statistics.

  • Hash functions.

  • Dynamic Programming.

  • Greedy Algorithms.

  • Graph Algorithms: Search, Minimum Spanning Trees, Shortest Paths, Network Flows.

  • Introduction to Linear and Integer Programming.

  • Some basic geometric algorithms.

  • Basics of Computational Complexity: P, NP, reductions and open problems.

This course is about principles, concepts, and ideas that underly programming languages. We will dissect programming languages by constructing interpreters. The semester project is to construct an interpreter for JavaScript (incrementally). We will see that interpreters are the basis for realizing computation, and we will study the programming language theory that enable us to reason carefully about a language's design and implementation. Our approach will be gradual in that we will initially consider a small subset of JavaScript and then slowly grow the aspects of the language that we consider.

Surveys data management, including file systems, database management systems design, physical data organizations, data models, query languages, concurrency, and database protection. Requisites: Requires prerequisite course of CSCI 3104 (minimum grade C-).

The overarching learning goal of this class is to create an appreciation for the tight interplay between mechanism, sensor, and control in the design of intelligent systems. This includes (1) formally describing the forward and inverse kinematics of a mechanism, (2) understanding the sources of uncertainty in sensing and actuation as well as to describe them mathematically, (3) how to discretize the robot’s state and reason about it algorithmically, and (4) experiencing 1-3 on a real robotic platform.

After using a variety of platforms, this iteration of the class will use the “Sparki“, a simple differential wheel platform from ArcBotics, allowing students to implement simple odometry, Markov localization and simple planning for object retrieval tasks.


Covers tools and practices for software development with a strong focus on best practices used in industry and professional development, such as agile methodologies, pair-programming and test-driven design. Students develop web services and applications while learning these methods and tools.

The objective of this course is provide an introduction to the theory of computation covering the following three branches of theoretical computer science:
  1. Automata Theory
    • Formalization of the notion of problems via formal languages
    • Formalization of the notion of computation using "abstract computing devices" called automata
    • Understanding a hierarchy of classes of problems or formal languages (regular, context-free, context-sensitive, decidable, and undecidable)
    • Understanding a hierarchy of classes of automata (finite automata, pushdown automata, and Turing machines)
    • Understanding applications to pattern matching, parsing, and programming languages
  2. Computability Theory
    • Understanding Church-Turing thesis (Turing machines as a notion of "general-purpose computers")
    • Understanding the concept of reduction , i.e., solving a problem using a solution (abstract device) for a different problem
    • Understanding the concept of undecidability , i.e., when a problem can not be solved using computers
  3. Complexity Theory
    • Complexity classes : how to classify decidable problems based on their time and space requirements
    • Complexity classes P and NP
    • When a problem is called intractable (NP-completeness)
    • Using reductions to prove problems intractable

Operating systems are an essential part of every computing system. They play a major role in determining the performance and usability of a computing system. This course is an introductory course covering the fundamental concepts in the design, implementation and evaluation of an operating system. While the field of operating systems has been undergoing rapid change, the fundamental concepts remain firmly clear.  This course covers these fundamental concepts comprised of device management, process management, memory management and network management.

This class focuses on design and implementation of network programs and systems. Topics include network protocols, file transfer, client-server computing, remote procedure call, and other contemporary network system design and programming techniques.

CSCI 4830-007 / CSCI 7000-007 / ATLS 4519-007 / ATLS 5519-007

This course provides an in-depth coverage of the underlying principles and practices involved in the design, implementation and evaluation of a distributed system.

Introduces the practice and research of human-centered computing, including the evolution of human-computer interaction to its forms today and the techniques of user-centered design. The course will survey topics that include social computing; tangible computing; mobility; and more. It will cover computing in society at large with respect to domains such as health, education, assistive technology, emergency response, and environment. Prerequisites: Restricted to students with 27-180 credits (Sophomores, Juniors or Seniors) only.

This course teaches the security mindset and introduces the principles and practices of computer security as applied to software, host systems, and networks. It covers the foundations of building, using, and managing secure systems. Topics include standard cryptographic functions and protocols, threats and defenses for real-world systems, incident response, and computer forensics.


Schedule and assignments at https://ericw.us/trow/ecen5032/

Turn in projects here

Forums for CSCI faculty

Communication for the curriculum committee

Undergraduate Committee Communication Site