Cómo pensar como un programador, lecciones para resolver problemas
Primero agradecer al escritor del post original en inglés por compartir está valiosa información, pueden ver más de su contenido siguiendo en Medium a Richard Reis
Si usted 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 te preguntaste qué significa, exactamente, pensar como un programador. ¿Y cómo lo haces?
Esencialmente, se trata de una manera más efectiva de resolver problemas.
En este post, mi objetivo es enseñarte de esa manera.
Al final, sabrá exactamente qué pasos debe seguir para resolver mejor los problemas.
¿Por qué es importante?
La resolución de problemas es la meta-habilidad.
Todos tenemos problemas. Grandes y pequeños. La forma en que tratamos con ellos es a veces, bueno... bastante aleatoria.
A menos que tengas un sistema, probablemente así es como "resuelves" los problemas (que es lo que hice cuando empecé a codificar):
Pruebe una solución.
Si eso no funciona, pruebe con otro.
Si eso no funciona, repita el paso 2 hasta que tenga suerte.
Mira, a veces tienes suerte. Pero esa es la peor manera de resolver problemas! Y es una enorme, enorme pérdida de tiempo.
La mejor manera es a) tener un marco y b) practicarlo.
"Casi todos los empleadores priorizan las habilidades de resolución de problemas primero.
Las habilidades para resolver problemas son casi unánimemente la cualificación más importante que buscan los empleadores....más que el dominio de los lenguajes de programación, la depuración y el diseño de sistemas.
Demostrar el pensamiento computacional o la capacidad de descomponer problemas grandes y complejos es tan valioso (si no más) que las habilidades técnicas básicas requeridas para un trabajo". - Rango de Hacker (2018 Developer Skills Report)
Tener un marco
Para encontrar el marco adecuado, seguí el consejo del libro de Tim Ferriss sobre el aprendizaje, "The 4-Hour Chef".
Me llevó a entrevistar a dos personas realmente impresionantes: C. Jordan Ball (1er o 2do 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 adivina qué? Sus respuestas fueron bastante similares!
Pronto, tú también los conocerás.
Nota: esto no significa que ellos hicieron todo de la misma manera. Cada persona es diferente. Serás diferente. Pero si empiezas con principios que todos estamos de acuerdo en que son buenos, llegarás mucho más lejos y más rápido.
"El mayor error que veo que cometen los nuevos programadores es enfocarse en aprender sintaxis en lugar de aprender a resolver problemas." - V. Anton Spraul
Entonces, ¿qué debe hacer cuando encuentre un nuevo problema?
Aquí están los pasos:
1. Entender
Sepa exactamente lo que se le está preguntando. La mayoría de los problemas difíciles son difíciles porque no los entiendes (de ahí que este sea el primer paso).
¿Cómo saber cuándo se entiende un problema? Cuando puedas explicarlo en un lenguaje sencillo.
¿Recuerdas haber estado atascado en un problema, empiezas a explicarlo, e instantáneamente ves agujeros en la lógica que no habías visto antes?
La mayoría de los programadores conocen esta sensación.
Es por eso que debes escribir tu problema, garabatear un diagrama o contárselo a alguien más (o algo.... algunas personas usan un pato de goma).
"Si no puedes explicar algo en términos simples, no lo entiendes." - Richard Feynman
2. Planificar
No se zambulle en la solución sin un plan (y de alguna manera espere que pueda salir adelante). Planifique su solución!
Nada puede ayudarte si no puedes escribir los pasos exactos.
En la programación, esto significa no empezar a hackear de inmediato. Déle tiempo a su cerebro para analizar el problema y procesar la información.
Para obtener un buen plan, responda a esta pregunta:
"Dada la entrada X, ¿cuáles son los pasos necesarios para devolver la salida Y?"
Nota: Los programadores tienen una gran herramienta para ayudarles con esto... ¡Comentarios!
3. Divide
Presta atención. Este es el paso más importante de todos.
No intente resolver un gran problema. Llorarás.
En su lugar, divídalo en subproblemas. Estos subproblemas son mucho más fáciles de resolver.
Luego, resuelva cada subproblema uno por uno. Empieza con la más simple. Más simple significa que usted sabe la respuesta (o está más cerca de esa respuesta).
Después de eso, el más simple significa que este subproblema que se está resolviendo no depende de que se resuelvan otros.
Una vez resuelto cada sub-problema, conecta los puntos.
La conexión de todas sus "sub-soluciones" le dará la solución al problema original. Felicitaciones!
Esta técnica es la piedra angular de la resolución de problemas. Recuérdelo (lea este paso de nuevo, si es necesario).
"Si pudiera enseñar a cada programador principiante una habilidad para resolver problemas, sería la técnica de 'reducir el problema' ".
Por ejemplo, suponga que usted es un nuevo programador y se le pide que escriba un programa que lee diez números y calcula cuál es el tercer número más alto. Para un programador nuevo, puede ser una tarea difícil, aunque sólo requiera una sintaxis de programación básica.
Si estás atascado, deberías reducir el problema a algo más simple. En lugar del tercer número más alto, ¿qué tal si encontramos el más alto en general? ¿Sigues siendo demasiado duro? ¿Qué hay de encontrar el más grande de sólo tres números? ¿O la más grande de las dos?
Reduzca el problema hasta el punto en que sepa cómo resolverlo y escriba la solución. Luego, expanda el problema ligeramente y reescriba la solución para que coincida, y continúe hasta que vuelva al punto de partida". - V. Anton Spraul
4. ¿Atascado?
A estas alturas, es probable que estés sentado pensando: "Hey Richard.... Eso es genial y todo, pero ¿y si estoy atascado y no puedo resolver un subproblema?"
Primero, respira hondo. Segundo, es justo.
Pero no te preocupes, amigo. Esto le pasa a todo el mundo!
La diferencia es que los mejores programadores/resolvedores de problemas tienen más curiosidad por los errores que por los errores.
De hecho, aquí hay tres cosas para intentar cuando se enfrenta a un golpe:
Depurar: Vaya paso a paso a través de su solución tratando de encontrar dónde se equivocó. 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 dijiste a tu programa que hiciera en lugar de lo que pensabas que le dijiste que hiciera". - Andrew Singer
Reevaluar: Da un paso atrás. Mire el problema desde otra perspectiva. ¿Hay algo que se pueda resumir en un enfoque más general?
"A veces nos perdemos tanto en los detalles de un problema que pasamos por alto 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 números enteros consecutivos, 1 + 2 + 3 +... + n, que un Gauss muy joven reconoció rápidamente fue simplemente n(n+1)/2, evitando así el esfuerzo de tener que hacer la suma". - C. Jordan Ball
Nota: Otra manera de reevaluar es empezar de nuevo. Borrar todo y empezar de nuevo con nuevos ojos. Lo digo en serio. Te sorprenderás de lo efectivo que es esto.
Investigación: Ahh, el bueno de Google. Lo has leído bien. No importa el problema que tengas, alguien probablemente lo ha resuelto. Encuentra a esa persona/ solución. De hecho, ¡hágalo aunque haya resuelto el problema! (Puedes aprender mucho de las soluciones de otras personas).
Advertencia: No busque una solución al gran problema. Sólo busque soluciones a los subproblemas. Por qué? Porque a menos que te esfuerces (aunque sea un poquito), no aprenderás nada. Si no aprendes nada, pierdes el tiempo.
Práctica
No esperes ser genial después de sólo una semana. Si quieres ser un buen solucionador de problemas, ¡resuelve un montón de problemas!
Práctica. Práctica. Práctica. Sólo será cuestión de tiempo antes de que reconozcas que "este problema podría resolverse fácilmente con <insertar el concepto aquí>".
¿Cómo practicar? ¡Hay opciones fuera del wazoo!
Puzzles de ajedrez, problemas matemáticos, Sudoku, Go, Monopoly, videojuegos, cryptokitties, bla.... bla... bla.... bla.....
De hecho, un patrón común entre las personas exitosas es su hábito de practicar la "micro resolución de problemas". Por ejemplo, Peter Thiel juega al ajedrez, y Elon Musk juega a videojuegos.
Byron Reeves dijo: "Si quieres ver cómo será el liderazgo empresarial dentro de tres a cinco años, mira lo que está pasando en los juegos online".
Adelántalo hasta el día de 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 2017)
¿Significa esto que sólo debes jugar videojuegos? No, en absoluto.
¿Pero de qué se tratan los videojuegos? Así es, ¡resolver problemas!
Así que, lo que debes hacer es encontrar una salida para practicar. Algo que te permita resolver muchos microproblemas (idealmente, algo que te guste).
Por ejemplo, me gusta codificar desafíos. Todos los días, intento resolver al menos un reto (normalmente 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 sabes que la resolución de problemas es una habilidad increíble para cultivar (la meta-habilidad).
Como si eso no fuera suficiente, note cómo usted también sabe qué hacer para practicar sus habilidades de resolución de problemas.
Uf.... Bastante bien, ¿verdad?
Por último, deseo que se enfrenten a muchos problemas.
Lo has leído bien. Al menos ahora sabes cómo resolverlos! (además, aprenderás que con cada solución, mejoras).
"Justo cuando piensas que has navegado con éxito por un obstáculo, surge otro. Pero eso es lo que mantiene la vida interesante.
La vida es un proceso de romper con estos impedimentos - una serie de líneas fortificadas 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 queda eres tú: la mejor versión de ti." - Ryan Holiday (El obstáculo es el camino)
¡Ahora, ve a resolver algunos problemas!
Y la mejor de las suertes 🙂
Un agradecimiento especial a C. Jordan Ball y V. Anton Spraul. Todos los buenos consejos vinieron de ellos.
Además, todos los conocimientos de programación que he adquirido en tan poco tiempo no habrían sido posibles sin Lambda School. No puedo agradecerles/ recomendarles lo suficiente.
Gracias por leer! 😊 Si lo disfrutaste, 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.