The following is a list of courses that I occasionally teach. Consult the class schedule for a definitive list of what is offered and who is teaching.

ComS 252: Linux Operating System Essentials

Typically offered: Fall, online only

This is a hands-on course designed to demonstrate the installation, utilization, and administration of the Linux operating system for a personal computer. A secondary focus of the course is on interoperability of Linux with other operating systems, including Windows and Mac. While the emphasis is Linux, much of what is covered applies also to UNIX systems and Mac OS X. This is an online, asynchronous course, meaning students watch lecture videos whenever they like during the week.

ComS 327 (previously 229): Advanced Programming Techniques

Typically offered: Fall, Spring

This course covers C and C++, with an emphasis on differences between these languages and managed languages like Java. Topics include memory management, parameter passing, inheritance, version control systems, build systems, and debugging tools. Significant (on the order of two thousand lines of code, total), open-ended (students are responsible for the overall design), semester-long programming projects are given.

ComS 412: Formal Methods in Software Engineering

Typically offered: Spring

This course is an introduction to the use of Formal Methods for reasoning about the correctness of systems. The primary focus of the course is on Model checking, with other topics covered as time permits. Specific topics covered in the course include Temporal logic (CTL, LTL, and others), Kripke structures, Model checking algorithms and software, Fixed points, Counter-examples, High-level formalisms, and Program verification. Advanced topics (covered as time permits) include Probabilistic logics and Markov chains, SAT solvers, Theorem provers, Decision diagrams, and Symbolic model checking.

ComS 440: Principles and Practice of Compiling

Typically offered: Spring

This course is an introduction to the theory and practice of building compilers. There is a semester-long project in which students build their own compiler for a subset of the C programming language. The project is broken into parts, roughly corresponding to the different phases of a compiler. Specific topics covered in the course include lexical analysis, parsing methods, code generation, runtime environment, and tools for constructing compilers. Other topics will be covered as time permits.