On our last show we answered a mail from one of our listeners, who asked: I want to learn to write programs in Linux. This is not the first time I have seen some variation of such a request, and it won’t be the last. There are numerous answers available all over the Internet, and here is one more. 🙂
Very often I find that the answer concentrates too much on the selection of a language. I find it especially amusing when someone quite knowledgeable asks: what program do you want to write? In my opinion, most beginners have no idea what they are getting themselves into (that is why they are asking in the first place), and further in my opinion it does not make one a good programmer if they know any particular language, or even a number of languages, particularly well. What makes a good programmer is knowing what different tools (languages, packages, etc., etc.) do, and why, and how. Don’t get me wrong, selecting the first language is important, but the answer given to the beginner should always be: start with Python.
I will next attempt to justify this. If you do not care for a justification skip the next paragraph! Warning: all of the following are just my opinion of how the world works; if you do not appreciate sarcasm, you should stop reading now (and probably contact your Internet provider and beg them to permanently disconnect you).
There are many programming languages out there, each with a different goal in mind. At the low end of the scale are languages meant for beginners at a primary school level, such as BASIC or LOGO. These are languages that are intended to introduce some very basic concepts, but most people should outgrow such a language within a week of study. If not, that is a good indicator that programming is probably not for you. Next step up in my scale are all other scripting languages: Python, Ruby, Perl, and many many others. These are languages that intentionally abstract certain nuances of programming (like type casting, for example) which the beginner does not want to be bogged down with. However, they do introduce some programming concepts that although advanced are very good to learn as soon as you can (like functions and classes). As such, these languages are very good at quickly prototyping ideas, and even being used in production where security or speed are not of primary importance. Next step up are semi-compiled languages like Java and C#. These are almost real languages in that they allow you to manipulate software at almost machine level, but they still abstract some of the dirty work like actually porting code to different machine platforms. Although many beginner-level tutorials exist for Java, I personally strongly advise true beginners against picking this language as their first choice, as you will immediately get bogged down with all the dirty stuff. Next step up from this are, what I call real languages: C, C++. These languages allow you to manipulate software at the hardware level, if you chose to, and will run directly on the hardware without someone else’s interpretation of what you wanted your program to do. With such power comer great responsibility: you often have to perform many meaning tasks, such as cleaning up after yourself. The pinnacle of programming languages is assembler and machine language. No person programs in these languages today, only machines program other machines in assembly.
Just to give you some idea of what you can expect from each of these. Using BASIC, you can make text appear on the screen, and make funny (to a 3 year old) beeps come out of the speaker. If you are familiar with Linux Mint, which I assume many readers of this blog are, most of the Mint-specific tools are written in Python. The application Tomboy is written in C#. No serious desktop applications are written in Java or C#. These language are widely used only in Internet application because of their (often false) promise of OS and hardware non-dependence. The desktop environment GNOME is probably (I have not checked) written primary in C++. The Linux kernel is primary written in C and C++, with some small parts in assembly.
I am currently in the process of putting together a beginner-level course. First a little background on it. At the beginning of this year I had a little time off (downsized) and was looking to pick up another scripting language. In my line of work (software test), there is not much need for compiled languages, but to transition up to one would be quite easy as the concepts of structuring a computer program are the same regardless of the language. By coincidence, my son, whom I had give an old laptop and a Linux Mint CD, was on his own getting quite into Blender; which is an application that can be greatly enhanced with a scripting language: Python. So that is how the decision was made as for the language.
Having worked in the computer industry for about 10 years, I already had a pretty good idea of what a normal day for a software developer is like and what sorts of tools they use. I wanted to take my son “quickly” (say one year) from “playing around with stuff” to using professional level tools, so that he could make a decision 1) if he wants to continue along this career path, and 2) where exactly within that field he wants to go – even in software development there are way too many specialities. I found some tutorials online that are intended for teenage kids who are just starting out in computers – programming games – and I used those to build upon. My son is also homeschooled, and because of that I had to come up with a syllabus; here it is: http://siking.wordpress.com/programming/. I actually came up with this just recently, with the thought that there are other homeschooled kids around that may be interested in the same thing. But being a teenagers is certainly not a prerequisite!
If you get into the course I can offer help; leave a comment / request at the above link.