
Recientemente, se hizo una pregunta en un foro en línea: ¿cuánto demandan las matemáticas bajo las condiciones de un programador real, con qué frecuencia lo usa y cuáles son sus áreas? Y aquí está mi respuesta.
En primer lugar, yo, como casi todos los programadores, uso 
la lógica booleana , desde el análisis de expresiones lógicas para declaraciones condicionales y criterios de salida, para alinear tales expresiones con, por ejemplo, 
las leyes de Morgan . La mayor parte de nuestro trabajo limita con el 
cálculo de predicados de primer orden y otra lógica de predicados en forma de análisis de precondiciones, invariantes y más (aunque parezca que estamos haciendo otras tareas).
Además, a menudo participo en el análisis de la complejidad de los algoritmos. Las dimensiones de los conjuntos de datos que se procesan en estos días son enormes. En una conferencia de 
Techonomy de 2010 
, Eric Schmidt dijo que el volumen de datos creado por la humanidad hoy en solo dos días es igual al volumen de todos los datos existentes en el mundo a partir de 2003. Es importante para mí poder procesar grandes segmentos de estos volúmenes y beneficiarme de ellos. Y en este sentido, comprender la 
complejidad espacio-temporal de las operaciones que aplicamos a los datos es la clave para determinar si ciertos cálculos son posibles en principio. A diferencia de los tipos más tradicionales de 
análisis O o 
análisis theta, los factores constantes a tales escalas tienen un efecto significativo: el factor 2 no cambia la complejidad de tiempo asintótica del algoritmo, pero requerirá un aumento en el número de procesadores de 10 mil a 20 mil, y tal diferencia en el consumo Los recursos serán tangibles. Como resultado, los cálculos se vuelven más sofisticados. Ejemplos: ¿puedo tomar un cálculo lineal y reducirlo a uno logarítmico? ¿Es posible reducir el consumo de memoria en tres veces? Y así sucesivamente. 
A menudo necesito calcular la variante más desfavorable del límite superior, por ejemplo, el tamaño de algún conjunto de datos. En muchos casos, tales cálculos pueden ser no triviales. O puede que necesite analizar alguna 
fórmula de recurrencia para verificar cómo cambia a medida que aumenta la profundidad de la 
recurrencia . Para esto, yo, entre otras cosas, debo conocer el 
teorema básico sobre las relaciones de recurrencia y cómo entender los principios de análisis de 
series numéricas . Y puede parecer increíble, pero a veces significa que necesito calcular la 
integral (aunque principalmente solo las integrales de 
Riemann ). ¿O puedo resolver la relación recursiva y obtener un 
número finito de soluciones ? ¿Tengo que recurrir al 
álgebra lineal ? Esto lleva a cosas como 
generar funciones , 
números de Stirling , cálculos 
matriciales . Si tiene curiosidad acerca de lo que se incluye en el conjunto de conceptos matemáticos fundamentales necesarios para comprender la informática, consulte el primer volumen de "El arte de la programación" de Donald Knuth o "Matemáticas concretas" de Knut, Ronald Graham y Oren Patashnik.
Hago muchos cálculos básicos en términos de agregación, combinación y transformación de datos, y la 
combinatoria (contar el número, encontrar simetrías en diferentes dimensiones y más) me ayuda en esto. Creo que los ejemplos de esta área son obvios.
Utilizo muchas 
matemáticas discretas , en particular para buscar sistemas algebraicos en operaciones en conjuntos de datos especialmente grandes. ¿Es posible mostrar esta o aquella estructura con la ayuda del 
homomorfismo como un determinado 
grupo o 
anillo , lo que será más claro para mí? ¿Hay una opción con una conexión menos estrecha? ¿Puedo aplicar la 
acción de un grupo a algún conjunto para crear un modelo especulativo de transformación que simplifique el razonamiento? ¿Puedo definir alguna topología para el análisis de datos? Se sorprendería si supiera cuántas cosas se pueden describir utilizando 
topologías discretas . Y aún menos sorprendente sería la demanda de 
desigualdad triangular .
Trabajo mucho con la 
teoría de grafos . "Crear sitios web": requiere no solo la capacidad de colocar imágenes lindas de gatos en la página. Este proceso también implica insertar nodos en el gráfico global de 
hipervínculos . Agregar una sola página conduce a un aumento potencial en el número de bordes del gráfico, y esto, a su vez, puede tener un efecto que no es obvio a primera vista sobre el rendimiento, el análisis, la clasificación de los motores de búsqueda y otras características. Comprender las consecuencias de tales cambios puede ayudar a obtener información interesante, como cómo crece el gráfico. Resulta que esta 
dinámica es dolorosamente similar a una 
ley de poder : la World Wide Web es una 
red sin escala . ¿Cuál es el 
camino más corto entre dos nodos de este gráfico? ¿Cómo se verá esa red si intentas presentarla como un gráfico 
plano o 
bipartito ? ¿Cuándo es posible cumplir con estas propiedades, si es posible? Pero, ¿qué pasa si no consideramos la red mundial como un gráfico, sino toda la red de carreteras de América del Norte, Europa o Asia?
Hay otras consecuencias de este conocimiento. A menudo, las personas no entienden que las páginas web modernas no son solo documentos 
HTML con enlaces y otros recursos, sino 
estructuras de datos en forma de 
árbol conectadas entre sí en un 
gráfico . Estos árboles a menudo se rastrean, procesan y actualizan dinámicamente debido a la interacción entre el navegador web del usuario y un servidor (gracias a tecnologías como 
AJAX ).
Un ejemplo excelente y adecuado es 
MathJax . O 
Gmail Comprender cómo funcionan implica cierto nivel de conocimiento de 
la computación simbólica y el 
análisis semántico de los elementos de la página. Los autores de MathJax necesitaban escribir un programa capaz de atravesar el árbol generado sobre la base del 
modelo de objetos del documento , encontrar elementos matemáticos, "guardarlos" y reemplazarlos dinámicamente con nuevos elementos dibujados. Quizás algunos usuarios que solo ven cómo funciona no sean muy impresionantes, pero suceden cosas bastante complicadas. Por lo general, no tengo que hacer algo similar (no trabajo con el front-end), pero todo el tiempo hago cosas similares en 
Lisp . Tenga en cuenta que Lisp se agudizó originalmente por el procesamiento matemático de la información simbólica: sus macros cubren completamente los problemas del procesamiento de expresiones simbólicas.
Trabajo mucho con 
series de tiempo . ¿Cómo cambia el consumo de tráfico o recursos? ¿Qué tendencias se pueden destacar? ¿Es este o aquel salto manifestado en la demora en responder a las solicitudes o el consumo de memoria 
estacionalmente ? ¿Cómo reacciona la 
tasa de cambio de algo cuando los datos de entrada varían en diferentes dimensiones? ¿Hay alguna 
correlación con algún evento externo?
Trabajo mucho con el análisis de datos estadísticos, no solo para determinar las características de rendimiento, sino también para comprender los datos como tales. Además de buscar metadatos semánticos en el árbol DOM mencionado anteriormente (por ejemplo, 
microdatos y 
microformatos , 
RDF , otros datos 
XML con algún 
esquema específico), también estoy tratando de comprender 
datos no estructurados . ¿Cuál es la probabilidad de que este texto sea una dirección postal? ¿O son 
coordenadas gráficas ? ¿En qué contexto aparece? ¿Es 
spam ? ¿Tiene sentido? ¿Parece el resultado de un generador de texto basado en cadenas de 
Markov ? ¿Quizás esta es una serie de citas de algún trabajo literario conocido? ¿O un fragmento de una discusión literaria? ¿O tal vez esta es una discusión sobre el spam que contiene un fragmento literario? Todavía me río cada vez que pienso en un correo electrónico no deseado que anuncia medicamentos envueltos en un fragmento del "Maestro y Margarita" de Bulgakov.
Teoría de la categoría . 
Los tipos en lenguajes de programación de computadoras corresponden aproximadamente a categorías, y las 
mónadas y los 
functores se pueden usar para simplificar seria y elegante algunas construcciones. Por ejemplo, en el lenguaje de programación 
funcional Haskell, las mónadas se usan para 
E / S y para modelado de 
estado . Cuando se trata de programas simplificados, es más fácil hacer que funcionen. Es más fácil hablar sobre ellos, es más fácil de entender, cambiar, etc. Los tipos a menudo se pueden determinar sobre la base del razonamiento lógico, lo que conduce a la aparición de 
casos especiales (que también se pueden usar en problemas de razonamiento generales). Piense en lo que sucede si usa las 
conclusiones para aplicar funciones lógicas, como las que se usan en 
prolog , para 
transformar gráficos en 
sistemas distribuidos .
Los sistemas distribuidos nos devuelven a la teoría de grafos. A escala real, los bloqueos del sistema, las excavadoras desgarran la fibra, los terremotos, las erupciones volcánicas y los arrastreros de pesca dañan los cables marinos. Para comprender las consecuencias de tales eventos y determinar las mejores formas de responder a ellos, es necesario comprender las características del gráfico de red. Los algoritmos de enrutamiento y el análisis de red están estrechamente relacionados con cosas tales como 
encontrar la ruta más corta entre los nodos en un gráfico. El 
algoritmo Dijkstra te ayudará con esto.
Y, sin embargo, ¿cómo puede distribuir la carga de un gran cálculo entre centros de datos ubicados en diferentes partes del mundo? Aquí también necesitará algunos conocimientos de física: en la escala de Internet, la 
velocidad de la luz se convierte en un "cuello de botella". 
La disipación de calor , 
la densidad de corriente por unidad de área y más son ejemplos de lo que los programadores deben tener en cuenta al trabajar con tareas del mundo real. ¿Debo alojar un centro de datos en Islandia? La refrigeración barata y las fuentes de energía geotérmica crean condiciones atractivas, pero ¿qué pasa con el retraso mínimo para los usuarios que puedan estar interesados en alquilar equipos en dicho centro de datos? ¿Cuál es la distancia a lo largo del arco de un 
gran círculo entre, por ejemplo, Islandia y Londres, o Berlín y Amsterdam? Calcular todo esto es bastante simple, pero para esto es necesario tener cierto conocimiento matemático. ¿Podemos enviar fibra desde Islandia a otro centro? ¿Cuál es el retraso promedio? ¿Cuál es la probabilidad de una ruptura del cable submarino en el Mar del Norte durante 12 meses de operación? ¿Y por 48 meses?
Por supuesto, la 
teoría de los algoritmos , la 
teoría de los autómatas , el 
análisis , 
la gramática formal y 
los lenguajes regulares son áreas de conocimiento con las que los programadores tratan constantemente. A menudo trabajo con análisis y 
coincidencia de patrones . Al trabajar con datos del mundo real, incluso los conjuntos de tamaño no muy grande pueden contener elementos que pueden causar 
un comportamiento patológicamente deficiente cuando se utilizan, por ejemplo, 
técnicas de retroceso . Al usar 
expresiones regulares para unir datos, debo tener cuidado y asegurarme de que estas expresiones sean 
realmente regulares .
Al usar una 
máquina con memoria de almacenamiento para analizar 
la gramática libre de contexto (que, por cierto, ocurre cada vez que envía una solicitud a un servidor 
HTTP ), necesito asegurarme de limitar la profundidad de recursión para evitar agotar la 
pila de llamadas del procesador, lo que requiere comprensión principios subyacentes de la computación y las matemáticas en las que se basan.
Si necesito escribir mi propio 
algoritmo de descenso recursivo para una gramática inusual y no puede coincidir con 
LALR (1) (por lo que no puedo simplemente usar 
yacc o 
bison ), debo tener cuidado o mantener la pila de estados separada de la recursión procesal. Esta comprensión también es necesaria si voy alrededor del árbol DOM (o cualquier estructura de datos definida recursivamente). 
Algunos lenguajes de programación consideran que esto es una dificultad en el trabajo de un programador y lo eluden utilizando 
pilas segmentadas . Por supuesto, sería genial si pudiera definir mi colección de algunos de los recursos analizados en forma de una 
función (en el sentido matemático). ¿Y qué genial sería si se tratara de algún tipo de problema de 
optimización de programación lineal ?
Tenga en cuenta que ninguno de los anteriores es ningún conocimiento esotérico. Todo esto se basa en la experiencia con tareas y datos del mundo real. Por supuesto, no hago todo esto todos los días, pero la mayoría de este conocimiento lo aplico regularmente, y solo algunos, de vez en cuando. Probablemente, la observación, la experiencia y la heurística tienen más influencia en el proceso de lo que deberían (los modelos heurísticos son a menudo incompletos e inexactos). ¿Tengo suficiente conocimiento matemático para calcular el 
error promedio entre la realidad y mi modelo heurístico?
Esta es la esencia de la informática, así como también cómo interactúan con la programación y las realidades de la informática moderna. Ser un profesional de TI no es lo mismo que ser un experto en la teoría de sistemas informáticos, y como muchos señalan correctamente, ese experto está mucho más cerca de un matemático aplicado que de un artesano especializado. En ningún caso quiero menospreciar la importancia de tales profesionales, ya que son útiles y son universalmente respetados, pero solo quiero señalar que la informática es otra cosa.
(Por cierto, yo mismo no soy un experto en informática. Estudié matemáticas puras y mi ocupación profesional está mucho más cerca de la ingeniería).
