Resolución de problemas: cómo mejorar

resolucion de problemas

Resolución de problemas: Cómo mejorar su programación


A la mayoría de nosotros se nos ha dado el mismo consejo: para ser un mejor solucionador de problemas, es necesario hacer más y más resolución de problemas. Pero este consejo es demasiado simplista. Ser bueno en cualquier cosa requiere más que solo repeticiones. También es cómo lo hace.

Además, cuando los programadores escuchan el consejo de “resolver más problemas”, a menudo piensan que “más” significa más rápido. Es un error que se comete a menudo al empezar.

La ‘cinta de correr’ para resolver problemas puede ser perjudicial para el aprendizaje y la mejora. Al principio sentirá la necesidad de acelerar un problema y pasar al siguiente. Pero la realidad de ese enfoque pronto se impondrá. Al centrarse en la cantidad, comprometerá la calidad y perderá aprendizajes clave en el camino.

No quiere decir que la repetición no importe; lo hace. Sin embargo, la repetición por sí sola no llega al meollo del asunto. El proceso lo hace.

Tengo un gran interés en este tema: quiero mejorar en la resolución de problemas para mejorar como programador. Así que aquí les ofrezco mi plan de ataque. Sin duda, se trata de repeticiones, y mucho más.

 

  1. Resuelva una variedad de problemas en una variedad de plataformas

“Estaba obsesionado con HackerRank cuando comencé a aprender a codificar”, dijo un instructor de un curso de Python que estaba tomando. Aunque está bien tener una plataforma favorita, no se limite a una sola. Este es el motivo: debe estar preparado para cualquier cosa.

Uno de los objetivos podría ser alternar sin problemas entre diferentes tipos de problemas y entre diferentes plataformas. Los problemas de Interview Cake son diferentes a los del libro de Reuven Lerner, Python Workout. Del mismo modo, encuentro que los enunciados del problema en el ejercicio semanal de Python de Lerner son diferentes de los de HackerRank.

Tengo mis preferencias, sin duda. Sin embargo, necesito poder resolver problemas de todo tipo. Por eso, estoy usando una variedad de plataformas y recursos para practicar.

Aquí hay unos ejemplos:

  • LeetCode
  • Rompiendo la entrevista de codificación por Gayle Laakmann McDowell
  • Ejercicio
  • Interview Cake
  • Entrenamiento de Python por Reuven Lerner
  • Ejercicio semanal de Python por Reuven Lerner

Elija un día para hacer su plan para la siguiente semana, seleccione algunos problemas de los recursos anteriores. Sea deliberado al respecto. Por ejemplo, elija un problema que se centre en la búsqueda binaria de LeetCode. Luego, uno que se enfoca en estructuras de datos de una de las fuentes de Reuven Lerner.

Esta práctica evitará que se sienta demasiado cómodo. No confe en la misma estructura o técnica de datos. Necesita poder elegir la mejor herramienta para el trabajo. Tiene que poder pivotar.

También tome un desafío. Seleccione problemas que le empujen al borde de sus límites, una característica de lo que el psicólogo Anders Ericsson llama “práctica deliberada”.

La práctica deliberada tiene que ver con el desarrollo de habilidades. Es un esfuerzo consciente y totalmente enfocado que lo saca de su “zona de confort”, se centra en un objetivo específico y “exige un esfuerzo casi máximo”, explica Ericsson en su excelente libro, Peak.

En otras palabras, no estás haciendo algo que le resulte fácil o natural. “El sello de. . . La práctica deliberada ”, escribe Ericsson,“ es que intentas hacer algo que no puedes hacer ”.

 

  1. Entrene en forma cruzada su cerebro de programación

A menudo se escucha sobre atletas que incorporan el entrenamiento cruzado en su rutina. Por ejemplo, un corredor completa uno o dos ejercicios en bicicleta cada semana. Tiene mucho sentido: mediante el entrenamiento cruzado, los atletas impulsan su aptitud cardiovascular desde un ángulo diferente.

La formación cruzada para programadores es un tema sobre el que he escrito antes. Sin embargo, es necesario decir más sobre los beneficios de este enfoque. Al igual que un atleta hace entrenamientos cruzados para mejorar su aptitud cardiovascular, estoy incorporando el entrenamiento cruzado para mejorar mi aptitud mental.

Un entrenamiento cruzado implica resolver problemas matemáticos. Aplicar las mismas tácticas que usaría para resolver un problema de programación pero en matemáticas. Mismo proceso, contexto diferente.

Hay un libro de matemáticas a tener en cuenta: El arte de la resolución de problemas. Sí, proporciona los beneficios de entrenamiento cruzado mencionados anteriormente. Pero hace algo más: ayuda a desarrollar la intuición para resolver problemas.

Ese es un punto importante. No se trata de memorizar una ecuación o un proceso matemático, sino saber intuitivamente cuándo usarlo. Lo mismo ocurre cuando se resuelven problemas de programación.

 

  1. Aprenda de sus soluciones

Todos nos atascamos y todos cometemos errores al resolver problemas. Usamos estas fallas para ayudarnos a descubrir qué hacer de manera diferente.

A menudo, ahí es donde se detiene el aprendizaje. Una vez que hayamos resuelto el problema, estamos ansiosos por seguir adelante. Pero no lo hagas.

El matemático Richard Hamming sugiere que es entonces cuando debería comenzar el aprendizaje.

“Considero que el estudio de los éxitos es básicamente más importante que el estudio de los fracasos … hay tantas formas de equivocarse y tan pocas de tener razón, estudiar los éxitos es más eficiente”, escribe Hamming en su libro, The Art of Doing Science and Engineering (El arte de hacer Ciencia e Ingeniería).

Esta idea de “mirar atrás” y estudiar sus éxitos es un tema sobre el que he leído anteriormente y vale la pena señalarlo nuevamente. Siempre escuchamos sobre cómo debemos “aprender de nuestros fracasos”. Pero Hamming tiene razón: hay mucho que aprender de nuestros éxitos.

Así que uno de los mayores cambios que podría realizar en su proceso de resolución de problemas es poner en práctica las palabras de Hamming. Por ejemplo: resolver un problema que involucra una lista enlazada, una estructura de datos que sea nueva para usted en ese momento. Después de resolver el problema, estúdielo con atención. Copie su solución en un archivo de Google Doc y use comentarios para explicarse a sí mismo el código.

Con esto la intención es que se asegure de entender claramente qué hizo y por qué por esta razón fundamental: para que pueda hacerlo de nuevo.

 

  1. Obtenga comentarios

La conciencia puede ser una maestra maravillosa.

No asuma que sus soluciones son excelentes. Descúbralo por sí mismo recibiendo comentarios. La retroalimentación es un factor crítico cuando se trata de mejorar. También es un componente de la práctica deliberada.

Hay dos formas de obtener comentarios.

Primero, después de completar un problema, estudie las soluciones de otros. A veces, los recursos, como LeetCode y Cracking the Coding Interview, brindan la solución. Otras veces podrá encontrar la solución de un programador que ha resuelto el mismo problema. A veces sirve hacer ambos.

De cualquier manera, el siguiente paso es el mismo: comience desde la parte superior de la solución y explique cada línea con sus propias palabras. Especule por qué el programador eligió esta estructura de datos en particular, por ejemplo. Luego, escriba un breve resumen del programa para solidificar los conceptos centrales o los nuevos enfoques que acabo de conocer.

Poner algo complicado, como una línea de código, en sus propias palabras es una gran prueba para ver si realmente lo entiendes. Además, puedes practicar otra habilidad fundamental: leer código.

Si hay algo nuevo para mí, lo investigo. Comparo su código con el mío. Yo estudio. Yo evalúo. Aprendo. Es un proceso arduo, pero obtengo mucho de él.

La segunda forma de obtener retroalimentación es simplemente pedirla a otro programador. Las videollamadas son útiles para recorrer el código línea por línea en tiempo real. Aunque, las solicitudes de extracción también son útiles.

Hay un punto en los comentarios: ¡aplíquelos! Ponga en práctica sus aprendizajes.

 

  1. Sea consistente

Ahora hablemos de repetición. La resolución de problemas es una habilidad. Como cualquier habilidad, lleva tiempo desarrollarla. Simplemente no sucede de la noche a la mañana o durante un fin de semana. Es por eso que dedico tiempo todos los días a la resolución de problemas.

Hay una reacción común a esta práctica diaria: “Hay mucho que aprender. No puedo perder tiempo todos los días resolviendo problemas “.

Mi respuesta es doble. Primero, siempre habrá algo más que aprender, siempre.

En segundo lugar, la programación consiste en gran parte en la resolución de problemas. Es fundamental para nuestro oficio. Es digno de su tiempo y atención todos los días. Aquí está la advertencia: haga que su práctica diaria sea intencional.

 

Es un arte

Mucha gente considera la resolución de problemas como un arte. Estoy de acuerdo con ese sentimiento. Lo mismo puede decirse del proceso en sí.

Las ideas descritas en este artículo son un enfoque para mejorar en la resolución de problemas. Su enfoque puede parecer muy diferente. El punto es éste: sea intencional en su práctica. La calidad importa; haz que cada problema cuente.