Soy bueno en matemáticas, pero ¿por qué mis habilidades de programación son deficientes?

Hay muchas habilidades que contribuyen a ser un buen programador, siendo estas tres las más importantes:

  1. Fluidez en su idioma de elección. Esto significa que puede implementar algoritmos de manera rápida, elegante y precisa en el idioma que prefiera.
  2. Claridad analítica y la capacidad de resolver problemas usando una variedad de técnicas algorítmicas que incluyen recursividad, programación dinámica y estrategias ambiciosas.
  3. Un conocimiento completo de una gran cantidad de técnicas estándar, estructuras de datos y algoritmos: incluyendo clasificación, búsqueda, estructuras de árbol, gráficos, algoritmos de gráficos, algoritmos matemáticos, permutación y generación de combinaciones, y muchos más.

En treinta y cinco años de enseñanza de las matemáticas, descubrí que la mayoría de los buenos estudiantes de matemáticas pueden hacer los tres. Sin embargo, no todas las personas que pueden hacer 1 y 3 son buenos estudiantes de matemáticas. Las matemáticas se correlacionan principalmente con la habilidad 2.

La habilidad menos correlacionada con las matemáticas es 1, que es una habilidad de ingeniería. Es decir, la habilidad proviene de mucha práctica práctica y repetición, en lugar de una abstracción.

Completa la habilidad 1, y si eres realmente fuerte en matemáticas, pronto serás un gran programador.

Son en gran medida habilidades no relacionadas. Los mejores programadores que conozco son prácticamente inexpertos en algo parecido a las matemáticas avanzadas.

Puede expresar casi cualquier cosa en la programación con bucles while y si las declaraciones, no necesita ser bueno en matemáticas.

Necesitas aprender a aprender.

Piénsalo, ¿puedes hacer un juego como Halo? ¿No? Tampoco puedo.

¿Puedes hacer Buscaminas? ¿No? ¿Te imaginas cómo hacerlo? ¿Puedes pensar cómo comenzarías? ¿Si? OK, comienza

Hecho eso? Genial, está bien, ahora haz un juego de Mario.

Bien, ¿qué tal Sonic the Hedgehog?

En realidad has ido a hacer algo .

En serio, no leas sobre programación, ni siquiera preguntes sobre programación, solo haz la programación .

Configure un entorno de programación, no importa qué, podría ser Java, C #, Swift, Python, lo que sea, no importa. Elija un proyecto, un juego, una aplicación, una herramienta de escritorio, un programa de servidor, un sitio web, no importa, simplemente elija algo que le interese. Hazlo. ¿Te quedaste un poco? Buscalo en Google.

En mi experiencia, la programación debe abordarse en algún sentido como cualquier otro lenguaje: se necesita una práctica constante y regular para internalizarse. Si no lo usa con frecuencia, no continuará progresando. Mucho de lo que aprende se internaliza abordando nuevos problemas con nuevas bibliotecas y nuevos idiomas una y otra vez para que comience a desarrollar habilidades sólidas y flexibles.

De la misma manera que no necesariamente memorizas todo lo que le dices a alguien en una conversación regular (es decir, tus pensamientos se secuencian en voz sobre la marcha), tus habilidades de codificación se agudizan al usarlas en nuevas situaciones, recontextualizando las anteriores codificadas soluciones a problemas nuevos y ligeramente diferentes. El discurso es semi-programado, dependiendo del contexto (su conversación con un empleado de una tienda de conveniencia se verá diferente a una conversación con su jefe o un extraño al azar) pero siempre está respondiendo a nuevas situaciones al reorganizar su biblioteca de palabras e ideas. La programación se parece mucho a esto.

Es este aspecto de la programación lo que lo convierte en un desafío para dominar. Las matemáticas existen en un mundo que ha sido muy bien abstraído de la realidad para que su lenguaje y símbolos sean limpios y (relativamente) consistentes. La programación es mucho más desordenada en general. Además, todas las ‘reglas’ en la programación de computadoras se basan en sistemas reales con propiedades físicas. Hay varias capas de abstracción antes de llegar al nivel de escribir un programa en un lenguaje de alto nivel. Las implementaciones detrás de esas abstracciones son en realidad algo con lo que tiene que lidiar en varios puntos (por ejemplo, algunos idiomas lo obligan a administrar la memoria dinámica manualmente y otros hacen algunas compensaciones simples pero relativamente robustas para administrar la memoria automáticamente, pero ningún sistema de administración de memoria es perfecto ) Las matemáticas son abstractas y, por lo tanto, bastante más flexibles.

No se deje engañar por la simplicidad de la respuesta: practique más. Y me refiero a la práctica deliberada . Pruebe algo que esté fuera de su zona de confort actual. Si su práctica está en ese nivel correcto (donde tiene que estirarse), entonces aprenderá de la manera más eficiente. No hay ningún secreto para aprender a programar más allá de esto y comprender los conceptos básicos. Por lo tanto, su éxito será más una cuestión de voluntad y perseverancia que de inteligencia o habilidad general (de la que tiene suficiente si es bueno en matemáticas).

No puedo subrayar lo suficiente la frecuencia con la que debes practicar. Contraste aprender un idioma en un aula universitaria o escolar con otros métodos. Obtienes pequeñas dosis de práctica en un ambiente seguro que es un poco pesado en lo teórico. Está bien comenzar, pero un enfoque mucho mejor es la inmersión . ¿Imagina cuánto más rápido progresará si tiene que hablar en el nuevo idioma como 8 horas al día? Debería sangrar el código cuando su piel se pinche.

El listón para ser “bueno en matemáticas” es bastante bajo. Si la programación se enseñara en las escuelas de la misma manera que las matemáticas, hay una buena posibilidad de que hubieras crecido pensando que eras “bueno en la programación” incluso si solo eras competente.

Es fácil para las personas encontrarse con obstáculos en matemáticas muy temprano y algunas personas nunca tienen una intuición para ello. Dado que intentan enseñar hacia el medio, puede ser muy fácil para alguien que “lo entiende” llegar muy lejos. Pero en el extremo superior, puede encontrar problemas arbitrariamente difíciles si los busca.

Sin embargo, con las matemáticas, los resultados de gama alta no son tan fáciles de inspeccionar desde el exterior como World of Warcraft o Photoshop o cualquier otra cosa. Para mí, la razón por la que pude dudar de que era bueno en matemáticas era porque sabía que había cosas como el Teorema fundamental del álgebra con imágenes de Gauss en el libro de texto, y no tenía idea de cómo comenzaría a probarlo. una cosa. También tuve un par de viajes de campo a concursos de matemáticas donde perdí mucho porque el otro lado estaba preparándome duro mientras yo estaba pasando por las matemáticas de la escuela primaria con un esfuerzo del 40 por ciento. Hay buenas en matemáticas, y luego hay buenas en matemáticas. Nunca debes sentirte tan seguro de que eres el último, y si lo eres, sigue intentando algo un poco más difícil hasta que tengas que leer despacio y atascarte a veces. Verás que las matemáticas de la escuela secundaria son como escribir un bucle for para recitar la letra de 99 Bottles of Beer On The Wall. Calc2 no es como ser lo suficientemente bueno como para programar Photoshop.

De todos modos, nada es fácil. Sea lo que sea que quieras, tienes que trabajar para lograrlo. Es posible que tengas que trabajar solo para descubrir lo que no quieres. Es fácil sentirse abrumado y agotado incluso antes de comenzar, pero espero que tenga buena suerte dejando eso de lado y averiguando dónde está parado y hacia dónde puede avanzar. Eso podría significar programación, o podría ser algo más que se superponga un poco con la programación y / o las matemáticas.

Hay tres requisitos esenciales para mejorar su programación:

  1. Programe tanto como pueda.
  2. Lee los programas de otras personas.
  3. Nunca estés satisfecho.

Programación de recompensas de práctica. Entonces practica. El mejor tipo de práctica que obtendrá es escribiendo los programas que desea escribir. Por ejemplo, al principio de mis estudios, estaba usando un sistema de tiempo compartido cuyo editor de texto odiaba. Entonces, escribí mi propio editor de texto basado en uno que había usado en un sistema diferente. Me obligó a aprender muchas cosas que no había tenido en las clases, como lidiar con un sistema de archivos, almacenar en caché (ya que la memoria del programa en el sistema estaba limitada a 16 kb, sí, soy tan viejo) y construir un IU fácil de usar. Era mucho más complejo que cualquiera de las tareas que me habían asignado hasta ese momento. Lo escribí, pero lo más importante, lo reescribí en su totalidad o en parte, muchas veces. No estaba satisfecho con solo hacerlo funcionar. Quería que fuera una obra de arte. Busqué formas de simplificar cosas que parecían complejas o torpes. Lo refactorice. Cada vez que tenía una idea para agregarle algo más, lo hacía. Otras personas en la escuela comenzaron a usar mi editor y me dieron sus comentarios. De hecho, las personas en otras escuelas comenzaron a usar el editor y me dieron retroalimentación. Tomaría todos los comentarios y críticas y los usaría para mejorar el programa. A medida que aprendía cosas nuevas en las clases, las aplicaría a ese programa. Aprendí más sobre programación escribiendo y manteniendo ese proyecto personal en el transcurso de tres años de lo que aprendí haciendo cualquier tarea de clase.

Leer otros programas también fue clave en mi desarrollo como programador. Vería los programas del sistema en ese sistema de tiempo compartido y vería cómo se estructuraron. Compararía el código que había escrito con un código similar que encontré en los programas del sistema. Aprendí formas de hacer que el código sea más eficiente. Aprendí trucos que usaban los programadores profesionales.

En esencia, simplemente no estaría satisfecho de que los programas que estaba escribiendo para mí fueran lo suficientemente buenos. Quería que fueran perfectos. Entonces, busqué estándares para medirlos y me apegaría a esos estándares. Es un lujo que no obtienes en el lugar de trabajo. Y ciertamente uno que no tienes cuando haces tareas de clase en una fecha límite. Debes estar motivado y darte el lujo de ir más allá de lo que requieren tus clases ahora mientras tienes tiempo. No obtendrá ese lujo una vez que sea un profesional que produce código hasta la fecha límite.

A2A. ¿Eres bueno en las pruebas? Porque un programa es una prueba ejecutada por una computadora, lo que requiere práctica y disciplina.

Cuando dices que eres bueno en matemáticas, ¿de qué estás hablando? Los matemáticos discretos (matemática para informática) suelen ser un requisito para un CS menor. En Stanford, los cursos que cubren este material son CS 103 y CS 109, consulte Autoestudio para los cursos de la Fundación MSCS de Stanford.

Trabajé con muchos Quants durante varios años, personas de modelos de matemática de banca comercial, y cada uno de ellos escribió un código terriblemente malo.

Finalmente descubrí cuál era el problema.

En matemáticas, el entrenamiento es reduccionismo: se reducen los términos de la ecuación a su expresión más simple posible, eliminando toda redundancia. Esto se perfora una y otra vez, hasta que simplemente no puede evitarlo: si ve algo que huele a redundancia, las personas capacitadas en matemáticas tienen una compulsión abrumadora por eliminarlo.

Esta fijación para eliminar la complejidad y la redundancia es una forma desastrosa de abordar la codificación.

Alguna “redundancia” (punteros inteligentes que protegen los punteros en bruto, separación de funciones y datos, capacidad de prueba, jerarquía de clases) es esencial para escribir código de alta calidad.

Claro, no desea que el código haga cosas que son innecesarias, pero al mismo tiempo, a veces es mejor hacer las cosas de una manera más compleja, cuando esa complejidad adicional ayuda a protegerlo de cometer errores.

Tuve una larga conversación con los Quants sobre esta idea: estuvieron de acuerdo en que tenía razón, pero no pudieron evitarlo, seguían eliminando todas las características de seguridad, cada vez que intentaban codificar, porque la obligación de eliminar la “redundancia” era Demasiado fuerte para resistir.

re: Programación matemática

Esto puede ser una ventaja para usted, ya que las tendencias actuales (finalmente) se están moviendo hacia la programación funcional. Debido a los límites del procesador individual en la ley de Moore, la dirección de la informática se está moviendo hacia sistemas y concurrencia masivamente paralelos, que se manejan mucho mejor en lenguajes de programación funcional (FP).

Mire a Haskell, que es un lenguaje de programación que ahora está creciendo en popularidad, a pesar de que sus fundamentos están arraigados en las primeras ciencias de la computación. Mientras Turing presentaba sus teorías computacionales, Church estaba desarrollando lo que ahora llamamos cálculo Lambda, una forma algebraica de resolver problemas de programación. Esto evolucionó a una programación funcional, tal como es compatible con Haskell y varios otros lenguajes similares.

Si tiene una inclinación matemática, encontrará que FP está mucho más en línea con sus procesos de pensamiento. Los lenguajes imperativos se basan en soluciones paso a paso, mientras que los lenguajes FP usan código que se ve y actúa como álgebra.

Los desarrolladores experimentados a menudo tienen problemas con la programación funcional porque piensan de manera gradual, no matemáticamente. Sin embargo, muchos de los proyectos de TI más nuevos se están construyendo con lenguajes FP como Scala, Erlang, OCaml y Haskell. Esto es especialmente cierto para el aprendizaje automático y otras ramas de la IA.

De hecho, los lenguajes puros de FP como Haskell no tienen la capacidad de realizar soluciones paso a paso y todo tiene que especificarse en términos de tales funciones “algebraicas”.

http://www.haskell.org

Buena suerte.

Aprendo código básico de video en youtube para principiantes, y código como un loro, después de eso me desafío con un algoritmo complejo (de fácil a difícil).

Una cosa más, debe ser paciente para aprender el código, corregir errores y mejorará su programación.

Bueno, siempre repito esta sugerencia. Aprende un buen lenguaje FP. Vaya a Acerca de – Proyecto Euler y esos problemas uno por uno, tal vez cien o dos. Y después de eso serás una persona diferente.

Además, dado que afirma ser bueno en matemáticas, asegúrese de que la teoría de categorías esté en su cartera. Lo necesitarás también en matemáticas.

¿Cómo sabe que pobre es lo que ha hecho y con quién se compara y cuánto de esos 1.5 años realmente ha pasado escribiendo código para proyectos o tratando de encontrar mejores formas de hacer las cosas si pasa la mayor parte de ese tiempo aprendiendo y divirtiéndose? Llegó muy lejos, entonces puede ser la forma en que ha estado aprendiendo o la falta de proyectos.

También descubrí que hasta ahora he usado poco o nada de matemáticas más allá de algunos de los conceptos básicos. Sin embargo, se necesita el mismo tipo de resolución de problemas, por lo que si eres bueno en matemáticas es un buen indicador.

Utilicé la teoría de la información para sugerirme a mí mismo que ordene lo contrario si las declaraciones de la mayoría a las menos utilizadas para la entrada de un cuadro de número que hice. pero el rendimiento no es un problema para ese proyecto en este momento, así que simplemente me ignoré. Creo que en grandes proyectos de colaboración se usarán más matemáticas en parte, ya que optimizar el rendimiento sería mucho más importante. no tiene sentido complicar algo si no hay un beneficio adicional real.

Es un problema muy común de un joven inteligente, que siempre pensó que la programación es una cuestión de cuán inteligente eres.

La máquina es un humano tonto pero calcula muy rápido. No tienen sentido de crisis, problemas o incluso ningún sentido de ser útiles.

Solo sea paciente, trate de avanzar un poco más lento de lo que es ahora, y todo está a su alcance ahora. Dale otra oportunidad, ten paciencia y mantén la pasión.

Buena suerte ..