Friday, November 30, 2007

To Program or Not To Program? What is The Problem?!

The reason I'm writing this blog entry is two-fold: Analyzing the problems I faced with the students for three consecutive years teaching data structures, and trying to answer the eternal question asked by pure information systems fans: Do I have to program to survive the IT industry?
I'll first address the first part of the reason because it was what triggered the entry in the first place. The problem that made me wonder so many times and ask the question about programming was the fact that in the second year, I'm asked to teach the students a very hot topic (data structures) while they're oblivious to the fundamentals of programming; and I mean basic programming (either that or I'm totally getting the wrong signs from their confused looks and questions.) Students cannot understand what functions are, how they're called, what's the difference between variables and objects, or between data types and reference types, how to define a class, what can be a class, how to debug, and most of all how to read and correct programming errors (either syntax or logic ones.)
Let me clarify two important facts here before I proceed: First, I'm in no way a programming guru; I know some stuff but no advanced programming. Second, there ARE students who seem to have programming "programmed" naturally in their genes. I asked myself many times what gives me the right to discuss a topic I'm not a hundred percent experienced with, and the answer came to me this year; there's a serious problem with the way programming is taught, when it's taught, and why it's taught.
Second-year students are supposed to have studied at least one basic programming course in their sophomore year, and in the specific case of my faculty they're taught in labs by two of the most gifted TAs in programming whom I hold a great respect for: Waleed and M. Handousa. And I always blamed the students for not listening in labs. I figured out the problem isn't with the TAs ways nor in the students; the problem is, programming is a difficult subject to be taught and learned, and a huge effort should be paid to developing a methodical way of teaching it so that basic programming skills can be instilled in students to enable them to go the distance on their own.

The way programming is taught

In the first year, students are taught the basics of programming; that is, data types, variables, loops, flow control, and functions. I don't think amateur students know what any of these things is good for! They don't see the big picture: programming is a way to tell the computer how to solve problems, and it resembles our normal way of thinking when attempting to solve our problems. What adds "spice" to programming is that computer makes us capable of adding little "tricks" to solve problems that we don't usually use in real life. But it has the drawback of sticking to the way computers are built. So students don't see that programming is slightly different from ordinary problem-solving techniques in that it can do some things the mind can't do and it can't do some things the mind can do. Students should be able to see that all the basics of programming are tools to the original goal: solving a problem, and they should first be able to think systematically about how to solve the problem at hand and then proceed to check how programming is to be done, and what it will be able to do for them to enhance their way and what parts of the solution it will not be able to do "as they do it in their minds." the brilliant programmer then will figure ways to use whatever "is possible" within the programming language to achieve whatever "that can't be done following the normal human brain thinking."
Programming courses tend to teach students "how" to do stuff instead of "what" to do if a certain problem needs to be solved. I think an emphasis should be made on how the human brain solves a certain problem and then how to adapt the solution "manuscript" to fit the intricate programming concepts and techniques.

When programming is taught

The problem here is that programming is taught before the students have any idea of how to "think" about the solution to a problem, how to build flow charts, and how to understand algorithms. When a child goes to school for the first time and is taught how to make simple calculations, he doesn't see the big picture; the abstract mathematical principles that make computations what they are. That's exactly how students are treated when taught programming: Do it now and you'll understand later. Well, you can't tell a 17 or 18 years old student that! He or she is mature enough to understand why things are done a certain way. I should never write a recursive function call without explaining to the student how it's executed in memory. But to do that, he has to have a knowledge of memory and how to deal with it. That's not a problem to me to explain that; the problem is with so little time in the semester how am I supposed to do this and still have time to explain the different data structures and algorithms? Either more time should be dedicated to this matter or it should be dealt with in a separate course. The curricula is so keen on teaching a state-of-the-art programming language and no focus is given to what principles make understanding programming possible in the first place.

Why programming is taught

I'd like to make a distinction here; there is the problem that needs to be solved, and there are problems related to programming the solution to the problem. Software engineers should be able to solve the first; meaning they should be able to analyze the problem, define how it will be solved, identify the user requirements of the software, identify the software components, and make a detailed description of what to do programmatically, while computer programmers should be able to solve the second; meaning that once they have the "manuscript" of the solution, they should be able to address any problems that arise during programming, what classes are needed, code optimization, testing, …etc. There's a debate among many of the TAs I know about whether or not the first should do the job of the second, but I think there is an agreement -forced by the market- that the second "must" be able to do the job of the first. That's where the real problem is; how is the student supposed to know how to program if he doesn't realize programming is a tool to solve a problem and he must first figure out how to solve the problem?

An interesting study conducted by Dr. Saeed Dehnadi and Prof. Richard Bornat from the school of computing, Middlesex University; which was titled "A cognitive study of early learning of programming", argues that there are two distinct groups of students when it comes to the ability to learn programming skills: those who can, and those who cannot. The focus of the solution to this problem has been always on the teaching side: changing the language, using an IDE…etc. this will evidently lead to no progress, since the problem (from their perspective) lies in the learning capability, how to measure it, and I can add how to enhance it. I made a quick review of some programming course pages on the web (check below) and found an interesting point: these courses DO NOT teach a specific programming language, they just pave the way to that by focusing on principles and concepts of programming. The problem with our way of teaching is that we think it's cool to hit it off and jump start the students into the completely different and mystic world of coding, thinking that their excitement about it is a good thing. They end up being so confused about what it is exactly that they're supposed to do with all these for loops and if-else conditions. When I ask the students in my sections whether they can trace what a code does, they seem perplexed and unwilling to even try; to them, those who write the algorithm are super humans.

I conclude with excerpts from two of the sites I checked…

"
List and Explain the five steps in the Programming Process:
There is a basic flow for computers as well as in programming. All programming commands can be mapped to this basic flow: BASIC FLOW OF COMPUTERS = INPUT, PROCESS, OUTPUT.
To be effective in anything, you really need a Process. The programming process can and should be used for any programming language that you use. The five steps in the programming process are:

  1. Define the Problem – discuss problem with the users of a system and the systems analyst to determine the necessary input, processing, and output
  2. Design the Solution – design an algorithm and represent the logic using a Flowcharts or Pseudocode
  3. Write the Program – express the solution in a programming language
  4. Test and Debug the Program. Insure that the program works as planned (Use an Interpreter or Compiler
  5. Document Throughout – provide material that supports the design, development, and testing of the program.

"
From http://avconline.avc.edu/rhoffman/Programming.html

"
Introduction to Programming
Objectives
By the end of this reading you should know the following:
Expain in simple terms what computer programming is.
Understand why there are programming languages.
Understand the terms high-level language and low-level language.
Understand the difference between compiled and interpreted programming languages.

"
From http://revolution.byu.edu/programmingconcepts/programmingIntro.php

No comments:

Template by:
Free Blog Templates