As a programmer, my philosophy of teaching is heavily influenced by the principles of Free and Open Source Software. I attribute most of my success in Computer Science to having the opportunity to learn about difficult technical topics from the developers who graciously made the inner workings of their products open and available to the world. As such, I believe that students can benefit from this attitude as well, so I lead by pulling back the curtains and articulating to students the process by which I extract information from the world. I teach transparently and with an attitude towards turning my classroom into a community of learners among which students teach and learn from each other.
First and foremost, I start by building how I believe into the way I grade. Programming is an iterative process, and as such, students should have the opportunity to see how their work performs before committing it to the instructor for evaluation. I took the lead this semester building up a platform for automatically grading student work on top of the Jenkins continuous integration framework, a tool used by software engineers in industry and the Open Source community. By building this platform, students are able to see exactly what the graders see, and are given the opportunity to evaluate themselves before signing off on their work. When it comes to homework, I believe that a student should know what grade they will be getting before they submit it, as the projects are their opportunity to critically engage and attain mastery of the course concepts. Uncertainty is not conducive to a learning environment, and this kind of immediate feedback removes a layer of uncertainty from the course, putting that much more power and control over learning in the students' hands.
When I lecture, I emphasize how the topics I cover fit into the big picture. The topics of a lecture should be self-contained, but should still fit in with the course as a whole, the degree program within the university, and the discipline in the workforce and beyond. I bring in examples from my research in the graduate program to show how the elementary concepts I convey in a sophomore-level class are informing graduate-level dissertations, and show examples of design patterns we cover in academia "in the wild" in open source projects on Github. By establishing relevance, I provide ways for students to latch on to the material and stick with it.
Returning the first point I raise, part of my focus on openness comes from a desire to teach students how to think and learn for themselves and on their own. Any time a student raises a question that I don't know the answer to, I take the time to show them how I figure it out. Whether it's a carefully worded search on Google, digging through and open source project, or a building protoype example of a program, the only way to know the answer in a field as deep as Computer Science is to know how to go about finding it. We often take it for granted that students know how to search through information or build an example on their own to teach themselves a topic, but this is something that has to be learned and students don't come with those skills on their own. Those that do often overshadow those that do not, leaving them to end up slipping through the cracks. Being able to independently and systematically obtain information about the field through inquiry and even play are such key elements to being successful that I try to solve a problem on my feet in every class I give. This willingness to fail and learn from it is an important part of conveying the skill of learning from failure, and is the one overarching skill that I hope that my students get from my lectures to some extent.
I've written elsewhere about this topic, both on HASTAC and as a chapter in Field Notes for 21st Century Literacies: A Guide to New Theories, Methods, and Practices for Open Peer Teaching and Learning.