My cousin, who was in class X, once sought some guidance from me to complete his computer assignment - to write a Java program for bubble sort. Having been out of touch with "classic programming assignments" since some time - I wanted to refresh my understanding of bubble sort. So I asked him to explain it to me - he started blurting out the code in Java. I stopped him "Hold on! Let's not get into the code. First tell me what you do in bubble sort?"
To my surprise he couldn't tell me in plain English what he meant by bubble sort. When I delved deeper I realized that the problem was more fundamental - Java was the first programming language that he was learning and his study of programming started with understanding Objects and Classes rather than algorithms and logic.
I had observed the same problem with some batch mates in Engineering. But their case was more accidental than by design because Computer Science was not a core subject in their schools. However, for my cousin it is more by design that study of computer programming starts with a language as complex as Java (this is usually preceded by study of MS Office or Coral Draw).
The problem with this approach is that students are exposed to advanced software development techniques (like OOP) even before being told why and what is the expected result from their use. It is like teaching a student the Pythagoras theorem before basic geometry.
IMHO, the study of programming should proceed in the order of increasing complexity of programming logic and its relationship with the real world. Programming has 3 basic concepts - structured flow of instructions, data abstraction & storage and data presentation. These 3 parts correspond to the 3 components - the machine, the real world and their relationship.
The first thing that a naive student needs to understand is that in order to use a machine for problem solving, one must 'talk' to it in a language that it understands. I am not referring to Language Syntax but the ability to think in a structured manner. While the traditional means to learn this would be flow-charts and algorithms, they are often boring for students as one cannot 'run' algorithms and flow charts and see the results.
Hence, I think the best language to start learning programming is BASIC. Simple syntax, English like commands and semi-structured constructs make it an ideal choice. It combines the ease of algorithms with compiler readable instruction set. In addition, the fact that BASIC has no ability to interact with databases means that it follows the most basic concept of computer science - GIGO (Garbage In Garbage Out) - to the tee.
Another benefit of BASIC is that in spite of being an unstructured language, it introduces you to the basic constructs used in all high-level languages like loops and input/output commands. I learnt BASIC from a book called Chipping In - it was a fun book illustrated with cartoons to explain the 'flow' of sample programs. Unfortunately, the book isn't available in the markets any more and this post is my tribute to the book.
Anyway- back to programming - if someone wants to progress further towards system programming, it is important to learn about handling memory and addresses - the best way to learn which Assembly programming. However, often people are told to learn 'C' instead, which I feel complicates things because the concepts of pointers in C are extremely difficult to understand without the knowledge of how memory is manipulated through raw addresses. However, once you have manipulated memory addresses and registers in assembly language, the otherwise complex concepts of pointers seem quite easy.
For those who want to progress towards application development however should understand Objects and Classes along with database concepts and SQL. Though to build simple applications, IDEs like Visual Basic coupled with Access databases offer much simpler options - complex software cannot be built without OOP concepts. Suites like VC++ and other more complex development environments are essentially based on OOP.
Another area which many youngsters might consider to learn immediately after BASIC is web-based programming in JavaScript + HTML further progressing towards AJAX and server side languages like ASP and PHP. Increasingly most application frontends are web-based and one would rather learn these than Desktop environments like VB and VC.
It is only here that I would appreciate Java - especially applets for offering a middle ground of a GUI/front-end + OOP language. However, in the age of Web2.0 Apps the relevance of Java is questionable.
In fact Web2.0 also fundamentally challenges all concepts of software development and project management. For those who would want to delve deeper into the effects of Web2.0 on software project management - Getting Real by 37 signals is a good book. The book is available free to read online or you can buy a PDF for $19.
To my surprise he couldn't tell me in plain English what he meant by bubble sort. When I delved deeper I realized that the problem was more fundamental - Java was the first programming language that he was learning and his study of programming started with understanding Objects and Classes rather than algorithms and logic.
I had observed the same problem with some batch mates in Engineering. But their case was more accidental than by design because Computer Science was not a core subject in their schools. However, for my cousin it is more by design that study of computer programming starts with a language as complex as Java (this is usually preceded by study of MS Office or Coral Draw).
The problem with this approach is that students are exposed to advanced software development techniques (like OOP) even before being told why and what is the expected result from their use. It is like teaching a student the Pythagoras theorem before basic geometry.
IMHO, the study of programming should proceed in the order of increasing complexity of programming logic and its relationship with the real world. Programming has 3 basic concepts - structured flow of instructions, data abstraction & storage and data presentation. These 3 parts correspond to the 3 components - the machine, the real world and their relationship.
The first thing that a naive student needs to understand is that in order to use a machine for problem solving, one must 'talk' to it in a language that it understands. I am not referring to Language Syntax but the ability to think in a structured manner. While the traditional means to learn this would be flow-charts and algorithms, they are often boring for students as one cannot 'run' algorithms and flow charts and see the results.
Hence, I think the best language to start learning programming is BASIC. Simple syntax, English like commands and semi-structured constructs make it an ideal choice. It combines the ease of algorithms with compiler readable instruction set. In addition, the fact that BASIC has no ability to interact with databases means that it follows the most basic concept of computer science - GIGO (Garbage In Garbage Out) - to the tee.
Another benefit of BASIC is that in spite of being an unstructured language, it introduces you to the basic constructs used in all high-level languages like loops and input/output commands. I learnt BASIC from a book called Chipping In - it was a fun book illustrated with cartoons to explain the 'flow' of sample programs. Unfortunately, the book isn't available in the markets any more and this post is my tribute to the book.
Anyway- back to programming - if someone wants to progress further towards system programming, it is important to learn about handling memory and addresses - the best way to learn which Assembly programming. However, often people are told to learn 'C' instead, which I feel complicates things because the concepts of pointers in C are extremely difficult to understand without the knowledge of how memory is manipulated through raw addresses. However, once you have manipulated memory addresses and registers in assembly language, the otherwise complex concepts of pointers seem quite easy.
For those who want to progress towards application development however should understand Objects and Classes along with database concepts and SQL. Though to build simple applications, IDEs like Visual Basic coupled with Access databases offer much simpler options - complex software cannot be built without OOP concepts. Suites like VC++ and other more complex development environments are essentially based on OOP.
Another area which many youngsters might consider to learn immediately after BASIC is web-based programming in JavaScript + HTML further progressing towards AJAX and server side languages like ASP and PHP. Increasingly most application frontends are web-based and one would rather learn these than Desktop environments like VB and VC.
It is only here that I would appreciate Java - especially applets for offering a middle ground of a GUI/front-end + OOP language. However, in the age of Web2.0 Apps the relevance of Java is questionable.
In fact Web2.0 also fundamentally challenges all concepts of software development and project management. For those who would want to delve deeper into the effects of Web2.0 on software project management - Getting Real by 37 signals is a good book. The book is available free to read online or you can buy a PDF for $19.
one word... apt.
ReplyDeletevery true... i m faced this exact scenario with my bro...