Autor Tema: Y vos antes de programar haces tests ? Te gusta el TDD ?  (Leído 3550 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado rdoggsv

  • Administrator
  • The Communiter-
  • *
  • Mensajes: 6530
  • "Once you go arch , u never go back"
    • SV CommunitY
Y vos antes de programar haces tests ? Te gusta el TDD ?
« : septiembre 27, 2011, 11:48:42 am »
Ayer de la nada fui a parar a un video de Robert Martin (El mismo de object mentor) en el que el titulo decía "What killed smalltalk could kill ruby" Ya es medio viejo el video (Agosto-2009), pero siento que siempre aplica para lo que estamos viviendo en estos momentos.

RailsConf 09: Robert Martin, "What Killed Smalltalk Could K

Dura una hora y al principio da un poco de hueva verlo porque el tipo habla un par de cosas de todo un poco, pero luego se va poniendo interesante, y me dejo muchas cosas de refuerzo en el porque siempre tienes que hacer tests, y lo importante que son.

Justo hay un momento en el que sentí que me estaba hablando directamente cuando comenta que tenes mil y una tentación de empezar a programar antes de hacer tests, y todos los conocidos que tengo en el ámbito de la programación, inclusive a los que están en varias empresas de prestigio, no practican nada de testing.

Y tienen un gran miedo cuando hacen un cambio, y les toca estar de nuevo a pie evaluando si ese cambio no afecto alguna parte de la aplicación de manera negativa. Muy importante también como compara el profesionalismo en la carrera, lo que es ser un buen profesional, y hace una semejanza con los doctores.

Véanlo si tienen tiempo y me comentan que les pareció más interesante, no platico tanto a fondo de lo que más me quedo grabado en la mente para no hacer tanto spoiler.

Espero les guste  :thumbsup:

Desconectado rdoggsv

  • Administrator
  • The Communiter-
  • *
  • Mensajes: 6530
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: Y vos antes de programar haces tests ? Te gusta el TDD ?
« Respuesta #1 : septiembre 27, 2011, 04:34:20 pm »
Aunque sea hubieras visto el video antes de comentar que curioso que 30 min después ya tenías el que decir, menos el tiempo que te haya tomado escribirlo.

...
La programación, especialmente la del producto final, debería ser el último de todos los pasos en un proyecto, cuando ya se tiene la lista de APIs, herramientas, problemas y sus soluciones, y cada una de las piezas y algoritmos, y sus explicaciones, que se van a usar para el programa. Sino puede haber incompatibilidad o dificultad de interacción entre los diferentes componentes o problemas de escalabilidad o posibilidad de mejorar el programa como para tener que reescribirlo obligatoriamente....

Aquí botaste todo lo que es test driven development, en donde vas trabajando por pasos, y repeticiones de Falla(rojo) -> Pasa (verde) -> continuar con siguiente feature.

No necesitas tener todo listo, no necesitas pasar meses y días planificando el producto, lo podes ir moldeando acorde a van saliendo las necesidades, lo importa es que te enfoques en hacer los tests primero y el código después.

Desconectado JaiMe

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 1485
  • λ | h+
Re: Y vos antes de programar haces tests ? Te gusta el TDD ?
« Respuesta #2 : septiembre 27, 2011, 04:53:38 pm »
@rdoggsv lo mejor es no responderle a ~, por que le agarra la chiripiolca y escribe testamentos como respuestas. Tanta babosada y poca sustancia.

-*-

Interesante charla, algo que he estado practicando ultimamente es el integrar DDD (Documentation Driven Development) y TDD (Test Driven Development).

A mi me gusta pensar en capas de abstracción con modulos que

* 1) Están bien documentados: no solamente comentarios, sino que ademas la expresividad del código. La regla de oro es que el código facil de interpretar por otro programador al leerlo.
* 2) No producen efectos secundarios: Basicamente creando cajas negras que siempre producen el mismo resultado cuando evalúan la misma combinación de argumentos.
* 3) Todos los modulos son sometidos a test.

Puntos 1) y 2) son basicamente una manera de mantener "Clean code" que de acuerdo a la charla es cuando escribís una "Function that is pretty much what you expected".

Punto 2) te ayuda a reducir los WTFs/m, los cuales son causados mayoritariamente cuando el estado cambia durante runtime, sin nosotros saberlo. (esto es muchísimo común en lenguajes con lexical scoping).

Punto 3) es algo que debería de practicar mas seguido. Cuando escribo librerías que operan con números, si escribo tests, por que es bastante difícil saber de donde viene el problema cuando los cálculos no cuadran.

La tarea de escribir tests antes de empezar a escribir código si parece aburrida, pero ayuda bastante. Cuando uno programa es muy bueno usar la tecnica de "wishful thinking", con la cual basicamente nos imaginamos que las funciones/objetos ya existen y solo los llamamos sin haberlos implementado. Es cuando estamos en esta capa de abstracción que es buena idea escribir los tests, y después moverse a la implementación.




« Última Modificación: septiembre 27, 2011, 05:00:30 pm por JaiMe »
"Unless you try to do something beyond what you have already mastered, you will never grow."
― Ralph Waldo Emerson

Desconectado rdoggsv

  • Administrator
  • The Communiter-
  • *
  • Mensajes: 6530
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: Y vos antes de programar haces tests ? Te gusta el TDD ?
« Respuesta #3 : septiembre 27, 2011, 05:06:28 pm »
Y en tu vida cotidiana como ha sido? En que porcentaje dirías que escribís los tests antes del código?

Te has encontrado frecuentemente con dejando de escribir tests para hacer primero el código y tener algo que evaluar?

Sos fiel usuario de alguna plataforma de tests? Unit ? Rspec? Cucumber?

Desconectado JaiMe

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 1485
  • λ | h+
Re: Y vos antes de programar haces tests ? Te gusta el TDD ?
« Respuesta #4 : septiembre 27, 2011, 06:06:23 pm »
Siempre empiezo escribiendo el código, solamente agrego tests cuando se que voy a ha depender bastante del código (por ejemplo una libreria que voy a ocupar en varios projectos y necesito agregar funcionalidad después a medida que vaya necesitando). Y no uso ningún framework, basicamente escribo mis propias funciones, nada complicado solo una función que evalúa otras funciones dinamicamente y se asegura que el valor esperado es igual al real.

Ultimamente he estado escribiendo bastante JavaScript y TDD no es muy común, especialmente cuando lo que se hace es modificar el DOM y se necesita comprobar visualmente los resultados. Aunque en mi radar están Jasmine y QUnit.

-*-

Basicamente esta es mi testing framework para JS. En otros lenguajes utilizo assert o escribo la misma función.

Código: [Seleccionar]
var test = function(f, args, expected){
    var result = f.apply(this, args);
    var msg = 'Testing ' + f.name + '(' + args.join() + ') => ' + result;
    msg += '...................' + (result === expected ? ' OK!' : ' FAIL');
    console.log(msg);
};

Si tengo las siguientes funciones

Código: [Seleccionar]
function sum(x,y){ return x + y; }
function abs(x){ return (x > 0 ? 0 : -1 * x); }

solo escribo un script para tests

Código: [Seleccionar]
test( sum, [1,2] ,3);
test( sum, [1,4] ,3);
test( abs, [-4] ,4);

Que produce, lo siguiente

Código: [Seleccionar]
Testing sum(1,2) => 3................... OK!
Testing sum(1,4) => 5................... FAIL
Testing abs(-4) => 4................... OK!

Es simplista pero bastante útil y el principio es el mismo en varios lenguajes.

Sí es cierto, pero es más fácil y cómodo ir acumulando un repositorio de reutilizables ANTES de enfrentar un proyecto en algún punto del tiempo, y simplemente usar las piezas genéricas para armar el producto.
r diferentes tareas primitivas que son la base del resto de cosas más complejas.

Como vas a justificar tardarte meses solucionando problemas que pensas que vas a tener algún dia... podes pasar una eternidad escribiendo modulos reusables y juntar una libreria solo para luego encontrarte con la triste realidad que sos un programador y no nostradamus. En el mundo real, fuera de los libros de 1980 y monitores monocromáticos con los que soñas,... lo que mencionas no es practico... cuando vos venis ya varios va regresando y lo que vos esperabas solucionar ya a nadie le interesa.  Las herramientas se construyen cuando hay necesidad de hacerlo, y cuando ya la tenes hecha la podes reutilizar y modificarla.
« Última Modificación: septiembre 27, 2011, 06:20:04 pm por JaiMe »
"Unless you try to do something beyond what you have already mastered, you will never grow."
― Ralph Waldo Emerson

Desconectado rdoggsv

  • Administrator
  • The Communiter-
  • *
  • Mensajes: 6530
  • "Once you go arch , u never go back"
    • SV CommunitY
Re: Y vos antes de programar haces tests ? Te gusta el TDD ?
« Respuesta #5 : septiembre 27, 2011, 08:15:49 pm »
Hey Jaime y en tus proyectos de Javascript nunca te ha llamado la atencion probar cucumber con capybara para la parte de javascript/dom/etc ?

Esta bien interesante tu idea de hacer las cosas manualmente, pero como tu dices puedes probar las funciones y objetos en si, pero para la parte del DOM si estaria un poco mas tedioso ir paso a paso.

Desconectado JaiMe

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 1485
  • λ | h+
Re: Y vos antes de programar haces tests ? Te gusta el TDD ?
« Respuesta #6 : septiembre 27, 2011, 09:34:37 pm »
No había escuchado de Capybara, pero dandole una hojeada se ve interesante, lo unico que no me gusta mucho es Ruby centric y a no siempre uso Ruby.

En estos dias estoy usando node.js y me dan ganas de explorar un poco los testing frameworks disponibles, y al parecer para JavaScript hay bastantes https://github.com/joyent/node/wiki/modules#wiki-testing, las que mas me llaman la atención son estas: http://vowsjs.org/ y http://zombie.labnotes.org/

Lo bueno es que varias incluyen Sizzle.js (la libreria que jQuery ocupa para los DOM selectors) y tambien permiten probar Ajax calls.


"Unless you try to do something beyond what you have already mastered, you will never grow."
― Ralph Waldo Emerson