The Making of a Programmer - Part One

16 views
Skip to first unread message

Jayakrishnan K

unread,
Jul 29, 2010, 12:00:53 AM7/29/10
to ipgof...@googlegroups.com
[Note: This article was written in 1998 and deals with issues from 90's some of which strike a chord even today.]

The Making of a Programmer - Part One


“How long does it take to learn to use computers?", is one of the more common queries regularly put forth to me. While over the years I have formed my own rather differing opinion on the subject, it is however interesting to note that plenty of institutes now have a one to two month course on computers. While some may claim that a month or so may be sufficient to grasp the fundamentals of the topic, is it actually possible to learn about computers in that short a time?

Computers by its very nature of being a highly flexible computing device is of tremendous inherent complexity. The availability of the right kind of software hides this complexity from us; however, on occasions, one is forced to come to terms with this complexity in order to keep the system functional. As was described by one of my friends, “if it works, it works, but when it fails... I don’t have the faintest idea what could be wrong".

And my friend is not alone. There are plenty of people out there who run into these minor troublesome, irritating, problems everyday. Ask the worst sufferers and they would tell you a computer is simply not worth the hassle. So is the system actually to blame? or are these users just victims of their own ignorance..?

While a casual user of computers may not be required to understand why or how the system fails or malfunctions, what is disappointing to note is that most programmers or would be programmers have preferred not come to terms with this complexity. Instead of attempting to master the system, to learn to how to control it, most programmers simply tend to shrug off the problem as beyond their capability, an attitude that is certainly not conducive to further self development.

The most commonly cited reason for this self defeating attitude is that the required information is simply not to be found and that most of the doubts raised by them could not be cleared by anyone they knew. So does that mean the knowledge at this level is not readily available here? Are people who complete diploma and engineering courses competent enough for the job? Are the courses comprehensive enough? Why do software icompanies rarely take up fresh diploma holders? These are just a few of the questions that need to be asked.

Availability of information, is a crucial issue. while the primary source of information for a student is the lecturer, merely sticking to that one source for information handover does not always result in a true understanding of` the subject. A student who is interested in gaining a better, more comprehensive View of the subject should and must refer to secondary sources of information... like books. Unfortunately books too ultimately reflect the prejudices of its author, and therefore referring something much more than that one extra book is required to gain a clearer picture. Besides the relevant books are not exactly cheap, nor are the good ones easy to obtain.

The last word on information availability is the Internet. The good news is that it is accessible and the better news is that there is plenty of information in there, much more than what you would probably read in a lifetime; the bad news is that most institutes aren't exactly encouraging their students to utilize it. Part of the reason are the costs involved, Even with a pretty good cut in the access tariffs for registered educational institutions, a good amount has to be spend to gain access to the net.... something that most institutes seem reluctant to do.

So how long does it take to learn to effectively use a computer? The key word here is "effectively", Learning to use a computer and` learning to use it effectively are two entirely different concepts. You can sit down in front of the system, learn to hang a few keystrokes and claim to have learned to use a computer (and be quite truthful about it). However, incorporating the computer ae a tool in your field of work and deriving substantial benefit from doing eo, indicates that you have learned to utilize it effectively and that in my opinion necessitates a minimum regular use period of around four months. Becoming a competent programmer with a relatively good knowledge in a language is possible in about a year. Good knowledge in two to three languages and a couple of operating systems would take around you around three years.

And finally, "how long does it take to become an expert?" well... you got a lifetime of learning ahead of you.

- JK

ashik salahudeen

unread,
Jul 29, 2010, 1:23:09 AM7/29/10
to ipgof...@googlegroups.com
Awesome. Its still valid - except that the cost of internet has come
down, while the institutions still don't really teach their students
to use it effectively.

--
aashik

Technikhil Account

unread,
Jul 29, 2010, 2:08:13 AM7/29/10
to ipgof...@googlegroups.com
Along the same lines I came across this cartoon sometime back - check it out

- Technikhil

Praseed Pai

unread,
Jul 29, 2010, 2:09:32 AM7/29/10
to ipgof...@googlegroups.com
Hi all ,

>
>Instead of attempting to master the system, to learn to how to control it, most programmers simply tend to shrug off the >problem as beyond their capability, an attitude that is certainly not conducive to further self development.
>
The above lines are the most important for me. 

regards
Praseed Pai

Technikhil Account

unread,
Jul 29, 2010, 2:17:10 AM7/29/10
to ipgof...@googlegroups.com
Hi Jayakrishnan,
   If you are interested, you can post your articles on my weblog as a guest poster. 
   My weblog is located here - http://technikhil.wordpress.com/
  
   Otherwise if you don't mind can I take your content and post it on my blog - I will credit you as the author of the post and provide a link to you

Thanks and Regards
Technikhil

Vishnu Gopal

unread,
Jul 29, 2010, 9:59:28 AM7/29/10
to ipgof...@googlegroups.com
Just to put a slight note of dissent here: while I like the text and understand the spirit in which it was written, understanding everything about a computer and becoming an expert imho shouldn't be the goal set when learning. 

One of the major complaints I had about my bachelor course was that it tried to start from the "ground up"—teaching us the structure of a computer, then the workings of its units, then instruction formats, assembly language programming and then finally higher-level programming. I suppose the idea was to make the student get a fuller understanding of a computer and its workings. In real life though I noticed that most of my friends would start to get glassy-eyed at around the instruction format level and then attend classes and exams with the sole purpose of just getting through the course. It takes the joy out of the experience entirely.

Another way to look at it is that a computer is at best a tool, and it should be sufficiently understood so that it serves its purpose. A web developer should never need to understand compiler construction (dealing with browser differences and usability is complex enough), a mobile app developer doesn't need to worry about the ARM instruction set, and a systems programmer should never bother about a defective RAM chip making his programs go berserk. Google, which employs some of the best programmers in the world also has one of the most extensive IT support teams, people whose sole purpose is to make IT smooth for programmers.


Learning should probably be explorative: show a student what a computer can do. All the interesting bits (of which nowadays there are so many—when I was starting off, showing me Gorilla in QBASIC was enough) and teach them how easy it is to tweak and modify certain things. Teach them a higher-level language like Ruby/Python first and focus on interesting things that can be done with it. Show em how to make a web page and add interactivity to it.

Stuff like that I think will make more people like computers. As an aside, this has been discussed to death within the context of getting more women into computing.

Cheers,
Vishnu

--
  Vishnu Gopal
  vishnugopal.com

Jayakrishnan Kurup

unread,
Jul 29, 2010, 12:24:04 PM7/29/10
to ipgof...@googlegroups.com
> understanding everything about a computer and becoming an expert imho
> shouldn't be the goal set when learning.

I disagree. If your goal is to become a programmer then you do need to
understand how computers work at a rather low level. The lower the level,
the better the programmer you become even in these days of GB's of memory
and GHz of speed.

The comparison with a car would be appropriate.

If you are a driver using a car to get from point A to point B then
understanding how to drive the car would be sufficient. However if your
daily job is that of a racing car driver, then understanding exactly how
your car engine works will make you a much better driver. In the same way,
I don't expect a power user to understand how the cpu, memory or disk
function in concert with an OS to boot up a computer. But if you are a
programmer, you better have a good idea of that and more.


> I suppose the idea was to make the student get a fuller understanding of
> a computer and its workings. In real life though I noticed that most of
> my friends would start to get glassy-eyed at around the instruction
> format level and then attend classes and exams with the sole purpose of
> just getting through the course. It takes the joy out of the experience
> entirely.

The disconnect happened as cpu's started becoming complex, programming
languages started going high-level and simultaneously students without
genuine interest opted for computer science purely for getting a good job.
If you happened to take a computer course in the 80's. The above course
made perfect sense as you would have to spend time programming in machine
code, assembler for many of your tasks and knowing this was an essential
requirement for your job. Nowadays students study gates or maybe a simple
adder [and then a miracle happens] and you have a cpu [a second miracle
happens] and you have an OS. Many students never get a chance to figure
out the miracles and colleges don't have the time to teach them. The blame
should be shared equally between the syllabus, the teachers and the
students. The information is out there... after all how many students take
the effort to learn it later?

> Another way to look at it is that a computer is at best a tool, and it
> should be sufficiently understood so that it serves its purpose.

"sufficiently understood" is a loaded word :-). It is probably impossible
to completely understand something, but the better your understanding, the
more proficient a programmer and trouble shooter you can be.

> A web developer should never need to understand compiler construction
> (dealing with browser differences and usability is complex enough), a
> mobile app developer doesn't need to worry about the ARM instruction
> set, and a systems programmer should never bother about a defective RAM
> chip making his programs go berserk.

I disagree. I can think of plenty of instances when my understanding of
computers / os internals and knowledge outside my domain helped me trouble
shoot and solve issues. In fact I would probably be able to write a whole
book on such experiences. In all these cases you had well intentioned
programmers / it managers who "sufficiently understood" the situation, but
not enough to solve it. It is the people who bother about these details
who end up becoming expert programmers.

I can narrate one incident that happened back in 1993 when I bought a
printer for the first time. I was all of 20 at that time and the guy from
the computer company brought the 80 column dot matrix printer to my house
and set it up on my computer. He then types "dir > prn" as is the norm in
dos to test the printer and the printer prints garbage. He does it again
with the same result. After examining the prinout and referencing the
printer manual, I pipe in and say that the pin X on the printer cable has
an issue and is most probably not soldered correctly. He looks at me as if
I have lost my mind. This kid who is probably seeing a printer for the
first time is advising him on what is wrong and has a very specific
answer. He say that "it's a new cable" and fiddles around with printer
trying to get it to work and I quitely suggest the same option. In
desperation, more out of annoyance rather than belief, he unscrews the
cable connector on one end and says "see it's perfect". I say open the
other end. He does it now thoroughly convinced he has a crackpot for a
client. I can still visualize the amazement in his voice when he discovers
that the exact pin I stated on the cable connector is not soldered
correctly. He asked with wonder in hi voice...how did you know that? and I
explained it to him.

His name was Joshua (if my memory is right. It's 2 decades ago after all)
and he subsequently ran a computer store in bakery junction, kottayam for
quite some time. If anyone knows him, you can get an independent statement
of facts from him. The problem with Joshua was that he "sufficient
understood" printers and "sufficiently understood" computers but never
really fully understood how they worked. If you "sufficiently understand"
something you will never face an issue when the going is good, but when
you have to resolve an issue that's where fully understanding computers
will make a difference and set you apart from the crowd of wannabe
programmers/personnel.

I just noted one such instance that stuck in my mind that was sufficiently
far back in time so as not to offend anyone. I have more war stories, some
of them as recent as 6 months ago which I guess I would have to reserve
for story telling a decade down the lane :-).

> Google, which employs some of the best programmers in
> the world also has one of the most extensive IT support teams, people
> whose sole purpose is to make IT smooth for programmers.

So does Microsoft and all the biggies, but that is more of a business
decision. It's better to let a specialized service person who getting paid
30k a month install and get the OS up and running as per company policy
rather than have your protocol specialist who is getting paid a cool 2L
per month waste a day figuring out out to install and get something up and
running. It's better for the business and wiser use of personnel
resources, nothing more.

> Learning should probably be explorative:

I agree. A person starting computers should be free to explore areas that
capture their interest. However any one looking to become a good
programmer should be looking at getting a good idea of the fundamentals of
computers and how they work. Merely gaining an idea of how to code in a
high-level language is imho insufficient.

- JK

Vishnu Gopal

unread,
Jul 29, 2010, 2:44:49 PM7/29/10
to ipgof...@googlegroups.com
Hi Jayakrishnan,

Even though I have very differing opinions, it's refreshing to find a stimulating discussion. 

I suppose the crux of the argument is what you mean by a programmer. I found your comparison of a race car driver eye-opening. How many race car drivers are there in the world after all (i.e. compared to regular car drivers)? I'd rather compare them to systems programmers with a very specialised niche rather than the everyday bread and butter programmer/car driver. If you'd ask me to look at the engine of a bike or car and figure out what's wrong with it, I'll have no clue, but I'm pretty competent behind the wheel and have been on an all-India safari on my bike. 

Does the fact that I have to rely on a mechanic to fix my engine make me less than competent at what a bike's supposed to do? (Or at least, what I use it for?) Not at all. Why should programming be any different? Why is a complete mental model the ideal?

In "these days of GB's of memory and GHz of speed" almost everybody does some programming without even realising that that's what they're doing. Excel Macros? Game UI (like say, Starcraft) customisation? Widget creation? Facebook applications? Google chrome plugins? Android/iOS web applications? A Yahoo Pipe maybe? A lot more programming is happening than we realise but a *lot* more could happen if only we get out of this rut that "programming" is somehow an esoteric art that requires knowledge of the whole stack from chip up to interface down.

Thinking that you need a knowledge of how a computer internals function is imho an "old programmer's" mentality. If you grew up during the 70s, 80s and 90s, I suppose it was unavoidable because computers had no GUI, hardware was much more tied into software and programming was more in low-level languages than not. I have several friends who work in chip design firms and microprocessor industries now who have never written a line of Assembly code. I predict that in 20 years time, there will be programmers in such firms who've never written a line of C. Does that make them less of a programmer? I don't think so.

Another way to think about it is in terms of abstractions. The more refined the technology becomes, the better the abstractions available to build on top of it. Having a mental model built around an abstraction (rather than the bare metal reality) does in no way hurt you. In fact, it helps you learn much faster. [You don't have to take my word for it, there's lots of research on it: http://bit.ly/b517MC]


Your argument that people join bachelor courses in computer science because they'll get a good job is an excellent one. It's of course true, but in no way answers what I mentioned earlier. They are disillusioned because of the great detail into which the course goes into convincing people that adders and diodes are important to every day programming. A friend of mine and I took a lot of classes for my friends in college that focused on what I suppose could be termed "popular programming" i.e. how to create a web page, how to write PHP scripts, how to make a blog etc. The same people who were bored out of their minds in class were very enthusiastic about our lectures. The reason is pretty simple and obvious: the utility that they perceived for stuff like web programming was way more than learning about assembly or inane C contusions. 

The counter-argument then is that you're making a class of dumb programmers. Is a person dumb (or less of a programmer) because he doesn't understand math (i.e. under the assumption that computer science is math) or doesn't care the least whit to learn about it? Of course not. There are several streams of expression of which math is just one. If you program in something like Processing.js etc, it's as much art as math. If you do web design/programming, I'd argue usability is more important than algorithmic efficiency. Is any of these things less complicated than math? Again, no.


I liked your answer to Google's large IT support base. Putting it in economic terms is a copout though. In terms of programming productivity, if you were a programmer, what would you be rather doing? Coding or installing software updates? Reading a blog on good programming techniques or figuring out if the latest update breaks a feature in Microsoft Word that you depend on every day? The IT support base provides a more valuable role: it abstracts away the merely functional bits of a computer from a programmer so that they can _get work done_ and not worry about the fiddly bits. 

I also liked the narration of your printer cable incident if only because a lot of such incidents have occurred to me (and I suppose everybody on this list) as well. The argument is that the more bits of knowledge you know about a system, the greater the extend of proficiency you have in it. But where do you draw the line? The computer science field has become tremendously complex in recent years. Pretty soon we'll have to understand quantum effects to grok chip design. There's complexity at the top end as well: to design an interface you'll have to understand how humans use a device. This means understanding ergonomics, cognitive science, HCI and usability, each a huge research field in itself (I spent the last year doing a master's course in this area).

The days of a single lone programmer coding away in a garage (a la Steve Woznaik) and coming up with everything from hardware to software are years in the past. In the same vein, the art and science of "programming" is no longer a monolithic orthogonal field. Focus on an area that you are interested, an area that you really perceive you can do well, and study up. And when you have doubts about something outside your field, ask Stack Overflow, somebody will help you :-)

Cheers,
Vishnu

Praseed Pai

unread,
Jul 29, 2010, 9:11:34 PM7/29/10
to ipgof...@googlegroups.com
Hi All ,
    This thread has now become vibrant !
 
> Vishnu wrote    
>I suppose the crux of the argument is what you mean by a programmer. I found your >comparison of a race car driver eye-opening. How many race car drivers are there in the >world after all (i.e. compared to regular car drivers)? I'd rather compare them to systems >programmers with a very specialised niche rather than the everyday bread and butter >programmer/car driver. If you'd ask me to look at the engine of a bike or car and figure out >what's wrong with it, I'll have no clue, but I'm pretty competent behind the wheel and have >been on an all-India safari on my bike. 
>
Here now debate has turned into Economics and  Feasibility. IMHO , now an
implicit classification has "creeped" into  programming community  to divide them into System Programmers [ there itself Device Driver Writers , Compiler Writers , System utility writers ]  and Application Programmers [ Desktop , Web , Database , LAMP .....] .
 
Personally , I am of opinion that such a classification gives a deliberate excuse to Software
developers not to learn further things other than their narrow area. ( This is the ground reality ). The article by JK is a case against that trend.
 
>
>Does the fact that I have to rely on a mechanic to fix my engine make me less than >competent at what a bike's supposed to do? (Or at least, what I use it for?) Not at all. Why >should programming be any different? Why is a complete mental model the ideal?
>
Even though a complete mental model is not achievable now a days , why can't we
attempt that and spread the word ? . Lot of Projects fail just because developers
do not have a global view of their project and context where there unit of work fits in.
 
>
>Your argument that people join bachelor courses in computer science because they'll get a >good job is an excellent one. It's of course true, but in no way answers what I mentioned >earlier. They are disillusioned because of the great detail into which the course goes into >convincing people that adders and diodes are important to every day programming. A friend >of mine and I took a lot of classes for my friends in college that focused on what I suppose >could be termed "popular programming" i.e. how to create a web page, how to write PHP >scripts, how to make a blog etc. The same people who were bored out of their minds in >class were very enthusiastic about our lectures. The reason is pretty simple and obvious: >the utility that they perceived for stuff like web programming was way more than learning >about assembly or inane C contusions
>
The issue is not the complexity of Web programming or intricasies of low level programming.
People want to make a fortune out of IT (only a few can achieve that like any other discipline ) and  IT is a good way to make a decent living (which most of us are ). We do not
realize this because Conspicous spending,Keep up with joneses and Anti Snobbery concern dominates in the social life. Students are coming to college in this background.
Obviously , learning "hard stuff" is neither their priority and they do not see a future in it.
 
For a eco system to survive , we require all forms of "species". Some "species" are becoming extinct in our part of the world ( Kochi,Trivandrum ...i am for sure ) and persuading people to learn C/C++ , Electronics ( required for embedded system ) and Assembler is a must as far as i am concerned. ( In the past year , i have consulted on lot of projects and it was a struggle to get programmers who knows the system side of things. In the end , i found
couple of PHP types [no offence intended ] and in the pressure of the context they learned
a lot and did the project successfuly. What they personally say is they were having a mental block. One even vowed never to return to Application Programming [ i was happy but the view
is bit extreme. without business , he cannot feed himself ] )
 
>
>In "these days of GB's of memory and GHz of speed" almost everybody does some >programming without even realising that that's what they're doing. Excel Macros? Game UI >(like say, Starcraft) customisation? Widget creation? Facebook applications? Google >chrome plugins? Android/iOS web applications? A Yahoo Pipe maybe? A lot more >programming is happening than we realise but a *lot* more could happen if only we get out >of this rut that "programming" is somehow an esoteric art that requires knowledge of the >whole stack from chip up to interface down
>
You are having an Information Technology view towards the software development. The primary author is having a Software Engineering view towards the discipline (which i share
with him )
 
So i am proposing a new idea , "The article is a good approach for people want to have a  career path in Software skewed towards the system. ( IMHO,It is a must read article from that perspective ). Application developers can take ideas from it for fun and profit"
 
>
>The counter-argument then is that you're making a class of dumb programmers. Is a person >dumb (or less of a programmer) because he doesn't understand math (i.e. under the >assumption that computer science is math) or doesn't care the least whit to learn about it? >Of course not. There are several streams of expression of which math is just one. If you >program in something like Processing.js etc, it's as much art as math. If you do web >design/programming, I'd argue usability is more important than algorithmic efficiency. Is any >of these things less complicated than math? Again, no.
>
For the Kind of software which i have been part of  , Math or interest
in meddling with symbolism was a must. Currently , i am making a team of programmers
write a Financial Analytics Engine ( a small footprint one...there are excellent alternatives
like QuantLib )  where my staff requires knowledge of  IRR ( Root Finding ,Descartes rule of sign)  , Options Evaluation ( Calculus of Finite Differences  )  and What if /analysis ( Monte Carlo simulation ) to name a few.
 
When we do not get people with skill in math , certain projects cannot be done. Fact that , we have got a lot of people who are really compettent in Web Programming around and not much from the above cateogery shows Math is "slightly" complicated. 
 
When i explain the stuff , they are able to do all of the above stuff.
 
>
>The days of a single lone programmer coding away in a garage (a la Steve Woznaik) and >coming up with everything from hardware to software are years in the past. In the same >vein, the art and science of "programming" is no longer a monolithic orthogonal field. Focus >on an area that you are interested, an area that you really perceive you can do well, and >study up. And when you have doubts about something outside your field, ask Stack >Overflow, somebody will help you :-)
>
This argument is a classic argument which i have come across a lot. Stack Overflow , forums can solve issues related to procedural aspects of software development. An option in a tool , a procedure to achieve a stuff , bugs in the system , workarounds etc. 
 
No amount of forums , can give you "Brain Share" and to Write algorithmic stuff which should fit in a particular context , you are of your own and need to tweak the system parameters. No one with trial and error attitude can write a deterministic system in this scenario.
( if there are 20 variables (system variables) in a system , he needs to enumerate all
the subset of options. 1048576 , he will die before the system finishes ..just joking)
 
In the end , it is about "Top Down Approach (Vishnu )  vs  Botton Up Approach (JK) "
towards Software development.
 
( I can be interpreted as an Old school programmer and frankly speaking , in my younger
days i used to program for the fun of writing programs without bothering about what others
feel about it . This might be reflected in this post.  )
 
 
 
regards
Praseed Pai
 


Vishnu Gopal

unread,
Jul 30, 2010, 1:06:50 AM7/30/10
to ipgof...@googlegroups.com
On Fri, Jul 30, 2010 at 2:11 AM, Praseed Pai <pras...@gmail.com> wrote:
Hi All ,
    This thread has now become vibrant !

Agreed! :)
 
The issue is not the complexity of Web programming or intricasies of low level programming.
People want to make a fortune out of IT 

I concede this but that has never been my argument. All the good C/C++ systems programmers I know cultivated this interest themselves, by self-study or an innate interest in the field. My bachelor curriculum in the guise of tooling everybody up to become a systems programmer succeeds in putting people off programming entirely. This is an observation that I've made several times during my college years. These same students when approached with concrete examples of how programming can be valuable are much more receptive [and not because of commercial reasons, a lot of them went on to do MBA and couldn't care less about computer science]. The basics of programming should not start from learning about bits and bytes or hardware.
 
So i am proposing a new idea , "The article is a good approach for people want to have a  career path in Software skewed towards the system. ( IMHO,It is a must read article from that perspective ). Application developers can take ideas from it for fun and profit"
 

I agree partially, but if you notice, you make the distinction here towards "software skewed towards the system" when in the first paragraph (which I've not quoted here) you were against a distinction for system programmers. It's one or the other don't you think?


For the Kind of software which i have been part of  , Math or interest
in meddling with symbolism was a must. Currently , i am making a team of programmers
write a Financial Analytics Engine ( a small footprint one...there are excellent alternatives
like QuantLib )  where my staff requires knowledge of  IRR ( Root Finding ,Descartes rule of sign)  , Options Evaluation ( Calculus of Finite Differences  )  and What if /analysis ( Monte Carlo simulation ) to name a few.
 

There's no special legitimacy that systems programmers have just because they code in C or know a lot of math and algorithms. That myth has to be utterly destroyed. Programmers are programmers, and each kind deals with a separate kind of complexity.

What you're saying here is that it's easy to find average programmers. That's a truism in every profession. I bet it's equally hard to find a web designer who knows colour theory or a UI developer who knows what Fitt's law is. Equating average programmers to web developers and systems programmers to exceptional ones is a disservice.

 
When we do not get people with skill in math , certain projects cannot be done. Fact that , we have got a lot of people who are really compettent in Web Programming around and not much from the above cateogery shows Math is "slightly" complicated. 
 
When i explain the stuff , they are able to do all of the above stuff.
 

It's encouraging that they're able to transition from web programming to systems is it not? I wonder if you took a bunch of die hard assembly coders and asked them to make a CMS from scratch in PHP/MySQL, how long they'll take to adapt.

One of my closest friends works in the microprocessor industry as a development lead and we recently worked on a medium-sized project in Python together. He's an excellent low-level C coder, but had to work at it to figure out how to do certain non-trivial tasks in Python.
  
No amount of forums , can give you "Brain Share" and to Write algorithmic stuff which should fit in a particular context , you are of your own and need to tweak the system parameters. No one with trial and error attitude can write a deterministic system in this scenario.

Don't pick on the Stack Overflow thing please, it was meant more as a joke :) But how often do higher level programmers face situations where they have to deal with algorithmic complexity or math? I've been a web developer for around eight years now and have faced that situation maybe <5 times, certainly less than 10. I'm not ashamed to admit that I asked for help or googled around for a solution in possibly every one of those situations. 

One time I remember was to figure out how to draw clock hands. I'm reasonably weak in Math so had to look up basic trigonometry to figure out how to calculate length of the line to draw from the angle (If I have to do it now, I'll have to look it up again). It's not trial and error per-se, as much as reading literature, understanding it to solve the problem at hand.

As another example, I had never until recently written a compiler, but I wrote one for a tiny DSL recently. I still don't know how to write a parser, or even what LALR stands for, but my solution is close to outperforming one written using C++/Boost. I just used readily available tools that abstracted away the complexity. [For people curious, I used treetop in Ruby: http://treetop.rubyforge.org/ and cross-compiled the DSL to native ruby code which is then run via JRuby on the Java VM. The C++ version turned out to be a hassle to maintain, which is why the current experiment was undertaken]. But frankly speaking, writing that compiler was far easier and more enjoyable than some of the infrastructure & scaling problems that I deal with as a web developer. 
 
 
In the end , it is about "Top Down Approach (Vishnu )  vs  Botton Up Approach (JK) "
towards Software development.
 
( I can be interpreted as an Old school programmer and frankly speaking , in my younger
days i used to program for the fun of writing programs without bothering about what others
feel about it . This might be reflected in this post.  )
 

I definitely love programming a lot too, and just for the heck of it. Please don't mistake anything that I've said as a criticism against systems programming. But I definitely disagree with the idea that a knowledge of system fundamentals is required to make you a "better programmer". A better systems programmer definitely. But to become a better web programmer for instance, learning the x86 instruction set provides no utility whatsoever.


There is a separate problem that you mentioned, that of encouraging systems programming in college-level kids and improving math skills. I have an unproven theory that showing them something cool that's only possible with system programming skills will likely convert more than a few. One thing that comes to mind is to use http://www.arduino.cc/ Arduino controllers and demo perhaps a maze-solver robot. It again has to be explained from top down though ;-)

Cheers,
Vishnu
 

Jayakrishnan K

unread,
Jul 30, 2010, 3:24:07 AM7/30/10
to ipgof...@googlegroups.com
Even though I have very differing opinions, it's refreshing to find a stimulating discussion.
    Likewise :-).


I suppose the crux of the argument is what you mean by a programmer. I found your comparison of a race car driver eye-opening. How many race car drivers are there in the world after all (i.e. compared to regular car drivers)? I'd rather compare them to systems programmers with a very specialised niche rather than the everyday bread and butter programmer/car driver. If you'd ask me to look at the engine of a bike or car and figure out what's wrong with it, I'll have no clue, but I'm pretty competent behind the wheel and have been on an all-India safari on my bike.
    You missed the point. My argument was that if you make racing your career you better figure out how your car engine works as that will make you a better driver than the other racing car drivers out there. If your career is in programming, figuring out how you computer actually works will give you an edge over the other wannabe experts. You can choose.



Does the fact that I have to rely on a mechanic to fix my engine make me less than competent at what a bike's supposed to do? (Or at least, what I use it for?) Not at all. Why should programming be any different? Why is a complete mental model the ideal?
    Because software almost always don't work as expected. This can be due to faulty hardware, OS issues and compatibility with existing other application software. Most of the time when your application breaks, you are expected to figure out the cause. Good mechanics in software are hard to find and are highly paid. Couple of months ago I charged and got Rs. 50,000 for a 2 hour review of code for a major company in Cochin (which employed at last count at least 50+ programmers) to locate a cause for the unexplained random crashes of their mission critical application. Couldn't any of their programmers have figured it out. Yes... if they had more than "sufficiently enough" knowledge.


In "these days of GB's of memory and GHz of speed" almost everybody does some programming without even realising that that's what they're doing. Excel Macros? Game UI (like say, Starcraft) customisation? Widget creation? Facebook applications? Google chrome plugins? Android/iOS web applications? A Yahoo Pipe maybe? A lot more programming is happening than we realise but a *lot* more could happen if only we get out of this rut that "programming" is somehow an esoteric art that requires knowledge of the whole stack from chip up to interface down.
    I know. I have seen asp.net web programmers who have no idea what http actually is. It horrifies me. How is he going to fix issues in his code or during deployment.... oh.. I forget stackoverflow ;-). I assume the code will be reliable as well :-).


Thinking that you need a knowledge of how a computer internals function is imho an "old programmer's" mentality. If you grew up during the 70s, 80s and 90s, I suppose it was unavoidable because computers had no GUI, hardware was much more tied into software and programming was more in low-level languages than not. I have several friends who work in chip design firms and microprocessor industries now who have never written a line of Assembly code. I predict that in 20 years time, there will be programmers in such firms who've never written a line of C. Does that make them less of a programmer? I don't think so.
    Programming in assembly or c is not the point. The point is you need to understand in great detail exactly how your computer functions. That is needed if you want to become an expert.


Another way to think about it is in terms of abstractions. The more refined the technology becomes, the better the abstractions available to build on top of it. Having a mental model built around an abstraction (rather than the bare metal reality) does in no way hurt you. In fact, it helps you learn much faster. [You don't have to take my word for it, there's lots of research on it: http://bit.ly/b517MC]
    The reason you need to understand how the abstraction works is that all abstractions break down at some point and when it happens, you need to be aware of the cause and how to resolve it.

    I could argue on this but this article explains the point in much better terms that I could -> "The Law of Leaky Abstractions" - http://www.joelonsoftware.com/articles/LeakyAbstractions.html


Your argument that people join bachelor courses in computer science because they'll get a good job is an excellent one. It's of course true, but in no way answers what I mentioned earlier. They are disillusioned because of the great detail into which the course goes into convincing people that adders and diodes are important to every day programming. A friend of mine and I took a lot of classes for my friends in college that focused on what I suppose could be termed "popular programming" i.e. how to create a web page, how to write PHP scripts, how to make a blog etc. The same people who were bored out of their minds in class were very enthusiastic about our lectures. The reason is pretty simple and obvious: the utility that they perceived for stuff like web programming was way more than learning about assembly or inane C contusions.
    I had the same feeling when I learned maths in high school. I ended up re-learning most of that while studying graphics and numerical algorithms, If I had spend time figuring it out in school, I would become a better graphics programmer.. earlier.. period. Just because people are bored does not mean the class itself is not useful. The point is, to become an expert programmer you need to know how your computer works. Imho there is no way around it.


I liked your answer to Google's large IT support base. Putting it in economic terms is a copout though. In terms of programming productivity, if you were a programmer, what would you be rather doing? Coding or installing software updates? Reading a blog on good programming techniques or figuring out if the latest update breaks a feature in Microsoft Word that you depend on every day? The IT support base provides a more valuable role: it abstracts away the merely functional bits of a computer from a programmer so that they can _get work done_ and not worry about the fiddly bits.
    Getting more work done means... $$$ to the company. Sounds like a no brainer business decision to me :-).

I also liked the narration of your printer cable incident if only because a lot of such incidents have occurred to me (and I suppose everybody on this list) as well. The argument is that the more bits of knowledge you know about a system, the greater the extend of proficiency you have in it. But where do you draw the line? The computer science field has become tremendously complex in recent years. Pretty soon we'll have to understand quantum effects to grok chip design. There's complexity at the top end as well: to design an interface you'll have to understand how humans use a device. This means understanding ergonomics, cognitive science, HCI and usability, each a huge research field in itself (I spent the last year doing a master's course in this area).
    There is no place you can really draw the line. Which is why...

Vishnu Gopal

unread,
Jul 30, 2010, 9:20:52 AM7/30/10
to ipgof...@googlegroups.com
Jayakrishnan,

I think you expect one person to be a super-programmer and do everything and know everything. And also you somehow imply that knowing algorithmic fundamentals and computer hardware will make him such a super-programmer. 

That's probably true only in the systems programming field. For the majority of programming work out there, there are several more issues that are _more_ important. Understanding the business domain, doing TDD, even working productively with an IDE are issues that most programmers wrestle with daily.

I'm also _very_ sure that in the real world, programmers with different specialties depend on each other. I regret putting that Stack overflow comment in there because it makes my whole argument looks frivolous, but what's wrong with depending on other people with differing specialities? The ASP.net programmer does his bit, a sysadmin figures out the deployment.

Not everybody wants to (or even has to) be such a superman. Thinking in that fashion is probably a bit elitist.

Also I think this is the last I'll talk about this because it seems we have pretty unresolvable standpoints. :)

Cheers,
Vishnu

--
  Vishnu Gopal
  vishnugopal.com

Sujith Nair

unread,
Jul 30, 2010, 11:09:33 AM7/30/10
to ipgof...@googlegroups.com
Vishnu,

If you take any field, the condition is same.  There are professionals who simply follow the process and do the work for their company for living.

But once so called programmers become experienced, either they move away from programming or gets more involved with programming.  And if a programmer gets more involved, he can get into deeper and deeper in system and become trainer or consultant in their programming area. 

But as far as the C/C++ programmers are considered, what i  found is if they go deeper they come up with some new standards, tools or even programming languages.

IMHO. if a person wants make living in IT world, he can learn any language or tool and use it for earning.  But if a person is interested in providing solutions to people for making their life easier, he/she needs to learn the system internals and C/C++ plays a major role compared to any other language for helping him/her achieve that.

Thanks&Regards,
Sujith

Jayakrishnan K

unread,
Jul 31, 2010, 9:57:32 AM7/31/10
to ipgof...@googlegroups.com
I think you expect one person to be a super-programmer and do everything and know everything. And also you somehow imply that knowing algorithmic fundamentals and computer hardware will make him such a super-programmer.
    Nope... I didn't say that. What I said was to become an expert programmer you need to know how your computer works at a lower level.

    And if you are working as a web developer, you need to know how the framework works to at least two stacks underneath you. That will make one a better web programmer.


That's probably true only in the systems programming field. For the majority of programming work out there, there are several more issues that are _more_ important. Understanding the business domain, doing TDD, even working productively with an IDE are issues that most programmers wrestle with daily.
    As a programmer, you primary tool is a computer. And you are expected to know it. nuff said. :-).


I'm also _very_ sure that in the real world, programmers with different specialties depend on each other. I regret putting that Stack overflow comment in there because it makes my whole argument looks frivolous, but what's wrong with depending on other people with differing specialities? The ASP.net programmer does his bit, a sysadmin figures out the deployment.
    I guess I went overboard with my sarcasm on stackoverflow. I apologize.

    Imho, if the ASP.net programmer knew a bit of deployment and the sysadmin knew more of asp.net, I am sure both of them would have been able to do a better job of working together in any project.
  
Not everybody wants to (or even has to) be such a superman. Thinking in that fashion is probably a bit elitist.
    It's not about being superman. It is about being a better programmer. I don't think it is elitist to want to be good in your job.


Also I think this is the last I'll talk about this because it seems we have pretty unresolvable standpoints. :)
    As you rightly pointed out, our viewpoints are entirely different :-).

    However, if I might offer a simple suggestion.

    Please keep track of all programmers you meet who in your opinion falls into the expert category. If you know them closely enough, try to understand why they are so good.

    More often than not, you will find it is because they understand the internals of what they are dealing with. And that is all I was trying to say :-).

- JK

P.S. From your mail, I felt that my previous mail has offended you in some way. If this is so, I apologize. I am actually quite a reasonable person as people who know me will attest.

Vishnu Gopal

unread,
Jul 31, 2010, 2:06:59 PM7/31/10
to ipgof...@googlegroups.com
On Sat, Jul 31, 2010 at 2:57 PM, Jayakrishnan K <ja...@xtendmail.com> wrote:
    However, if I might offer a simple suggestion.

    Please keep track of all programmers you meet who in your opinion falls into the expert category. If you know them closely enough, try to understand why they are so good.

    More often than not, you will find it is because they understand the internals of what they are dealing with. And that is all I was trying to say :-).


The best programmers I know are actually people who can communicate their ideas very well. But that's a different argument :)
 

P.S. From your mail, I felt that my previous mail has offended you in some way. If this is so, I apologize. I am actually quite a reasonable person as people who know me will attest.


Sorry if I gave off that impression. I rather liked the discussion actually and it did make me think about your viewpoints quite a bit (Joel's leaky abstractions for e.g. was a good read), although I still stand by by what I've said.

I've been in IRC/mailing lists discussions though where people rehash their arguments in a thousand differing ways and have realised it's best to quit while you're ahead ;)

Cheers,
Vishnu

Jayakrishnan Kurup

unread,
Aug 1, 2010, 1:50:53 AM8/1/10
to ipgof...@googlegroups.com
>> More often than not, you will find it is because they understand the
>> internals of what they are dealing with. And that is all I was trying to
>> say
>> :-).
>>
>>
> The best programmers I know are actually people who can communicate their
> ideas very well. But that's a different argument :)

I would say that those category of people you are talking about who
communicate well would actually make expert teachers/project managers
and there are some excellent programmers with horrible communication
skills. But then you are right... that's a different argument :-).

> Sorry if I gave off that impression. I rather liked the discussion
> actually
> and it did make me think about your viewpoints quite a bit (Joel's leaky
> abstractions for e.g. was a good read), although I still stand by by what
> I've said.
>
> I've been in IRC/mailing lists discussions though where people rehash
> their
> arguments in a thousand differing ways and have realised it's best to quit
> while you're ahead ;)

:-)

- JK

Anoop Madhusudanan

unread,
Aug 1, 2010, 3:21:28 AM8/1/10
to ipgof...@googlegroups.com
Interesting thread.

My 2 cents - Probably we can call a set of programmers working on a specific level of abstraction as a 'species' as Praseed mentioned. In that sense, an organization breeds their own species, that is aligned with their overall strategy, business domain and internal processes. If you have the DNA of multiple species, the more will be the adaptability you have, the more will be your instincts and decision making skills - the more you'll be able to survive.

Businesses often find more value in moving towards a domain specific model. In these days, we have highly specialized ecosystems (business domains, organizations) that builds and breeds very specialized digital species, through artificial cross pollination methods. For example, consider a programmer in Oil and Gas industry, writing or designing programs for years using a custom DSL or domain specific tool. The problem is - these guy's can't survive in other ecosystems, if they don't have the 'core' competencies built into their DNA.

My observation is that - If you are placed at the bottom of the levels of abstraction (say system programming), your  DNA is some what generalized, and it is very easy to move up and adapt and is common in the industry - but the reverse is not very common. An irony the evolution of a programmer.

[blog] http://amazedsaint.blogspot.com
[twitter] http://twitter.com/amazedsaint

Renju

unread,
Aug 1, 2010, 11:05:01 AM8/1/10
to IPGOFKERALA
Interesting thread to read...

I personally stand with Jayakrishnan's

"More often than not, you will find it is because they understand the
internals of what they are dealing with. And that is all I was trying
to
say :-)."


Hari KT

unread,
Aug 12, 2010, 12:52:33 PM8/12/10
to ipgof...@googlegroups.com
Hi guys ,

I am web developer , but I started with learning Basic , then C , Java and now in PHP .

As Praseed Pai points out the difference between the web developer and system programmers , we both are on different ends :) .

According to my knowledge the web is open standard and not like the system developers . You do have huge amount of code developed by yourself . May be having lesser codes developed by others .

But as the trend is all open-source we web developers do learn from the internet and share what they learn .

Anyway I enjoyed the topics and thread . Every one is awesome :) .

Thanks once again for all your comments . Also JK congrats for your brilliant work for 2 hours getting 50 K . I don't think we web-developers earn 50 K for two hours :) , don't know whether any one earns for it in Cochin  :) . Also the software field has changed and now its like kooli pani ............... :) . The culture of s/w is changing .


Hari K T

Web Developer
( PHP , Zend framework , Drupal , Joomla , Wordpress and more. catch me @ harikt.com  )

Reply all
Reply to author
Forward
0 new messages