Cómo ser un gran programador

¿Qué distingue a los grandes programadores?

Como todos sabemos, los grandes programadores crean funciones, sitios web, aplicaciones y similares increíbles. Pero, ¿qué tienen en común?

En mi investigación, no se trata solo de conocer un idioma realmente bien o tener una formación educativa particular. Es que los programadores realmente talentosos han dominado los fundamentos. Esa base es lo que les permite construir grandes cosas y proponer ideas innovadoras.

Piense en una pirámide. Tiene una base grande, pero gradualmente se vuelve más pequeña y delgada hacia la parte superior. Aprender los fundamentos de la programación forma esa base. Todo despega a partir de ahí.

Entonces, ¿cuáles son esos fundamentos? Según mi experiencia y los programadores cuyos antecedentes he investigado, veo los fundamentos de la programación como un enfoque de dos partes.

Extraordinario en resolución de problemas

Primero, debe ser un solucionador de problemas eficaz. Este es un lugar importante para comenzar, ya que la programación es solución de problemas.

Aunque hay muchas formas de resolver un problema, hay algunas partes del proceso que me llaman la atención. Los programadores que también son grandes solucionadores de problemas destilan un problema hasta su esencia, con el fin de identificar su objetivo general y comenzar un problema con un propósito. Luego, dividen cada problema en partes pequeñas y manejables, atacando cada parte por turno y, a veces, en términos visuales, dibujando una imagen para convertirla en un “mundo real”.

El proceso es más difícil de lo que parece. Cuando comencé a programar, choqué contra una pared: como muchos otros, nunca aprendí a resolver problemas en la escuela; es una habilidad que no se enseña fácilmente. Me dieron un conjunto de problemas en la clase de matemáticas y simplemente me sumergí, que es lo que hice cuando comencé a programar. Como era de esperar, estaba haciendo girar mis ruedas innecesariamente y chocando con obstáculos en los problemas más simples.

Las cosas empezaron a cambiar cuando comencé a aprender sobre el proceso de resolución de problemas y cómo resolverlos de forma eficaz. Ahora comienzo un problema con intención. Tengo el libro de George Polya, How to Solve It , para agradecer ese pequeño consejo.

He adaptado algunas de las ideas de Polya a la programación, como comprender el problema. “El problema debe entenderse”, escribe Polya. Esto incluye poder “señalar las partes principales del problema, lo desconocido, los datos y la condición”. Para cada problema, saco una hoja de papel y escribo las respuestas a estas preguntas: ¿Qué estoy resolviendo o tratando de encontrar? (desconocido); que me dan (datos); y ¿qué limitaciones o detalles debo tener en cuenta? (condición).

Comprender el problema puede parecer obvio, pero lo obvio se pasa por alto fácilmente. En más de una ocasión, he invertido horas en un problema solo para darme cuenta mucho más tarde de que me perdí un pequeño pero crítico detalle en el planteamiento del problema. Escribir los detalles del problema me ralentiza mentalmente y me ayuda a pensar exactamente en lo que tengo que hacer, que es la mitad de la batalla.

A partir de ahí, hago un plan, que es otra de las sugerencias de Polya. Que tiene sentido. Escribo un esquema antes de escribir un artículo. Un artista hace un boceto de la pintura antes de trabajar en la pintura en sí. Un constructor usa dibujos y planos para construir una casa. No es diferente con la programación. En lugar de apresurarme a hacer , necesito comenzar pensando sobre lo que me propongo hacer y hacer un plan de ataque.

Hay muchas formas de hacerlo. A veces describo los pasos que debo seguir en orden numérico: primero haz esto, segundo haz aquello. Otras veces hago que el problema sea visual. Cuando estaba aprendiendo sobre los bucles for, saqué un puñado de almendras y recorrí físicamente la pila. Es un ejemplo tonto, pero me ayudó a pensar en el problema.

También haré dibujos o diagramas. Para un problema recursivo, dibujaré un diagrama de lo que sucede en cada llamada recursiva hasta que llegue al caso base. Casi siempre, sin embargo, encuentro una manera de simplificar el problema para hacerlo más manejable y ayudarme a detectar un patrón. Sobre todo, el objetivo para mí es abordar un problema con un propósito y mantener ese sentido en todo momento.

A pesar de los mejores planes, los problemas siguen siendo difíciles y sigo estancado. Convertirse en un gran solucionador de problemas lleva tiempo; es una habilidad en la que todavía estoy trabajando y definitivamente vale la pena el esfuerzo. Es una diferencia que puede ver.

Cuando leo código escrito por un gran solucionador de problemas, es limpio y fácil de entender. Las variables están bien nombradas. Las funciones son breves y nítidas. Cada línea de código tiene un propósito específico; se quita la pelusa. La claridad del código refleja el proceso de pensamiento del programador: puedo leer el programa de arriba a abajo y saber exactamente lo que está pasando. Eso es una gran solución de problemas, y eso es lo que estoy buscando.

¿Qué pasa con su computadora?

Aprender informática es el segundo aspecto fundamental de la programación. Recientemente comencé a aprender informática y me encanta porque me estoy moviendo más allá del nivel de la superficie. Voy “detrás de escena” para saber qué sucede cuando uso una función integrada, por ejemplo. También estoy aprendiendo sobre la memoria y el tiempo de ejecución, entre muchos otros temas. En resumen, estoy aprendiendo por qué una computadora hace las cosas que hace.

Conocer el “por qué” mejora mi conocimiento contextual y me convierte en un programador más informado. Como resultado, soy más reflexivo con el código que escribo. Ahora que sé un poco sobre el tiempo de ejecución, por ejemplo, optaré por usar una búsqueda binaria en lugar de recorrer cada elemento de una lista.

También está enriqueciendo mi comprensión de cómo funcionan los conceptos básicos de programación. Por ejemplo, estaba trabajando en un problema recurrente y no obtenía la solución que esperaba. Después de un examen detenido, supe por qué: tenía que ver con la ejecución de la pila de llamadas, una idea que se me habría escapado hace solo unos meses.

O toma clases. Luché inmensamente con las clases durante mucho tiempo y estaba aterrorizado de usar una. Sabía cómo escribir una clase, pero no estaba seguro de cuándo y por qué usaría una. Eso cambió cuando supe lo que realmente sucede en mi computadora cuando creo instancias y llamo métodos. Finalmente hizo clic, una vez que tuve algo de contexto. Tanto para la recursividad como para las clases, la informática cubrió las lagunas en mi conocimiento.

Con demasiada frecuencia, los fundamentos se dejan de lado. El progreso puede ser lento y las personas tienden a elegir cosas más “divertidas” en las que trabajar cuando se les da la opción. Es una pena. Los programadores que dominan los fundamentos parecen codificar con confianza: conocen el “cómo” y el “por qué” de sus elecciones de programación, lo que mejora su trabajo y construye su credibilidad con los demás.

Además, un conocimiento sólido de los fundamentos facilita el aprendizaje de nuevos idiomas y tecnologías. Por ejemplo, tomarse el tiempo para comprender realmente conceptos básicos como la iteración, la recursividad y la abstracción con un idioma ayudará a aprender otro. En pocas palabras, hay mucho que ganar y poco que perder si se dominan los fundamentos.

Soy escritor ( amymhaddad.com ) y soy un programador principiante.