Hay dos preguntas diferentes aquí, y dos cuestiones diferentes para cada pregunta. Las preguntas, como varias personas ya han señalado, son la necesidad de las matemáticas para la programación frente a las ciencias de la computación. Las cuestiones, para cada pregunta, son si uno necesita las matemáticas para obtener un título en el área y para practicar en el área.
Para las ciencias de la computación, la respuesta es bastante directa. La informática es una disciplina académica que depende en gran medida de varios tipos de matemáticas: probabilidad y estadística, lógica, etc. No llegarás muy lejos sin las matemáticas, ni en términos de educación ni en términos de práctica. (Es posible que puedas trabajar en algunas ramas sin usar directamente las matemáticas, y necesitando sólo la disciplina estructural que discuto más adelante, pero te costará mucho llegar a ese punto en primer lugar.)
Para la programación, es ciertamente el caso de que la práctica de la programación actual tiene relativamente poca dependencia de las matemáticas. También hay muchas formas de conseguir una educación que te lleve a ese punto: probablemente no un típico título universitario de informática (los requisitos de cálculo y matemáticas discretas probablemente te dejarán fuera de combate), pero tal vez la formación en línea o a través de programas como CIS (ciencias de la computación y la información) – además de, por supuesto, la autoeducación.
Para ser un programador fuerte y exitoso, sin embargo, creo que necesitas algo, y está tan fuertemente correlacionado con las matemáticas formales que a menudo se confunde con ellas, pero los dos no son idénticos. La gente utiliza frases como «sofisticación matemática» o «pensamiento matemático», lo que aumenta la confusión (porque ambas suenan de algún modo ligadas a las «matemáticas»). Por lo tanto, permítanme darle un nombre diferente: estructuralismo.
Cuando se programa, se están creando y manteniendo estructuras. Estas estructuras tienen dependencias y relaciones que deben mantenerse a lo largo del tiempo (ambas nociones de tiempo: mientras se ejecuta una fuente de programa, y mientras la propia fuente de programa evoluciona). Por lo tanto, la programación requiere la capacidad de pensar claramente en las estructuras, así como de comprender las propiedades de las mismas (por ejemplo, las relaciones de uno a muchos, sus tamaños y cómo crecen, la capacidad de sustituir una estructura por otra, etc.). Una gran cantidad de soporte de programación -desde los sistemas de tipos hasta UML y los lenguajes de especificación, entre otros- está diseñado para ayudar a los programadores a realizar un seguimiento y evolución de estas estructuras.
Algunos programadores pueden utilizar herramientas muy sofisticadas para realizar este tipo de diseño y mantenimiento de estructuras (por ejemplo, yo ayudo a impartir un curso llamado «Lógica para sistemas» que trata sobre el uso de lenguajes avanzados y herramientas de análisis precisamente para esta tarea). En ese punto, la programación no sólo parece matemática, sino que puede ser difícil incluso distinguir las dos cosas.
Pero todos los buenos programadores se dedican a este tipo de pensamiento estructural, ya sea que usen matemáticas de lujo para ello o no. Cuando escribes contratos o restricciones de integridad de la base de datos o cualquier otra declaración descriptiva que no está directamente ligada a la ejecución del programa, estás haciendo una declaración estructural. Un tipo complejo o una jerarquía de clases refleja este tipo de pensamiento. Incluso cuando se escriben casos de prueba y se pregunta «¿He cubierto el espacio?», o se participa en una revisión de código que habla de por qué se eligieron determinadas estructuras de datos, se está pensando estructuralmente. Es inevitable. De hecho, una buena prueba de un programador es sacar su código y preguntarle sobre sus estructuras y ver lo bien que puede articular sus elecciones.
La cuestión es que este tipo de pensamiento estructural es profundamente matemático. (Una definición de «matemáticas» que me gusta es «las propiedades estructurales de los objetos imaginarios»). Alguien que puede trabajar bien estructuralmente -y lo necesitará, creo, para tener una carrera a largo plazo en la informática si todavía es joven hoy en día- tiene la claridad de pensamiento y organización que creo que no es muy diferente de lo que uno necesita para tener éxito en muchos tipos de matemáticas. Por supuesto, hay más cosas que hacer en las matemáticas, como llegar a ideas ingeniosas que resultan ser ideas clave para demostrar propiedades, y esas tienen más o menos análogos en la programación (dependiendo del tipo de programación que hagas).
La línea de fondo, por lo tanto, no es preguntar si puedes pensar matemáticamente. Más bien, es preguntar si puedes pensar estructuralmente. Si puedes, es probable que te vaya bien como programador, y tal vez incluso como informático. Si no puedes, entonces imagino que te será mucho más difícil sobrevivir y tener éxito.