July 12, 2015

Is programming language important?

Should we as developers to focus more on the language we work with or on more fundamental knowledge and skills? Everyone there to choose his own path in IT career. Is it worth to aim to become "JEE Architect", and limit yourself only to one technology and company? Balance between making money and keeping yourself professionally fit.

In software development - language is only a small part of the bigger picture:

  • how do you build the project
  • how do you deploy
  • how do you monitor your product or service in production
  • testing
  • OOP or program design and structure
  • clean code principles
  • persistence
  • design patterns
  • architectural patterns
  • algorithms and data structures
  • etc.
The list can go long. As you can see those skills could be applicable no matter which language you use. I believe that focus on the fundamentals and software development principles and techniques is more valuable than focus on the language itself.

But also limiting yourself to only one language you can work with professionally and comfortably, in our polyglot world, is no longer an option. And a few languages born once a while could teach the new fundamental concepts as well (look into Clojure, Erlang or Haskell, for example). Even if you stay and continue working on the daily basis with your current language, learning how things are done in different languages will help you to use your current toolset much better, and might even improve the quality of the software you develop and the way you think.

As Eric Raymond said:

Lisp is worth learning for the profound enlightenment experience you will have when you finally get it; that experience will make you a better programmer for the rest of your days, even if you never actually use Lisp itself a lot.

Be curious, and learn new languages to become more familiar with what they can offer, which tasks or problems could be solved in those languages more elegantly. Understand the new constructs and techniques they introduce, and how you can apply them in your day to day language either via libraries, or your native constructs which you might ignored till now.

So, the goal here is not to master bunch of the languages, but the goal is to become aware. With better awareness you can make better choices. With better choices you can achieve better results.

I know it is a cliché phrase: "Use the right tool for the job", but sometimes it is. But without knowing that the tool exists, you can't make that choice.

So, which language is then to learn? Pick up the one with different paradigm from your current language of choice.

Develop in a statically typed language, try dynamically typed. Does you language have REPL? Try one which has, and experience the different style of working. You can't use your favorite IDE anymore, learn a decent editor, it will pay back itself. Are you familiar with modern concurrency techniques the new languages offer nowadays? Try another build tool, use Maven try Gradle. Would like to stay on JVM, try Groovy, Kotlin, or Clojure. Use JUnit, why not to try Spock and start writing tests in Groovy. Have never done system programming, practice Go or Rust.

Keep in mind, although, that the only language is worth to learn is the one which changes the way you think about programming, and enlightening you about new concepts and techniques you have not known or heard before.

Alan Perlis once said:

A language that doesn't affect the way you think about programming, is not worth knowing.

And if you just start your career then most likely whatever language you pick - it will feel for you that you learn everything new every day. But sooner or later you reach some point of proficiency where the language can't surprise you anymore (maybe occasionally when the new update of the language is released), but in general it will turn into learning new frameworks and libraries. You still might find some interesting ideas in those frameworks and libraries, but the big chance is that those ideas were ported from other languages. So you should keep looking around.

The best way to learn a new language (or anything, for that matter) is actually practice it, learn by doing. The famous one from Confucius:

I hear and I forget. I see and I remember. I do and I understand.

And there are several options I see could be valuable:

  • if you have the idea of the project to build you can try a new language or tool there
  • start reading source code of other people projects on GitHub, to understand how do they use the language (it will give a really fast start as you see in one place the way the project in that specific language is configured), and maybe contribute to the project
One of the easiest way to practice a new language is to use coding challenges platforms (as a side effect you will study and improve knowledge of algorithms and data structures):Moreover stay with the language which is fun and joy for you to work. The one which makes you happy, and productive, and allows you deliver the result for the customer or the product you build faster and with better quality.

As Agile says:

Working software is the primary measure of progress.

But understand the options, so you could use them when required, and be ready for the opportunities when they come.

Tags: craft