2008-09-09 13 views
63

Desde que se graduó de una escuela muy pequeña en 2006 con un programa obsoleto & mal formado (soy un extranjero & no conocía ninguna escuela mejor en ese momento) me he dado cuenta de que extrañaba muchos conceptos básicos desde una perspectiva matemática del software & que son en su mayoría las bases de otros conceptos superiores.¿Cuáles son los conceptos matemáticos centrales que un buen desarrollador debería saber?

I.e. Traté de escuchar/ver el material abierto del MIT en Introduction to Algorithms pero rápidamente me di cuenta de que me faltaban varios conceptos matemáticos para comprender mejor el curso.

¿Cuáles son los conceptos matemáticos centrales que un buen ingeniero de software debe saber? ¿Y cuáles son los posibles libros/sitios que me recomendarás?

Respuesta

62

Math for Programmers. Una buena lectura.

+0

El artículo de Yegge es muy completo y proporciona muchos otros recursos para lecturas adicionales. –

+0

¡Gran enlace, gracias! –

+4

de lejos, el mejor (est) artículo que leo sobre este tema, responde a toda su confusión y dilema sobre el aprendizaje de las matemáticas. Ojalá pudiera dar esto más que + Muchas gracias Gulzar, por favor comparte algunos artículos más como este si es que tienes. –

7

Comience con lo que la gente de CS llama "matemática discreta". El cálculo y el álgebra lineal también pueden ser muy útiles porque te permiten acceder a muchos dominios de aplicaciones. Una vez que hayas dominado esos tres, ve a la teoría de la probabilidad. Esos 4 lo pondrán a la competencia en el 95% (lo inventé) de los dominios de aplicación.

+0

Algunas personas llaman "matemáticas discretas" "matemáticas finita". Creo que ambos son lo mismo. –

1

Había un libro recomendado ... el título era algo así como Concrete Mathematics. Fue recomendado en algunas preguntas.

+0

asumió que tiene sus fundamentos claros, es introductorio pero avanzado. qué más podemos esperar de knuth. –

0

Mi formación matemática es realmente pobre (geólogo por formación), pero tomé una clase discrete math en la escuela secundaria y utilizo los conceptos todos los días como programador. Es probablemente la clase más valiosa que tomé en toda mi educación en lo que respecta a mi profesión actual.

3

Álgebra básica y estadísticas son buenos puntos de partida y la base para muchos otros campos.

9

"Prueba por inducción" es un concepto matemático esencial para que los programadores lo sepan.

+2

¿De verdad?¿Para qué tareas específicas de programación se requiere esto? –

+0

@Anders - Prueba de pruebas en el caso del desarrollo de algoritmos. – rjzii

+1

Afortunadamente, las pruebas de inducción son algunas de las más fáciles de imo. – mmcdole

9

Big O notation en análisis general algoritmo, y en relación a las colecciones estándar (clasificación, inserción recuperación y supresión)

4

que diría lógica booleana. Y, O, XOR, NO. Encontré como programador que utilizamos esto más a menudo que el resto de conceptos matemáticos.

5

Creo que depende de su enfoque. Hace unos años, compré el set de Arte de programación por computadora de Donald Knuth. Después de mirar los libros, me di cuenta de que prácticamente todo es prueba de cálculo. Si estás interesado en desarrollar tus propios algoritmos genéricos y pruebas para ellos, te recomiendo que puedas entender los libros anteriores, ya que es con lo que estarías lidiando en ese mundo. Por otro lado, si solo quiere/necesita usar varias rutinas de ordenación/búsqueda/árbol/etc ... entonces la notación de O grande como mínimo, las matemáticas booleanas y el álgebra general estarán bien. Si se trata de 3D, también geometría y trigonometría.

Tiendo a ser más en el lado de usar que en hacer pruebas, y aunque me gustaría pensar que he hecho algunas cosas inteligentes a lo largo de los años, nunca me senté y desarrollé una nueva rutina de clasificación. El mejor consejo que puedo darte es aprender lo que necesitas para tu campo, pero exponerte a niveles más altos para que sepas que existe y cuánto más hay para aprender, de lo contrario no obtendrás mucho crecimiento.

19

El álgebra de Boole es fundamental para entender las estructuras de control y la refactorización. Por ejemplo, he visto muchos errores causados ​​por programadores que no sabían (o no podían usar) la ley de DeMorgan.Como otro ejemplo, el número de programadores reconocer inmediatamente que

if (condition-1) { 
    if (condition-2) { 
     action-1 
    } else { 
     action-2 
} else { 
    action-2 
} 

puede reescribirse como

if (condition-1 and condition-2) { 
    action-1 
} else { 
    action-2 
} 

Matemática discreta y combinatoria son tremendamente útil para comprender el funcionamiento de varios algoritmos y estructuras de datos.

Como lo menciona Baltimark, la inducción matemática es muy útil para razonar acerca de los bucles y la recursividad.

La teoría de conjuntos es la base de las bases de datos relacionales y SQL.

A modo de analogía, permítanme señalar que los carpinteros rutinariamente utilizan una variedad de técnicas empíricas para construir cosas como techos y escaleras. Sin embargo, un conocimiento de geometría le permite resolver problemas para los cuales no tiene una regla de oro "enlatada". Es como aprender a leer mediante la fonética frente al reconocimiento visual de un vocabulario básico. 90 +% de las veces no hay mucha diferencia. Pero cuando se encuentra en una situación desconocida, es MUY bueno tener las herramientas para resolver la solución usted mismo.

Finalmente, el rigor/precisión requerido por las matemáticas es una preparación muy útil para la programación, independientemente de la técnica específica. Una vez más, muchos de los errores en la programación (o incluso las especificaciones) que he visto en mi carrera tienen un pensamiento descuidado en su causa raíz.

+0

+1 para su ejemplo –

+0

+1 para su ejemplo – Trae

0

Matemáticas discreta
Álgebra Lineal
Combinatoria
Probabilidad y estadística Teoría
Gráfico

8

Para matemáticas discretas, here es un impresionante conjunto de 20 conferencias de la Universidad de ArsDigita. Cada uno dura alrededor de una hora y veinte minutos.

12

Me gustaría ir con los campos que se indique Landon:

Matemáticas discreta, Álgebra Lineal, Combinatoria, Probabilidad y Estadística , teoría de grafos

y añadir la lógica matemática.

Esto le daría un control en la mayoría de los campos de CS.Si quieres entrar en campos especiales, usted tiene que sumergirse en algunas áreas en particular:

Computer graphics -> Linear Algebra 
Gaming -> Linear Algebra, Physics 
Computer Linguistics -> Statistics, Graph Theory 
AI -> Statistics, Stochastics, Logic, Graph Theory 
2

Aquí es muy simple que me desconcierta cuando veo a los desarrolladores que no lo entienden:
- Orden de las operaciones

+0

De acuerdo. Solía ​​ser tutor de intro cursos de CS y me tomó un tiempo darme cuenta de que algunos estudiantes tenían problemas para entender esto. Es algo muy natural para la mayoría de nosotros procesar que es difícil al principio creer que algunos no lo hacen. –

+0

Lo mismo aquí. Siempre solía estancarme cuando me di cuenta de que no tenían idea de lo que estaba hablando. –

0
  • Álgebra de Boole
  • Teoría de Conjuntos
  • Matemáticas discreta
10

En orden de importancia:

  • Conteo (necesario para bucles)
  • suma, resta, multiplicación, división.
  • Álgebra (solo se requiere realmente para comprender el uso de variables).
  • Álgebra booleana, lógica booleana y binario.
  • Exponentes y logaritmos (es decir, entender la notación O (n)).

Cualquier cosa más avanzada que eso suele ser específica de un algoritmo o de un dominio específico. Dependiendo de qué áreas le interesa, lo siguiente también puede ser relevante:

  • Linear algebra y trigonometría (visualización en 3D)
  • Matemática discreta y la teoría de conjuntos (diseño de bases de datos, diseño de algoritmos, el diseño del compilador).
  • Estadísticas (bueno, para aplicaciones estadísticas y/o científicas/económicas, posiblemente también útiles para el diseño de algoritmos).
  • Física (para simulaciones).

Entender las funciones también es útil (no recuerdo cuál es el término matemático para esa área), pero si sabe cómo programar probablemente ya lo haga.

Mi punto es: un niño de diez años debe saber suficientes matemáticas para poder entender la programación. No se requieren realmente muchas matemáticas para la comprensión básica de las cosas. Todo se trata de la lógica, realmente.

2

El capítulo 1 de "El arte de la programación de computadoras" tiene como objetivo proporcionar exactamente esto.

0

Bueno, eso depende de lo que sea su objetivo. Como alguien dijo, Linear Algebra, Combinatorics, Probability and Statistics y Graph Theory son importantes para resolver problemas difíciles. El crecimiento asintótico de funciones (notación bit-Oh) es muy importante. También necesitará dominar las sumas y las series si necesita trabajar en el análisis de algunos algoritmos más complejos (consulte el apéndice sobre Cormen & más Introducción a Algoritmos).

Incluso si le gusta "Java para la empresa" o "PHP del lado del servidor", encontrará algunas estadísticas y complejidades de algoritmo (combinatorias, inducción, sumas, series, etc.) útiles cuando su jefe lo desee para hacer que el servidor funcione más rápido, y agregar nuevo hardware no parece ayudar. :-) He pasado por eso una vez.

0

Por qué está todo el mundo incluyendo probabilidad y estadística en la lista de oro sin mencionar el cálculo? No se puede entender de qué se tratan las probabilidades y las estadísticas sin al menos un conocimiento práctico de los límites, los derivados, las integrales y las series. Y, en general, el cálculo (junto con el álgebra lineal) es el caballo de batalla de todas las matemáticas.

1

De regreso a la escuela, uno de mis instructores dijo que para aplicaciones comerciales, todo lo que necesita saber es sumar, restar, multiplicar y dividir. Todas las otras fórmulas que el solicitante conocerá y le informarán qué se necesita. Ahora date cuenta de que esto es para la financiación de los informes y la escuela centrada en la aplicación. Hasta el día de hoy, esto ha sido cierto para mí. Nunca una vez necesité saber más que eso.

0

Creo que los algoritmos y la teoría son de gran importancia. Poder encontrar una solución rápida correcta es lo que diferencia a los buenos programadores del resto. Además, ser capaz de demostrar su algoritmo (usando técnicas de prueba estándar, inducción, contradicción, etc.) es igualmente importante.

1

Consultar el libro Foundations of Computer Science
Este libro es propiedad de: Al Aho y Jeff Ullman y todo el libro está disponible en línea.

Esto es lo que los autores dicen en su Prefacio sobre la meta de este libro:

" Fundamentos de Ciencias de la Computación cubre temas que se encuentran a menudo dividida
entre un curso de matemáticas discretas y un nivel de segundo año secuencia en computadora
ciencia en estructuras de datos. Hemos tenido la intención de seleccionar las bases matemáticas
con la vista puesta en lo que el usuario realmente necesita, en lugar de
qué puede elegir un matemático ".

0

Sí, yo diría que una comprensión básica de la inducción ayuda a entender lo que n representa en los algoritmos. También algunas estructuras lógicas y discretas son útiles.

0

Probabilidad y estadísticas son muy útiles si alguna vez tiene que hacer algo parecido al aprendizaje automático.

Cubro los conceptos básicos en mi publicación de blog "Computing Your Skill" donde analizo cómo funciona el algoritmo TrueSkill de rankings y emparejamientos de Xbox Live.

Cuestiones relacionadas