|
Summary
|
|
As a part-time adjunct professor at the departments of Computer Science of the Texas State University at San Marcos and the University of Texas at San Antonio, I have taught over 100 graduate students since 2004. I have been teaching graduate courses on Software Engineering, Formal Methods of Software Engineering, and Advanced Computer Security. I designed the latter course, got it approved, and taught it at San Marcos in Spring 2005. I earned excellent course evaluations which you will find on this web site.
|
My Teaching Philosophy
|
|
A guiding principle of my teaching philosophy is a paraphrase of the Golden Rule: teach others as you would have them teach you. As a computer scientist I constantly learn new fundamental ideas, and I use these ideas to create new technologies that allow software engineers to accomplish their jobs faster and at a fraction of cost. Therefore I want to be effective at learning new ideas and to develop a clear understanding of their fundamentals fast.
When I am simply presented with a heap of facts accompanied by hard-to-understand formulae or complex diagrams, I consider such teaching method ineffective, since students are inundated with information which they do not comprehend. Instead, I state a problem clearly and in precise terms, and explain the solution to this problem using Occam’s razor as a guiding principle – that is, among other possible solutions this one is the simplest for specific reasons. My teaching philosophy is to give a clear explanation of the core principles and laws, and show how to use them to solve problems.
My teaching is about freedom. Hugh Mercer Cutler said in Recalling Education that a person is truly free only if s/he can order a bewildering variety of goods and make it less bewildering. The ultimate freedom is to understand the complexity of the surrounding world and to know few choices that control and manipulate it. In the complex world of computer science this freedom enables software engineers to harness the bewildering variety of principles, theories, and laws and use them to create software systems with no deficiencies.
I believe most students take computer science and software engineering courses for a specific reason – they want to become professional software engineers. Some of them may already have experience working for high-tech companies. They take classes not only because they want a degree, but also because they want to acquire knowledge that they can use in their professional lives. Their desire to learn practical techniques makes some of them develop critical attitudes towards theory, falsely thinking that “real programmers” do not need it. It is my job to prove them otherwise.
When teaching a course, I use my background of over twenty years of hands-on software development in industry and founding my own companies to establish the trust between me and my students. I promise to them that I would never require them to learn anything that is not needed in the software industry. I tell them that if they find out that some material is superficial, then I would drop my requirement that they should learn this material. Occasionally, students take up on the task of proving to me that certain topic is not relevant, and during the argument they change their minds and develop interest in this topic because I explain how this knowledge will help them to accomplish their tasks.
Computer science theory is an integral part of my research. I extend and use results in theoretical computer science to create technologies for software engineers to improve their productivity. When teaching a topic, I show to students how theoretical results are used in software technologies. For example, students of computer science often complain about topics like set theory or predicate calculus as boring. When teaching graduate-level course on Formal Methods of Software Engineering, I start with a problem that is interesting and easy to understand. I present a small program that has bugs in it, and I ask students to find these bugs. It takes them a while to do that, and then I tell them that there is a tool that can find these bugs automatically. In some cases I used Alloy Analyzer, a tool developed by the MIT Software Design Group for analyzing models. Then I show to my students how to create a model of the program in question using the Alloy structural modeling language. This language is based on first-order logic and the set theory. Next, I run this model in the Alloy Analyzer, and the bugs that students worked so hard to find, are determined automatically within a minute. Seeing is believing, and this example convinces my students immediately about the value of the synergy of theory and practical knowledge
|
My Teaching Experience
|
|
I taught graduate-level Software Engineering in Spring 2004, Summer 2004, Fall 2004, and Spring 2005, Formal Methods of Software Engineering in Spring 2004, and undergraduate course on computer security in Fall 2004, and Advanced Computer Security in Spring 2005.
The graduate-level Software Engineering course is based on my book “Principles of Engineering Software Components” that is scheduled for publishing by Prentice Hall in 2007. Before Prentice Hall offered me a contract, they sent the manuscript for review to six professors. One of the reviewers requested preprints of my book and used them to teach CS650 “Designing Complex Software Systems” at the Department of Computer Science at the University of Virginia in Fall 2003.
I thoroughly enjoy working with and supervising students. Since students have varying abilities, I start with simple examples to explain underlying models and principles while avoiding complicated and unnecessary terminology. Once students are comfortable with the problem statement, I incrementally introduce new ideas and concepts that lead them to the solution. Normally, students interrupt me with their suggestions of what the next step should be in formulating the problem or its possible solution. These interactions with my students serve as an indication that my approach is working. I use the same approach when presenting my work at conferences and when developing research papers, and the feedback I receive confirms that I communicate my ideas well..
|
My Teaching Plans
|
|
I am keen on designing and teaching graduate and undergraduate courses on programming languages, compilers, program analysis, software verification and model checking, and component software engineering in addition to the courses that I already taught. Since my research is interdisciplinary, teaching these courses and other courses would go along with my research interests. The breadth of scientific results that I use in my research enables me to teach a wide variety of courses. I am confident that my experience and results of my teaching qualify me to meet the teaching requirements of an academic job.
I am also looking forward to advising and mentoring individual students. I already have experience in both mentoring students on course projects and guiding students working on their master theses. Some students approach me with ideas of how they wanted to extend course projects into research work. I enjoy working with students on different levels, suggesting research topics and gently leading them through the forest of ideas and assumptions.
Teaching and research complement each other in my life. Good research is when you discover something interesting that people care about and present it in a simple way. Teachability is a measure of how good research is. Presenting research ideas to students helps me to refine these ideas, and bright student give their fresh perspectives on the research. Teaching improves the mastery of a subject since effective teaching requires comprehending subjects on a much deeper level. I am looking forward to many years of inspiring and effective teaching and mentoring my students.
|
|