Teaching
I
I Design is one of the critical success factors in large software projects. Design is a basis for planning projects and achieving functional and quality software requirements. Poor design leads to rising costs of software evolution. What are the effective ways to teach advanced design concepts in university courses? In my experience, design principles cannot be taught in abstraction. Design principles are best learned when students immediately apply them in practice and experience their benefits. Design principles matter only in projects of substantial size. Enforcing design in assignments is artificial and not effective: problems students work on are too small, most often programs can be “hacked”, so students can’t experience the real need and value of applying design principles. It follows that project courses provide better basis to teach design than assignment-based courses. Two types of project courses are popular: real world projects done in industry attachment and projects supervised by various faculty members, focused on application domains of their expertise. Such project courses enhance students’ skills in areas of requirement elicitation, dealing with fuzzy and incomplete requirements. Students get exposure to new application domains, industry practices, team work and software technologies. There is a great value of such project courses for students. Still, the above project courses may face some difficulties to teach design know-how. The instructors and supervisors may not be able to scrutinize design deliverables (architecture, interfaces, and design decisions) at the level of details that is needed to effectively coach students. In 1990s, industry often hinted at poor development skills of our graduates. I developed CS3215 Software Engineering Project course to address this challenge. The idea behind the course is that design is best taught by example: Most of the students must see good design and experience its benefits before they can come up with good design on their own. I identified model problem that is particularly useful in teaching design-in-the-large (just like stacks and queues serve the purpose of teaching abstract data types and design in-the-small). Working in teams of six, students do modular decomposition, architecture design and learn to specify component interfaces. This part is closely monitored by supervisors during weekly consultation sessions, to give students early feedback and opportunity to refine their design. Students follow up with implementation (10-15KLOC) in iterative development. We emphasize design for change, reliability and quality documentation. At the end, students present their projects, and we test programs using our regression testing tool comprising 400 test cases. I developed courseware for the above project course in 2000 and have been teaching it ever since. We have been continuously refining the teaching method and tool infrastructure for the project course. Despite heavy load (project course is equivalent to two normal courses) students like the course. I observe huge difference in student’s ability to tackle the project work at the beginning and at the end of the course. Links:
|