From some time I have been thinking of the right way to teach a programming course. Something I have noticed from the way I learn, as well as by having taught Java to college students and corporate participants, is that programming is not learned well if it is detached from practice and discussion. In fact, practice and discussion are the most important aspects of learning how to program. Here are some numbers from the National Training Laboratories, Maine, USA, that point to how retention rates differ for different learning approaches.
Research shows that discussion, practice, and teaching are the most effective ways to learn. My own learning experience also validates this finding. When I simply read about a programming technology, I might forget it in a few days, but when I practice it, the learning remains with me for longer, and when I teach something, I retain it for much longer, and even more importantly, I also grasp the fundamentals in a better way.
All of these concepts can be introduced in the classroom, but for some reason they do not work very well. Many students are shy to ask questions. The time we have for a lecture is fixed and there is a set agenda for what has to be completed in the lecture. There is also the problem of differing learning styles and speeds. Different students learn at different rates. In a classroom, the lecturer always has to be at a median rate, which is too fast for some and perhaps too slow for a few. In other words, the median is not really the best pace for a lecture. Practice is usually in the form of lab exercises. The purpose of the labs is to complement what is taught in class. This method of teaching does not prepare students to be good software developers. Perhaps this is the reason why people in the industry say that many software graduates know the syntax of programming languages, but they are'nt good programmers.
To help students become good programmers, the primary form of learning must be through lab exercises, using the classroom to discuss doubts, and clarify concepts. I am proposing that we invert the current method of lectures complemented by exercises and discussions, and make projects and discussiosn the primary vehicle for teaching, complementing them with lectures when necassary. We must teach programming in a way that supports experiential as well as discussion based learning. Putting the focus on practice, will also help students learn at a pace that is best for them. Another factor we commonly see in most classrooms is that the teaching is usually directed from the lecturer to the students. Sometimes technology changes so fast, that it is very difficult for one person to keep up with everything. Often, people who have work in the industry have dealt with different types of real world situations (especially fighting fires). This gives them a somewhat unique practical perspective, that goes beyond the textbook. Please don't get me wrong. I am NOT suggesting that a lecturer knows less than a practitioner. Not quite. Even among working professionals, each individual will not know everything. What I am suggesting is that a community of practitioners and academicians have a lot of collective wisdom together. This collective wisdom will be way more beneficial to students than the wisdom of just one person. By learning from a community of practitioners, students will learn not only the theory but also real world practical usage (along with pitfalls and best practices) of a technology.
For such a teaching and learning model to work, we must first create the right infrastructure and some guiding principles that will help the students, lecturers, and industry mentors.
Let's tackle the infrastructure first, and make a checklist of things we need:
- Place to publish course descriptions
- Ability for students to enroll for a course
- Mechanism by which groups of students can work on projects (source code versioning, bug tracking, forum)
- A place where students can ask questions (and get answers)
- A way for the students to log their learnings, progress on the projects, etc
- Mechanism for real time discussions, lectures
- A way for mentors to provide feedback (and grades... ughhh) to students
- A calendar for announcing important dates, etc
If you think of more, please add them in the comments section. I will appreciate your feedback.
Because the course may involve mentors from different cities (or even countries), all of the above features must be web enabled. Most good learning management systems offer course definition, enrollment, grading, discussion forums, calendars, blogs, etc. In fact a good learning management system like Moodle, will take care of almost all the above requirements, leaving only source code versioning, project collaboration, and real time collaboration. For versioning, we can either install CVS/SVN internally or let the students host their projects on hosted services. For project collaboration (bug tracking, forums, etc) , we can use Bugzilla, and web based newsgroups. For real time collaboration, we can utilize the classroom for lecturers and mentors who can go to the institute physically, and web based tools like Skype and Yvew for voice and slides. A simple way to get started is, install Moodle, install CVS, install Bugzilla, install Skype, and create an account with Vyew. And offcourse give access to students and mentors to relevant systems. Even though this is really simple, I prefer an alternate configuration, which I will describe below.
I am a bit uncomfortable with the above configuration for a couple of reasons. I would rather that students keep their blogs on a public website. That way they can retain their blogs even after they graduate (this may not be appropriate for school students for safety reasons). I would also prefer to use web hosted version control as provided by Google, or Sourceforge. This is because they provide many more facilities beyond version control. They provide bug tracking, forums for discussing issues, file downloads, and document hosting. Also since these services are hosted on the web, students can make their work available to future employers for viewing online. My personal preference is to install Moodle, let students host their blogs (which will be used as their learning journals) on a service of their choice, and host projects on code.google.com, or sourceforge.net . One thing to remember before hosting projects with these or similar services is that the projects will have to be made available on an open source license.
Google also provides "Google apps for education". They provide very good collaboration features, but you will have to supplement it with a course management software. Incidentally, such a software is available as a hosted option.
As you can see, there are several options. A different combination of software will be suitable for different institutes. Also there may be several alternatives for the services I have mentioned. For example, I mentioned Vyew for synchronous slide sharing. However, there are other services like GoToMeeting, being one of them. Similarly, there are other learning management systems besides Moodle. Moodle is free, feature rich, and also simple to understand and use. I believe there are other free options, but I cannot recollect them at the moment.
Regardless of the software and services chosen, what's important is that we support collaboration that is synchronous as well as asynchronous, and make appropriate information available to all concerned in as seamless a manner as possible.
Once the infrastructure is in place, we have to define a set of guidelines to help the students and mentors. I suspect none will have taken or mentored a course offered in this mode. So it is very important to have a set of guidelines, nobody gets stuck on how to move ahead. I will talk about the guidelines in a future blog post.
- Free blog hosting is provided by Blogger, Wordpress, and several other.
- The Shuttleworth Foundation is also doing some interesting research on peer taught software engineering.
- Konrad Glogowski publishes an excellent blog on learning (especially using a conversational technique of teaching with blogs in the classroom).
- Christopher Sessum also publishes an excellent blog. He talks primarily of teacher education, and the role of new media in education.
Note: This text was originally posted on my earlier blog at http://www.adaptivelearningonline.net