I recently came accross 2 videos on the BigThink website that addresses the topic 'Five Programming Languages that Everyone Should Know'. The original videos can be found via the following links:
In the first video, Larry Wall (computer programmer responsible for creating Perl), begins by providing a very valid point. The point that he makes is that answering this question is very much influenced by context as well as the times. What may be good a few years ago may not necessarily hold true for current or future times. He then goes on to provide what he currently thinks are 5 programming languages that everyone should know and they are listed as follows:
"Nobody should call themselves a professional if they only knew one language.”
For the rest of the video, Bjarne gets straight to the point and nominates the following computer programming languages as the 5 that he thinks you should know:
- Functional Programming Language (doesn't specify anything particular)
- High Performance Computing Programming Lanaguage (doesn't specify anything particular)
If you would like to have your say, I have created a survey where you can nominate your top 5 programming languages. This survey is for fun and I allow anonymous access. You will also see the current results straight after making your picks. If you're interested, please access the survey here.
In the next section I provide some detail into what "knowing" a programming language means.
EDIT (2018-03-21) - Fixed inaccurate explanation of side effects as seen in functional programming section
I feel that it is important to provide some context and insight into what I perceive "knowing" a programming language entails. It is an opinion, therefore my thoughts on the matter should not be taken as 100% correct and applicable to all programming languages.
Below I provide a list of concepts that I consider to be the pillars of "knowing" a programming language:
- Nuts and Bolts
By "Nuts and Bolts", I'm referring to the core features and mechanics that make the programming language work. These features have nothing to do with using libraries and frameworks. It is the language in it's purest form. More specifically, I am referring to things like compilation, type systems, memory managment, constructs, loops, evaluation mechanisms, variables, scope and closure to name a few. The "Nuts and Bolts" are the building blocks of a programming language and one cannot effectively use the language unless one has a firm grasp in terms of understanding how to use and apply those building blocks. This is where everyone starts when learning a new language. It's also the easiest part in my opinion. For some, they may feel that once they know the "Nuts and Bolts", they know the language. But for me this is merely the beginning and but the tip of a very large iceberg.
Most programming languages come packaged with a core set of libraries. These libraries are reusable bits of code that can be shared, adopted, extended, and applied to various programming problems. Typically, there are hundreds, actually thousands of libraries to choose from. This is especially more prevalent as a result of third party and open source development. It is impossible to learn about all libraries relating to a programming language. Though it is good practice to at least make oneself familiar with as many as possible. This takes a lot of time and commitment.
I've often heard the terms "libraries" and "frameworks" used interchangeably. However, from my perspective, frameworks imply something far bigger than a simple library. Frameworks are usually created to help simplify development that may span multiple layers of an application architecture. Where libraries are easy to add, remove, or replace. Frameworks form an inherent part of ones architecture and cannot be easily removed or changed. Frameworks are big, and they require even more investment of time to fully understand and apply them. And often, just when you've achieved a good understanding of a framework, a new one comes along to replace it and one has to start all over again.
So much about effective programming is about effective design. And the design of a programming language often determines how we design systems using that programming language. A good design is the key difference between a system that "works" over the long term and one that ultimately fails. A design that works in one programming language may not necessarily work for another programming language. Once again, it is only through time and experience that one is able to determine what designs work and what designs don't work at all. Also, different design patterns will emerge for different programming languages. This has a lot to do with the fact that some programming languages are imperative by nature and others are functional for example. As I've mentioned before, each programming language will have short-comings. For example, much to the dismay of many, the GO programming language currently does not support "generics". Therefore, one would need to use a different design than if one were programming in C#/Java (that do support generics). There is a constant tradeoff when designing programs for the real-world and it's different for each and every programming language.
- Application and Practice
Each language will come with it's own set of good and bad practices. It is important to know about both. Each language will also come with subtle nuances and "traps" that one should be aware of. It's this practical side of working with a programming language that truly determines whether you know a programming language or not. It is knowledge only acquired by working continuously with the programming language and applying it in real-world scenarios that one can acquire a good sense of "knowing" what the programming language is all about.
In the next section I am going to provide some insight into the programming languages that I think you should know. However, judging by what I have written in this section, you may have realised my subtle hint in that I don't think it is possible to "know" 5 programming languages. But I do think we should try because it makes us better thinkers and therefore better programmers.
After watching the "Big Think" videos, it got me thinking. What do I consider as the top 5 programming lanaguages that someone (by someone I mean anyone practicing or interested in programming) should know. After thinking about it I decided that there are actually 6 that I would like to recommend.
Before answering the million dollar question, I would like to provide some of my working background as it does influence my choices. For the past 15 years, I have worked in 3 primary types of industry. Namely, financial services (banking and insurance), medical services industry, and the online gaming (gambling) and sports-betting industry (where I still work). The types of applications that I have been responsible for designing and building have always involved working within 3 primary areas of a system and they are listed as follows:
One cannot build applications without some form of long-term persistent data store. If experience has taught me anything, it's that applications come and go but data is forever. It's the one software asset that tends to outlive everything else within a system.
Where there is data, there is a need to easily view, store, retrieve, and manage that data. Therefore, I have found that there is often a "one-to-many" relationship between databases and frontend applications. By that I mean that for each database there may be many applications built to interact with that database. The types of frontend applications that I have had to build involved using many different types of languages. For example, typically I would use one set of languages to build native applications and another set of languages to build web applications.
Very seldom have I been required to create simple CRUD (Create, Read, Update, and Delete) applications. There have always been business rules that govern the flows of different processes within a system. Some business rules are very complex and lead to the creation of many different kinds of domain models that involve integrating to databases and services (like API's for example). Often, I have been required to expose domain models through API's. Once again there are certain programming languages that work better at this level than others.
Based on my background and experience, I now provide what I feel are important programming lanaguages to know or learn. My top 6 programming lanaguages are listed as follows in no particular order:
Elm - Elm is a domain-specific programming language for declaratively creating web browser-based graphical user interfaces. Elm is purely functional, and is developed with emphasis on usability, performance, and robustness.
2. Object Oriented Programming (OOP) Language
At university, I majored in distributed computing using Java as my primary programming language. Although, I also done a fair amount of programming using C++ and a lesser known programming language called Eiffel. However, Java was always my favourite. Learning Java certainly enabled me to easily adapt to other programming languages. The only thing that I can say I hated about the Java programming language was "checked exceptions". And no, there is nothing you can do to convince me otherwise, despite any technical merit they may have.
Python has been around for a long time. Sometimes referred to as a scripting language, I will take it one step further and call it a general purpose programming language. Lately, circa 2017/2018, it has been gathering massive adoption. One cannot talk about data science without Python being mentioned in the discussion. The other one is of course R but for now my first choice is Python. I am mostly a Python hobbyist programmer and have not used it in any production environment. That doesn't mean that I think of it as a hobbysit language. On the contrary. Once again, one only needs to visit a job board or some trending stats to realise that Python is a clear favourite of many. With the rise of Machine Learning and Artificial Intelligence, it seems that Python has become a popular choice in those domains too.
4. SQL (Structure Query Language)
Yes, SQL is a language. More specifically SQL is a fourth-generation language (4GL) that's closer to human language. I sometimes wonder if SQL is not the most omnipresent programming language in the world. SQL is everywhere, and in all my working experience, I have not once NOT had to work with SQL. Whether it was MSSQL, Postgres, MySQL, or Oracle, SQL existed in some shape or form. Of course SQL is not as sexy and shiny as the new NoSQL technologies out there, but SQL is here to stay for a long time yet. Interestingly, Couchbase, a NoSql database, uses the N1QL (pronounced "nickel") query language. The interesting thing about N1QL is that it adopts nearly full SQL ANSI-92 compliance. Even some tools like NoSqlBooster allow one to write SQL queries over a MongoDB database.
BASH is a scripting language and it is Turing-Complete. Like my prior choices in programming languages to know, the reason BASH makes it onto my list is for reasons of it's massive adoption and community. For me, the difference between being a King or a God of Linux is ones ability to program in BASH. That and being able to work with VIM ;)
Furthermore, Linux is by far the most used OS in server computing. Therefore, I think it is a good idea to master as much as possible about Linux as you're most likely bound to work with it sooner or later. Learning BASH scripts is part of mastering Linux. Knowing BASH will also help you to write repeatable and automated tasks that can be shared and used my many. Therefore, in addition to being a valuable sysadmin tool, I think it is a valuable devops tool too.
When writing about Linux, I'm always reminded by the following picture:
6. Functional Programming Language
I have no experience developing software using a purely (or close to pure) functional programming language. Therefore, I cannot make any recommendation based from experience. However, in the absence of experience, I turned to data to help drive my decision. For the past year I have been keeping a close eye on functional programming languages. The 3 functional programming languages that always seem to attract the most attention (in my experience) are as follows:
Haskell - Haskell is a standardized, general-purpose purely functional programming language, with non-strict semantics and strong static typing.
Scala - Scala is a general-purpose programming language providing support for functional programming and a strong static type system. Designed to be concise, many of Scala's design decisions aimed to address criticisms of Java.
F# - F# is a strongly typed, multi-paradigm programming language that encompasses functional, imperative, and object-oriented programming methods.
I suspect that functional programming is going to become THE programming skill to have in the near future. The reason for me saying so is due to the increased demand to write concurrent and parallel programs. That demand is driven by the changing physical architecture of micro processors. In a nutshell, as programmers we have only had to worry about writing programs that work with a single core processor. Until a few years ago that is. If we needed more speed, we would increase the speed of the processor. In recent years, the processor industry reached the limits of providing higher processing speed. As a result, the processor architecture changed to provide 2, 4 and more cores per processor to help run programs faster. But programs didn't run faster because nobody had programming languages that could effectively utilise the additional cores to write truly concurrent programs without side-effects (more on that later). Nobody except those using functional programming languages that is. It turns out that functional programming languages are very good for multi-core, multi-threaded, and distributed system domains. One of the biggest advantages that one will often hear being advertised as a reason to use functional programming is to eliminate "side-effects". A "side-effect" is when you have some code that is accessing or changing the state of some data (like a variable) that is outside the scope of that code. The problems associated with side-effects are exacerbated in the presence of multiple threads. Another important concept to understand as it applies to parallel computing is Amdahl's Law. To explain Amdahl's Law would require an entire dedicated article, and I won't be providing that here. I would however like to direct you to an interesting explanation of Amdahl's Law that can be found here. I should mention that programming languages like GO, Rust, Java and C# now have concurrency (the ability to write concurrent programs) baked into the language too and feel certain that this will only improve with time.
I encourage anyone that is new or experienced with programming to invest time in learning a functional programming languages. If anything it will help one to think better about how to correctly write programs without side-effects. Also, functional paradigms are making their way into many popular languages like Java and C# too.
It is Scala that holds the most interest to me in terms of functional programming languages. For me it is a rising star in the world of functional programming.
That concludes my musings in terms of the programming languages that I think you should learn. In the next section I conclude this article and provide a few more programming languages that I feel are also important, and anyone of them could easily have taken the place of the one's I have already mentioned.
In my experience, there is no programming language to rule them all. I have mostly picked up languages out of necessity to get particular jobs done in the easiest way possible. The programming languages that I discussed are by no means the most popular languages. But they are languages that have massive communities, massive amounts of documentation and learning materials, and massive amounts of jobs.
In closing I would like to mention a few programming languages that I would love to try. Anyone of them could easily have taken the place of the programming languages I discussed in previous sections. They are listed as follows:
Rust - Rust is a systems programming language sponsored by Mozilla Research, which describes it as a "safe, concurrent, practical language", supporting functional and imperative-procedural paradigms
GO - Go is a programming language created at Google in 2009. It is a compiled, statically typed language in the tradition of Algol and C, with garbage collection, limited structural typing, memory safety features and CSP-style concurrent programming features added.
Don't forget that if you would like to have your say, you can access the survey that I am running for fun at this link.