I do believe in the old saying that practice makes perfect. Of course things aren’t so simple and it’s important to the right kind opractice, but without practice it’s impossible to develop a mastery of anything. Software engineering is no different. You can spend all the time in the world reading about Agile development practices and Object-oriented design, but if you don’t produce working software projects on a regular basis, you’ll never experience what it means to face all the troubles and diversion that can crop up along the way. The act of taking a project from development to finish allows you to hone your skills and learn from your mistakes and hopefully make sure that your next product works just a little better than the last one.
The greatest concern I have about modern computer science classes (at least the ones I’ve been) is that students simply do not have the chance to practice. Sure there are labs and projects and multiple hours spent a week, but almost all of that time is devoted to just learning new concepts and getting to know how to use them and not does not allow for the honing of the learned skills. You can’t really blame the schools, because they have only four short years to teach students what they need to have a bare minimum of competence and college is about more than just living your major 24/7.
All that being said, I still do wish that there was a way for interested students to hone their skills if they had the time and the desire to be better and what they’re learning to do. For a lot of things this is actually quite easy. Thanks to the fountain of knowledge we call the internet, students can easily find tutorials and exercises on a lot of different topics for free online. All my knowledge of Python comes from the internet and I’ve used online sources to practice functional programming in ML and Lisp. I’m currently on the look out for software engineering exercises.
My software engineering class has weekly labs and two projects during the semester, but they’re not really enough for me. The labs are designed to teach us the C++ and other tools like Kdevelop and Doxygen. However for someone like me who already has experience with 2 other object oriented languages under his belt and some previous knowledge of C++, the labs are not very hard and take less than the 3 hours a week allotted to them. One of the projects is designed to teach us the whole process of software engineering including requirements gathering, use case modeling, design and finally implementation. The other project is basically a test of basic competency in C++ and object oriented programming. While the projects are good in the sense that everyone in the class gains a good idea of what software engineering is all about, there isn’t enough time to hone specific skills. In particular, I’m more interested in design and implementation than I am about requirements gathering. I’d like to be able to practice taking a sufficiently detailed description of a project (say a description of the public interface), designing the class structure required and then implementing it into a working program. This would not only give a chance to hone my programming skills, it would be a great way to get more practice with the tools that I am not familiar with (namely the make system and the debugger).
In some ways, it would be good there was a more lab intensive version of my softare engineering course, but since that is not the case, I guess I have to look elsewhere for what I need. The problem is that my searches are yet to turn up anything of real relevance. It seems that most software engineering are geared to giving a rounded view of the subject, teaching tools, techniques and theories all at the same time. As a result even the exercises that I can find online are either exercises in C++ or Java (not what I really need) or else larger full length projects (also not what I need).
I’m going to keep looking around the net to see if I can get what I want. I also hope that some of my many forum postings around the net will turn up something. However, while that happens, I’m trying to design my own mini-projects. For one thing our labs use a simple account management system as an example. I’ll be working to develop a more fleshed out version of the account manager putting into use what I’m learning in lab and in class. If any of you reading this post have any ideas or know of resources that match what I’m looking for, please drop me a note.