Tinselcity

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
old:ay_ay_ay_agile [2020/09/04 08:32]
flynn
old:ay_ay_ay_agile [2020/10/10 12:58] (actual)
flynn
Línea 1121: Línea 1121:
  
 Y Karen no la creería... salvo que "cosas más raras se han visto". Así que simplemente asiente y le dice que por lo menos eso significa que la aplicación funciona como debe, ¿no? Aisha se va, no convencida por ese argumento, seguramente a buscar otro motivo por el que gritar a alguien. Y Karen no la creería... salvo que "cosas más raras se han visto". Así que simplemente asiente y le dice que por lo menos eso significa que la aplicación funciona como debe, ¿no? Aisha se va, no convencida por ese argumento, seguramente a buscar otro motivo por el que gritar a alguien.
 +
 +----
 +
 +Hace tiempo, en una reunión en la que el Arquitecto proclamó que él hacía todo bien, comenté que algo que había encontrado por el código era un buen puñado de sitios en los que alguien había decidido usar ''eval'' de forma totalmente innecesaria. El Arquitecto no solo mostró sorpresa sino que comentó algo que dejara clara la evidente obviedad de que eso debía haberlo escrito alguno de los seres inferiores (cualquiera del equipo salvo él mismo).
 +
 +Hoy mientras hacía algunas tareas de limpieza he encontrado un cierto fragmento y, aburrido y triste por otros asuntos que había traído la mañana, he decidido buscar en el historial del repositorio. El fragmento era este:
 +
 +<sxh javascript>
 +/**
 + recibiendo el id de un campo select y un valor, busca este ultimo entre los valores
 + del select y si lo encuentra lo marca
 +*/
 +function setSelectValue(selectId, value) {
 +  eval('selectObject = document.getElementById("'
 +    selectId + '");');
 +  if (selectObject) {  
 +  for(index = 0; 
 +    index < selectObject.length; 
 +    index++) {
 +    if(selectObject[index].value == value)
 +    selectObject.selectedIndex = index;
 +    }
 +   }
 +}
 +</sxh>
 +
 +Así, con esa misma indentación... Que es otra de las cosas que el Arquitecto atacó fácilmente con un "Es que no se debería dejar nunca que se metiera código en el repositorio que no tuviera un mínimo de orden y estuviera bien //identado//"((El Arquitecto no dice "indentar", dice "identar"; probablemente porque, como la mitad de las cosas que dice, no sabe bien del todo lo que significa)). Pero sobre todo me llamó la atención el comentario. Porque es el tipo de comentario que escribe el Arquitecto; encaja con su forma de hablar.
 +
 +Y efectivamente ahí estaba. Abril de hace 12 años. Escrito y subido al repositorio por el propio Arquitecto. Así con ese horriblemente innecesario y ridículo...
 +
 +<sxh javascript>
 +  eval('selectObject = document.getElementById("' + selectId + '");');
 +</sxh>
 +
 +Y en mi aburrimiento he seguido tirando del hilo y han aparecido toda una serie de usos similares de ''eval'' y todos y cada uno de ellos son... sí, del Arquitecto.
 +
 +----
 +
 +Creo que lo de [[old:ay_ay_ay_agile:hasta10000|hasta10000]] lo voy a escribir en su propia página porque ya no sé muy bien si todo esto está ocurriendo realmente o si de repente se abrirá una puerta y saldrán gritando que todo era broma y tirando confetti y qué sé yo.
 +
 +----
 +
 +Llevo tiempo sin mencionar la palabra //Agile//. Es porque ya se han olvidado de eso. El modelo de gestión y organización del proyecto desde principio de año aproximadamente es una especie de //metodología post-apocalíptica//. Es como aquellas pelis de los ochenta y noventa de dibujos animados donde todo es desierto y abandono y ruinas y hay a lo mejor 3 humanos, un perro y algunos robots. Y cada uno va a lo suyo y nadie habla con nadie y hay algún rico tirano que observa desde su fortaleza de acero y cristal y se ríe pero nunca interviene porque no se atreve a mezclarse con el mundo exterior. Y los humanos vagan por las ruinas sin saber bien por qué pero haciendo tareas comunes como para aparentar normalidad en sus vidas pero sus vidas son cualquier cosa menos normales. Y hay un tipo que intenta hacer cosas con trastos viejos como si fuera a reconstruir algo (ese es Gunther el experto en BBDD que aún tiene esperanzas). Y hay otra que cree firmemente que todo es normal y que todo va bien y sigue a lo suyo sin hacer caso a nadie ni a nada. La mayoría simplemente vaga sin ningún interés ya, haciendo su rutina de almorzar, de ocuparse de sus cosas, de cuchichear sobre el tirano, etc.
 +
 +Pues así, pero en una sala, fichando al entrar y al salir, discutiendo por el aire acondicionado, y con el Arquitecto en su casa desde hace 6 meses porque es la única //"persona de importancia para el proyecto"//((Palabras del Traje)).
 +
 +----
 +
 +Hay una tabla que, en el entorno de desarrollo, tiene 3,512,282 registros. Es la tabla en la que se guardan los errores de la aplicación. Los 3.5 millones de errores son solo de los últimos cuatro años que parece que es cuando dejaron de hacerle caso.
 +
 +Creo que es la única tabla que hace la paginación en BBDD y acaba de tardar unos 40 minutos en traerme una página.
 +
 +----
 +
 +Monty vuelve a preguntarme.
 +
 +Sinceramente, cada vez que me pregunta Monty siento que pierdo yo. Si, lo reconozco. Pierdo la paciencia, pierdo las ganas, las de vivir incluso.
 +
 +En el perfil de LinkedIn de Monty se ha puesto como "Programador Senior". De hecho, su perfil muestra varias experiencias como "programador senior" desde 2006 y con montones y montones de conocimientos. "NodeJS, Express y MongoDB", "Programación Funcional", Gulp, Sass, PHP5, Underscore, JSF, SQL Server, Angular, Ionic, PL/SQL... y la foto en blanco y negro, que da más categoría.
 +
 +Monty no tiene ni puñetera idea de ninguna de esas cosas. Pero el problema de Monty no es ese. Su problema es que pregunta, pero no hace caso. Y así nunca aprende.
 +
 +Hoy me pregunta, por un tema de un listado que está haciendo y quiere actualizar una cosa y no se puede. Bueno, //"no se puede"//. Poderse se podría, con mucho trabajo, con más chapuza, y deshaciendo un montón de lo que ya ha hecho. Y todo eso para conseguir, además, que esa actualización funcione diferente de todas las demás que ya ha hecho en ese mismo listado, que es algo que al cliente //seguro// que no le hace gracia.
 +
 +Así que se lo digo. Bueno, nos retorcemos y apretamos intentando llegar a este punto en el que consigue decirme qué es lo que está intentando hacer y yo consigo entender qué es lo que realmente debería hacer. Pero eso son detalles. Llegamos a este punto y se lo explico. //No, no vayas por ese camino. Haz esto otro.// Que además, "esto otro" es muchísimo más simple y ya se lo doy mascado.
 +
 +> Mira, aquí, en este punto del código donde ya tienes estos datos, coges estos otros datos que los sacas con esta función y luego haces una llamada AJAX con todo eso. Y cuando te responda, actualizas esto de aquí con esta otra función.
 +
 +//Vale// - me dice convencido. Ha apuntado lo que he dicho en un editor y parece que lo tiene claro. Yo reconozco que ya me cansa bastante Monty. Podría preguntar más, asegurarme mejor de que lo ha entendido, pero sé que eso no importa. Sé lo que va a pasar.
 +
 +Le dejo mientras vuelvo a hacer mis cosas. Al rato noto que ha llamado a Fred para que le ayude. No quiero meterme, así que les dejo hacer, esperando que quizá con Fred se entienda mejor.
 +
 +Unas tres horas después, Monty, que sigue con Fred al lado los dos trabajando juntos, se levanta y viene de nuevo a preguntarme... Y me pregunta //exactamente lo mismo que me preguntó inicialmente//. Podría pensar que es una broma. Monty tiene un humor poco convencional. Pero no, no es una broma.
 +
 +> ¿Me estás preguntando para hacer lo que hemos dicho hace tres horas que **no** ibas a intentar hacer? ¿Lo que te dije que no hicieras?
 +>> Sí...
 +> ¿Por qué?
 +>> ...
 +> Te acuerdas que te dije hace tres horas que lo hicieras de la otra forma, ¿verdad? Me dijiste que vale. ¿Qué ha pasado con eso? ¿Ha cambiado algo en estas tres horas?
 +
 +No me contesta. Seguramente mi tono no es muy amigable y lo sé. Me contengo todo lo que puedo pero sé que no es suficiente. Le digo que vaya y que lo hagan como le había dicho.
 +
 +Tardan 8 minutos en hacerlo.
 +
 +> Ya funciona - me dice.
 +
 +No sé qué decirle. No es la primera vez que hace esto. Ni la segunda ni la tercera. Ha llegado a perder un par de semanas enteras después de haberme preguntado y haberle dado la solución, solo porque ha querido seguir haciéndolo de la otra forma. Una vez llegué a decirle que como no hacía ni caso de lo que le decía, que no volviera a preguntarme nada. Algo que luego, evidentemente, ninguno de los dos mantuvimos. Pero no creo que podamos seguir así. Tendré que hablar con él, otra vez más. O realmente dejar de contestar sus preguntas. O algo. No sé el qué, pero algo.
 +
 +----
 +
 +Hay una funcionalidad de planificación y control del tiempo. No es genérica, sino que está centrada en las tareas que gestiona la aplicación, en particular tareas de mantenimiento.
 +
 +Se organiza todo alrededor de una tabla en la que se guardan "actividades realizadas", con su fecha, el tiempo empleado y //el concepto//.
 +
 +El concepto es un código. Hasta hace poco había 2 valores posibles: ''1'' y ''2''. El ''2'' significa que es un tiempo invertido en una tarea de mantenimiento. El ''1''... bueno, el ''1'' significa que es //otra cosa//. No es que no lo quiera explicar, es que es eso: O es mantenimiento o es otra cosa.
 +
 +Ahora añadimos el valor ''3'' para tareas de transporte. Esto, en sí mismo es poco importante, pero es el desencadenante para que me encuentre yo con este jaleo entre manos. Jaleo, sí, porque cuando tienes un código con dos valores posibles y uno significa "pues lo demás", está claro que no tienes las ideas muy claras de qué es eso. Y eso se traduce en que no se sabe qué nombre dar a las cosas y el proceso almacenado que saca esta información termina llamándose ''consultarConcepto''. Y peor, cuando los //"conceptos"// se agrupan y ordenan para pintarlos en un calendario, los conceptos se acaban agrupando en dos, obviamente, y uno de los grupos es "otras cosas". Pero no vas a llamarlo "otras cosas" porque sería muy evidente que no sabes lo que estás haciendo, así que el grupo de otras cosas se llama simplemente "concepto" y el otro "tareas" porque se sabe que es tiempo trabajado en mantenimiento y está más claro.
 +
 +Pero no podía ser tan simple. Según la BBDD tenemos ''1'' -> otras cosas -> "concepto" y ''2'' -> mantenimiento -> "tareas". Pero a mitad de camino hacia que esto se pinte en un calendario en la pantalla del usuario, se hace //el twist//. Si es ''1'' se marca como ''tareas'' y si es ''2'' se marca como ''concepto''. Se manda a la página y luego en la página se vuelve a cambiar: ''tareas'' es "no tareas", o sea "otras cosas" y ''concepto'' es "tareas".
 +
 +Cuando le pregunto a Analise, la analista, ya por segunda vez que por favor me confirme que ese ''1'' y ese ''2'' significan lo que tienen que significar, me siento obligado a enseñarle el código que hace el twist para que no piense que es que soy yo el idiota y no me creo lo que dice. Pero sí, el twist lleva ahí unos 8 años. Le enseño el código.
 +
 +> Uh... sí, es confuso, sí... Vaya. No sé por qué estará así... - me dice.
 +
 +Está así porque nadie tiene ni idea de lo que hace, obviamente. No es la primera vez que me encuentro con un //twist// de estos.
 +
 +En fin, sigo con lo mío. Rocky, el tipejo que me ha soltado este marrón porque a él no le apetece hacerlo, es el mismo que me dijo que él no pensaba cambiar nada en absoluto de cómo hacía las cosas y le daba igual todo lo que le pudiera decir. Como es natural, lo que me ha dejado es un montón de mierda copiada y pegada desde otro sitio que es "parecido pero distinto". Me reuní con él y con Analise para que me contara cómo estaban las cosas y cómo me lo iba a dejar Rocky.
 +
 +> Había puesto ya todo lo de las horas extra pero resulta que no hay que ponerlo. Así que ahora lo quito antes de salir, que mañana y pasado yo no voy a estar.
 +
 +Como es "normal", hoy me encuentro que lo de las horas extra sigue ahí puesto. Pero es que es mejor aún. Hay que seguir trayendo los datos de las horas extra de todos modos, aunque no se vayan a sacar, porque Rocky ha decidido meter en esa consulta un dato que no tiene nada que ver y ese sí que hace falta.
 +
 +No voy a discutir con Rocky... sobretodo porque no está, porque cuando suelta una de estas se toma un par de días libres para no estar y que nadie le diga nada. Tampoco es la primera vez que me cae una mierda de estas de Rocky.
 +
 +Y en algún momento de la mañana ha venido el Coronel a agradecernos el esfuerzo de //estar ahí//((que supongo que significa que de trabajar en remoto ni hablamos)) y a decirnos la gran confianza que tiene en la labor técnica del equipo. Supongo que es lo que llaman //confianza ciega//, porque si vieras cómo es de verdad la labor técnica de este equipo no confiarías ni un ápice.
 +
 +----
 +
 +<sxh javascript>
 +total = parseFloat(24);
 +</sxh>
 +
 +----
 +
 +Reconozco que me empieza a costar bastante tratar con Monty...
 +
 +Hace unos seis meses, Monty, Edward y yo aceptamos hacernos cargo (por lo menos temporalmente) de una serie de tareas mayormente de maquetación y algunas cosas más. Son tareas bastante aburridas, la verdad. Ninguno de los tres quería tener que cargar con todo y tampoco el Traje quería tener que dedicar a una única persona de forma exclusiva. Así que entre todos acrodamos que se haría así, conjuntamente.
 +
 +Se creó un usuario genérico en Jira al que se asignarían todas esas tareas y Monty, Edward y yo las iríamos cogiendo sin mucha ceremonia, simplemente según fueramos viéndolas llegar.
 +
 +Seis meses después yo no estaba demasiado contento con algún detalle. Les digo a Edward y Monty que me gustaría que lo habláramos. Les explico que no busco un confrontamiento pero que en seis meses yo he cogido 138 tareas de estas, Edward 78 y Monty ha cogido... //25//.
 +
 +Lo primero que hace Monty es dudar de los números. Los verifica. Luego sugiere que a lo mejor sus 25 tareas son mucho más complejas... pero rápidamente abandona esa idea. Me imagino que intuye que si sigue por ese camino le voy a tener que recordar todas esas veces en que ha perdido horas, días, e incluso semanas haciendo algo que después, cuando ha aceptado hacer como le decía, ha tardado 30 minutos como mucho.
 +
 +Luego Monty confiesa, con toda normalidad, que bueno, que es que él no mira esas tareas desde hace meses. En fin, como digo no busco el confrontamiento, así que para no tener que decirle nada desagradable, le ofrezco que sugiera alguna idea sobre qué podemos hacer y cómo podemos mejorar esto.
 +
 +Monty dice que... vaya, Monty dice que a él le parecería bien que siguiéramos así como lo hemos estado haciendo hasta ahora.
 +
 +Ni siquiera se le ocurre tratar de vestirlo un poco bonito. No se le ocurre decir que sigamos así pero que va a hacer un esfuerzo por coger más tareas ni nada similar. Solo que sigamos así, que a él eso le parece lo mejor.
 +
 +A veces tengo dudas sobre Monty. No sé si es simplemente idiota, si es que no es capaz de entender lo que le están diciendo, o si realmente tiene esta actitud intencionadamente y se hace el idiota.
 +
 +----
 +
 +He encontrado //otro// invento del Arquitecto basado en usar ''eval''.
 +
 +Resulta que hay una media docena de sitios en la aplicación donde hay una pequeña lista de cosas -normalmente enlaces-. Y en un momento dado a alguien por algún motivo se le ocurrió que sería interesante poder ordenar esas listas de varias formas.
 +
 +Estas listas se pintaban desde JavaScript, a base de pasar un //array// con los enlaces y sus textos. La solución parece fácil. Se hace un...
 +
 +<sxh javascript>
 +arrayDeEnlaces.sort(ordenacion);
 +</sxh>
 +
 +...y se le pasa la función ''ordenacion'' como parámetro. El problema es que el Arquitecto no debía saber que se pueden pasar funciones de aquí para allá. Supongo, no sé. Porque la solución del Arquitecto es pasar //el nombre de la función// como una cadena. Y luego, hacer esto otro:
 +
 +<sxh javascript>
 +arrayDeEnlaces.sort(eval(ordenacion));
 +</sxh>
 +
 +Esto además es simpático porque luego resulta que salvo en 1 caso, nunca se pasa nada en ''ordenacion''. //Shrug//