Verlo para creerlo

No tengo muy claro cómo comentar esto para que no sea muy rollo y se pueda apreciar en toda su magnitud, pero voy a intentarlo.

Hoy he estado revisando algo de código que me han pasado (de otra empresa, afortunadamente). Se supone que ese software debe hacer lo siguiente

El software tiene 16 puertos abiertos, todos ellos conectados a equipos iguales, por lo que su mensajería y comportamiento es igual en todos ellos. La idea del software es que el usuario pueda elegir uno de los puertos y hacerle un prueba apretando un botón. La prueba consiste en enviar un mensaje concreto (codificado en el código) y ver si la respuesta tarda menos de un minuto en llegar. Cuando el usuario ha elegido el puerto y pulsa el botón, se abre una ventana con un contador que comienza en 1:00 y va hacia atrás. Si la respuesta llega antes de que termine el contador, se oculta la ventana y se le dice al usuario que el puerto está bien. Si no llega, se cierra igualmente la ventana y se le dice al usuario que el puerto está mal.

¿Y cómo hace esto el software que me han pasado?

Pues se ponen 16 botones en 16 variables boton1, boton2, etc. Se guardan en otra clase 16 atributos estáticos boolean etiquetados testeandoPuerto1, testeandoPuerto2, testeandoPuerto3,…. para indicar qué puerto está bajo test. Por supuesto, los puertos también están guardados en 16 variables estáticas puerto1, puerto2, … Cada botón tiene su ActionListener (16 ActionListener) de forma que cada uno de ellos marca su atributo estático testeandoPuerto correspondiente y abre la ventana con la cuenta atrás.

Por si no fuera poco todo esto, lo bueno empieza ahora. Para la ventana con cuenta atrás se hacen 16 clases Ventana1, Ventana2, etc, una para cada botón. Estas ventanas, en su constructor, miran si se está testeando el puerto que les corresponde para arrancar la cuenta atrás. Y durante la cuenta atrás mira el puerto que le toca a ver si llega la respuesta. Por ejemplo, la Ventana7 en su constructor mirar si testeandoPuerto7 es true para arrancar o no la cuenta atrás. Y si la arranca, en la cuenta atrás se mira puerto7 para ver si llega la respuesta. Es decir, las 16 ventanas son exactamente iguales, salvo la variable testeandoPuerto y puerto, que cada ventana mira las suyas.

Y como todos sabemos que si quieres hacer algo bien es mejor hacerlo uno mismo, para la cuenta atrás no usaremos los Timer de java ni para pintar los minutos:segundos que quedan las clases Date, Calendar, SimpleDateFormat ni similares. Lo mejor es hacerse un hilo "vulgaris", guardándose previamente el currentTimeMillis(), haciendo sleeps de 1000 milisegundos, viendo el tiempo transcurrido respecto al currentTimeMillis() que guardamos al principio y multiplicar/dividir por 1000 milisegundos/segundo, 60 segundos/minuto, cogiendo los restos y las divisiones enteras para separar minutos de segundos.

Y claro, como el arrancar o no el Timer está en el constructor de la ventana y no hemos puesto métodos de arrancar/parar/resetear, pues cada vez que se pulse uno de los botones, se hace new de su ventana correspondiente, haya sido o no creada previamente, ya que si no se hace así no hay forma de rearrancar la cuenta atrás una segunda vez.

Resumiendo, 16 variables botón, con 16 ActionListener, 16 variables estáticas, 16 clases Ventanas exactamente iguales salvo por la variable que miran, y news por doquier.

Si soy bueno, puedo entender que quizás le encargaron esto a alguien que no sabe nada de java, quizás es alguien de perfil hardware que se dedica a testear los equipos con osciloscopios y voltímetros, que a su jefe se le ocurrió la brillante idea de hacer un software que ayude a testear, que a él le ha caído el marrón y que quizás incluso le han apretado en tiempo e hizo el copy-paste de las 16 clases Ventana un Domingo a las cuatro de la madrugada porque el Lunes tenía que estar todo a primera hora.

Pero hay que ver estas cosas para entender realmente lo que se dice en muchos posts y de lo que otros países más avanzados en software que España ya se han dado cuenta. Es mejor pagar el doble, el triple (o incluso 16 veces más) a un programador bueno y con experiencia, que pagar cuatro cuartos a dos o tres sin conocimientos ni experiencia ninguna. Imagino, con los conocimientos de java que demuestra, a la persona que ha hecho este código tardando dos o tres semanas en hacerlo, e imagino a algún programador bueno y con experiencia haciéndolo en una tarde, con 16 veces menos de líneas de código. La pena es que los jefes que contratan o encargan estos "marrones" al primero que pillan, no ven estas cosas, ni posiblemente quieren verlas.

Entradas relacionadas:

13 comentarios en “Verlo para creerlo

  1. es digno de http://thedailywtf.com/ , si lo tradujeras hasta te lo publicaban
    Entiendo el dolor que has sentido al ver el codigo, iiiirrssssh como si rayaran un tenedor en un plato, pero igual no es tan grave, el codigo funciona (supongo) y no tiene pinta ni de ser muy grande, ni de tener que crecer ni de tener que integrarlo en otro lado. Por tanto es un quasimodo que hace sonar la campana y si no lo hubieras mirado igual nadie lo hubiera hecho nunca (o igual si, si lo has mirado sera por algo, supongo).

  2. Pues sí, lo he mirado porque tengo que ampliar la funcionalidad de ese software, o bien coger los trozos que me interesen y hacerlo de nuevo. O bien hacerlo todo nuevo.

    Se bueno.

  3. Lamentablemente se compra lo que «funciona» y luego hablar de escalabilidad, bien gracias. Seguro luego te preguntan «Y como no podes ampliarlo para que testee mil puertos? El otro lo hizo en 5 min.»
    En fin … Gajes del oficio.

  4. Ya me imaginaba que no solo era curiosidad lo de mirar el codigo 😛 Lo malo de los que desarrollan y/o gestionan el desarrollo sin importarles la «deuda tecnologica» es que a veces no la pagan ellos sino al que le cae encima el codigo. Como si te dieran una casa con una hipoteca que vale mas que la casa misma…ainnsss, a tira’la al rioooo

  5. Sí, en el primer vistazo del código, viendo que absolutamente todo es estático y antes de descubrir la maravilla de las 16 clases ventana, ya tenía intención de rehacerlo desde cero.

    Lo único que me vale/interesa de ahí es la parte del protocolo de comunicación con los equipos a los que van conectados los puertos, ya que de momento no tengo dichos equipos para probar. Ese software, aunque un poco de aquella manera, al menos funciona casi en un 100% (he encontrado también algún fallo de funcionamiento).

  6. Uy, yo lo que espero es que haya hecho el copy-paste después de que el código le funcionara bien y no haya tenido que corregir ningún bug después del copy-paste.
    Y espero, sobre todo, no descubrir yo ningún bug ahí.

  7. Jaja, me estoy imaginando cómo sucedió:

    Primera clase ventana: «a ver a ver… en este ejemplo de definir una clase pone STATIC… supongo que habrá que ponerlo…»

    Un rato después: «¿Cómo que no puedo hacer varias ventanas de la misma clase?… Voy a buscar un manual…»

    «Vaya, qué gordo es el manual… ¿y si copio y pego quince vedecs?»

    Debería haber más gente suscrita a «chuidiang.com». jeje

  8. Pingback: Diario de Programación » Blog Archive » ¿Qué habría pasado de usar TDD?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.