Pasito a pasito


Hacía tiempo que quería hacer un ejercicio interesante (al menos para mi) que consiste en hacer una codekata muy sencilla a pequeños pasos o, como dice Kent Beck en su libro “TDD: By Example“, con baby-steps. Me interesa estudiar cuáles son las fuerzas que empujan a refactorizar hacia un mejor diseño y para eso verlo en un ejercicio de laboratorio me parece ideal. En este sentido, también me interesa ver cómo se aplica la “Premisa de la Prioridad de las Transformaciones” expuesta recientemente por UncleBob.

FizzBuzz en Github (pasito a pasito)

Así pues, he creado un proyecto vacío con Jeweler (mi lenguaje de elección ha sido Ruby porque necesito practicarlo más) y he trabajado sólo en el fichero de test por simplicidad. Jeweler crea el esqueleto y te lo deja todo muy fácil para ejecutar los tests sin más que ejecutar:

rake test

De hecho, Jeweler te hace hasta el primer commit en git y lo deja listo para subirlo a github. Bueno, el resultado de este experimento lo he dejado en Github y veréis que se trata de la kata FizzBuzz, que es lo suficientemente sencilla como para no alargar demasiado el ejercicio. Si alguien tiene ganas de empezar con GitHub, también recomiendo este tutorial de primeros pasos de Adictos al Trabajo.

Así que fui haciendo commit con git para cada uno de los pasos, incluso en aquellos en los que estaba en rojo, porque la idea era tener todos los comentarios que explicaban ese paso en la historia de los commits y así, quizás algún día, tener una herramienta que me permita visualizar ese “paso a paso” a modo de slideshow.

De paso, en el camino, he puesto en práctica mi kung-fu con Git y he aprendido a:

Cambiar el comentario del último commit

Como los comentarios en este ejercicio son fundamentales, no podía permitirme que no pusieran exactamente lo que quería poner. Así que busqué y encontré esto:

git commit --amend

Esto lo que hace es proponerte el editor por defecto para modificar el mensaje del commit.

Deshacer los últimos commits

Más adelante me encontré con que había ido haciendo unas refactorizaciones que no me gustaban nada, así que quise volver atrás. Normalmente habría deshecho los cambios en el editor y hecho un nuevo commit, pero eso habría dejado un poco sucio la historia.

git reset <el hash del commit hasta el que queremos volver>

Esto nos pone apuntando justo a ese commit al que hemos hecho referencia. Si no sabéis cómo conocer el hash, “git log”, aunque hay maneras de abreviarlo y también vale. 🙂

Hacer push a github sin haber hecho clone antes

Pensaba que ya había hecho creado el repositorio en github y que había hecho clone (que es lo que se suele hacer), pero como había empezado directamente desde el esqueleto que me ofrecía Jeweler, ni me acordé de todo eso. Así que creé el repositorio en github y, claro, ya no se parecía a lo que Jeweler había dejado configurado por defecto. El nombre del proyecto en local era “fizzbuzz” y en Github era “fizzbuzz-babysteps”. Además, al hacer git push me daba un error. Así que de nuevo recurrí a Google y Stackoverflow y encontré esto otro:

git remote set-url origin git@github.com:jmbeas/fizzbuzz-babysteps.git
git push -u origin master
Algunos alias nuevos bastante útiles

La primera vez que usé Git lo hice siguiendo el tutorial GitImmersion. Allí vi que se podían definir alias muy útiles para simplificar muchas de las tareas habituales. Los amigos de Emergya también nos recomiendan algunos. En particular el hacer “commit -a” parece una tontada, pero a mi me da mucha pereza hacer “git add” todas las veces. 🙂

LA FOTO: La encontré a través de “Google images” y, la verdad, no he pedido permiso. Espero que como es bastante inocentona y no busco lucrarme, no haya ningún abogado americano que me denuncie. Si alguien tiene interés en la fuente original (la que me da Google), es ésta. Ya véis, nada interesante.

Tagged:
  • Muy buen artículo, me alegro que sea en ruby 🙂
    Te dejo un tutorial interesante de git http://gitimmersion.com/index.html y otro de ayuda memoria http://goo.gl/XZxKZ

    Saludos y gracias por la info!

    • jmbeas

      Gracias. Gitimmersion ya lo conocía, de hecho es una de las referencias que cito cuando hablo de los alias en este artículo, y la otra guía rápida no, y me gusta. ¡Muchas gracias!

      • Ups!, es cierto, no había seguido el link 🙂
        Muy bueno el blog, felicitaciones!!!

  • Edu

    Muchas gracias por compartir esto. Cuando tenga un rato le echo un vistazo a todo el proceso, aunque habrá que aprender algo de Ruby 🙂

    Aquí te dejo otro link llamado “Git Magic” http://www-cs-students.stanford.edu/~blynn/gitmagic/

    Otro atajo que me resulta útil a lo “git commit -a”, si trabajas con ramas es:

    git checkout -b nuevaRama

    En lugar de:

    git branch nuevaRama
    git checkout nuevaRama

    Ya por último.

    ¿Qué tal baby-steps? ¿Merece la pena? ¿Alguna revelación? Aquí en Barcelona cuando hacemos dojos hay “polémica” entre los que creemos que es interesante hacer así las katas por tener un punto de vista diferente y los que no, pero nunca llegamos a las manos 🙂

    Yo normalmente intento baby-steps pero me falta muchísima práctica aún.

    • jmbeas

      Hola Edu, qué bueno tenerte por aquí.

      Lo mejor de los baby-steps es que te permiten reflexionar (y compartir tus reflexiones) mucho mejor sobre cómo haces las cosas, pero es una manera más de practicar. No creo que se pueda/deba practicar siempre así.

      Echa un vistazo a los comentarios que estamos cruzando @plagelao y yo porque me está ayudando un montón