There is a longstanding urban legend that, to be a good programmer, you must also be a good mathematician. But after many years as a programmer and having hired many talented programmers in my career, I don’t believe it’s true. This legend was most likely born with the first computers, which were initially used to automate increasingly large and complex calculations, for which a background in mathematics would be an asset. Even though things have changed quite a bit since then, the idea still remains.

The roots of mathematics are deep—without it, we couldn’t design even the simplest computer. History tells us that, thousands of years ago, the Babylonians and the Egyptians discovered the first rules of geometry and developed the basic concepts of math. When, a few centuries later, Euclid produced his *Elements*—a collection of mathematical knowledge, proofs and theorems, and one of the most influential books of all time—mathematics was transformed into a set of logical rules from which to demonstrate all truths deductible from a few fundamental principles.

Since then, making calculations has become an abstract activity based on absolute theorems and implemented according to rigorous and mechanical procedures that, in modern times, we refer to as algorithms (another reason for the urban legend).

After more than 25 centuries, mathematics represents an articulate and vast discipline: it has explored the world of numbers, discovered new geometry and developed calculation instruments so powerful and pervasive as to constitute the very language of science.

But, since the Middle Ages, the history of math also records evidence of a dream—that of entrusting the process of calculations to a machine. The first mechanical calculators of the 17^{th} century (first Schickard and then Pascal), would be transformed into real machines, i.e. digital computers capable of performing many different mathematical tasks—without changing a single part of the machine, but by simply changing the instructions.

In fact, for a computer to function properly requires only the proper instructions. Programming a computer to make it perform only highly structured, repetitive and mechanical tasks can be relatively easy and profitable; it’s enough to provide the precise instructions in the form of “algorithms”, understood as well-defined sequences.

If we want the computer to understand what is written in a text or dialogue in a natural way, as if it were a person, then we have to go beyond the logic of the calculation. Cognitive actions are not structured, repetitive or mechanical, but exactly the opposite: a text can contain endless amounts and types of information, expressed in many different ways.

Obviously a computer can never fully substitute a human—our brains are not structured the same, nor do they work based on algorithms (even if clever enough to write them). The brain’s core work, thought, is not essentially due to a logical-mechanical description. Instead, thought is rather free and creative, as it should be.

In 1950, at the dawn of the information age, the brilliant Alan Turing created a test to answer the question: Can a machine replicate human intelligence? The famous Turing test utilized written communication—one generated by a human, one generated by a computer—in response to questions, that a judge had to evaluate to determine which was which. If a machine passes the Turing test, then you have to admit that it is an intelligent machine, and able to reason, whatever you mean by “reason”. As you can imagine, to date, no computer has passed the Turing test.

However, if we narrow the field to the idea of a computer (or a program, essentially the same thing), that is able to understand and reason like a human in specific contexts, then the scenery changes dramatically. In the last 20 years, so many advances have been made that the computer is no longer used to quickly perform tons of calculations (even if, in reality, any program, however complex, a series of elementary logical and mathematical operations are reduced to the lowest level).

A program can successfully perform limited cognitive tasks, such as to understand a language and interpret the meaning of a text (as readers of this blog are well aware). Understanding the meaning of text is the narrow gate from which all programs must pass to allow for automatic management of knowledge, or at least to support a human management of the same. The objective is always that of helping people save time, and increasing their effectiveness in activities.

As we will discuss in upcoming posts, the understanding/comprehension on the part of a computer does not need to force processes similar to those in humans (recall that at the lowest level, a computer always needs instruction), but a critical step requires passing from a series of numbers in a web page to a solution for toothache. Until next time…