🛠 A programming language is a tool. Embrace it to become even more productive!
Tags: beginners, tutorial, discuss, productivity
Published: 2021-01-13 14:14:29

## Introduction

Hey, DEV people! 👋  Yes, it's time to talk about what most programmers try to avoid, when asked *what* language to start with.

I think, you have 100% heard such questions from your acquaintances and friends. They usually start with an awkward listing of languages they have heard anything about. For example, like this:

> If I learn Golang now, can I switch to Node.js later?

How to answer such questions so as not to harm and to give a positive vector of movement for the newcomer? OK. Let's figure it out together! 🤗

<a name="toc"></a>
### 📝 Table of contents

- [A misconception that spoils everything](#ch-1)
- [Real-life question to make it clear](#ch-2)
- [What is the reason and what is the consequence?](#ch-3)
- [More to the point](#ch-4)
- [What's this all about?](#ch-5)
- [Tips I'd like to get](#ch-6)

<a name="#ch-1"></a>
## A misconception that spoils everything

Many beginners and/or inexperienced programmers mistakenly believe that "_a programming language is the foundation of everything_" and "_you don't need to know anything at all except 1-2 frameworks_". 

These opinions are raised to the level of a postulate in the IT community. And you can hear this very often in 2021 from developers on _React.js_ (JavaScript) or _Django_ (Python) or similar popular and widespread libraries and frameworks.

But, in fact, programming language (_and of course library or framework_) it's just a tool with which to achieve the ultimate goal: **developing a software product with a maximum programmer's productivity**. Having only a knowledge of the language will not be enough.

[↑ Table of contents](#toc)

![Real-life question to make it clear](https://dev-to-uploads.s3.amazonaws.com/i/3si3nthn3uc60sl1j48b.jpg)

<a name="#ch-2"></a>
## Real-life question to make it clear

To begin with, you need to break down the reason for such questions in order to understand the nature of the problem of such questions. I suggest that we use a real-life question like this to make it clear to everyone:

> If I learn to drive a Porsche, can I then switch to a Tesla?

Let's take a look at these two cars and note their common elements, that enable you to operate the car (their _user interface_, so to speak):

- A steering wheel with controls for the turn signals and windscreen washer;
- Two pedals (gas and brake);
- Gear lever and handbrake;
- The on-board computer screen;
- Driver's seat;

Now let's look at the differences between these cars (their unique features, so to speak):

- Engine operating principle (electric and internal combustion engine);
- Location and format of the engine;
- The appearance of the vehicle body;
- Software for the on-board computer;

> Yes, there are actually a lot more items, I've just pointed out the ones that are 100% in any car and allow you to drive it. Forgive me for saying this... 🤗

And now, we need to determine the most important thing: **without what elements would it be impossible for a driver to drive any car**? That's right! It's just four elements: steering wheel, pedals, gear lever, and driver's seat.

That is, the answer to the original question is: **yes, you can easily switch to a Tesla, if you have learned to drive a Porsche**. All the elements will be familiar and intuitive.

Yep. If you've been following along, you've probably guessed my point by now, haven't you? Yes, we can apply the same principle to computer science.

[↑ Table of contents](#toc)

<a name="#ch-3"></a>
## What is the reason and what is the consequence?

Nowadays there is a very wide range of different programming languages on the market. But all of them can be divided into large categories according to paradigms and approaches: 

- OOP and procedural;
- compiled and interpreted;
- statically and dynamically typed;

Switching from one OOP language to another, such as from JavaScript to Python, is not too difficult. Of course, you will have to learn the syntax, the standard library and some popular framework. You need to put the right level of effort into it, but it won't take long anyway!

> Just like driving almost any car, if you've ever learned how.

On the other hand, switching from Python, let's say, to Haskell will be much harder: there is a different approach and paradigm of the language. You already need to make an effort to rearrange your thinking.

In any case, it is important to understand the main thing, **the fundamentals** on which modern languages are based:

- variables;
- functions;
- conditional operators;
- loops;
- concurrency;
- ...

If you combine all of these into one, you need to have **a basic understanding of Computer Science**.

[↑ Table of contents](#toc)

<a name="#ch-4"></a>
## More to the point

For example, take John, who thought for a long time: "_which is better – Golang or Node.js?_", and settled on Golang. He learned the syntax, understood the principle of building HTTP servers in this language and even tried to make a small microservice on the [Fiber](https://dev.to/koddr/are-sure-what-your-lovely-web-framework-running-so-fast-2jl1) web framework.

Will John now be able to develop a fully functional web application, like an _Instagram_ or _Amazon_ analog? Of course not! 🤷

Knowing the language **is not enough** to develop software products on this scale. You also need to understand the web and its protocols, be able to work with databases, setup the infrastructure, make complex architectural decisions, and many more.

> These things don't depend on the programming language you choose!

[↑ Table of contents](#toc)

![What's this all about](https://dev-to-uploads.s3.amazonaws.com/i/2pl9qa7bcc6cs6ewi73m.jpg)

<a name="#ch-5"></a>
## What's this all about?

When I started in web development (**over 12 years ago**, wow), I had a really good understanding of the principles of visual composition and I could transfer that to HTML and CSS and then make it dynamic, using PHP on the CMS Drupal.

Even then, in addition to HTML+CSS and PHP, I had a good understanding of:

- how websites are structured;
- what is the process of data exchange between client and server;
- how to configure and run a virtual server;
- how to organize backups for the database;
- how to optimize a virtual server;
- where the web application security bottlenecks can be;
- how to configure error logging;
- and so on...

> I was really good at it, honestly! 😉

One day, an acquaintance said: "_better to start writing in Ruby on Rails_" (a popular framework for _Ruby_) and even promised to help me get a job. In the end, it didn't work out, I wasn't hired because they needed a middle or senior level specialist... But I realized, that in ~4 weeks of reading documentation and code practice, I can quickly learn a new language and framework! 

> With the right level of persistence, of course.

A few years later, a very similar situation occurred with Python (namely, the Django framework). In ~2 weeks of intense study and practice, I learned the basics of the new programming language and was able to solve test cases to get a job.

And two years ago my switch from Python to Golang was even faster! 😀

> I was able to quickly switch to the new language only because I already had a clear understanding of the fundamentals.

[↑ Table of contents](#toc)

<a name="#ch-6"></a>
## Tips I'd like to get

1. Start understanding the fundamentals of software product creation and architecture, and most importantly, practice. 
2. No need to think long and hard about "_which language to choose?_", take any language and learn the fundamentals of the technology you choose (web, mobile applications, automation, IoT, or whatever).
3. Write code on a daily basis, and then learning a new language or framework will not be a problem and limitation (_into which many want to drive themselves_).
4. And, of course, believe in yourself! Everything will work out for you.

That's it, friends! 🤗

[↑ Table of contents](#toc)

<a name=""></a>
## Photos by

- Thought Catalog https://unsplash.com/photos/o0Qqw21-0NI
- Josh Rinard https://unsplash.com/photos/H9mp1P1VUj4
- Joshua Aragon https://unsplash.com/photos/EaB4Ml7C7fE

<a name=""></a>
## P.S.

If you want more articles (like this) on this blog, then post a comment below and subscribe to me. Thanks! 😻

And of course, you can help me make developers' lives even better! Just connect to one of my projects as a contributor. It's easy!

My projects that need your help (and stars) 👇

- 🔥 [gowebly][gowebly_url]: A next-generation CLI tool for easily build amazing web applications with Go on the backend, using htmx & hyperscript and the most popular atomic/utility-first CSS frameworks on the frontend.
- ✨ [create-go-app][cgapp_url]: Create a new production-ready project with Go backend, frontend and deploy automation by running one CLI command.
- 🏃 [yatr][yatr_url]: Yet Another Task Runner allows you to organize and automate your routine operations that you normally do in Makefile (or else) for each project.
- 📚 [gosl][gosl_url]: The Go Snippet Library provides snippets collection for working with routine operations in your Go programs with a super user-friendly API and the most efficient performance.
- 🏄‍♂️ [csv2api][csv2api_url]: The parser reads the CSV file with the raw data, filters the records, identifies fields to be changed, and sends a request to update the data to the specified endpoint of your REST API.
- 🚴 [json2csv][json2csv_url]: The parser can read given folder with JSON files, filtering and qualifying input data with intent & stop words dictionaries and save results to CSV files by given chunk size.

<!-- Footer links -->

[gowebly_url]: https://github.com/gowebly
[cgapp_url]: https://github.com/create-go-app
[yatr_url]: https://github.com/koddr/yatr
[gosl_url]: https://github.com/koddr/gosl
[csv2api_url]: https://github.com/koddr/csv2api
[json2csv_url]: https://github.com/koddr/json2csv