examples - algorithms book
Resolución de problemas/Algorithm Skill es una habilidad especial o se puede desarrollar con la práctica? (8)
Cada vez que comienzo un problema difícil y si no puedo encontrar la solución exacta o no puedo comenzar, entro en esta discusión interminable conmigo mismo, como se muestra a continuación:
Que las habilidades de resolución de problemas / matemáticas / algoritmos están dotadas (no es que puedas aprender practicando, por práctica, solo dominas el tipo de problemas que ya has resuelto antes)
solo aquellos que fueron a buenas escuelas pueden hacerlo, ya que lo aprendieron temprano.
¿Cuáles son sus pensamientos? ¿Puede uno alcanzar la maravilla en la resolución de problemas / algoritmos simplemente por el trabajo duro o necesita tener ese gen extra en usted?
El trabajo duro supera al talento si el talento no funciona duro. Esta afirmación anterior define cuál es el verdadero potencial de la persistencia. Cualquier habilidad en este mundo puede desarrollarse mediante la práctica. Este proceso es análogo a clavar un clavo en la pared. No solo requiere la magnitud correcta sino también la dirección adecuada.
1) No trates de resolver el problema en su abstracción más general.
2) Elija el momento adecuado cuando su mente está trabajando al máximo.
Obtuve el primer punto como un consejo de un instructor de matemáticas. ¡Funciona! intenta hacer diferentes ejemplos y escenarios del problema. Esto ayuda mucho a identificar los casos extremos que son los más difíciles de entender en la mayoría de los problemas.
Mi tiempo favorito para resolver este tipo de problemas es el amanecer (4-6 AM). Duerma bien la noche anterior y despierta listo para resolver el problema. El silencio es tu amigo
Creo que algunas personas tienen inteligencia extra que otras, pero no es el factor más importante. Es la forma en que utiliza esta inteligencia para resolver el problema.
Ha habido muchos ejemplos de personas que tienen un talento extraordinario con un éxito mínimo. Usted ve ejemplos de este tipo en deportes, política, negocios y también en general a su alrededor. Entonces, siento que después de cierto límite, el talento es una virtud sin sentido. Es sobre todo la palabra dura que te recompensa con mayor éxito. Si sigues al cricket, here hay un enlace con buen ejemplo. Siento que el mismo principio se aplica al algoritmo y la resolución de problemas. Hace un año que uso para resolver problemas algorítmicos y solía encontrarme completamente perdido. Un año invertido en la lectura de libros algorítmicos, la resolución de sus ejercicios y la práctica de algunos problemas de programación, confío en que ahora puedo resolver la mayoría de los problemas (todavía tengo un largo camino por recorrer para hacerme eficiente). Pero el punto es que el trabajo inteligente es suficiente para desarrollar esta habilidad para resolver problemas.
Para mí, creo que es un poco talentoso, pero mucho más importante es la experiencia y la práctica. Si conoce muchos problemas y las mejores soluciones para ellos, puede encontrar más fácilmente una solución a un nuevo problema.
Ejemplo de mi propio pasado: Hubo algún concurso de programación (bueno para entrenamiento, por cierto) y no encontré una buena solución. El ganador resolvió el problema principalmente usando un KD-Tree. Para llegar a esto, primero necesita saber qué es, en este caso, un KD-Tree y dónde es útil. Hoy, esto es claro para mí y si me encuentro con un problema similar nuevamente, podré resolverlo muy rápido.
Para responder a la pregunta, primero debemos encontrar los ingredientes para la capacidad de resolver un problema.
Hay un llamado talento natural. Este es el talento con el que naces. Esto predetermina tu potencial. Las personas nacidas con más materia gris tenderán a desempeñarse mejor que las personas con quienes la naturaleza era menos generosa. Esto significa que una persona con mejor talento tiene una mayor probabilidad de desempeñarse mejor que una persona que no tiene tanto talento si tiene los mismos parámetros (educación, personalidad, resistencia al estrés, fuerza de voluntad). Si uno observa que tiende a consumir un gran momento para absorber nueva información hasta que pueda aplicarla, entonces la decisión más sabia para la persona es dejar la programación y evitar una vida llena de frustración. Naturalmente, no se puede esperar que un principiante sea capaz de comprender al instante el fenómeno más complejo, pero si un principiante es demasiado lento para entender conceptos de principiante, entonces la programación no es su taza de té.
Talento desarrollado Uno tiene un talento natural, pero eso es, en sí mismo no es suficiente para resolver problemas. Nunca he visto recién nacidos escribiendo código. Uno tiene que obtener algo de educación. Cuanto antes mejor. Además, la calidad de la escuela es de gran importancia. Nunca deberíamos negar el hecho de que una persona que no tuvo la oportunidad de aprender programación en una buena escuela temprano, entonces él o ella tiene una discapacidad en la carrera por el éxito. Sin embargo, si alguien falla temprano en las buenas escuelas, entonces el impedimento se puede cubrir con trabajo duro. Por ejemplo, mi esposa tenía una educación en otro campo, pero después de terminar la universidad, no encontró trabajos adecuados. Entonces comencé a educarla. Después de un mes, aprendió a aprender y pudo resolver casi todos los problemas que se le presentaron, pero aún no era efectiva. Poco a poco comenzó a aprender de forma autodidacta. Después de un año ella ya era una codificadora profesional. Ella no tiene un papel de una escuela que pueda codificar, pero está haciendo un trabajo fantástico. Entonces, ella perdió la educación temprana, pero luego fue capaz de neutralizar la discapacidad. El talento desarrollado se puede describir como el conjunto de información aprendida y conocida, junto con la actitud correcta, el enfoque científico para nuevos tipos de desafíos.
Práctica: la práctica es buena para aumentar el nivel de talento desarrollado, sin embargo, NO DEBE ser la única fuente de desarrollo de talento. Junto con la práctica, los horizontes teóricos deben expandirse regularmente.
Estrategia de trabajo: uno puede ser extremadamente talentoso, puede tener un montón de conocimiento. Si él o ella no tiene una estrategia de trabajo correcta, entonces él o ella tiene una discapacidad. Cada vez que se da una nueva tarea, se deben hacer las preguntas correctas:
- ¿Cuál fue la tarea más cercana a esta? ¿Puedo reutilizar mi solución en cierta medida?
- ¿Qué debo aprender para poder resolver este problema?
- ¿Cómo puedo escribir un código claro y eficiente para resolver el problema?
Entonces la respuesta es: si bien es bueno tener una educación excelente tan pronto como sea posible, no es necesario. No olvides que la vida es la mejor escuela y puedes recuperar la oportunidad perdida más adelante si tienes talento, fuerza de voluntad y fuente de información. La práctica no solo te muestra los pasos correctos para resolver un problema, sino que también amplía tus horizontes. Por ejemplo, si uno entiende los sistemas numéricos, entonces él o ella podrá entender una variedad de cosas más tarde, como colores en CSS, PSD o desbordamientos numéricos. Si uno aprende cómo codificar en Java, entonces él o ella entenderá C # muy rápidamente. Por lo tanto, la práctica es brindarle conocimiento sobre la solución para un tipo de problema dado, pero también le brinda nuevos conocimientos teóricos que le serán útiles en diversas áreas. La habilidad central que uno tiene que desarrollar es la capacidad de aprender rápidamente.
Pasé gran parte de mi vida preguntándome si el talento era algo que desarrollaste o algo con lo que naciste. Entonces se me ocurrió que la respuesta era irrelevante, al menos si desea lograr las cosas usted mismo. Incluso si tienes talento, solo te ayudará si actúas como si el talento solo proviniera de la práctica, porque trabajarás mucho más.
Con respecto a los algoritmos, así como a cualquier otra habilidad realmente difícil, se necesita práctica para obtener buenos resultados. Ya sea que tengas o no que tener algo de talento también, no lo sé. Sin embargo, sí sé con certeza que la gente ha realizado grandes mejoras en competiciones como TopCoder al practicar. Yo mismo he aprendido mucho de eso.
Si configura un programa de entrenamiento sistemático, estará muy por delante del paquete, incluso si no es perfecto. Ya escribí unos cientos de programas en TopCoder y esto ha afectado mi pensamiento de una manera profunda. Aprendí muchas cosas que solo podían aprender al hacerlas mal y luego arreglar mi error. Un amigo mío ha escrito varios miles de programas en TopCoder y es mucho mejor que yo, a pesar de que sus estadísticas empeoraban cuando él comenzaba. Eso no es una coincidencia
EDITAR:
Acabo de encontrar esta respuesta en math.stackexchange. Creo que es una de las mejores explicaciones de cómo aprender algoritmos que he leído, a pesar de que escribe sobre ajedrez y matemáticas.
Tomé clases de magia en un ambiente grupal cuando tenía doce años. El nombre del mago era Joe Carota. Hizo un truco de magia una vez y yo espeté: "¿Cómo hiciste eso?" Dijo algo ese día que me ha acompañado desde entonces.
La respuesta de Joe fue: "Michael, si realmente quieres saber cómo se hace ese truco debes descubrir cómo lo harías tú mismo".
Bueno, por supuesto, eso no es lo que quería escuchar, pero mi mente se centró en la resolución de problemas. Esta era la resolución de problemas desde mi perspectiva. Si mi primer intento de resolver el problema tomó diecisiete pasos y fue realmente tonto, la buena noticia fue que resolví el problema.
Luego, al analizar la solución que había desarrollado y buscar nuevas formas de refinar esa solución, aprendería a optimizar el resultado final. Más adelante, en la vida de programación de mi computadora, descubrí que este proceso se llamaba "Refinamiento por pasos".
Funcionó en 1971 y todavía funciona hoy.
El talento es barato e inútil sin trabajo duro. El talento solo puede llevarte hasta cierto punto, pero con el trabajo duro y la práctica, cualquiera puede alcanzar grandes alturas
- Josh Waitzkin, 8 veces campeón nacional de ajedrez, 13 veces nacional y 2 veces campeón del mundo
Él mismo dice esto en su voz en Chessmaster Grandmaster Edition