Saturday, September 18, 2010

If I can program..

I am posting after a long time. Researching a long screed on the National People Registry. In the meantime, here is a filler.
It is true that in this day and age, people who know computer programming have an advantage - it is somewhat like auto mechanics but with more glamor and money. I was recently at my wife's sister's place. They are running a business and they had a problem with a sales product they had bought. One fine day the product stopped working. The product maker just denied support. And all their information was tied up in the database.
They asked me to take a look at it. This is an unknown product; I had no access to source code. But I could make the product work again. My relatives were very thankful and my wife very proud.
Computers still have a glamor in India. Its "mechanics" are still not sullied with the geek image that programmers in the United States have to bear. If you know a certain set of programming languages, you can understand how systems work and (mostly) what breaks them.
Given this, it is sheer luck that I chanced upon this particular field. I was a computer hater in college.

Computer Hater
I majored in electronics engineering as well as Physics. Our class had a few guys who were taking computer courses. "We" thought they were pathetic traitors to the cause of Physics.
"We" were a bunch of guys who thought it was fun discussing the existence of the centrifugal force when we were hanging in the bus footboard. We all thought we were the natural inheritors of Einstein's legacy. Even though I myself had difficulty doing Physics experiments in the lab without breaking things, I completely identified with the great physicists. I thought I was a "theoretical" physicist, like Einstein. (It took some courage writing that last sentence)
In my world, if you sucked at experiments, then you were a theoretical physicist.
Unfortunately I was bad with theory too.
We started noticing that a few of our classmates were going to NIIT classes. They all had books such as "C Programming". Since none of us knew anything about computers we decided it was not worth knowing.
Then college ended and most of my bunch of budding physicists went on to MCA.
I was shocked by this. I decided I would carry on the lone torch of Physics even if everyone in the world started learning "C".
I was in engineering college by this time; and our syllabus involved computers. In the 5th semester I finally had to sit before a computer and write something called a program.

What is all that blank space after C:?
One of my classmates Vijay was an expert in computers (he apparently has patents to his name now). I enticed him with a Rava Dosa and begged him to teach me DOS.
He sat before the computer and typed a few commands. He created a directory. He deleted one. He copied a few files. Then he explained to me that files were organized in paths, like house addresses.
"When you say your house is in 20, Some Street, Adyar, Chennai, India - you are pointing to your location. It is the same way with files. You have to tell the computer where the file is."
I was intently staring at the monitor. It had a C: and then a cursor blinking.
I said, "So what is all this blank space after C:?"
He said, "What blank space?"
I said,"You said there are files. But I only see a blinking dash."
He was confused. He said again, "It is like an house address"
I did not relent. "What is in the computer after C:?"

It took me a long time to realise a couple of things:
1) The computer monitor is not directly connected to the keyboard. There is something in between called the processor, memory and all that. That is, the computer is not a typewriter.
2)There is nothing after C:.

It took a lot more Rava Dosas too get that precious bit of knowledge.

My point is that when you don't know something, you automatically dismiss it. Then you have to take it as a course in 5th semester and your entire career depends on it. That is my point.

My encounter with Windows
Before I first saw a Windows machine (3.1), I did not think multi tasking was really needed. I was surprised that people were spending so much time on the ability to do multiple things at the same time with one computer. To me, it seemed like you would need two keyboards before you could multi task. Then you would need two people to type in the keyboards. Who needs one other person sitting near you and typing?
So that was my understanding of multi tasking.
(By the way, I had a similar reaction to constructors in C++. I did not understand why they would ever be needed, so I skipped the entire chapter on them)
Then I was sitting in a shopfloor one day and saw a computer with a screensaver. I saw the mouse and thought it was very cool. I tried to explore that computer to learn all about Windows.
Qucikly I found out that I could play Solitaire and so spent the entire evening playing Solitaire. That was my first attempt at learning Windows. That computer only had two icons. One was Solitaire and the other was Minesweeper. I thought Windows was completely lame.

The debate between Systems and Application programming
Once we understood that all the computer learners were being shipped off to the USA, we found a new interest in computers. I was convinced that I was born for computer programming, but I still thought of myself as a theoretical programmer.
At that time there were people who worked on Y2K; there were people who worked on network programming. In between there were weird people who were learning VB6, Java or HTML/ Javascript.
Now each of these were split into camps which knew nothing about the other. You can find some aspect of the below question, I am sure, still raging in campuses:
Would you be a systems programmer or an applications programmer?
In college, most people wanted to be a "systems" programmer. We had no idea what this meant. But in our minds, we would rather be someone who wrote code that everyone else would use (such as a tiny portion of an Operating System) than a mere programmer who ASSEMBLED such pieces.
That is, we wanted to write core functions that everyone else will call.
Now, as most people familiar with software programming will understand, this is impossible. Every programmer assembles their software - but that does not mean that the coding is easy. If anything, application programming is very complex because it has changing requirements. Application programmers simply address a different set of problems, and those are not trivial.
(The reason I emphasize this is because a few months back in a facebook discussion, someone told me that an AT&T scientist thought Indians were better with applications; but could not write really complex software - such as algorithms. This is hilarious, because applications model human interactions and transactions. These are hardly trivial )
So we have tribal warfare between the Javascript guys and the Middle Tier programmers; network programmers vs application programmers;C++ vs Java; C# vs VB; and so on. Each camp knows nothing about the other. The sorriest lot of them are the database developers who stand in a small corner and keep complaining.

I always took sides in these debates until I found out that all of these can take you to the United States. In fact the much detested web UI programmers have the best shot.

So I started from staring at C: and wondering what that was; and have ended up even winning my relatives' approval as a computer expert. All the while I hated everything new that came up the horizon until I learnt it.
My current hatred is for mobile app/web programming. I am sure it is just a fad and will go away shortly. I cannot imagine that people will actually access websites through mobile phone. That is what I have been telling everyone...


Jebarson007 said...

Learning is the only change every computer programmers have to live with. If you stop learning, then you'll get an opportunity of becoming a project manager. :)

Geek said...

Nice post!

Perhaps I should add that in spite of being a PhD student in computer science, I have not written a single line of code for a very long time, and it is not uncommon for a theoretical computer scientist.