The current global movement towards code literacy is a good thing. Apart from the fact that some of the richest people in the world are programmers and thus software engineering is a very lucrative career, there are other motivations to learn to program beyond such career and material success.
A lack of proper education will lead to irrational thinking but what constitutes education is beyond memorizing facts. In this age of computer backed memories, it is unnecessary to force students to memorize facts of any kind. If one engages in a certain discipline for long enough the necessary facts will be automatically memorized via familiarity rather than brute memorization.
So traditionally, our educational systems have emphasized memorization as a means to knowledge and thus the status of being an "educated" individual but this is false. True education is the ability to reason rationally from premise to conclusions.
Some rare individuals possess some natural ability to think rationally without being previously educated in any formal systems but for some of us, proper education is a means to become rational thinkers that are able to think clearly in any scenario.
So how can rationality be taught by means of education? The answer lies in the tendency towards mimicry in human beings. Humans learn by copying, the human mind although not a complete tabula rasa at birth contains certain raw primitives just like a new computer comes with just an operating system and a few utilities.
To build the mind, the human must learn new things either directly from its environment or from other humans. Informal education comes mostly from the environment the human finds itself and depending on the quality of that environment, that is the rational capacity of the people around, the human individual will develop accordingly.
In a formal education setting the goal which is often mistaken as training the human to become a memory machine should really be about developing the capacity for rational thinking and exploration, just like installing new software on a computer enables it to perform some new task which it did not have before.
Natural language is the form in which most of our education is conducted in and learning to think about some topic, be it literature, grammar or philosophy, which is some kind of codification of rational thought processes will elevate the raw mental capacity of a human being towards greater rationality, as these topics mostly codify the results of careful thinking done by humans with good levels of rigorous rational thinking and passed on to another generation of learners.
Engaging in science and observing the rigourous process of the natural world is another path to gaining a rational sense. When you are able to observe water evapourate, to become clouds and then rain, you have witnessed some form of systematization and order. This order is recorded in the mind and transfers to our expectations about reality. No longer will we think of the process of rain forming as a random accident of nature but we will now see it as a sequence of events that move from cause to effect.
If we see many of these kinds of sequences of causes and effects in the course of our scientific discipline we get a sense of order and harmony in our thinking processes and when faced with a situation, we will begin to think scientifically/systematically preventing the wild rulemaking processes of our mind from interfering the sequence of our thinking. Thus we are rational thinkers.
Mathematics started out as simple arithmetic but later with the development of algebra, mathematics became the most powerful source of rigour for the human mind. Because mathematics deals with abstract symbols and their manipulation in systematic highly specific ways, it is very powerful, because rather than wait on nature to reveal sequences of events. We can create abstracts systems where we can manipulate things in a rigorous way and arrive at definite conclusions.
Mathematics became the language of science because the same rigour in nature could be represented in it, and rather than toil too much at nature, we could do minimal experiments, get data, represent these data in equations, manipulate the equations, get results and then design experiments to confirm our results and thus we can gain new knowledge.
What has been amazing to me is how nature can be accurately represented in mathematics, it feels as if nature was somehow designed mathematically. Because of the power of mathematics, we can use our powers of deduction to go where no physical equipment can go directly. We can observe cosmological data and go back in time to when the universe started, we can measure the size of our solar system etc.
The study of mathematics has as a side effect, the systematization of the mind. The more time we spend indulging in mathematical rigour, the more rational we become when we think about things in life.
With the advent of computer programming we are able to go a bit above mathematics in terms of the scale of things we can represent systematically. While with math we must represent every statement as some equation, in programming we have the liberty of representing things as arbitrary expressions.
Not every situation can be modelled mathematically, sometimes we need to model things that do not fit the mathematical mold. This is where programming comes in as a very generic system of modelling any system, including those that adhere to arbitrary rules that are not necessarily mathematical.
So one might say are we not back to natural language with programming, since mathematics elevated us beyond natural language by giving us the ability to be more discrete and systematic in our expression and thinking and programming is taking us back to our pre-rigour days?
Programming is powerfully rigorous because programming languages have fixed syntax. Statements in a good programming language only say only one thing, the result of executing them.
If you are reading some math equation, there is room of misunderstanding and therefore misinterpretation because there is no compiler that can explicitly execute the equation. If we need to be definite about what our equations say, then we have to express them in the generic representation system of programming, execute them and then we can know exactly what they mean without any doubt due to the result of the execution, but sometimes issues with handling numbers on computers can mess with the accuracy of the result but this is usually the exception and not the norm and with a good programming language you will not running into numerical precision errors most of the time.
Both mathematics and programming discipline the mind by making it think systematically. Without these explicit rigorous tools, we will be hampered by the unstructured nature of natural language and we will not be able to express the truths obtained from observing nature or any other system in a definite way.
Quality of programming languages
No matter the language you are programming on there will always be some kind of benefit to your ability to think in a disciplined way because when you want to solve a problem using a computer, you will have to think systematically since the computer can be very unforgiving towards shoddy thinking.
If you don't think clearly about the problem you want to solve with a programming language you will not arrive at a solution, so constantly trying to solve problems with computers will gradually discipline your mind to think clearly, rationally and systematically about things and this skill will transfer to your daily life.
I fancy the idea that a foundation to success in any endeavour is that ability to think clearly and systematically, and while some successful people possess this ability naturally and to a great degree, it can always be cultivated by engaging the mind constantly in some rational endeavour.
When you are programming in some languages you are not quite sure that what you are doing is systematic thinking because most of your time is spent tinkering with the details of the language which is usually due to shortcomings in its design philosophy.
In a properly designed programming language, the language aligns naturally with the way you should be thinking without allowing you to stray into the kind of mushy thinking that natural language alone allows. A properly designed programming language should give the kind of freedom of expression that natural language gives with necessary restrictions preventing you from drifting.
My personal favourite is the Wolfram language because when writing code on it I am less concerned with the details of the machine I am programming on and more concerned with the problem I am trying to solve. There could be other languages that do this too but I am not aware of any better.
The object-oriented programming paradigm seems to work well on a philosophical level, but when dealing with actual objected-oriented programs the class hierarchies can get so high that it becomes difficult to actually reason about what you are trying to solve as you spend so much time dealing with the details of class heirarchy organization and less about the problem you want to solve. Sometimes a good philosophy can have a bad implementation.
Even if you don't ever intend on writing full-blown software, gaining computational thinking skills by using a language like Wolfram Language will discipline your mind properly and this skill will transfer to the natural way your mind analyses problems and give you the ability to arrive at your solutions faster.
Plus most problems in many fields are computational in nature and once you detect the structure of the problem from analysis, it will be straightforward to write a program that solves it. Even the analysis stage can be automated to a great degree using the very tools of computational thinking and a programming language.
Steve Jobs once said computers are bicycles of the mind, A good programming language adds a motor turning it into a power bike.