On his blog, Occasionally Sane, my friend Gnuvince tries to make a case for Python as a first programming language. He presents Python with a series of bullets, each giving a reason why Python is a good choice. While I think it may be a good choice pedagogically, it may not be a good pragmatic choice when someone is learning a programming language to find a job, as one of his reader commented.
But I think that betting on a sole language to base a programming career on is about as silly as someone mastering only the hammer looking for a construction job. His limited skills might not permit him to find a job, and even if he finds one, he may be confined to menial, unchallenging tasks. To push the tool analogy further, another workman that masters a wide array of tools will probably be more solicited and appreciated in his work-group, and be lead to more and more complex tasks, and more responsibilities within his group. Programming is very much the same: sometimes, it just takes something else than a hammer, and the right guy for the job is the guy that has the largest toolbox—the one with the Torx screwdriver set.
While Python might be a good first programming language (I would make a case in a slightly different way than Gnuvince, but that’s unimportant), choosing a first programming language is an important step, but not the last one. There are a large number of other programming languages and technologies one will eventually need to know, at least to some degree, to have any chance of success within the competitive world of computer science/information technologies.
In no specific order:
- Shell Programming. In a Unix-centric world, shell scripting means sh (the Bourne shell) or Bash (the Bourne again Shell) or any of the vaguely sh-ish shells there are out there. On Linux, Bash is probably the de facto standard shell, although sh is often present. In a Microsoft-centric world, this means VBScript and JScript and the Windows Script Host environment. In either case, shell programming will let you interface system-level utilities in ways that would be otherwise cumbersome to emulate in other, higher-level languages. Shell programming will also allow you to bind together programs that weren’t originally meant to inter-operate. Sometimes, to make those programs inter-operate, you’ll need some data manipulation and extraction glue, but that’s OK, you should know some.
- Data Manipulation and Extraction. Inevitably, you’ll have to convert, extract, rehash data. Conversion utilities, such as ImageMagick (or its fork GraphicsMagick) will let you apply effects and transcode images to other formats. If you manipulate XML data, you will use another host of utilities. If you manipulate text based data, you will, sooner or later, meet grep, awk, sed, and Perl. Maybe you’ll use Bash to glue all those together. Although all of these tools are a pain to learn, they will prove themselves most useful in time of dire need.
- C and C++. The C programming language’s semantics makes it ideally suited for low-level applications such as system software or other time critical applications. It is, probably, the most used language for embedded applications. C is meant to be a language that offers both the facilities of high level language and the possibility of controlling exactly what gets done at the machine level. C isn’t particularly friendly, is sometimes unreadable, offers little help to find bugs, but is, nonetheless, the weapon of choice for high-performance computing. For example, most audio and video codecs are written in C because it offers both performance and the possibility of controlling what’s going on at the bit level, if need be. The C++ programming language is the object-oriented descendant of C. Vastly more complex than C, C++ however still retains most of the desirable features of its ancestor (from a system programming point of view, that I would say) enabling the programmer to abstract many things yet have a very low-level control on what is computed and how.
- Java. The Java programming language is also quite popular, but inhabits a very different niche than C and C++. Java is meant to be platform independent (that is, runs the same indifferently from the actual underlying OS and CPU) and mostly succeeds at it. Its rich standard library makes the use of multithreading and networking very easy, thus making Java well suited to rapidly build complex applications. Java broke away from its initial web-centric niche but is still very much confined to “visual programming”, that is, applications where the user interface predominates over speed performance or program complexity.
- The .Net Platform. If you work, or intend to work, in a Microsoft-centric environment, the .Net Framework is probably the sanest way to go about developing software for Windows. Its abstractions allow to share the same functionalities across different languages (C#, Managed C++, Visual Basic, etc.) and to interface with existing applications. The C# (pronounced “C sharp”) language is a structured, object-oriented language reminiscent of a simplified C++, with strong overtones of Java, and is probably, after Managed C++, the most interesting language on this platform. I know very little about C#, so I won’t comment further on it. However, it is clear that a business that is doing Windows-centric development (and that is not stuck in the 90s) will require working knowledge of .Net.
- Database systems. In the world we live today, most, if not all, businesses accumulate insane amounts of data. Traffic, customer data, transactions, etc. All these data end up in a data warehouse, a structured repository of information that can be queried, rehashed, and from which, hopefully, knowledge about the business can be extracted and used to better the businesses’ processes. Big businesses, like Amazon, makes extensive use of data warehousing to support its data mining. That’s how Amazon models a costumer’s interests to suggest books based not only on his previous buys but also based on other, similar, customers’ buys. To manage and use data warehouses, one will inevitably use one of SQL‘s dialect to query and manipulate huge databases. Although MySql or Oracle are sometimes unavoidable, one may also use simpler database environments, such as, say, (the now Oracle-own) Berkeley Database (I’m not sure it still exists), or, even simpler, CSV. Regardless of the actual dialect, one should have, if so inclined, have at least minimal knowledge of databases systems and database languages.
Of course, this list is not an “all” list, but a “pick n out of m” list, the n that make the most sense for you. But the more you’ll know, the more you’ll be interesting for an employer, and the more you’ll have the choice of employer.
To answer Gnuvince’s commenter, I think that being proficient, in a general sense, is not about knowing only one language at the Guru Level, it’s about being proficient in the ecosystem you’re living in. That is, moderate but working knowledge of the tools you use less often (like awk, or Bash, say) so you don’t get stuck whenever your envelope is pushed a bit, while being adept at your main programming language(s).
As in life, being proficient in computer science/information technologies is a holistic thing. It’s not about the right tool. It’s about the right toolbox.