El buen programador

En este post voy a dar mi opinión sobre qué es ser un "buen programador". Destaco que es mi opinión porque seguramente es subjetiva y arbitraria. Esto es algo que he pensado hace mucho y recién ahora me decidí en plasmarlo en bytes. Me encantaría escuchar otras opiniones, así que te invito a dejar tus comentarios.

Hace bastante tiempo que programo y sobre todo que trabajo con otros programadores. Hay que sincerarse. Somos bichos raros. Es por eso que a lo largo de estos años he tratado de ser observador y entender qué hace a los "buenos programadores". También debo reconocer que yo estoy lejos de mi ideal de "buen programador", por lo que analizar estos conceptos me ayuda a darme cuenta en qué tengo que mejorar. No creo sinceramente que exista El Buen Programador, sino que estamos todos en la búsqueda de la mejora constante.

Dicho esto, y antes de comenzar a describir más, les presento la siguiente imagen, que puede resumir mis pensamientos. La pirámide del buen programador:

Pirámide del buen programador

Para mi estas son las cosas que tiene que cultivar un buen programador. Lo más importante abajo, obviamente. Voy a arrancar a dar mi punto de vista desde el fondo.

Formación personal, disciplina, introspección.

Podríamos decir que estas no son habilidades que solo debe cultivar el buen programador, sino "la buena persona". Esto nos constituye como personas. Es importante como seres humanos formarnos a nosotros mismos, cualquiera sea el camino que elijamos. Esto nos hará un "buen programador", un "buen amigo", un "buen padre", etc. Los valores que cada uno posee son los que terminarán dando forma a su posterior actividad profesional. Conozco buenos programadores que son increíblemente soberbios, lo cual hace que poca gente quiera trabajar con ellos. Hay programadores que no son tan buenos técnicamente pero son grandes personas, lo que hace que otros programadores se acerquen y se sientan a gusto al compartir su tiempo y conocimiento, lo que termina siendo beneficioso para su vida profesional.

Más allá del tema de la persona y sus valores, tema que me excede notablemente, se encuentra la "disciplina" del programador. La programación es una profesion complicada. Tiene algo de ciencia y tiene algo de arte. El arte se manifiesta en esos momentos en que hay que hacer algo y uno no sabe por dónde arrancar. Se nos ocurren mil formas distintas de encararlo, pero todo es una experimentación. Sumado a eso, puede ser que esa particular tarea no nos agrade mucho. Y por si fuera poco, la mayoría de los programadores tenemos "horarios flexibles". No tenemos un jefe que nos diga "¿presentaste el formulario en tribunales?", "¿cuántos clientes visitaste?". En esos momentos es donde hay que hacerse fuerte y ponerse metas y objetivos, y terminar de alguna manera nuestro trabajo. Mucho se ha escrito acerca de esto. Incluso se han creado "técnicas" para optimizar el tiempo. Pero sigue siendo un problema recurrente. El buen programador conoce estas dificultades, conoce sus propias limitaciones y sabe cómo atacarlo.

Por último menciono introspección. Esto también tiene que ver con el "ser" de cada persona, por eso no voy a extenderme en mi análisis. A mi juicio, lo importante para una persona es sentarse de vez en cuando a solas, en silencio y hacerse las preguntas básicas:

  • ¿Qué estoy haciendo bien? ¿Qué estoy haciendo mal?
  • ¿Me gusta lo que hago?
  • ¿Cómo puedo mejorar? ¿Qué necesito cambiar?

Habilidades sociales y de comunicación

El punto anterior es prácticamente filosófico. Es difícil verlo en un programador día a día. En cambio, el rasgo social se observa a diario. Si bien no está en la base de mi pirámide, es muy importante.

Tener la capacidad de comunicarse con otros es fundamental. Y por comunicarse no digo: "convencer al otro programador que mi lenguaje es mejor o que mi editor es mejor" o "convencer al PM que tal o cuál feature quede afuera del release". Me refiero a lograr una profunda comunicación con el otro. Entender a las personas que nos rodean, conectar, lograr empatía.

La interacción social es la base del crecimiento de nuestra raza. No hay nadie que se haya desarrollado individualmente. Los programadores podemos tomar mucho de las otras personas. Afortunadamente hay muchos programadores que fomentan la comunicación. Un ejemplo es la comunidad de PyAr: Si bien no soy un asiduo participante se ve que las personas interactuan activamente. De ahí salen cosas muy buenas, los programadores se ayudan a sí mismos y comparten cosas.

La moraleja de todo esto sería analizar uno mismo qué habilidades sociales tiene y en qué debe mejorar. Y si uno cree que debe mejorar sus habilidades sociales se puede comenzar involucrándose en comunidades (como la anteriormente mencionada PyAr), en proyectos open source, participando en conferencias, etc.

Math interlude: Abstracciones y patrones

Programar consiste en resolver problemas. Para resolver problemas es fundamental la capacidad de abstracción. Si bien en el título dice "math", no estoy diciendo que le encajemos una Transformada de Laplace a un algoritmo de ordenamiento. La idea es desarrollar con el tiempo la capacidad de abstraerce y levantar el nivel de nuestro pensamiento. Lamentablemente esto es muy difícil de explicar. Los programadores con cierta experiencia van entender a lo que me refiero. Es una cuestión de práctica. Nuestro cerebro se acostumbra a los patrones.

Algunas cosas interesantes para desarrollar este punto pueden ser:

  • Problemas matemáticos en general.
  • Problemas de programación en general (Google: "programming puzzles". Los de Facebook están geniales.)

Conceptos técnicos básicos

Este vendría a ser el primer concepto técnico dentro de mi pirámide. Es fundamental aprender y entender las bases de la computación. Es irritante cuando un programador se jacta de saber "tal o cuál feature" o "conocer tal o cual lenguaje". Les doy un ejemplo, seguro que alguna vez oyeron algo parecido.

"Hablando con un programador PHP".
- Programador: Sí, porque esta vez decidí que voy a mandar los datos con GET.
- Yo: ¿Con GET? ¿Qué es eso?
- Programador: ¡Con GET! Se nota que te falta PHP pibe. GET es cuando mandás los datos por la URL...

En ese momento me explota una vena de la frente y mientras me tiembla el ojo le digo. "Ahh, mirá que bien che...". Lentamente me doy la vuelta y procedo a buscar algún pozo en el cual enterrarme.

Es clave para un programador ir hacia el centro, hacia las bases de lo que hace. Uno no debe "aprender python". Debe aprender el concepto de objetos, de programación funcional, de concurrencia, etc. Eso es lo que diferencia a los buenos programadores. Los lenguajes pasan, las tecnologías pasan, las técnicas pasan. Las bases quedan. Es por eso que quienes aprenden las bases pueden transformarse a sí mismos hacia lo nuevo, evolucionar.

Cosas importantes para aprender que considero básicas:

  • Arquitectura de Hardware.
  • Sistemas operativos. Funcionamiento en general. "¿Qué pasa cuando ejecuto un proceso? De principio a fin."
  • Concurrencia. En general. (Fundamental en la nueva era multicore)
  • Redes Infraestructura y programación. Protocolos básicos.
  • Paradigmas: funcional, objetos, prototipos, etc.
  • Datos, datos y más datos! Almacenamiento, modificación, transformación. (Si no me creen pregúntenle a Linus)

Conceptos generales de programación

Si bien estos también podrían considerarse "conceptos básicos", quiero hacer una diferencia de los anteriores porque en este caso están directamente relacionados con la actividad de Programar. Con "Conceptos Generales" me refiero a cosas que uno hace a la hora de programar que son básicas y están más allá del lenguaje de programación o la plataforma usados. Tal vez la mejor manera de explicarlo es mediante ejemplos:

  • Manejo de colecciones: Cuál es la mejor forma de iterarlas, de modificarlas. Qué complejidad tiene cada tipo. Cuándo usar un tipo u otro, etc.
  • Algorítmica en general: Escribir programas simples, tratar de disminuír la complejidad.
  • Buen manejo de tipos de datos: Saber por qué un float no tiene la presición esperada, manejar dates y datetimes, conjuntos de caracteres, etc.
  • Escribir código legible y modular: Saber aprovechar de la mejor manera el paradigma que estemos usando en el momento.
  • Saber cuándo documentar y qué documentar.
  • Escribir buenos tests: Es decir, saber cuándo testear unitario, cuándo funcional, cuándo integración, etc.

Si bien me deben faltar puntos acá, esto es una buena lista. Lo malo de este punto en particular es que hay dos formas de mejorar en este aspecto:

  • Progrmando (doh!)
  • Leyendo código

Algo que es realmente útil para esto es poner tu código ante los ojos de otros programadores. Por ejemplo incorporar code reviews al proceso de desarrollo, escribir código y mandar PRs a proyectos open source (por más que no pasen, solamente para tener feedback), hacer pair programming, entre otras cosas.

A la hora de mejorar la programación en sí, una cosa que se puede hacer es aprender muchos lenguajes, y saber sacar lo mejor de cada uno. Además, aprender los fundacionales como Lisp o Smalltalk.

Ahora sí, el lenguaje.

Por último un buen programador es aquel que conoce a fondo un lenguaje (o varios). Está muy bien aprender muchos lenguajes (cuantos más mejor) pero es importante conocer alguno a fondo. Esto es lo que nos permite, además de ser buenos programadores, escribir buenos programas. Si uno conoce los detalles (las cosas buenas, malas, oscuras) de un lenguaje puede escribir programas que exploten esas ventajas y con la menor cantidad de errores posibles.

La forma de conocer a fondo un lenguaje es usándolo mucho, leyendo código de gente que sabe más que nosotros y metiéndonos en la fuente del lenguaje. Tal vez leyendo el código, la arquitectura, papers publicados, etc.

Conclusión

A propósito dejo afuera otros conceptos como la curiosidad, el "amor" por la programación, la paciencia, el pasión por la competencia, etc, ya que sería demasiado subjetivo (más aún). Son cosas difíciles de analizar. Para cerrar todo esto y darle una conclusión, me parece que lo más importante es siempre buscar la autosuperación. Happy coding.