martes, 17 de agosto de 2010

Libros: Implementation Patterns

En una de mis anteriores entradas explicaba la necesidad de aprender de los que más saben, de apoyarse en los grandes. Como dicen que hay que predicar con el ejemplo, os voy a comentar lo que he aprendido de mis gigantes. Voy a empezar con Kent Beck.

Hace una semana que compré sus screencasts sobre tdd y hace algo más de un mes que leí su "Implementation Patterns" (Previa recomendación de Xavi Gost en las cañas de la primera code retreat española). De los screencasts ya os hablaré otro día, hoy le toca al libro.

No voy a haceros un resumen, simplemente os diré que es un libro espectacular. Debería ser de lectura obligatoria en la carrera de informática junto con el "Clean Code" de Robert Martin :) Os recomiendo leerlo (176 páginas que se leen en un plis plas) pero, como es muy probable que mi recomendación no os baste, voy a tiraros la caña para que piquéis escribiendo las frases que más me han impactado. Vamos a ello.

[Decidí]Dejar de fingir que programo por instinto

Mis primeros pasos en esto de la programación fueron así. Hacía lo que yo pensaba (intuía) que estaba bien, pero en realidad no tenía ni idea. No tenía visión global, no pensaba en el usuario, iba a impulsos, no hacía pruebas automáticas, etc. Era un patán, una inconsistencia con patas. Y sin embargo, ¡Me parecía que hacía las cosas bien! Que barbaridad... No tenía ningún tipo de criterio.
Cuando empece a tomar conciencia de mi profesión (y en esto le debo mucho a Alfredo Casado) descubrí lo malo que era. Avergonzado, decidí empezar a aprender mi oficio y, no es que ahora sea la hostia, pero estoy a años luz de aquel paquete :D Espero que dentro de unos años vuelva a pensar lo mismo del paquete que os escribe ahora mismo, querrá decir que no me he estancado.

Los programas se leen más a menudo de lo que se escriben.

Espero que esto lo tengamos todos más que asumido. Hay que hacer código legible porque vamos a pasar más tiempo leyéndolo que escribiendo código nuevo. Sin embargo, cuando empiezas en esta profesión no eres consciente. En mi caso, no pensaba en el mantenimiento de mi programa porque, obviamente, una vez que lo hiciera funcionar nadie iba a volver a tocarlo :D Ahora, cada vez que me toca "enseñar" a alguien intento explicarle ésta necesidad y casi siempre me encuentro con lo mismo: "caras de pescao y culos torcios" ¿Nadie explica esto en las empresas o en las universidades?

Encontrar el nombre correcto es uno de los momentos más satisfactorios cuando se programa

Cuando empiezas a pensar en leer código más que en escribirlo se te plantea el problema de cómo nombrar una clase, un método, una variable... ¿Qué nombre representa mejor a esta clase? ¿Es lo suficientemente comunicativo? Para mi, es una de las partes más complicadas de la programación por eso, cuando consigues dar en el clavo, es de las más gratificantes.

Los programadores deben pensar, comunicar y aprender. Es parte de ser un profesional

Ser un profesional. Si queremos que nos tomen en serio como sector debemos empezar a tomarnos en serio nosotros mismos. Debemos empezar a ser profesionales. Para Kent Beck, los tres pilares de un programador profesional son

  • Pensar: Programar es muy difícil. Si haces las cosas a la ligera lo acabaras pagando.
  • Comunicar: Como ya he dicho antes, debemos empezar a hacer código expresivo, sencillo de leer y entender.
  • Aprender: No anclarnos, no quedarnos obsoletos. Intentar mantenernos al día.

El mejor código para optimizar es el legible, modular y probado

Me gusta esta frase porque pone por delante de la optimización las pruebas y la legibilidad. Haz que funcione, ya harás que funcione rápido.
Espera a tener pruebas que demuestren que necesitas optimizar y optimiza entonces.

Haz que tu código funcione, decide después como debe estructurarse. Si gastas mucho tiempo estructurando tu código antes de escribirlo, tendrás que deshacer todo ese trabajo y rehacerlo de nuevo cuando aprendas algo durante la implementación

Código que funcione, código que funcione, código que funcione, código que funcione, código que funcione, código que funcione, código que funcione... ¡Hazlo! Deja el análisis y pasa a la acción. Pero recuerda, PIENSA.

[sobre los setters]Intenta entender que problema está resolviendo el cliente al asignar la variable.

Orienta tu código al dominio del cliente, no al contrario. En esta cita en concreto, Beck se refiere a los típicos métodos "set" que únicamente sirven para asignarle el valor a una variable. ¿Por qué necesita tu cliente hacer ese "set"? ¿Qué problema necesita resolver? Cuando empecé a programar nunca me hacía estas preguntas. Pasaba de mi cliente (Entendido como el programador que utilizaba mi código). El solo hecho de pensar en ellas te asegura un código mucho mejor.

Antes de añadir complejidad a un programa, asegurate de que dicha complejidad traerá beneficios

Manten tu código lo más simple posible. Muchas veces los programadores somos los que añadimos la complejidad a nuestro código sin venir a cuento. Si cuando estás programando te da la impresión de estar creando un código demasiado complejo párate a pensar en por qué está pasando eso. Puede que hayas perdido el foco y estés añadiendo funcionalidad innecesaria.
Algo que me ha ayudado mucho a mantenerme enfocado en el problema a resolver es TDD. ¡A tope con el TDD!


Con esto paro, que me veo comentando el libro entero y eso prefiero hacerlo delante de unas cañas. Yo pago la primera :P

11 comentarios:

  1. Si señor! Aprendiendo de los mejores!

    yo tengo el libro empezado y debería terminarlo cuanto antes porque, como bien dices, debería ser de lectura recomendada en la carrera (con tantos otros...)

    A seguir aprendiendo y compartiéndolo con los demás.

    Un abrazo

    PD: Yo pago la segunda caña :P

    ResponderEliminar
  2. Por cierto (lo que me gusta Spammear) mola eso de los screencast de Pragmatic, no los conocía y me parece que va a ser una compra segura próximamente!

    PD: Sigo pagando la segunda caña, no más xD

    ResponderEliminar
  3. ¡A ver si nos vemos pronto y podemos invitarnos mutuamente! :D

    Los screencast no es que sean la leche tampoco. A mi se me han quedado un poco cortos :( Aún así, nunca está de más ver a Kent Beck haciendo TDD :P

    ResponderEliminar
  4. Buenas a todos.

    Yo actualmente estoy leyendo: "Head first design patterns" (también recomendado por Xavi Gost :P).

    ¿Sabéis si estos 2 libros se solapan o debería leerme también el de Kent Beck?

    Un saludo!

    ResponderEliminar
  5. ¡Buenas!

    Yo me los leería los dos. Kent Beck no habla de patrones de diseño, habla más de como escribir software legible y mantenible. Da unos principios y unos valores y describe como le influyen a la hora de ponerse a programar.

    El de Head First me parece un pedazo de libro, muy divertido y muy molongo :) Eso sí, es un rollo diferente, aunque lectura obligada también :)

    ResponderEliminar
  6. Ya era hora de que lo leyeras!!!
    A mi me habló directamente, veo que a ti te ha pasado lo mismo.
    Kent Beck es el puto amo

    ResponderEliminar
  7. En realidad lo que me ha llevado tiempo ha sido escribir esto :D Pero sí, ¡Kent Beck mola!

    ResponderEliminar
  8. Vaya, qué buena entrada en el blog, enhorabuena Alberto porque has conseguido que no deje este libro para más adelante...y mira que no será por veces que al pesado de @Xaviuzz se lo he oido recomendar...pero nunca le daba esa oportunidad.

    Tengo tanto que leer y tanto que aprender...y cada vez me hago más mayor y me queda menos tiempo...necesito otra vida!!!!

    Un saludo y a ver si te prodigas un poco más, que hay mucha calidad en lo que pones ;)

    ResponderEliminar
  9. Muy bueno!
    yo me quedo con dos enfoques que fueron reveladores para mí:
    1- El nombre es esencial. Ni se las veces que habré dicho a compañeros "pero... ¿por qué se llama así si no es eso lo que hace?" Encontrar el nombre adecuado es una parte esencial del proceso de diseño, no solo por legibilidad sino porque es un indicador muy fiable de la corrección del diseño.
    2- Ver el código desde el punto de vista del "cliente", aunque el cliente sea otro módulo, capa, etc... Siempre he intentado que los programadores aprendan que la mayor parte de su código es llamada "por más código", y que es esencial mirarlo *desde fuera*. Desde ese punto de vista, TDD fue una iluminación (y eso que me costó tiempo darme cuenta de que *ese* era el punto clave)

    Insisto, gran post! :)

    ResponderEliminar
  10. Muchas gracias, chicos :)

    @Jorge Jimenez
    No es por nada, pero mañana serás aún mayor :P Haz como yo, vete a trabajar a una empresa que esté a hora y media de tu casa en tren. Te harás el regalo del tiempo...

    @Jorge Uriarte
    Cierto, un buen nombre "valida" (o es parte de la validación) un diseño. Esa se me pasó, pero estoy totalmente de acuerdo. De hecho, cuando no sabes nombrar algo aparece un olor a cabrales que tira de espaldas :)
    TDD debería estudiarse en el cole. Te cambia la forma de programar (a mejor) de una manera brutal.

    ResponderEliminar
  11. Cierto, un buen nombre "valida" (o es parte de la validación) un diseño. Esa se me pasó, pero estoy totalmente de acuerdo. De hecho, cuando no sabes nombrar algo aparece un olor a cabrales que tira de espaldas :)
    TDD debería estudiarse en el cole. Te cambia la forma de programar (a mejor) de una manera brutal. coaching-mastery.com/que-es-un-postulado-en-matematicas/

    ResponderEliminar