Grupo Linuxero del Bajío

Recomendaciones para programadores nóveles

Víctor Manuel Jáquez Leal

Sí, lo admito, temo que por primera vez en mi vida estoy trabajando como unverdadero programador. A lo largo de este proceso, que abarca desde me conocí elsoftware hasta estos días, he reconocido varios conceptos que, creo yo, demanera personal, son útiles para llegar a ser un buen programador.Intentaré enumerar en este espacio dichos conceptos. No son triviales, implicanun esfuerzo consciente, lo que significa mantener la motivación constante.

El orden expuesto no implica una secuencia, es mera casualidad.

  1. Estudiar constantemente los patrones de diseño. Los patrones de diseño son soluciones abstractas a problemas genéricos de la ingeniería de software, algo así como meta-soluciones (soluciones de soluciones). Esto implica, para comenzar a documentarse, conocer UML (toda la documentación de patrones de diseño está en UML) y entender los problemas que pretenden solucionar cada uno de los patrones. Después de zambullirse en el mundo de los patrones, uno comienza a ver el desarrollo de software de una manera más armoniosa y elegante, la forma de escribir líneas de código cobra mayor sentido. Palabras como decoradores, proxys, fábricas de objetos, iteradores, deberían ser parte del lenguaje diario de un programador.
  2. Seguir los conceptos de la programación por contrato. Estas ideas, vertidas en el lenguaje Eiffel, vienen de los lenguajes formales para describir algoritmos -matemáticas duras y puras- y que resultaron en el concepto de programación por contrato: una función es un contrato, es decir, una especificación para realizar una tarea, sin embargo para que cumplir el contrato, la función debe validar la precondiciones del sistema, o las entradas a dicha función, si alguna de estas entradas no está dentro de lo especificado explícitamente, entonces la función no puede completar su contrato. Por otro lado, a terminar la operación a realizar por la función, esta tiene que validar sus salidas, es decir, las postcondiciones, para ver si están dentro de lo prometido en el contrato. Estas simples ideas ayudan mucha a la hora de eliminar gazapos en nuestro código.
  3. Asimilar los conceptos de la programación funcional. Lamentablemente, si como yo, tuvieron una educación profesional bastante precaria, no estarán en contacto con las ideas del cálculo lambda, padeciendo la miopía de la programación imperativa, donde la máquina de estados en la reina del juego. Sin embargo, el formalismo del cálculo lambda es equivalente al de la máquina de Turing, entonces podemos pensar en las funciones como una máquina universal de cómputo. Entonces podemos pensar en funciones de primer orden, que están compuestas de funciones y devuelven a su vez funciones. Esto es una forma de pensar muy diferente a lo acostumbrado por las mayorías, pero el código generado con este paradigma es de mucho mayor calidad, que el acostumbrado por la programación imperativa, aunque estemos atados a un lenguaje de este último tipo.
  4. Tengo el problema de que si no veo rápidamente en funcionamiento las líneas de código que escribo, pierdo la motivación rápidamente. Una buena forma irse retro-alimentando constantemente es a través de la pruebas unitarias. Es más, se podría llegar a utilizar una metodología de desarrollo totalmente conducida por pruebas unitarias (TDD): escribimos la prueba, luego escribimos el código necesario para pasar dicha prueba, probamos y así sucesivamente. Esta técnica es buena para el desarrollo de bibliotecas de software que se reutilizarán, teniendo que ofrecer una API lógica, coherente y homogénea. Es importante mantener la motivación y el entusiasmo mientras se escribe software y me parece que a través de un mecanismo de pruebas unitarias automáticas se podría mantener un flujo dinámico de desarrollo. Es buena idea intentar utilizar algunas de las bibliotecas de pruebas unitarias disponibles como las xUnit (JUnit, NUnit, CPPUnit, boost test library, check library, etc.), así podremos integrar al ciclo de desarrollo el diseño, escritura y ejecución de las pruebas.
  5. Sin embargo las buenas prácticas y el colmillo no se logran con sólo leer conceptos y programar bajo nuestro buena estrella y la gracia de Dios, hay que ver cómo trabajan los maestros. Leonardo Da Vinci no aprendió a dibujar aislado y encerrado en su casa, Aristóteles no desarrollo su filosofía siendo un ermitaño, ambos se codearon con los maestros de su tiempo y su arte, los vieron trabajar, aprendieron de ellos, tomaron sus técnicas y pensamientos y las pusieron en práctica y las mejoraron. Luego entonces, para programar decentemente hay que aprender de los maestros y esto significar leer código de otros programadores que respetemos y sus trabajos nos interese. Afortunadamente ya no tenemos que ofrecernos en persona como discípulos, ya que herramientas, como codesearch de Google, nos permite estudiar y escudriñar el código me miles de estupendos de programadores alrededor del mundo. Cuando tengo una duda específica, lo primero que me pregunto es ¿cómo habrán solucionado otros algún problema parecido al mio? y comienza la búsqueda.
  6. Programar es como tocar un instrumento musical. No es como andar en bicicleta, que nunca se olvida. Se olvida. Y se olvida rápido. Es por esto que ya que programar constantemente, programar por placer, no por obligación, programar por facilitarnos nuestra existencia, por comprender un nuevo concepto, por un reto. Dejar de programar por tiempos prolongados es retroceder.
  7. Pero leer código no siempre es la mejor manera de comprender los conceptos abstractos y sutiles de las ciencias computacionales y de la ingeniería del software, hay que leer periódicamente publicaciones especializadas. Y con revistas especializadas no me refiero a la literatura que se encuentran en los estantes de Sanborns, eso es basura publicitaria la más de las veces, me refiero a las publicaciones de la IEEE, de la ACM, o, si de plano nos gusta la publicidad pero queremos aprender algo, pues Dr. Dobb’s Journal.

No son todas las recomendaciones debidas, pero son las que he ponderado en estosdías. Espero, como siempre, haber despertado su curiosidad y los invito ainvestigar y divertirse más.