--
aashik
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
Hi All ,This thread has now become vibrant !
The issue is not the complexity of Web programming or intricasies of low level programming.People want to make a fortune out of IT
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"
For the Kind of software which i have been part of , Math or interestin meddling with symbolism was a must. Currently , i am making a team of programmerswrite a Financial Analytics Engine ( a small footprint one...there are excellent alternativeslike 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.
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.
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 youngerdays i used to program for the fun of writing programs without bothering about what othersfeel about it . This might be reflected in this post. )
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.
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).
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. :)
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 :-).
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.
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