En este artículo de (creo) 1978, E. W. Dijkstra habla de la relación íntima entre programación y matemática y de paso explica las razones por las que un programador competente debe tener bases matemáticas sólidas y amplias.

In reaction to the recognition that we did not know how to program well enough, people began to ask themselves how a really competent programmer would look like. What would we have to teach if we wanted to educate a next generation of really competent programmers? This became the central question of the study that later would become known as “programming methodology”. A careful analysis of the programmer’s task was made, and programming emerged as a task with a strong mathematical flavour. As I have once put it “Programming is one of the hardest branches of applied mathematics because it is also one of the hardest branches of engineering, and vice versa”. Why the programming task has such a strong mathematical flavour is something I shall indicate later.

A lower bound for what the adequate education of a really competent programmer should comprise was very convincingly established, but it was not an easy message to sell, because it demonstrated by necessity the total inadequacy of the education of what is known as “the average programmer”. The world today has about a million “average programmers”, and it is frightening to be forced to conclude that most of them are the victims of an earlier underestimation of the intrinsic difficulty of the programmer’s task and now find themselves lured into a profession beyond their intellectual capabilities. It is a horrible conclusion to draw, but I am afraid that it is unavoidable.

Creo que Dijkstra sobreestima el papel de los formalismos incluso dentro de la matemática. Buena parte de la labor de los matemáticos se funda sobre exploraciones erráticas no particularmente asentadas en la lógica (este asentamiento (sin duda necesario) hace parte de una etapa posterior del juego para blindar y presentar los resultados). De todas maneras es evidente que un cierto nivel de cultura matemática general (y comodidad para aplicarla) fortalece la capacidad de un programador para resolver problemas intrínsecos de su trabajo.