Subject: Re: becoming a better programmer From: Erik Naggum <email@example.com> Date: 16 Sep 2002 07:49:08 +0000 Newsgroups: comp.lang.c++,comp.lang.lisp,comp.lang.java.programmer,comp.lang.perl.misc Message-ID: <firstname.lastname@example.org> * email@example.com (Scott) | Another friend tells me "define what you mean by 'better programmer'". You have received much advice, most of which I find useful given a prior understanding of what it means to be a programmer, but it occurs to me that this is far from as obvious as one might think. What kinds of things would you like the computer to do for you? What kinds of things are you already good enough at that you can teach a computer to do it? Do you have extensive experience with hardware so you want to control devices and do things like play music or movies and such? Are you adept at human-computer interaction so you want to write software that embodies your psychological insight to write software that makes a human being more efficient at some task? Have you succeeded in teaching children or adults anything and would like to write computer-aided teaching software? Do you enjoy graphic arts and typography and would like to use the computer to automate the production of, say, flyers and posters? Are you interested in photography and would like to write software for digital image processing? Is optical recognition and artificial vision on your list of interests? The list of questions obviously goes on and on, extending into every field of human endeavors. In my view, to be a programmer is to be sufficiently well versed in some non- computer-related field that you can see how the computer can aid practioners of that field accomplish their goals. Many programmers never progress beyond the point of aiding their own use of the computer and never do anything "real" -- the number of software packages that help people read mail and news and waste enormous amount of time in front of the computer are legion, but they tend to make people spend /more/ time on these tasks than they would or should have done compared to actually productive tasks. Take spam, for instance. Varying amounts of effort by an enormous number of people have been poured into getting rid of this problem, including many pretty clever filtering tricks. However, the opportunity arises for machine recognition of meaning in electronic texts such that computers can analyze and classify them according to, say, Dewey's or Universal decimal classification. If this problem was solved, such things as the Semantic Web and search engines that produced topic maps would provide vastly different perspectives on the enormous emount of web pages out there. Spam detection would fall out of this work simply by being classified in areas most people have no interest, and if you should be interested in some of the things that are advertised by this means, you would be able to locate it. Imagine a world in which you could ask your computer to retrieve news articles and web pages according to a semantic classification instead of having to try out different search words. Imagine that this classification would not need a human to classify the documents but where machines would "understand" them. What would you need to know as a programmer before you could successfully implement something like this? Clearly, being a good programmer, you would need to know many algorithms in addition to understanding the nature of classification better than most of the people who do it by hand, perhaps instead writing a system that finds patterns in what has already been classified instead of actually understanding things. Often, a the solution to a problem is very different from the solutions that come to mind immediately. High intelligence and good creativity is needed atop a vast mass of knowledge from many fields is necessary to solve the many remaining interesting problems. However, if all it means to be a programmer is to be able to code up something from a specification and a design provided by others, "all" you need is a good command of the tools you use and the language grammar and idioms to express the ideas that somebody else have dreamt up. This part of programming is not the most interesting in my view, but many people who hire programmers want them to think as little as possible and be as faithful as possible to designs made by others. To be a "better" programmer in this regard is very different from a better programmer who can solve unsolved problems. -- Erik Naggum, Oslo, Norway Act from reason, and failure makes you rethink and study harder. Act from faith, and failure makes you blame someone and push harder.