Cómo pensar como un programador: lecciones de resolución de problemas

Si está interesado en la programación, es posible que haya visto esta cita antes:

"Todos en este país deberían aprender a programar una computadora, porque te enseña a pensar". - Steve Jobs

Probablemente también se haya preguntado qué significa exactamente pensar como un programador. Y como lo haces

Esencialmente,se trata de una forma más eficaz de resolver problemas .

En esta publicación, mi objetivo es enseñarte de esa manera.

Al final, sabrá exactamente qué pasos tomar para ser un mejor solucionador de problemas.

¿Porque es esto importante?

La resolución de problemas es la meta-habilidad.

Todos tenemos problemas. Grande y pequeño. La forma en que nos ocupamos de ellos es a veces, bueno ... bastante aleatorio.

A menos que tenga un sistema, probablemente así es como "resuelve" los problemas (que es lo que hice cuando comencé a codificar):

  1. Prueba una solución.
  2. Si eso no funciona, pruebe con otro.
  3. Si eso no funciona, repita el paso 2 hasta que tenga suerte.

Mira, a veces tienes suerte. ¡Pero esa es la peor forma de resolver problemas! Y es una enorme, enorme pérdida de tiempo.

La mejor manera implica a) tener un marco yb) practicarlo.

“Casi todos los empleadores priorizan las habilidades de resolución de problemas primero. Las habilidades de resolución de problemas son casi unánimemente la calificación más importante que los empleadores buscan… más que el dominio de lenguajes de programación, la depuración y el diseño de sistemas. , los problemas complejos son tan valiosos (si no más) que las habilidades técnicas básicas necesarias para un trabajo ". - Hacker Rank (Informe de habilidades del desarrollador de 2018)

Tener un marco

Para encontrar el marco adecuado, seguí los consejos del libro de Tim Ferriss sobre el aprendizaje, “El chef de 4 horas”.

Me llevó a entrevistar a dos personas realmente impresionantes: C. Jordan Ball (clasificado en primer o segundo lugar entre más de 65.000 usuarios en Coderbyte) y V. Anton Spraul (autor del libro "Think Like a Programmer: An Introduction to Creative Problem Solving ”).

Les hice las mismas preguntas y ¿adivinen qué? ¡Sus respuestas fueron bastante similares!

Pronto, tú también los conocerás.

Nota al margen: esto no significa que hicieron todo de la misma manera. Todos son diferentes. Serás diferente. Pero si comienza con principios que todos estamos de acuerdo en que son buenos, llegará mucho más lejos mucho más rápido.

"El mayor error que veo que cometen los nuevos programadores es centrarse en aprender la sintaxis en lugar de aprender a resolver problemas". - V. Anton Spraul

Entonces, ¿qué debe hacer cuando se encuentra con un nuevo problema?

Estos son los pasos:

1. Comprender

Sepa exactamente lo que se le pregunta. La mayoría de los problemas difíciles son difíciles porque no los comprende (de ahí que este sea el primer paso).

¿Cómo saber cuándo comprende un problema? Cuando puedes explicarlo en un inglés sencillo.

¿Recuerda estar atrapado en un problema, comienza a explicarlo e instantáneamente ve agujeros en la lógica que no veía antes?

La mayoría de los programadores conocen este sentimiento.

Es por eso que debes escribir tu problema, dibujar un diagrama o contárselo a alguien más (o algo ... algunas personas usan un patito de goma).

"Si no puedes explicar algo en términos simples, no lo entiendes". - Richard Feynman

2. Planificar

No se sumerja directamente en la solución sin un plan (y de alguna manera espere que pueda salir adelante). ¡Planifica tu solución!

Nada puede ayudarte si no puedes escribir los pasos exactos.

En programación, esto significa que no empieces a piratear de inmediato. Dale tiempo a tu cerebro para analizar el problema y procesar la información.

Para tener un buen plan, responda esta pregunta:

"Dada la entrada X, ¿cuáles son los pasos necesarios para devolver la salida Y?"

Nota al margen: Los programadores tienen una gran herramienta para ayudarlos con esto ... ¡Comentarios!

3. Dividir

Presta atención. Este es el paso más importante de todos.

No intente resolver un gran problema. Llorarás.

En cambio, divídalo en subproblemas. Estos subproblemas son mucho más fáciles de resolver.

Luego, resuelve cada subproblema uno por uno. Empiece por lo más simple. Más simple significa que conoce la respuesta (o está más cerca de esa respuesta).

Después de eso, lo más simple significa que este subproblema que se resuelve no depende de que se resuelvan otros.

Una vez que haya resuelto todos los subproblemas, conecte los puntos.

Conectar todas sus "sub-soluciones" le dará la solución al problema original. ¡Felicidades!

Esta técnica es la piedra angular de la resolución de problemas. Recuérdalo (lee este paso nuevamente, si es necesario).

“Si pudiera enseñar a cada programador principiante una habilidad de resolución de problemas, sería la 'técnica de reducir el problema'. Por ejemplo, suponga que es un programador nuevo y le piden que escriba un programa que lea diez números y cifras de qué número es el tercero más alto. Para un programador nuevo, esa puede ser una tarea difícil, aunque solo requiere una sintaxis de programación básica. Si está atascado, debe reducir el problema a algo más simple. En lugar del tercer número más alto, ¿qué hay de encontrar el más alto en general? ¿Sigue siendo demasiado duro? ¿Qué hay de encontrar el mayor de solo tres números? ¿O el mayor de dos? Reduzca el problema hasta el punto en que sepa cómo resolverlo y escriba la solución. Luego expanda el problema un poco y reescriba la solución para que coincida, y continúe hasta que esté de vuelta donde comenzó ". - V. Anton Spraul

4. ¿Atascado?

A estas alturas, probablemente estés sentado allí pensando "Hola Richard ... Eso es genial y todo, pero ¿y si estoy atascado y ni siquiera puedo resolver un subproblema?"

En primer lugar, respire profundamente. Segundo, eso es justo.

Pero no te preocupes, amigo. ¡Esto le pasa a todos!

La diferencia es que los mejores programadores / solucionadores de problemas sienten más curiosidad por los bugs / errores que irritados.

De hecho, aquí hay tres cosas que puede probar cuando se enfrenta a un golpe:

  • Depurar: vaya paso a paso a través de su solución tratando de encontrar dónde salió mal. Los programadores llaman a esto depuración (de hecho, esto es todo lo que hace un depurador).
"El arte de depurar es averiguar lo que realmente le dijo a su programa que hiciera en lugar de lo que pensaba que le dijo que hiciera" ". Andrew Singer
  • Revalorar:Da un paso atrás. Mire el problema desde otra perspectiva. ¿Hay algo que pueda resumirse en un enfoque más general?
“A veces nos perdemos tanto en los detalles de un problema que pasamos por alto los principios generales que resolverían el problema a un nivel más general. […] El ejemplo clásico de esto, por supuesto, es la suma de una larga lista de enteros consecutivos, 1 + 2 + 3 +… + n, que un Gauss muy joven reconoció rápidamente que era simplemente n (n + 1) / 2 , evitando así el esfuerzo de tener que hacer la adición ". - C.Jordan Ball

Nota al margen: Otra forma de reevaluar es comenzar de nuevo. Elimina todo y comienza de nuevo con ojos frescos. Lo digo en serio. Te quedarás estupefacto de lo efectivo que es esto.

  • Investigación:Ahh, buen viejo Google. Has leído bien. No importa qué problema tenga, probablemente alguien lo haya resuelto. Encuentra esa persona / solución. De hecho, ¡haga esto incluso si resolvió el problema! (Puede aprender mucho de las soluciones de otras personas).

Advertencia: no busque una solución al gran problema. Busque solo soluciones a subproblemas. ¿Por qué? Porque a menos que luches (aunque sea un poco), no aprenderás nada. Si no aprende nada, pierde el tiempo.

Práctica

No espere ser grandioso después de solo una semana. Si quieres ser un buen solucionador de problemas, ¡resuelve muchos problemas!

Práctica. Práctica. Práctica. Solo será cuestión de tiempo antes de que reconozca que "este problema podría resolverse fácilmente".

Como practicar ¡Hay opciones fuera del wazoo!

Rompecabezas de ajedrez, problemas de matemáticas, Sudoku, Go, Monopoly, videojuegos, criptokitties, bla… bla… bla….

De hecho, un patrón común entre las personas exitosas es su hábito de practicar la "resolución de microproblemas". Por ejemplo, Peter Thiel juega al ajedrez y Elon Musk juega a los videojuegos.

“Byron Reeves dijo 'Si quieres ver cómo se verá el liderazgo empresarial en tres a cinco años, mira lo que está sucediendo en los juegos en línea'. Avanza rápidamente hasta hoy. Elon [Musk], Reid [Hoffman], Mark Zuckerberg y muchos otros dicen que los juegos han sido fundamentales para su éxito en la construcción de sus empresas ". - Mary Meeker (informe de tendencias de Internet de 2017)

¿Significa esto que solo deberías jugar videojuegos? De ningún modo.

Pero, ¿de qué se tratan los videojuegos? ¡Así es, resolución de problemas!

Entonces, lo que debes hacer es encontrar una salida para practicar. Algo que te permita resolver muchos microproblemas (idealmente, algo que disfrutes).

Por ejemplo, disfruto de los desafíos de codificación. Todos los días, trato de resolver al menos un desafío (generalmente en Coderbyte).

Como dije, todos los problemas comparten patrones similares.

Conclusión

¡Eso es todo amigos!

Ahora, sabes mejor lo que significa "pensar como un programador".

También sabe que la resolución de problemas es una habilidad increíble para cultivar (la meta-habilidad).

Como si eso no fuera suficiente, observe cómo también sabe qué hacer para practicar sus habilidades de resolución de problemas.

Uf ... Bastante bien, ¿verdad?

Finalmente, deseo que encuentres muchos problemas.

Has leído bien. ¡Al menos ahora sabes cómo solucionarlos! (Además, aprenderá que con cada solución, mejora).

“Justo cuando crees que has superado con éxito un obstáculo, surge otro. Pero eso es lo que mantiene la vida interesante. […] La vida es un proceso de romper estos impedimentos - una serie de líneas fuertes que debemos romper. Cada vez, aprenderás algo. Cada vez, desarrollarás fuerza, sabiduría , y perspectiva Cada vez, un poco más de la competencia desaparece. Hasta que todo lo que quede sea usted: la mejor versión de usted ". - Ryan Holiday (El obstáculo es el camino)

¡Ahora, ve a resolver algunos problemas!

¿Y mucha suerte?

Un agradecimiento especial a C. Jordan Ball y V. Anton Spraul. Todos los buenos consejos aquí vinieron de ellos.

¡Gracias por leer! Si te gustó, prueba cuántas veces puedes golpear en 5 segundos. Es un gran ejercicio cardiovascular para tus dedos Y ayudará a otras personas a ver la historia.