Programmer Toolkit — an Opinionated Tour — Part I
Here’s a very opinionated tour of some of the various technologies available to individuals and companies. This is far from a complete list and the comments are based on my personal opinions which might not match your expectations, values or even experience. This first part will focus on programming languages.
Programming languages
Safe bets and my preferred languages
Go
https://golang.org Free and open source, from Google.
Go has been my goto language for many years now, it’s a great server and system programming language that shines for its simplicity and performance. It works best when developed server side APIs/services and client side CLIs. It’s a language that is easy to transition to, supports large team working on the same code base and has great tooling and compilation time. The language could offer more flexibility (Go 2 means to address some of those complaints) and the C interop could be faster/better (Gophers would tell you not use C). Go is a very popular programming language in the “devops” world (Docker, Kubernetes, Terraform, CloudFoundry and many more). Recommendation: adopt as server side language if you agree with the strong philosophy.
TypeScript
https://www.typescriptlang.org/ Free and open source, from Microsoft.
TypeScript has been my recommended way to write JS for a few years now. It’s a superset of JavaScript that compiles to plain JS but adds optional static typing and a other features. I prefer it over React’s JSX and it looks like TS is slowly but certainly becoming a standard alternative to JS. Great documentation, tooling and debugging support. Recommendation: adopt if you have a decent team or decent amount of JavaScript and don’t have 10+ years of JS experience.
JavaScript
https://www.javascript.com/ spec with free and open source implementations, originally from Netscape.
JS is the language that runs almost everywhere, the language has a lot of challenges but it’s ubiquitous. It certainly provides a lot of flexibility and allows new developers to feel progress really quickly. It’s however a really hard language to master and the tooling around the language seems to be moving really fast without a change to mature. My biggest issue with the language its interpreted nature and flexibility often results in runtime issues that are hard to catch/debug. Recommendation: if you are targeting JS, I’d suggest to take a look at TS, while it requires a little more onboarding/setup, I feel the superset provides a lot of answers to the problems I see in JS.
Java
https://www.java.com/ Free and open source implementations, originally from Sun Microsystems.
Java is a sure bet, it really managed to catch-up after years without design evolution. Java is a language for the masses, it’s pretty easy to learn, lots of resources and libraries, it performs well but it uses a LOT of RAM. In a world where RAM still comes at a premium that’s a bummer, also having to spend days tweaking the GC settings because the language allocates so many objects isn’t ideal. I still prefer Go for server side tasks, but based on the team skills and the project being worked on, Java can be a great solution. Recommendation: not the most exciting language but it will get the job done and you will find talented devs, adopt if you are ok being conservative in your tech choices.
C
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/ Free and open source implementations, from Microsoft.
C# is Microsoft version of Java but with better tooling, more language features and limited cross platform support. Very much like Java, C# is a solid choice, it’s a flexible language with a performing runtime, lots of skilled developers but unlike Java, it doesn’t run as well on other platforms than Windows. Thanks to mono and .NET Core, C# is becoming more popular outside of the Windows ecosystem and is the de facto language of Unity. Recommendation: unless you have very specific needs, I probably wouldn’t choose C# as server side programming language but would use it for Unity or Xamarin projects, especially if you have previous experience with C#.
Python
https://www.python.org/ Free and open source by Guido van Rossum.
Python is the standard scripting language these days and while the community is still having issues migrating developers from v2 to v3, it’s the default language of data scientists and machine learning developers for which no other programming languages comes close to having the same quality of libraries. Recommendation: stick to what Python is best at: data science and ML.
Ruby
https://www.ruby-lang.org Free and open source by Yukihiro Matsumoto.
Ruby can be considered a more flexible/dynamic version of Python. As a language, it isn’t very popular outside of the Rails framework and became very popular at the same time as Rails in the web 2.0 boom. While not as popular as it once was, it’s found in many companies with legacy Ruby code or Rails applications. Recommendation: use when Rails makes sense.
Hot takes on less safe choices
Rust: if Go is supposed to be an alternative to C, Rust is an alternative to C++. Very powerful system language especially to write safer low level code, but challenging to learn. Recommendation: only use for low level or embedded programs.
Swift: great replacement for Objective-C, fine language but stuck on the Apple ecosystem. Recommendation: use if you are focusing on native and Apple first.
Kotlin: was a promising language when Android started supporting it making it a viable Java replacement but now Google is moving to Flutter/Dart for Fuschia and mobile dev, I’m less excited about this language that sometimes feels a bit overly engineered. Recommendation: stick to writing Android apps with Kotlin and only if you are focusing on native (server side Kotlin is fine but sticking to modern Java would be a safer bet).
Scala: I tried, but nobody seems to agree on how good Scala should look like. Fascinating academic language that took a big hit when Twitter switched from Scala to Java. Recommendation: pick an alternative language.
Clojure: I loved the idea of writing Scheme/Lisp on top of the JVM then I realized I wasn’t smart enough to track the state/shape of the values through the processing chain. Process a big chunk of data to only realize 4 hours later than the data half way through the pipe wasn’t what you expected. Recommendation: learn for fun, pick an alternative language for a professional project.
Elixir: very interesting language on top of Erlang/OTP, it captivated the interest of early Ruby developers but didn’t become a standard, stayed niche and isn’t backed by a big name. Recommendation: play with it because it’s a great language and a fun web framework (Phoenix), but consider an alternative language for a professional project.
PHP: unless you work at Facebook, pick an alternative language.