Here is a list of courses I taught. Course abstract and the course official evaluations are also listed.
Introduction to Formal Languages CSI 3104 (Summer 2013)
Institution
University of Ottawa
Number of students: 30
Course Description
Regular languages, finite automata, transition graphs Kleene’s theorem. Finite automata with output. Context-free languages, derivation trees, normal form grammars, pumping lemma, pushdown automata, determinism. Decidability. Recursively enumerable languages, Turing machines, the halting problem.
Official Evaluation
Click here for this course Official evaluation from University of Ottawa.
Teaching Approach
Construct a story of evolving complexity of problems and languages. At each step, introduce the new mechanism that recognizes/solves the new problem. Starting from recursive definition of languages, regular languages, and to recursively enumerable languages. For each group, I introduce the mechanism that is capable of recognizing the language. I emphasize the purpose of the new mechanism and its increased power in language recognition. I also emphasize the deficiencies of a specific mechanism to justify the introduction of new concepts.
I used the book “Introduction to Computer Theory” by Daniel I. A. Cohen, and covered chapters 1 through 19, and chapter 23. The course content is abstract and can be boring for students. To overcome this, I always emphasize why we are studying a specific language recognition mechanism and how the existing mechanism that we have been using fall shorts of solving specific group of problems.
There is 6 assignments (30%) and 2 midterms (20% each), and a final exam (30%). If you are teaching this course, you can contact me for the course material.
Programming Paradigms CSI 2120 (Winter 2013)
Institution
University of Ottawa
Number of students: 60
Course Description
Presentation of the major programming paradigms: object-oriented, imperative, logic, functional. Related programming languages, their essential properties and typical applications. Programming in imperative, logic and functional languages. Influence of programming paradigms on problem solving and program design strategies. An overview of other paradigms, such as constraint-based, rule-based and event-driven programming.
Official Evaluation
Click here for this course Official evaluation from University of Ottawa.
Teaching Approach
This course appeals to students who prefer hands on and enjoy programming. The course covers different paradigms (Logic, functional, imperative, ..) making the course content to change significantly over the course duration. Students seem to like this dynamic nature of the course.
However, Prolog and Scheme editors (two o fthe languages used to introduce logic and functional programming) are far from being sophisticated and do not compare with modern editors like those available for Java and C++. This makes the language hard to learn and difficult to debug. The majority of students seem not to like Prolog or Scheme, but they usually will appreciate its power and value.
I did not use a specific book for this course. Springer sent me 60 free copies for a book on Prolog with I passed on to students. Students relied on my notes and other online sources, which I believe was sufficient for this course.
There is 6 assignments (30%) and one midterms (30%), and a final exam (40%). The course also included a 3 hour labs every week. During those labs, students get a chance to practice hands on some of the concepts introduced in the lecture. The labs are given by the TAs. I emphasized for the TAs and the students the importance of attending those labs. If you are teaching this course, you can contact me for the course and labs material.