¿Qué habilidades matemáticas debo aprender para convertirme en un buen programador?

Las matemáticas están en todas partes en la programación. Los lenguajes de programación y los enfoques han evolucionado enormemente a lo largo de los años. Muchos idiomas contienen bibliotecas enormes de funciones matemáticas que encapsulan la complejidad subyacente de las matemáticas.

Dicho esto, la programación es dominar el lenguaje de la lógica, mientras se trata de la gestión de la memoria, la sintaxis y el diseño. Tomaré cada uno de estos temas a continuación con una breve visión matemática basada en mi experiencia personal …

Lógica: en primer lugar, George Boole es un matemático importante que es conocido y ha creado una base científica en el dominio lógico. Si estudia el álgebra de Boole, comprenderá el poder de las operaciones lógicas, la dualidad, las puertas lógicas digitales … La lógica también es una cosa impulsada por el proceso, que se aprende mediante el estudio de algoritmos básicos de programación, estructuras de datos y, en etapas posteriores, avanzar hacia la logarítmica áreas matemáticas como la programación lineal (por ejemplo, algoritmo de Dijkstra), teoría de grafos (por ejemplo, simetrías), …

Gestión de la memoria: Otro dominio matemático interesante para comprender es cómo se realizan las operaciones numéricas básicas en los diferentes sistemas numéricos: notación binaria, octal, hexadecimal y decimal. Cómo se anotan los números grandes en notación binaria de 8 bits, 16 bits, 32 bits y 64 bits en formatos endian pequeños y grandes. Cómo la notación exponencial científica se expresa en formato binario es un tema muy interesante. Y cómo se calculan las operaciones matemáticas en estos sistemas numéricos utilizando una representación binaria … hoy en día, sin embargo, los programadores ya no entienden las complejas matemáticas requeridas al realizar estas operaciones, ya que las CPU modernas han asumido estas tareas …

Sintaxis: si aprende y obtiene una buena comprensión de cómo se crean los lenguajes de computadora, realmente entenderá cómo la sintaxis que está aplicando se convierte en código de máquina … Como primera observación, no puedo recomendar lo suficiente como para echar un vistazo a lo básico cómo funciona una CPU, cómo se construye el código de máquina … Tuve una experiencia fantástica durante mi juventud al crear demostraciones en pantalla dividida en el procesador Motorola 6502 de 8 bits en lenguaje ensamblador. Más tarde pasé a 8086 en Intel CPU Suite, incluso hice cosas como la programación en modo protegido en el 80386 y luego aprendí el ensamblaje básico en el mainframe ibm durante mi carrera profesional … De todos modos, volviendo a las matemáticas … Para modelar la estructura de idiomas y procesarlos. (= interpretar o compilar), debe tener una buena comprensión de la teoría de conjuntos, y cómo se aplica la teoría de conjuntos en ciencias de la computación para el análisis léxico y la estructura del lenguaje de análisis. La biblia en el tema es el libro Compiladores, Principios y Herramientas de Aho, Sethi y Ullman (El libro del Dragón). Además, en la literatura de Linux hay muchas herramientas que se ocupan de la gramática como yacc y Lex. Como consecuencia de este conocimiento, construí para un gran banco belga un compilador cruzado que convirtió aproximadamente 12.000.000 de líneas de código pl / 1. El compilador cruzado resolvió el problema de precisión que ocurrió al cubrir a los francos belgas (anotados con cero decimales) en Euros (anotados con 2 decimales) …

Diseño … Este es un tema muy amplio, tal vez sin una relación matemática directa. Pero me gustaría enfatizar que un buen diseño requiere un conocimiento profundo de los patrones de implementación y de relación. Este dominio es quizás el más difícil de todas las habilidades informáticas para dominar. El diseño se trata de equilibrar el esfuerzo, el tiempo, la capacidad de expansión, la capacidad de uso, la reutilización, la rentabilidad, etc. en algo que funcione y cumpla con las expectativas. Más aún, los equipos y las personas diseñan cosas y su éxito central reside en la creatividad y la motivación de las personas. ¡Así que la gestión de personas es tan importante como la ciencia! De vuelta a las matemáticas … Existen dominios de problemas informáticos en los que se requiere una gran cantidad de conocimientos matemáticos especializados, como programación de juegos, composición gráfica, simulación, control de hardware, protocolos, inteligencia artificial, predicción, lógica difusa, análisis de datos. Las áreas matemáticas que se deben dominar en estos dominios son los gráficos por computadora (cálculo vectorial, física, emisión de rayos, …), modelos matemáticos complejos de objetos y comportamientos del mundo real, como envolturas de simulación de vuelo, simulación de embudo de viento, etc. La inteligencia artificial se ocupa de muchas áreas matemáticas, pero lo más importante hoy en día es el aprendizaje automático que utiliza redes neuronales que requieren un conocimiento estadístico de matemática muy avanzado.

Solo agregue mis dos centavos para complementar las respuestas anteriores: Teoría de números. Es extremadamente importante para los programadores avanzados, especialmente para cifrar. Topcoder tiene algunos tutoriales rápidos y claros sobre la teoría de números básica (por ejemplo, GCD), los números primos, el teorema de Euler:

  1. http://community.topcoder.com/tc…
  2. http://community.topcoder.com/tc…

La capacidad de sumar, restar, multiplicar y dividir, con o sin una calculadora, es suficiente para el 99 y el 44/100 por ciento del trabajo que hará como programador.

Creo que el mito de que las matemáticas son necesarias para la programación se deriva de la programación que se ofrece como parte de un plan de estudios de Matemáticas, en lugar de Ciencias, a donde pertenece. A decir verdad, todo lo que se requiere es una mente lógica y la capacidad de resolver problemas del mundo real.

Un porcentaje muy pequeño de proyectos requerirá algún tipo de matemáticas superiores, pero en el entorno adecuado, incluso eso es innecesario. Hace muchos años, como programador muy joven, recibí instrucciones para codificar una función integral compleja (para mí, al menos) en lenguaje ensamblador. Después de una semana de estudiar textos de matemáticas, todavía no lo entendía. Nuestro analista de medio tiempo (él solo trabajó medio día el viernes e hizo más que yo) entró, vio la expresión en la pizarra y la reescribió en BASIC. Tuve el código de ensamblaje terminado veinte minutos después.

Las matemáticas se usan en la programación de dos maneras diferentes. Una forma es en el dominio de la aplicación. Por ejemplo, si va a trabajar en gráficos, entonces realmente necesita algo de trigonometría y geometría y álgebra lineal, y si va a trabajar en simulación, entonces necesita cálculo y estadísticas. Pero, como han señalado otros aquí, hay muchos dominios de aplicación en los que las matemáticas no van más allá del simple álgebra.

La segunda forma en que se usan las matemáticas en la informática es en tratar el programa como un objeto matemático. Por ejemplo, el diseño de un algoritmo recursivo es esencialmente idéntico a una prueba por inducción. Muchas manipulaciones estándar del texto del programa (por ejemplo, cambiar la prueba de forma condicional para obtener la sección más corta del código en la rama ‘luego’ en lugar de la rama ‘else’) constituyen una especie de álgebra. Este segundo uso de las matemáticas atrae a algunos de los campos particulares de las matemáticas, particularmente a la lógica, pero sobre todo lo que requiere es la capacidad de pensar matemáticamente. La habilidad de un programador para pensar de esta manera a menudo se refleja en la elegancia, la confiabilidad y la eficiencia de su código, en su efectividad en la depuración y en su capacidad para encontrar enfoques viables en dominios de problemas nuevos o desconocidos.

La única sección de matemáticas que realmente necesitas para el desarrollo de software es el Álgebra Booleana. Esto es para entender cómo escribir cláusulas condicionales complejas para las sentencias if..else.

Además de eso, debe tener una comprensión conceptual de lo que son las notaciones binarias, octales, decimales y hexadecimales.

Para convertirme en un buen desarrollador de software, creo que una habilidad para estimar rápidamente la complejidad del algoritmo dado será realmente útil.

Esas son las únicas cosas de las matemáticas que realmente se utilizan en la ingeniería de software en general . Todo lo demás se requiere en el desarrollo de tipos específicos de software. Por ejemplo, en el desarrollo web de los sitios web de e-marketing necesitará una comprensión de la aritmética suficiente para calcular correctamente los impuestos y descuentos. Nada mas.

Primero entiende en qué dominio específico está trabajando, y luego sabrá cuánta matemática necesitará para desarrollar una solución de software para su problema. No de la otra manera.

Voy en contra del grano y digo que sí, que necesitas una mentalidad matemática . La mayoría de la gente piensa que las matemáticas son aritméticas o memorizan fórmulas arcanas. Esto es como preguntar si necesitas una ortografía perfecta o un vocabulario extraordinario para ser un buen escritor.

Escribir es sobre comunicación, y matemática / programación es sobre el proceso de pensamiento claro y lógico (de una manera que no se pueden cometer errores; la ecuación no se equilibra o el programa no se compila). Específicamente, ese pensamiento lógico se manifiesta en:

  • Capacidad para estimar / comprender las diferencias entre los números: O (n ^ 2) vs O (lg (n)), sentido intuitivo de KB vs MB vs GB, cómo se compara el disco lento con la RAM. Si no te das cuenta de lo pequeño que es un KB en comparación con un GB, estarás perdiendo el tiempo optimizando las cosas que no importan.
  • Funciones / programación funcional (¿es una coincidencia que la ecuación f (x) = x ^ 2 sea tan similar a cómo escribirías ese método? Las palabras “algoritmo” y “función” existían en el mundo matemático mucho antes de La primera computadora nació :-))
  • Álgebra básica para crear y reordenar sus propias ecuaciones, tomar promedios, estadísticas básicas

Entonces, diré que necesita una mentalidad matemática, ser capaz de construir y manipular modelos mentales de lo que hace su programa, en lugar de una recopilación de datos y teoremas. Ciertos campos como gráficos o bases de datos también tendrán ciertos datos que necesitas, pero para mí eso no es la esencia de ser “bueno en matemáticas”.

  1. Combinatoria
  2. Teoría de grafos
  3. Álgebra lineal, al menos operaciones de vectores y matrices más ecuaciones lineales
  4. Cálculo, no en profundidad, pero lo básico es imprescindible.
  5. Probabilidades y estadísticas
  6. Teoría de la complejidad, O-notación

Estos son los temas más comunes, no tienes que dominar ninguno de ellos. Los algoritmos y las estructuras de datos no se mencionan en la lista, ya que la pregunta es acerca de las matemáticas.

Eso depende totalmente de en qué área de CS eliges trabajar.

Los trabajos de desarrollo de software más típicos no requieren que sepas nada de matemática. Estos son productos que no están construidos sobre algún algoritmo matemático; Son más una tarea de ingeniería inteligente que un desafío algorítmico.

Dicho esto, ciertos campos de CS se basan en leyes matemáticas, pero estas áreas son en realidad interdisciplinarias y no pertenecen exclusivamente a CS. Cualquier persona con buenos fundamentos matemáticos puede meterse en estos y si están interesados ​​pueden aprender programación sobre la marcha y seguir implementando cosas. Por lo que he experimentado, estos son los siguientes:

  1. Aprendizaje automático: álgebra lineal, teoría de la probabilidad, cálculo multivariado, métodos estadísticos y numéricos, funciones convexas.
  2. Visión por computadora: álgebra lineal, geometría básica, análisis de Fourier, probabilidad.
  3. Gráficos por computadora: Nuevamente álgebra lineal, cálculo multivariado, métodos numéricos.
  4. Diseño y análisis de algoritmos: teoría de números, combinatoria, teoría de probabilidades, Crecimiento de funciones, teoría de grafos.
  5. Verificación formal: álgebra booleana. Teoría de grafos si estás inclinado hacia la investigación en este campo.

Esta no es una lista exhaustiva, solo las matemáticas en las que tuve que trabajar para estos cursos.

Aritmética básica y estimación.
Álgebra lineal
Probabilidad básica y estadística.
Matemáticas discretas
Teoría de grafos y modelos de Markhov.
Teoría de cuerdas (notacional / lingüística, es decir, no física cuántica)
Lógica, sistemas axiomáticos, pruebas.

Cualquier cosa abstracta, útil para modelar, incluyendo:
– Teoría de conjuntos, relaciones, mapeos, funciones.
– Grupo, anillo, teoría de campo.
– Teoría de los números
– Fundamentos de X, para X = geometría, números reales, etc.

Ser capaz de modelar un problema e implementar un sistema de trabajo en torno a ese modelo es fundamental. Cada modelo tendrá uno o más tipos de objetos, relaciones entre objetos, funciones y operaciones. Para mi dinero, de esto se trata la matemática.

Pasé de estudiar matemáticas a lingüística teórica y aplicada. A menudo les digo a las personas, sin una pizca de exageración, que los mejores cursos de lingüística que tomé fueron en el departamento de matemáticas.

PD: Fíjate que no listé trigonometría o cálculo. Cuando estaba en la universidad se me ocurrió una regla general que me sirvió muy bien: cualquier curso que requiera un uso extenso de los números reales no sería una buena opción para mí.

Usted podría encontrarse aplicando ideas de cualquiera de una amplia gama de áreas de las matemáticas durante su carrera como programador. También es posible que la práctica con varios estilos matemáticos de pensamiento le ayude a enfrentar las preguntas que enfrenta.

Sin embargo, las habilidades más fundamentales que ejercen los programadores tienen que ver con el conteo. ¿Qué tan grande crecerá esta matriz? ¿Cuántas veces se ejecutará este bucle? ¿Qué tan profunda será esta recursión? ¿Cómo puedo asignar elementos del conjunto A al conjunto B para garantizar que la asignación sea una bijección? ¿Qué pasará si la cadena que estoy procesando no tiene m caracteres? ¿Cuánto tiempo tomará este proceso? ¿Cómo puedo hacer que el (enorme) vocabulario en inglés sea manejable? Y así.

Mucho depende de lo que vayas a programar. Soy un desarrollador de sitios web para un producto en línea orientado a los negocios y las únicas matemáticas que necesito saber son las matemáticas básicas y los conceptos algebraicos. Simplemente no es muy intensivo en matemáticas (algunos sitios web lo son, pero muchos no lo son). Pero otros tipos de programación (negocios / finanzas, científico, juegos y modelado 3D, etc.) pueden requerir un conocimiento avanzado de estadística, cálculo y geometría. El cielo es el limite. Cualquier cosa que se pueda describir con matemáticas se puede hacer en una computadora (y generalmente es en estos días).

Depende de lo que planeas programar.

Creo que una buena exposición al álgebra, el análisis asintótico, las técnicas de prueba, la lógica y las técnicas de razonamiento con tanto la abstracción del proceso como la abstracción de la información deberían ser adecuadas para realizar la mayoría de las tareas de programación exigentes.

Sin embargo, mi experiencia personal ha demostrado que las Matemáticas Discretas Básicas (teoría de conjuntos, lógica, combinatoria, teoría de grafos, probabilidad y estadística) son invaluables. Cuantas más ideas comprenda de estos campos, mejores serán sus habilidades para resolver problemas.

Además, las ideas de disciplinas matemáticas como Álgebra Lineal, Cálculo, Álgebra Abstracta han encontrado su camino en campos como el aprendizaje automático, la teoría del lenguaje de programación, la visión por computadora y otras optimizaciones. Así que realmente depende de en qué te estés enfocando. Las técnicas de análisis numérico podrían ser todo lo que necesita para programar en su dominio o podría terminar recorriendo una gran cantidad de campos y teoremas esotéricos para encontrar su solución.

La mayoría de la programación de pan y mantequilla no requiere muchas habilidades matemáticas, pero estos son los conceptos básicos que supongo:

  • Comprender las bases numéricas y cómo las computadoras manejan los valores booleanos, enteros y de punto flotante, y dónde se aplican, y qué errores pueden ser causados ​​por cada una.
  • Álgebra en general, por lo que puede establecer fórmulas básicas para, por ejemplo, escalar valores, transformaciones 2D (en su mayoría), etc.
  • Álgebra lineal para juegos y CAD.

Ciertamente hay dominios contextuales que requieren mucho más conocimiento de las matemáticas, como cuando se construyen motores 3D, criptografía, simulaciones de física, etc.

Lógica:

Debes entender esta expresión primero:
A => B <=>! B =>! A && A => B <= / =>! A =>! B
(la mayoría de la gente no entiende eso!)

Debe estar muy familiarizado con las expresiones lógicas / booleanas, marcar la diferencia entre AND y OR , también OR y XOR , y resolver complejas expresiones de este tipo sobre la marcha.

Lo que sea que programes, siempre usarás eso, todo lo demás es ocasional …

1 – Persistencia

Muchas veces te encontrarás con la apariencia de una pared de ladrillos. La persistencia es a veces todo lo que se interpone en el camino de su próxima progresión.

2 – Prueba y error

Debe estar dispuesto a probar ideas que no haya descubierto para ver cómo se deshacen, de modo que pueda acercarse más a una solución.

3 – Iterando a través de todos los pasos en tu cabeza

En lugar de que Willy nunca ejecute su programa para ver qué sucede, también puede seguir las instrucciones en su mente para ver cuáles son los resultados. Esto acelera su flujo de trabajo y expande sus capacidades porque puede evaluar el código en su cabeza más rápidamente en lugar de hacerlo lentamente en papel.

4 – Desarrollando abstracciones mentales efectivas.

La programación implica escribir instrucciones que cambien el estado interno del programa. Es de gran ayuda si puedes conceptualizar mentalmente en qué estás trabajando.


En lugar de centrarse solo en las habilidades matemáticas, mire el inglés, ya que está escribiendo no solo para la computadora sino también para otros seres humanos.

Así que lea ficción y no ficción para alimentar su mente con buenos ejemplos de comunicación clara, y al mismo tiempo escriba regularmente para perfeccionar sus habilidades.

Construye programas regularmente también. Podría ser cualquier cosa y puedes combinarlo con tu práctica de escritura al bloguear acerca de tu experiencia.

Para ser un buen programador, no se trata realmente de cálculos, sino del enfoque para resolver un problema. Por ejemplo, es más importante saber cómo y por qué terminas con el infinito como respuesta, en lugar de saber que el infinito es la respuesta. Pero como mencionó Chris, el calibre de los estudios de matemáticas depende del proyecto en el que estés trabajando. La inventiva y la motivación personal también son factores clave para ser un buen programador. Eso significa que sí, tienes que recoger un libro por ti mismo y descubrir cuáles son las últimas tendencias de programación y nunca dejar de aprender solo porque estás fuera de la escuela.

Soy licenciado en matemáticas y pasé varias décadas en la industria de la computación. La simple verdad es que casi nunca uso ninguna de las cosas que aprendí en matemáticas al hacer software o diseño de hardware.

Las excepciones:

Una vez utilicé una geometría analítica simple para resolver el problema de ubicar una sonda (dedo) en una complicada serie de cruces de caminos ópticos en un diseño de pantalla táctil óptica.

Otra vez utilicé las nociones subyacentes detrás del cálculo para resolver un problema de enfoque de la cámara.

Las matemáticas son una rama de la filosofía, y el único curso que encontré común a ambos (el mismo curso tiene dos números de curso diferentes) es la “lógica”. Este es probablemente un buen curso para cualquier trabajo de computadora, ya sea hardware o software.

Curiosamente, las matemáticas complejas no son necesarias para convertirse en un programador decente. Por complejo, me refiero a los baluartes y el cálculo. La mayoría de las matemáticas que querrás hacer tienen que ver con los cuatro básicos: suma, resta, multiplicación, división.

Sin embargo, diría que una buena comprensión de las estadísticas es importante. No solo le permitirá escribir software que tome mejores decisiones, sino que también le permitirá comprender la eficacia de varias implementaciones.

El álgebra es importante para resolver problemas de la vida real.

Además, trabajar con sistemas numéricos diferentes, la aritmética binaria y hexadecimal es realmente útil cuando empiezas a trabajar con cosas de bajo nivel (punteros y gestión de memoria).

Y, finalmente, la lógica proposicional y la lógica simbólica es una de las cosas más importantes que deberá aprender para ser un buen programador.

Álgebra lineal, matemática discreta, teoría de grafos, topología, teoría de conjuntos, trigonometría y combinatoria son buenas.

Cálculo, sorprendentemente no.