In computing, there is a vast tradition of distinguishing between users and developers. Besides obvious wording such as "I am a developer of primetools", this concept of separation is often unnecessary and even harmful.
Software for Linux and other Unix systems is traditionally distributed in source form, for a number of good reasons. While OS distributions do a lot of packaging to make software installation and usage seamless, this only applies to relatively well known and widely used software. For more obscure programs, the only solution is to download the source tree and compile your own binary.
In other words, in order to use a program, you need to compile it. Many OS distributions consider this a development task; there are no compilers installed by default. Moreover, there are no development headers for libraries that are otherwise installed — for each $LIBRARY, you generally need to install something like $LIBRARY-devel. This is even when you are not developing the software — you are not touching the source code, you are only interested in using it.
On the plus side, Linux distributions make it easy to install the necessary tools. In fact, in any Linux distro, there are already tools to play with interpreted languages such as Perl and Python. Even the command shell, which is often considered a user interface, is a relatively powerful programming environment. You can make your daily using a little easier with shell one-liners that genuinely blur the line between using and programming.
So why is there a line in the first place? Why does a Linux distro not ship a C/C++ compiler to begin with? Why are headers installed separately from the library?
There are some genuine reasons to skip including compilers. They take a nontrivial disk space on a small system, and they make some security issues worse. The first reason is not really meaningful on a modern system, and as for the latter, if there is an attacker on your system ready to use your compiler, you have other problems. Besides, admins that know what they are doing can decide for themselves if they want a compiler available for all users.
The shell is a prime example of how there is no difference between "using" and "programming" a computer. Spreadsheets are another common example. In all cases, you are telling the computer what to do. Of course, there are different levels of abstraction, but a developer who uses Python instead of Verilog is not generally considered any less of a developer.
There is a reason I used "programming" instead of "developing" above. IMHO, "developing" is a rather goal-oriented term, something you might do in a business intending to sell a product. If you are playing with code in whatever programming language, you may not be developing anything, but you are surely not a "user" in the traditional sense. The term "research and development" is probably important here — most of my programming is more about research than development.
This was originally written on 2014-05-31 after some frustrated discussions on Bitcoin forums. The cryptocurrency scene is full of bleeding edge software, and consequently there are a lot of newbies to the Linux way of needing to compile things.
I blame the distros for breaking the free software tradition. Source code was the native distribution format for software to begin with, until Microsoft and other commercial vendors popularized the idea of binary-only releases. Meanwhile, I find solace in Gentoo, a distro where compilers and headers are an essential part of the OS.