I have had the pleasure and the opportunity to do one of my favorite hobbies in the past two years, and that is teaching. I have had the opportunity of teaching several different topics in the field of computer science, from introductory courses to upper division courses, and I have seen a pattern along the students which has been a puzzle for me especially in the upper division classes.
One of the main surprising facts I have noticed, is that most of the students have little or no practical experience in software development, especially in the upper division classes. That is, they have not been given enough opportunity to do hands on projects to improve and fine tune their programming skills in the lower division classes, and when they take courses such as Software Engineering, most of them don't have the ability to create a fully functional system from the ground up.
Now I can understand if this is the first year for the student and they are just starting out and getting to know their first computer language and all of the tools and environments that are available to them. And it is also understandable that there are different levels of students with different levels of skill sets and motivation. But to be in an upper division course and still be uncomfortable with the basics is a little frightening for me.
What I also noticed and honestly surprised me, is that most of the students who are just starting out in the computer science curriculum don't have a clue of what computer science is all about. Now maybe this is an unfair statement, you may argue that they are still unsure or undecided, but I think that is not the case. If you are in a science or engineering curriculum, then there are certain things that are critical for the student to know, like a good foundation is mathematics and physics.
Again maybe, the issue is how we prepare our youth in their earlier years of life.
For instance, as part of the computer science curriculum, the students are required to take a course in Software Engineering. I am not going to discuss what software engineering is, but to enlighten you, here is a description from Wikipedia: Software engineering (SE) is the application of a systematic, disciplined, quantifiable approach to the design, development, operation, and maintenance of software, and the study of these approaches; that is, the application of engineering to software. The term software engineering first appeared in the 1968 NATO Software Engineering Conference and was meant to provoke thought regarding the perceived "software crisis" at the time. Software development, a much used and more generic term, does not necessarily subsume the engineering paradigm.
In such a class, the students is expected to have a good understanding of at least one programming language such as JAVA, C#, C++ and etc... as well as a good understanding of Object-Oriented Methodology and Design. On top of the programming skills, the student should have good understanding of data structures and algorithms. Don't forget, a Program = Data Structures + Algorithms! It would also help if the students have database knowledge and etc...
These are just some of the technical skills that they should have and keep fine tuning on a daily basis. The more important aspect of computer science has nothing to do with programming of JAVA or C# or anything like that. It has to do with the ability to ANALYZE and SOLVE PROBLEMS!
In my last class, I had created six different teams composed of three members each. Each group was given the option to come up with their own project to design and develop throughout the course, and if they were unable to do so, I was going to assign them a project.
The students were very good at coming up with defining their own projects. We had a good variety of projects from Hospital Management System, to Hotel Management System, to iPAD application for Retail Shopping and Inventory, to Android application for a simple 2D game, to a Learning Management System on the web, and a Windows based application creating customized MIMES.
Now it was time to start the real deal! Let's start Engineering our Product!
Throughout the course the students were responsible of defining: the requirements and specifications, the design and implementation, and finally the testing and release (demo) of their software project.
The surprising thing for me was that most students didn't know where to start! Given a particular problem, how would one take it and dissect it into smaller parts to be able to solve it in small portions and come out with the final solutions by the divide and conquer method!
As mentioned some teams did a really good job at each and every step, and others started out weak, and then increased their efforts and effectiveness throughout the course. As you can see the projects themselves are somewhat complex for the students and all of them require the knowledge of good User Interface Design, Object-Oriented Design, Database Design, and for most some sort of Network Communication!
Some students didn't even have any programming skills, and for the matter of fact, they really didn't care much about investing the time to learn it! Relying mostly on their peers for the technical aspects of the project! Now we should not expect every person to be a guru, but they should at least show some interest and have some self-motivation to learn on their own.
Overall the majority of students in the class were hard workers and they really put a lot of time and effort in their respective projects. Most of them wanted to learn and be challenged. They just lacked the proper skills that were necessary prior to taking this class.
There was a lot involved for the students in this particular class, and this put a lot of pressure on the students to push themselves and to become self-motivated and self-starters. And that is exactly what my objective was in not only this class but all my classes. I want my students to push harder and to think bigger and explore more areas and ideas because this is the only way to grow and be competitive later on in their professional careers.