A Highly Opinionated Review of Programming Languages for the Novice

Version 1.1
by Joseph Osako, Jr.
Initial version written 2004:12:12
Last modified 2005:04:11


One question which aspiring programmers often ask is, "which language should I start with?" Unfortunately, this question does not have a simple answer; preference in languages is as much aesthetic as rational, if not more so, and programmers are no more likely to agree on a 'best' language than people in general are to agree about 'the best' religion. Thus, any attempt to describe or advocate a given language is certain to be tinged with the reviewers personal biases. Furthermore, even the best languages have their share of problems and quirks, but what to one programmer is a fatal flaw may to another be a powerful advantage.

While I do not make any pretense towards objectivity, I have tried to be as even-handed as possible when skewering different languages' foibles. I hope I have not stepped on too many toes in doing so.

What to do Before Learning a Programming Language

Before you learn any programming at all, learn how to use the system you are on correctly, whether it is Windows, Unix/Linux, MacOS, or whatever. If you can't work in your user environment, you won't be able to do the basic tasks needed for programming. Also, hone your research skills, especially those involved in web searches and library crawling (yes, libraries are a good resource, especially university libraries). Get into the habit of lurking on message boards, reading the FAQs, and learn how to post on them effectively.

I would recommend reading How to Ask Questions the Smart Way before posting anything anywhere; in fact, you may want to read several of ESR's historical and cultural FAQs, though be aware that he is very biased towards Linux and open-source, and pretty heavy-handed in general. I would further recommend reading through the Jargon File repeatedly, until it starts to make sense. If this doesn't happen right away, don't worry; it will start to as you actually begin programming.

You should also learn how to use a version control program such as CVS, SourceSafe or BitKeeper. No matter what kind of programming you do, you'll probably need to be able to back up programs safely and manage multiple revisions; in larger projects source management is absolutely critical to avoid conflicts between different developers.

The Language Reviews

Setting a Course of Study - Which languages to Learn, and When

For most aspiring programmers, I would recommend HTML as a good starting point. Even if you aren't intending to do web development, it is a useful thing to know, and is simpler than a full programming language to start off with.

The next place to go depends on your goals:

If you intend to learn web programming, start by putting extra effort into learning HTML in detail. HTML is the framework on which all web programming is built on, and understanding it is crucial. The next step I would recommend would be to learn some simple Javascript client side programming; this can be done locally, and thus does not require a full web server. After this, I would learn some server side Javascript, and perhaps PHP as well. After this, learn about XML, so you can use specialty document languages. If you mean to use CGI scripting, you should then learn either Perl or Python; if you mean to write applets, then you should learn Java instead. For professional web design, you will probably need to learn about development frameworks such as Zope or Websphere, and possibly Enterprise Java Beans as well.

For general applications programming, I would recommend starting with either Python or Ruby, as they are both easy to learn, and are interpreted languages, which makes it easier to try out different things without writing a full program. If you want to learn Windows programming specifically, I would then go to Visual Basic, followed by C#. Otherwise, I would recommend C, then Perl, then either C++ or Java.

If you want to understand programming on a deep level, or intend to go into an academic career, I would start with Scheme, then learn Smalltalk, then an assembly language, then pick up as for applications programming.

For systems programming, follow the same approach as for applications programming, but drop Perl in favor of x86 assembly language.

For Unix or Linux system administration, learn Bourne-Again shell scripting, the Perl, then C.

For Windows system administration, learn Visual Basic for Scripting (not the same as VBScript) and DOS batch programming, then Visual Basic.

For database programming or administration, learn Oracle and PL/SQL, or SQL Server and Visual Basic. Java may be useful eventually, and Prolog may be of some side interest for understanding the connection between logic programing and the relational model. Rather than focusing on languages, you should delve into the details of the relational algebra and relational calculus.

For scientific programming, learn Python, then either Fortran 90 (for physics or inorganic chemistry) or Perl (for biology or organic chemistry), then C. You will also want to learn certain mathematical, statistical and simulation tools such as MATLAB, Mathematica, SPS and GPSS; which you will need will depend on the science and specialization you are studying. You may eventually need to learn either Common Lisp or Ada, but they are not high priorities.


In learning to program, it is all too easy to become too focused upon the specifics of languages and the process of coding. This can give a misleading impression of what programming is, and tends to distract from both the theoretical and the design aspects of the field. A particularly unfortunate result of this is that many programmers take an excessively parochial view of languages and methodologies. It is my experience that nearly any programmer would be better to begin with a broader view of the field, both theory and practice, before delving into the details of a specific language or specialization. Too close a focus can blind one to options which could prove fruitful. Thus, I recommend to any programmer to take some time, whenever possible, to try and learn some unfamiliar language or technique, and try to apply it to the tasks they are working on.

Document Change History