Teaching

I was a teaching assistant in the Department of Computer Science at the University of Iowa. During my time as a teacher, I was involved in teaching related duties from freshman level programming course to graduate level course on Automata Theory. My interaction with students has ranged from being a grader of homework and projects to running discussion sessions three times a week over the course of any semester supplementing regular lectures by the faculty. I have, from time-to-time, also filled in for lectures for faculty. Here's a teaching statement detailing my teaching experience. Below is a list of courses that I have been involved in teaching:

Undergraduate Courses:

  1. Computer Science II.
    Freshman level programming techniques course in Java. Typically, this is the second computer programming course taken by the students. Students are introduced to more sophisticated concepts of object oriented programming. They also learn about software design and implementation alongwith basic data structures such as arrays and other composite data structures.
  2. Computer Science III
    Junior level data structures course in C++. Taught twice. Data structures covered include sets, linked lists, stacks, queues, hash tables, trees, heaps, and graphs. Students are introduced to algorithms for searching, sorting, and data structure manipulation and learn the techniques to analyze program efficiency. Programming using recursion and dynamic data structures are covered.
  3. Advanced Java
    Senior level elective course.  The course was designed to provide training in Java to advanced undergraduate students.

Graduate Courses:

  1. Advanced Operating Systems.
    Required course on advanced concepts of modern operating systems. This course provides an introduction to the design and implementation of modern operating systems. Students learn how modern operating systems manage devices including I/O systems, secondary storage, and peripherals. Other topics include memory management, file systems, virtual memory, segmentation, paging, and addressing. Process scheduling and interprocess communication is covered including related issues of security, interrupts, deadlock, synchronization, and locks.
  2. Computer Graphics with OpenGL.
    Highly popular computer programming intensive course taken mostly by masters level students and senior undergraduate students. This course focuses on 3D interactive and non-interactive graphics. Includes coordinate systems, transformations, shading and lighting models, hidden-surface removal, ray tracing, radiosity, and rasterization.
  3. Computer Communications.
    Elective course on computer networks. This course introduces students to computer networks and the application techniques for using networks. The course surveys the basic concepts of messaging and media transfer. After an introduction to general concepts, the subject matter turns to important software applications that rely on networks: parallel simulation, network file sharing, multiplayer games, and distributed databases.
  4. Theory of Computation.
    The goal of this course is to develop the intuition of machine-computation using the mathematical models of computation provided by automata theory. Topics covered include: finite automata, regular sets and regular expressions, context-free languages and push-down automata, Turing machines, decidability, and undecidability theory.
  5. Computer Security.
    Topics include mechanism versus policy distinction; authentication mechanisms, access control mechanisms, and security domains; perimeter security, internal security and defense in depth; communication security, cryptographic protocols, key management and key distribution; threat models, security assessment methods, and clarification of secure systems.