Teaching

I have a great passion for teaching computer science, mathematics, and combinations thereof. Here are some courses I've been involved with along with a few artifacts.

SI 413: Programming Languages
Fall 2022,
Fall 2021,
Fall 2018,
Fall 2013, Fall 2012, Fall 2011.

A fourth-year course introducing functional programming, general principles
of programming language design, interpreters, and compilers.

SD 212: Data Science & Programming II
Spring 2023.

Second programming course for Data Science majors, building independence and
depth in Python programming with propular packages such as pandas and numpy,
as well as introducing regular expressions, error handling, and basic multithreading.
The usage of the bash shell and standard command-line utilities for file manipulation
and data cleaning is also introduced.

SD 211: Intro to Data Science and Programming
Fall 2022.

Intro course for the Data Science major, teaching the foundation of computer programming alongside basic
data science concepts and skills needed to process and analyze structured and unstructured digital data.

IC 312: Data Structures
Fall 2022,
Fall 2015,
Fall 2014.

Third-year course on classic data structures and basic algorithm analysis.

SI 486I: Randomized and Blockchain Technology
Spring 2022.

Upper-level elective course on how cryptocurrencies, blockchains, and smart contracts work,
from a technical and economics perspective.

SI 335: Computer Algorithms
Spring 2021,
Spring 2016,
Spring 2015,
Spring 2014, Spring 2013, Spring 2012.

Third-year course on algorithm design and analysis.

IC 210: Introduction to Computing
Fall 2020,
Fall 2018,
Fall 2016.

Introductory computer programming class for computer science and information technology majors.

IC 220: Computer Architecture and Organization
Spring 2020,
Spring 2012.

Second-year course introducing logic design, memory hierarchy, assembly language,
and the like.

SM 242: Discrete Math and Probability
Fall 2019.

Third-year course for computing majors introducing key concepts from set theory,
logic, proofs, linear algebra, probability, and statistics.

SI 486M: Randomness and Computation
Spring 2019,
Spring 2016,
Spring 2013.

This elective course looks at the role random numbers play in improving
computational processes. Covered topics range from random number generation to
randomized data structures and algorithms as well as randomized complexity theory.

IC 221: Systems Programming
Spring 2019.

Second-semester course on the foundations of Unix and interacting with the operating
system via the shell (bash) and the system call API (in C).

SI 204: Introduction to Computer Science
Spring 2017.

Introductory computer programming class in C for computer and electrical engineers
(mostly) as well as some computer science and information technology majors.

SY 301: Data Structures for Cyber Operations
Fall 2016.

Third-year course on classic data structures, also incorporating object-oriented programming,
some algorithm analysis, and a little cryptography, with a special focus on computer
security applications.

SI 110:
Introduction to Cyber Security
Spring 2015, Spring 2014.

A required course for all first-year USNA students introducing the technical
foundations of computers, programs, wired and wireless networks, and the web,
and the challenges in securing these systems from malicious attackers.

CS 240: Data Structures and Data Management
Instructor, Winter 2010 and Spring 2011.

Second-year course for computer science majors covering the "greatest
hits" of data structures and algorithms, along with basic complexity
analysis.

I co-taught this course with
Reza Dorrigiv.

Some course materials I produced:
lecture modules and
assignments.

CS 135: Designing Functional Programs
Instructor, Fall 2008.

First-year course for computer science majors and keen mathematics students
covering introductory programming techniques using Scheme.

Co-taught with 4 other instructors/professors in the department.

CS 341: Algorithms
Teaching Assistant, Winter 2009.

Third-year course for computer science students on advanced topics in
algorithms, focusing especially on graph algorithms, recursive analysis,
and introductory complexity theory.

CS 487/687: Introduction to Symbolic Computation
Teaching Assistant,
Winter 2008.

Undergrad/grad course covering the algorithms for the main problems in the
field: arithmetic on polynomials and integers, "fast" methods, primality
testing, polynomial factorization, dense and sparse linear algebra, etc.

My tutorial on using Maple.

Two
lectures on multivariate polynomials
(PDF) (from 2009).

CS 135: Designing Functional Programs
Instructional Apprentice, Fall 2007.

Fall 2007

First-semester intro computer science course taught in Scheme.

CS 135 Tutorials designed by me.

CS 136: Elementary Algorithm Design and Data Abstraction
Instructional Apprentice,
Spring 2007

Second-semester intro computer science course taught in Scheme and Java.

CS 136 Tutorials designed by me.

CS 134: Principles of Computer Science
Instructional Apprentice in Winter 2007, Teaching Assistant in Fall 2006.

Second-semester intro computer science course taught in Java.

CISC 181: Introduction to Computer Science
Honors section:
Spring '06

Second-semester intro computer science course taught in C++.
Two labs I wrote:
on computing factorials and
on exceptions in C++ (cached)

CISC 105: General Computer Science
Honors section:
Fall '05

First-semester intro computer science course taught in C.

MATH 245: An Introduction to Proof Spring '06, Fall '05