Wednesday, November 25, 2009

Knowing the Top Contributors to Computer Science…

I wrote about “Who are the Role Models of Computer Science & IT Students?” some time ago. I also stated why it is important for learners to know the top contributors in computer science. A good starting point is to know about the Turing Award, the winners of the Turning Award, and their contributions.

You can read about the Turing Award, the winners and their contributions from the website of the Association of Computing Machinery (ACM). The Turing Award is considered to be the highest award for contributions to computer science. This award has been named in the honor of Alan M Turing, one of the giants of computer science. Many think that the Turing Award is as prestigious as the Nobel Prize!

The 2008 Turing Award went to H Barbara Liskov for contributions to practical and theoretical foundations of programming language and system design, especially related to data abstraction, fault tolerance, and distributed computing. She is the second woman to bag this award. The first woman to win this award was Frances Allen in the year 2006 for her contributions to the theory and practice of optimizing compiler techniques.

The award winner, apart from receiving a prize and citation, also delivers a Turing Award lecture. I wish each student of computer science reads these Turing Award lectures. Many of them are outstanding!

Alan J Perlis was the first to win the Turing Award in 1966 for his influence in the area of advanced programming techniques and compiler construction. His Turing Award paper was on “The Synthesis of Algorithms”. But many of you, I am sure, would enjoy his delightful “Epigrams of Programming”. As a sampler, consider the following epigrams…

Whenever two programmers meet to criticize their programs, both are silent.
We will never run out of things to program as long as there is a single program around.
If you have a procedure with 10 parameters, you probably missed some.
Every program has (at least) two purposes: the one for which it was written and another for which it wasn't.

I urge you to read these epigrams, and I hope that you enjoy them as much as I did!
Two of the Turing Award lectures that I enjoyed are The Humble Programmer by Edsger Dijkstra, and Introductions to Computing Should Be Childs Play by Alan Kay. Look at these swinging titles. The content is even better! The Turing Award site on ACM is a treasure trove!

Sunday, November 22, 2009

Reading the Examination Papers of Certain Universities may be Injurious to my Health!

I have collected quite a few of the examination question papers of different courses of CS and IT conducted by some universities in India. I have read these question papers with emotions as varied as amusement, hilarity, sadness, admiration, anger and despair – just to state a few! Let me share a few of these specimens. I am refraining from sharing the absolutely hilarious ones for a future occasion.

This is from one of the large universities in the southern part of India in a course titled “Visual Programming” as part of the BE degree in Information Technology.

a)Write an overview of Windows Programming. (16 marks)
or
b)(i) Write a windows program to create and modify user defined menus. (10 marks)
(ii) How will you modify system menu using windows programming. (6 marks)


At first glance this appears perfectly legitimate and appropriate questions for an assessment. I have several problems with these kinds of questions.

• What does the examiner expect that the students writes in her answer to (a) above as “Overview of Windows Programming” that would fetch 16 marks?
• What constitutes an “overview” of windows programming? If a student provides a synopsis of the set of chapter titles of the prescribed textbook with a one line explanation of what that chapter covers, would that be considered as a correct answer?
• Now imagine that the answer to this question evaluated by not one examiner but several dozens of them. How does one ensure the consistency of the assessment?
• What indeed is the objective of this question (a) above?
• Answer to (a) may elicit a long-winded description. Answer to (b) consists of programs. Do you think that questions (a) and (b) are “equivalent” that a student may be provided with a choice of answering?
• Now read questions in (b). Why are these questions written as one-liners? Laziness? Concern for the trees? Much as I don’t like them, these questions in (b) are decidedly better than (a).

What appalls me is that the course had five other questions of the same type with all the shortcomings I have pointed out. Sample the “highly creative questions” framed with “extreme diligence” by the “experts” in a university for the course on Operating Systems.

Write short notes on the following:
a) Kernel
b) Paged memory management
c) Swapping
d) Device driver
e) File system


Enough said! Reading examination papers of certain universities may be injurious to my health! Of course, there are questions that are hilarious. Laughter, they say, is the best medicine. Perhaps I must share some of these rockers with you all someday!

Getting the bigger picture right

Today in India a very large number of students are chasing careers in software industry. They all seem to have a rather narrow view of the opportunities; they all think as if they are going to write a new operating system, DBMS or network protocol. While a handful of them might get the opportunty, there are many opportunities that are equally challenging!

As with other industries software industry is maturing too. While one can always improve on existing core software the billions of users will not accept anything new unless it is dramatically better. That is one reason very few of todays students will get to write one more operating system.

With software entering every facet of human activity - banking, manufacturing, telecom, education, healthcare, hospitality, travel or government - there are much larger opportunities in the application area.

With core software companies like Microsoft and Oracle having to support a very large number of platforms and environments there are opportunities to add functionality, supply tools, improve performance and to maintain the huge base of software that has been created.

To support so much activity a mammoth IT infrastructure has been created - servers, storage and networks. You need significant software expertise to manage this IT infrastructure.

Many other activities including engineering design, media and publishing are finding software to be central to their function; all of these activities are software enabled. There are plenty of opportunities in these areas as well.

In a nutshell, software industry offers a huge opportunity; do not limit it by your own short-sighted thinking.

Remember there are a very large number of temples for Lord Vishnu, smaller number for Lord Siva and a handful for vLord Brahma. So is software. Very large number of jobs in maintenance but very few jobs in new software creation!

Sometime back I wrote a piece on "Let thousand flowers bloom in the software garden" in Times of India. Do take a look if you are interested.

Thursday, November 19, 2009

How Does One Write Programs that Display or Print Themselves?

On 13th November 2009, I wrote on "Should Interviewers for Entry Level Programming Positions be "Trained" in Interviewing?" While the posting was about interviews, interviewers and out-of-the-ordinary questions, what appeared to have attracted the attention of student readers is the part about "writing programs that display or print themselves".

The most frequently asked question appears to be "How does one write programs that display or print themselves?" I will guide you to sites on the Internet that would help you learn how to do this.

A program that displays or prints itself is called a quine. This is named in the honor of Willard van Orman Quine, the American philosopher and logician. You can read about Quine and his contributions in Wikipedia.

I will describe at a very high level one possible method to implement a quine. The implementation of a quine consists of two distinct components. One of the components contains the definition of a string, and the other component is the program itself. The string itself contains the central part of the source program in the second component. The second component that contains the central program itself prints the string two times. The first time is to print the string definition. The second time is to print the central part of the program itself. This is the basic principle on which many quines are written. But writing the program itself could mean a lot of work.

Those of you who are really interested in learning how to write a quine must go through Igor Ostrovsky's blog on "How to write a self-printing program". Unfortunately, to understand this, you must be familiar with C#. At any rate, it does not hurt to read this well-written blog.

Over the years, many programmers have written quines in several languages. Quines are written in C, C++, Java, JavaScript, Perl, Python and several more. You must take a look at The Quine Page!

I am directing you to a few website that discusses quines to just satisfy your curiosity. If you do not understand how to write quines, do not be disheartened. If you had really gone through the Wikipedia, tried to understand what Igor Ostrovsky wrote about developing a quine in C#, and checked out The Quine Page , it would have been rewarding enough. But do not stop there, think of questions like "Are quines just oddities?" or "Do they have any useful applications?"

Wednesday, November 18, 2009

Would Learn by Doing be Effective at College?

In one of my postings, I emphasized the role of Learn by Doing in the process of learning computer programming. Many teachers agreed that learn by doing is good, but it would be ineffective at colleges in India.

Let us take the context to be the teaching and learning of computer programming using the programming language C as the first course at college. Barring a few notable exceptions in some of the top rung institutions in India, most of the others place an undue emphasis on teaching the syntax of the programming language. The time allocated to the learning of problem solving is almost negligible. Do ask the students who come out of these institutions to confirm this.

I think that this misplaced emphasis on the syntax of programming language happens mostly due to the structuring of the course to have “theory” classes and “lab” classes. Apparently, the teachers teach students the “theory” part of computer programming and the students practice programming in the "labs". And what would that mean? The teachers say that they teach “concepts”. That seems reasonable since one perhaps learns the conceptual and other foundations in the “theory” part of the course and practice learn by doing in the “lab” sessions. Sounds good, so far!

So why am I cribbing if students are indeed learning by doing in the lab part? The intentions may be honorable, but the ways these “lab” sessions are executed are a disgrace. Students are provided with a problem description. They are supposed to solve the problem, write the program, and get it executed. This is where certain disgraceful behavior happens. Several students have told me that during these sessions, they are also given the source program that solves the problem. All they need to do is to type the source program, get it compiled, see that it works as intended with a few test cases that are also given, and show it to the person-in-charge to be awarded the marks for that session. Is this exaggerated? Empirical evidence seems to suggest it is not!

Most students end up getting somewhere in the range [45,50] marks with the maximum marks being 50 in the "lab" component. Of course, the scores in the “theory” part of the exams show a wide dispersion. The bottom line is that a large number of students cannot program at all at the end of the course, whatever the marks they obtained in the “lab” part. Contrast this with excellent institutions like the IITs and BITS, Pilani where the "theory" and the "lab" are not disembowelled and the two components are seamlessly integrated! Grades obtained by students would correlate well with the ability to perform. Of course, you could come across students whose grades are not-so-good but their ability to perform is excellent. They are exceptions, however!

So, for learn by doing to be effective at college, there ought to be quite a few changes. Teaching, learning and assessments must all be aligned. The current practice of conducting the “lab” component is pathetic, and must be overhauled completely. The so-called “theory” component must be seriously examined and pragmatic practices adopted. Unless the colleges, and the universities that deal with them, adopt an “outcome based education” where competencies are clearly documented, and the assessment systems aligned to those competencies, the learn by doing methodology may be ineffective.

For students, my strong recommendation is to adopt the learn by doing approach notwithstanding how your university and college deal with outcome based education. After all, it is your life and you have to exhibit certain competencies in your job!

Sunday, November 15, 2009

Who are the Role Models of Computer Science & IT Students?

Computer Science & IT are hardly “traditional” disciplines of study. They are only about six decades old. In contrast, mathematics, physics, and chemistry and some of the disciplines like mechanical engineering & civil engineering are a lot older. Computer Science is an emerging discipline. There is one striking difference I see between the students of computer science and say, of mathematics or physics. Students of mathematics or physics take great pride in scientists who have made breakthrough progress in these disciplines. These scientists have inspired generations of students by being their role models.

So we have people like Albert Einstein and Stephen Hawking in physics, and Srinivasa Ramanujan and Pierre-Simon Laplace in mathematics. In Computer Science, too, there have been great personalities. But alas, very few students can name these persons and state what they have contributed to Computer Science.

The good news is that students know about Bill Gates, Linus Torvalds and Steve Jobs. The not-so-good-news is that they may not have heard of John von Neumann, John Backus, Alan Turing, Alan Kay or Donald Knuth. Very few can articulate the major contributions of each of these persons. The sad fact is that the students of computer science do not spend enough time and energy to learn about the greatest computer scientists and their contributions. A large number of teachers do not bother to provide this information in class either out of a misguided focus on “completing the syllabus” for the course or out of pure ignorance.

Why should I know about the greatest computer scientists and their contributions? What benefit will I get in investing my time and energy on this activity? Would I not be better off studying my prescribed syllabi and crack all examinations? Would I not be better off becoming more competent in some of the areas of computer science rather than know about the history of computer science?

All these questions are valid. None of them are trivial or improper. To question is to begin an inquiry and that is a good trait. After your intense inquiry, I really mean “intense inquiry”, if you do come to the conclusion that knowing about the greatest contributors of computer science is indeed detrimental or inconsequential to your progress, you are welcome to focus on what you think will be best for you. The teachers amongst you must inquire too.

Learning about the greatest personalities provides the context for our learning. Reflecting on the contributions and lives of iconic figures provides an opportunity to appreciate the culture, significance and relevance of the discipline. It enables one to develop a panoramic view of the discipline rather than a tunnel vision. I think that like in all disciplines, having a role model in computer science & IT helps.

Are our students aware of the immense contributions of great computer scientists like Edsger Dijkstra, Alan Kay, E.F. Codd, Niklaus Wirth, Alan Turing, Donald Knuth, or Barbara Liskov? Can’t we as teachers make our classes less insipid by providing inspiring context through reference to interesting personalities, their contributions and their lives?

I will make one posting each week on a person who has made immense contributions to computer science & IT. Watch this space, folks!

Friday, November 13, 2009

Can programming skills be taught to just about anybody? (contd)

This is what Professor Sadagopan says in response to my earlier post:


While I agree to a large extent, I do differ on one count. For some reason there is too much emphasis given to "logical thinking" (left brain) than "creative thinking" (right brain). Some of the best programs (MS Excel, Apple Mac OS, Adobe Illustrator) are created not always by those very good in "logical thinking" but those well versed in "beauty" (interface, interaction, aesthetics). So my conclusion ANY PERSON CAN MASTER PROGRAMMING if (s)he wants to master it!

Should Interviewers for Entry Level Programming Positions be “Trained” in Interviewing?

I know that I am going to raise the hackles of quite of few professionals in the IT industry. Would it help, if at the outset, I affirm that what I state here is without malice? I hope so…

Some months ago, one of my students told me that in an interview at a large company in Bangalore, the interviewer asked him to write the smallest C program that is possible. This student is quite intelligent and competent. Baffled as he was, after a few moments, he wrote the following program.

void main() {
}


The interviewer apparently did not think that was the appropriate answer. And after a couple of questions about the college in which he studied, the interviewer terminated the interview. The student did not get selected for a job. He still thinks that he was rejected because of this particular question & answer. The student may be wrong, and the interviewer would possibly have other reasons for not selecting him. I told this student so, and gave him a few words of encouragement.

The student then asked me how this answer could be wrong. This is a complete C program. It compiles correctly. It executes correctly, even though it does not do anything useful. Has he missed something to make this program even smaller? I had to confess that this program could be the smallest, but absolutely useless C program that I have encountered. But I have no clue what the interviewer had in mind when he declared the answer incorrect. Nor do I have any clue why such a question had to be posed at all in an interview? If you have any clue, please do share your thoughts here…

I was present in an interview several years ago as one of three interviewers. One of the interviewers asked the student to write a C program that prints itself. Now that is a valid question in that it has a solution. It is extremely difficult for a student to answer it correctly within the few minutes usually available in an interview. Take a look at one solution.

#include
main()
{
char *val1 = "main(){char *val1 = %c%s%c; int val2 = '%c'; printf(val1,val2,val1,val2,val2);}";
int val2 = '"';
printf(val1,val2,val1,val2,val2);
}


At first sight it is unlikely to make sense. For many it is unlikely to make sense at the second sight, the third sight, etc. You can compile and execute this program. You will find that this program displays itself. Pretty awesome, isn’t it? I will write about such types of problems one of these days! But is it the type of question one must pose a student in an interview? Perhaps the interviewer wasn’t really looking for a solution, but wanted to hear the approach of the interviewee! I still remember the baffled look on the face of the student, then. Roughly 15 years have passed since this incident. I wish I could communicate with the student and find out how he recollects this episode!

Looks like a section of the interviewers need to be trained on developing interviewing skills. Several companies in the USA do train their potential interviewers. Some do in India too. What is required is a cognizance that untrained, egotistic and over-enthusiastic interviewers can damage the psyche of youngsters!

Can programming skills be taught to just about anybody?

"Can programming skills be taught to just about anybody?" or "Can anyone become a good programmer?" Ravi - Thanks for this interesting question.

I am going to share my view on this - and Raja will follow up with a post reflecting his view:)

Answer: No, I don't think anyone can become a good programmer. Just like every branch of science or technology, programming requires a very keen mind with an above average IQ. One also needs to have a fairly good grasp of "logic" in order to become a good programmer.

Question: Can everyone with an above average IQ be taught programming? After all, above average will still cover half the world population:) 
Answer: Yes, I think that every person with a reasonable IQ and a good grasp of knowledge can be taught programming.

Question: Will every person who is taught programming become a good programmer?
Answer: No. What differentiates good programmers from the not-so-good ones is practice. This is not very tough to understand - every one of us plays cricket, but we don't all become good cricketers! It takes a lot of dedication and practice to become good.

Question: Is every good programmer a good software developer?
Answer: Oh, absolutely not. Being good/great at coding does not make you a good software developer.
Beyond coding, software development involves a number of other important steps including understanding and capturing requirements, translating these requirements into features/functionality, applying relevant technologies that best address the situation, performing design and analysis, laying out a development plan, developing test plans, documenting everything well, managing releases, etc.
So, if you are looking to be a good software developer, my advice to you is: please look beyond C, C++ and Java and start looking at all aspects of software development.

Rediff Article: Infosys to have employees master technology before they become managers

A couple of days ago, Ravi commented on one of the articles that most IT students look at programming simply as a stepping stone - something that they would work on for 3-4 years after which they would become a project manager / team lead.

This has pretty much been true for the past 10-15 years. Under pressure of rapid growth, IT & ITeS companies have been promoting their employees to team lead / manager positions with only 3-4 years of job experience. This is very different from what happens in the west as well as in other industries - typically, people spend well over 6-8 years before they get into a supervisory role.

Thanks to the recession and the slowdown in growth, IT companies are now taking a number of steps to rectify some of the mistakes they have made in the past. Infosys has announced today that they now expect their employees to spend atleast six years on technologies before they get into a manager role.

http://business.rediff.com/report/2009/nov/13/tech-master-technology-first-be-a-manager-later-says-infosys.htm

I, for one, am very happy to see this change. In the short run, this may sound like bad news for the employees. But I truly believe that this is a good thing for them as well in the long run - people with better understanding of technology do make for better product managers, project managers and business leaders.

So, kudos to Infosys for taking this step. I hope the rest of the industry follows this lead as well.

Thursday, November 12, 2009

Any Compelling Reasons for College Graduates to Know the C Programming Language?

Why do I even ask this question? I ask this because over ten years ago, when I was working at BITS, Pilani there were intense discussions on what one should be doing in the two programming courses that were common and compulsory for all students. The discussions dealt with quite a few things, but I give below a significant few:
· Since there are two courses, should one not cover the procedural programming paradigm in one course and the object oriented programming paradigm in the other course?
· If both the paradigms were covered, should one use the C programming language in one course, and either Java or C++ in the other?
· Why can’t one use just one programming language like Java or C++ to deal with both the programming paradigms?

I remember that during these discussions one of my colleagues and friends made a passionate case for using Java as the vehicle for teaching both procedural and object oriented programming paradigms. Most people involved in these discussions were of the opinion that C++ cannot be used for both paradigms since they felt that C++ is unsuitable for enabling students to learn object orientation sensibly. The fence sitters, typically, would support maintaining status quo, which is to just deal with the procedural programming paradigm only. You ask them whether learning object oriented programming will not be beneficial to all students. They would invariably reply “Well, definitely the Computer Science and IT students would benefit, but this is not required for other disciplines”. Well…whatever…

When a university offers two computer programming courses for all disciplines, there is room for discussions and adoption of innovative ideas. Most universities in India just offer one computer programming course that is common for all disciplines. Computer Science and IT students, perhaps, do a few more. So the choice of the programming language used in this course is a crucial decision.

We may debate these points on an academic, philosophical and pedagogical level. I think that there is at least one compelling reason to use the C programming language in one course. I must now really disappoint you! I do not have any solid academic, philosophical, or pedagogical reason to assert this.

A large proportion of all graduates from engineering colleges aspire for employment in the IT sector as software developers, not necessarily just the CS/IT graduates. A large number of these companies that recruit entry level programmers administer a test that is primarily based on programming using the language C. If these students have not done programming using C, there is no way they would be even considered for employment in these companies. Surely there are some companies that do not have this type of a test, but they are probably very few. So not learning programming using C restricts one’s capability to seek employment in companies dramatically. That is at least one compelling reason to use the C programming language in one course, from the students’ employability perspective!

The language C is good, but it does seem to encourage students to develop some maverick programming styles. But under the circumstances, it seems a pragmatic choice. There are problems with this choice, but I guess I will deal with that aspect some other time!

Wednesday, November 11, 2009

How the Nature of Assessments Influence What Competencies You Develop in Programming…

During the last two years, I have interacted with a good number of students of Computer Science & IT from various universities in India. These students are not from the top ones like the IITs, BITS, Pilani, the NITs. Several students exhibit just rudimentary competencies in programming even after having completed the course at college and even obtaining fairly good marks or grades. One of the simple problems that I ask them to solve is this:
The problem involves taking a positive integer as input from the user, and computing the sum of the individual digits of the input integer. If the result is not a single digit integer, the process of summing up the individual digits of the number continues till it reduces to a single digit number. The input integer and the reduced single digit integer are to be displayed. Write a computer program using the C programming language that performs these tasks.

In my opinion, it is a fairly simple problem. I have found a fairly large number of students who struggle to solve even this problem. Yet, they appear to have passed the course at college and have secured good marks/grades. Where does this disconnect stem from?

No prizes for guessing! It is the nature of assessments that these students had to go through at college. Many of the students have shared with me that they are not able to solve such problems because they were not required to prepare for answering such types of questions in their final semester exam. I then picked up a set of question papers from various universities and examined them. Predominantly, the nature of the assessment is such that one can get a decent number of marks by answering a wide range of questions that require descriptive answers, and not any problem solving. Of course, there are a few problems to be solved with the student having a generous choice of problems to choose from. So it is possible for many students to obtain decent marks without having the ability to solve problems by writing programs.

Now if a student knows that in assessment she would be required to answer question such as “What is recursion?” why would she practice solving problems that involve recursion? Of course, one might say that she must practice solving problems using recursion since it is one the important competencies to develop. I agree. But the sad fact is that most students would quickly adapt to doing only the required amount of work in a course that would enable them to pass a course with decent scores. I was lucky on two counts. One, I had an inspiring teacher. Two, the nature of assessments at my institution, BITS, Pilani, ensured that I had to develop programming competencies. Sadly, many students are not so lucky as I was on both these counts.

If you are a teacher, please do reflect on the need to align assessments to the stated learning objectives of a course, and what competencies a student would have to develop by doing the course. If you are a student, my appeal to you is to focus on developing competencies at problem solving using programming. Learn by Doing! Never mind the bland nature of assessment in your university. You would pass the course and get good marks anyway! But the competencies you develop in problem solving & programming could form the foundation of a great career! Well, there are other competencies, too, that you have to develop to make a great career, but I will talk about them some day.

Monday, November 9, 2009

Is There a Recipe for Learning Programming Effectively?

I have taught a very large number of students programming for about 30 years. Roughly about 20% of each set of students end up being good programmers. Many others do not learn programming that effectively. One of the common questions I am asked to answer is “Is there a recipe for learning programming well?”

Yes, there is! Many people have advocated several methods of learning programming effectively. You might be thinking that I am referring to “structured programming”, “stepwise refinement”, etc. While they are all useful, I am not referring to any of these as an effective recipe. A simple recipe for learning programming effectively is to “learn by doing”.

You cannot learn to ride a bicycle by reading a book, or listening to a wonderful set of lectures, watching a video or anything else. The only way you effectively learn to ride a bicycle is to “practice riding the bicycle”. We have all learned bicycling only by attempting to ride it, falling off, hurting ourselves and finally experiencing the thrill of riding the bicycle in a well-balanced manner.

But we are not talking about bicycling. Learning programming effectively means that, like bicycling, you must learn by doing. So what should I be doing to learn by doing? Many students depend too much on learning programming in classes (through lectures), or by reading books, or by learning them through videos. That is not the “doing” that I mean. You must learn by solving many problems by writing programs, and getting them executed correctly on a computer.

It is not enough that you write the algorithms, but not the program. It is not enough that you write the program, but do not get it compiled and tested. You must execute the program and test it with suitable test data to convince yourself (and anyone else) that the program works as intended. So, how many problems must I solve to gain a significant competency in programming? Solve at least one simple problem and another one problem of a medium level of difficulty every day. Well, alright, you may skip one day in the week as a relaxation! And once every month, I recommend trying to solve one problem that is somewhat challenging. There is no rigorous scientific basis in my recommendation. But it has worked well with many of my students.

Where do you find these problems? There are several places, actually. You can find them in books. You can find them possibly in your college library (collection of assignments, question papers, etc.). Well, don’t blame me if your college assesses students of programming through questions such as “Write short notes on (a) recursion, (b) passing parameters by reference, etc.” That is pathetic, but how does one advise and transform custodians of teaching and assessment? Of course, you can find several thousands of programming problems on the Internet.

I believe that you can find sufficient numbers of problems from these sources to learn by doing. I will, in my future postings, share some fabulous places where you can find programming problems.
So, start now! Learn by doing! It would be useful if you can also share your experiences on learning by doing with others through this site.

Sunday, November 8, 2009

Hello, I Want to Learn Santro, and Never Mind the Driving!

Just ask a sample of students who are enrolled in the engineering colleges who aspire to become software developers, "Have you done a course on Computer Programming? What did you do in that course?" The chances are that a large majority of them would respond "I've done C/C++" The latter part is to be pronounced as "SeeSeePlusPlus" in one single breath! And during a summer break, if you ask them what they are doing, the likely responses are "I am learning Java" or "I am learning Visual BASIC" or something similar. These answers trouble me a great deal. Why is the emphasis on the programming language rather than on problem solving?

Perhaps I am not gracious. These students must be learning programming, but are laying emphasis on the programming language for reasons best known to them. Maybe it is a lot glamorous if you add a long list of programming languages to your resume, rather than simply emphasizing that you are excellent at problem solving, and that you know how to solve them using a myriad of languages. I have been teaching students for close to three decades and have been interviewing aspiring programmers for my company. Are these students able to solve problems using programming techniques well? Barring the top 15%, the rest of them struggle solving problems of even less-than-moderate levels of difficulty. And yet, they have all learned computer programming. Sorry, they have learned "SeeSeePlusPlus"!

Well, what is important? Problem solving using the procedural method or the programming language C? Problem solving and the object oriented methodology or the programming language C++?

Suppose you want to learn how to drive a car. You go to the driving school. Do you say, "I want to learn how to learn a Santro" or do you say, "I want to learn driving"? For learning to drive a car, you need a car, and that is just a vehicle. Of course, your choice of a vehicle must be appropriate. It is perhaps alright to choose any stick shift compact car like a Santro or a sedan like Honda City. Would it be alright to choose a Formula I racer? While problem solving should be the focus, the choice of the vehicle or the programming language is also important.

While learning computer programming, you need a programming language. If you were to learn programming using the procedural paradigm, you have a few choices – C seems to be ubiquitous and not really a bad choice. But there are others too. If you were to learn programming using the object oriented method, again, you have a few choices – C++, Java, C# or Smalltalk.

If you are a teacher, it is important to emphasize that the first course on programming is about problem solving, like the act of driving. The programming language chosen is merely a vehicle, like Santro or whatever.

If you are a learner, it is important to focus on problem solving and not on just the syntax and semantics of the programming language.

For starters, why don't we drop saying "SeeSeePlusPlus" and instead say "C and C++", if we have to say the two together in the same breath! But why do people say "SeeSeePlusPlus" in the first place? Well, that is another story!

What is this blog all about?

Welcome to our new blog!

As the name says, this blog is a forum to provide our reflections on the state of IT education in India today. We also hope to provide several tips to youngsters who are trying to enter the IT industry or are in the early stages of their IT career. We hope that this blog will be interesting to students, teachers, academicians and authorities in the domain of education.

Join us in this journey - let us be the change that we want to see.