{"id":1088,"date":"2013-08-14T12:56:25","date_gmt":"2013-08-14T10:56:25","guid":{"rendered":"http:\/\/mundowdg.com\/blog\/?p=1088"},"modified":"2013-08-14T13:29:49","modified_gmt":"2013-08-14T11:29:49","slug":"el-codigo","status":"publish","type":"post","link":"https:\/\/mundowdg.com\/blog\/2013\/08\/14\/el-codigo\/","title":{"rendered":"El c\u00f3digo"},"content":{"rendered":"<p>Tengo la boca grande como un buz\u00f3n. Media vida metido en el departamento de inform\u00e1tica y a\u00fan me tengo que castigar el lomo yo mismo por lo inocente que soy. Pero no digo que tenga la boca grande por ser indiscreto, o falt\u00f3n, que tambi\u00e9n; sino porque cada vez que me preguntan contesto con lo que yo s\u00e9 que es verdad y no con lo que quieren escuchar. Ser honesto en la vida es una puta mierda.<\/p>\n<p>Suprakillminds depende enormemente de la buena marcha de una aplicaci\u00f3n muy particular. La dichosa aplicaci\u00f3n la usan muchos usuarios y ha de ser r\u00e1pida, veloz y ligera cual gacela huyendo de un guepardo con hambre de seis d\u00edas y zapatillas nuevas.<\/p>\n<p>Cuando compraron la aplicaci\u00f3n, y maldigo al lenguaje HTML por no tener suficientes herramientas de formato para remarcar el \u00abcompraron\u00bb; result\u00f3 que todo iba como la seda. Asignamos un servidor normalito, con treinta y dos gigas de RAM y dos procesadores de ocho n\u00facleos con tres discos SAS de trescientos gigas en RAID 5. Una cosa normalita para mover una base de datos e intercambio de ficheros de operaciones.<\/p>\n<p>La aplicaci\u00f3n en cuesti\u00f3n se comunica con dispositivos remotos mediante un fichero que se deja en un directorio y los dispositivos remotos preguntan si hay algo mediante FTP, o si tienen que dejar algo para que la aplicaci\u00f3n procese, pues lo dejan mediante el mismo sofisticado mecanismo. Hasta ah\u00ed todo muy siglo XX, pero bien. Entonces, la parte servidora hace lo que co\u00f1o sea que tenga que hacer y devuelve el resultado a impresoras, dispositivos, gente, m\u00e1quinas de caf\u00e9, etc.<\/p>\n<p>Todo esto que cuento no puede parecerle a nadie ni medio complicado. No lo es. De hecho, las operaciones se parecen mucho a un carrito de la compra. Sin embargo, de un tiempo a esta parte, la aplicaci\u00f3n se ha ralentizado hasta l\u00edmites inaceptables.<\/p>\n<p>La base de datos no es. Aqu\u00ed mi colega el MKII ha sacado los diplomas Emec\u00e9, los ha puesto encima de la mesa y ha tuneado la base de datos puesto que el servidor de bases de datos fue forjado en Mordor. De hecho, la base de datos responde ahora como un puto tiro. Me voy a tener que hacer un Emec\u00e9 para aprender cosas tan chula. No quisiera quitarle m\u00e9ritos a MKII por nada del mundo. Es un t\u00edo formado y serio. Pero que digo yo que se tiene que notar el aumento de rendimiento si pones \u00edndices coherentes a las tablas de la base de datos. Aunque sea uno. Porque no ten\u00eda ni un mal \u00edndice. Nada.<\/p>\n<p>Descartada la base de datos miramos el procesador. Los procesadores. Nada. La aplicaci\u00f3n provocaba algunos picos pero nada que perturbase la paz de los diecis\u00e9is n\u00facleos instalados. Tan panchos estaban lim\u00e1ndose las u\u00f1as.<\/p>\n<p>La memoria no era tampoco. Hab\u00eda memoria libre para aburrir. El disco tampoco estaba muy ocupado, la verdad. La red local estaba tocando las palmas y los enlaces al exterior relajados y con capacidad testada. No era tampoco.<\/p>\n<p>Aquello ten\u00eda pinta de que iba a ser el pin siete del RJ45 o que hab\u00edamos encendido el servidor con el dedo en \u00e1ngulo de doce grados en lugar de diecis\u00e9is. Vamos, que s\u00f3lo nos quedaba un sospechoso: el programa.<\/p>\n<p>Y ah\u00ed estuvo mi error. $Hyperboss fue informado pertinentemente por Gargamel de un problema inform\u00e1tico sin resolver y nos reuni\u00f3 a MKII y a mi en su despacho. Muy serio.<\/p>\n<p>-Pero vamos a ver, Wardog: si el servidor es muy lento, c\u00e1mbialo.<br \/>\n-Que no. que no es lento, oiga. El servidor no es.<br \/>\n-\u00a1Ponle m\u00e1s memoria!<br \/>\n-No le hace falta, no la est\u00e1 gastando.<br \/>\n-\u00bfEntonces?<br \/>\n-Como no sea el programa&#8230;<br \/>\n-\u00bfY por qu\u00e9 iba a ser el programa?<br \/>\n-Por exclusi\u00f3n. Me quedan el programa y los usuarios. Y por una vez les voy a dar un voto de confianza a los usuarios porque no pueden tocar nada de la aplicaci\u00f3n, s\u00f3lo la echan de comer.<br \/>\n-Pues llama a los del programa.<br \/>\n-Ya lo he hecho.<br \/>\n-\u00bfY qu\u00e9 te dicen?<br \/>\n-Que es por la red de la empresa, que a ellos les va bien.<br \/>\n-\u00a1Pues cambia la red!<br \/>\n-No. Va bien. La red no es.<br \/>\n-\u00bfLo sabr\u00e1n mejor los del programa, no?<br \/>\n-No. Ellos ni puta idea de c\u00f3mo va nuestra red. Ellos saben de su programa.<br \/>\n-Vale, pues si no es la red, \u00bfqu\u00e9 es?<br \/>\n-Insisto: el programa o el usuario. Descarto el usuario.<br \/>\n-Pues busca otra causa.<br \/>\n-Un pitufo epil\u00e9ptico ha estado practicando sexo t\u00e1ntrico con doce sapos encantados sobre los portales RFID me parece una causa razonable.<br \/>\n-\u00a1Una causa seria!<br \/>\n-Con todos los respetos- interrumpe EL M\u00e1quina II,- pero Wardog tiene raz\u00f3n. No puede ser otra cosa que el programa. Hemos descartado las dem\u00e1s opciones y no tenemos ning\u00fan inter\u00e9s en llevar raz\u00f3n, sino que simplemente, el resto de posibles causas est\u00e1n funcionando perfectamente.<br \/>\n-Vamos a ver si nos entendemos, muchachos-, se frota el puente de la nariz concienzudamente.- He pagado una cifra considerable a una empresa de desarrollo de software muy conocida para que esa aplicaci\u00f3n vuele. No me puedo creer que, despu\u00e9s de seis meses, ya no funcione. Algo hab\u00e9is tocado.<br \/>\n-No. Conforme la dejaron los artistas de $Bullshitsoft est\u00e1. De hecho, ni siquiera hemos habilitado ning\u00fan puesto nuevo ni hemos quitado los existentes. Cero cambios.<br \/>\n-\u00a1Pues algo tiene que ser!- dice con un pu\u00f1etazo en la mesa.<br \/>\n-\u00a1Pues es el programa!- replico con una palmada y un firulillo flamenco por encima de la cabeza.<\/p>\n<p>Nos miramos fijamente a los ojos. \u00c9l con el pu\u00f1o a\u00fan en la mesa. Yo, con la mano a diez cent\u00edmetros de la cabeza \u00a0y la palma hacia arriba.<\/p>\n<p>-El programa no puede ser, Wardog. Que me ha costado una millonada.<br \/>\n-Primera fase del duelo: negaci\u00f3n. El Titanic tambi\u00e9n cost\u00f3 una millonada. Y ah\u00ed est\u00e1, en calo.<br \/>\n-Pues mira a ver qu\u00e9 falla en el programa y arr\u00e9glalo.<br \/>\n-No puedo.<br \/>\n-\u00bfC\u00f3mo que no puedes?<br \/>\n-No puedo. Sabemos que en los dispositivos el cambio de una pantalla a otra tarda mucho, pero no sabemos qu\u00e9 co\u00f1o hace en el intervalo. A veces la conexi\u00f3n explota y otras veces suelta un error inespec\u00edfico. Pero sin el c\u00f3digo fuente no podemos saber qu\u00e9 es lo que le pica.<br \/>\n-\u00a1Pues que lo arreglen los de $Bullshitsoft!<br \/>\n-No. Como son tan guays y tan caros, si no les damos un diagn\u00f3stico claro, no mueven un dedo.<br \/>\n-\u00bfC\u00f3mo que no?<br \/>\n-Como que no. Que o les decimos qu\u00e9 va mal o no pueden hacer nada. Y nuestra mejor aproximaci\u00f3n a un diagn\u00f3stico detallado es: \u00abTodo va lento\u00bb.<br \/>\n-\u00a1Ponme con ellos!<\/p>\n<p>Marco el n\u00famero en el tel\u00e9fono de sobremesa de $Hyperboss. Pide hablar con soporte. Grita mucho. Dice que va lento. Se calma. Dice que eso espera. Cuelga.<\/p>\n<p>-Ya est\u00e1, solucionado.<br \/>\n-\u00bfYa va r\u00e1pido el programa?<br \/>\n-No, joder. Ma\u00f1ana tenemos aqu\u00ed a un ingeniero de la empresa para arreglarlo. S\u00f3lo hac\u00eda falta ponerse duro.<br \/>\n-Entonces no est\u00e1 solucionado.<br \/>\n-\u00a1Pero ma\u00f1ana estar\u00e1 solucionado!<br \/>\n-Vale, vale, si yo lo dec\u00eda por hablar con propiedad.<\/p>\n<p>Al d\u00eda siguiente, a las nueve de la ma\u00f1ana se present\u00f3 un ingeniero de $Bullshitsoft en $Suprakillminds, con su chaqueta, su corbata y las manos en los bolsillos. $Deity me libre de prejuzgar a la gente, pero mi olfato canino para detectar imb\u00e9ciles me estaba alertando acerca de este individuo.<\/p>\n<p>Le cog\u00ed de la manita y me lo llev\u00e9, a petici\u00f3n suya, a ver c\u00f3mo iban de lento los terminales equipados con su software. Se coloc\u00f3 detr\u00e1s de un operario para ver c\u00f3mo trabajaba el hombre.<\/p>\n<p>-Ah\u00e1-. Dijo muy concentrado el ingeniero.- Parece que tenemos un problema de velocidad.<br \/>\n-\u00a1No me digas! \u00bfC\u00f3mo lo has notado? \u00bfQuiz\u00e1 por el hecho de que nuestro operario puede pulsar un bot\u00f3n cada minuto y medio?<br \/>\n-S\u00ed. Parece que hay algo que ralentiza la aplicaci\u00f3n.<br \/>\n-Y as\u00ed, concretando m\u00e1s&#8230;<br \/>\n-No s\u00e9. Pero efectivamente, va todo muy lento.<br \/>\n-Eso ya lo sab\u00edamos y os lo hicimos saber.<br \/>\n-Pero ahora ya lo sabemos con certeza.<br \/>\n-Anda. Oye, me tienes que decir d\u00f3nde estudia uno la carrera de saber las cosas con certeza. Porque ya hemos comunicado en varias ocasiones que todo el aplicativo se arrastra como una babosa coja.<br \/>\n-Bien, yo hablar\u00e9 con los programadores para que lo revisen.<br \/>\n-\u00bfPara que revisen qu\u00e9?<br \/>\n-El problema de lentitud.<br \/>\n-\u00bfY cu\u00e1l es la causa concreta por la que va lento?<br \/>\n-No lo s\u00e9, es algo general.<br \/>\n-T\u00f3cate los cojones. Yo, de verdad, con vosotros es que aprendo. \u00a1Ay si yo me hubiese hecho ingeniero en vez de puta!<\/p>\n<p>El ingeniero ingenioso se fue con las manos en los bolsillos as fast as he came. Dejando en mi correo electr\u00f3nico un precioso informe de dos l\u00edneas redactado al vuelo con su Ladrilloberry. Eso es un usuario m\u00f3vil avanzado, amigos.<\/p>\n<p>Le ense\u00f1\u00e9 el informe a $Hyperboss. Lo ley\u00f3 doce veces, incr\u00e9dulo. El informe rezaba:<\/p>\n<blockquote><p>Detectada ralentizaci\u00f3n en todos los procesos de la aplicaci\u00f3n.<\/p>\n<p>Se pasa tarea a soporte para correcci\u00f3n y puesta en producci\u00f3n.<\/p><\/blockquote>\n<p>Y debajo la firma del Ingeniero en Diagn\u00f3sticos por la prestigiosa Universidad Handinpockets.<\/p>\n<p>Casi pod\u00eda apreciar c\u00f3mo la ira se abr\u00eda camino desde la v\u00e9sicula biliar de $Hyperboss hacia su garganta y c\u00f3mo el hombre, en un esfuerzo de autocontrol la reten\u00eda ah\u00ed.<\/p>\n<p>-Wardog&#8230; \u00bfc\u00f3mo se llama eso que dec\u00eds los inform\u00e1ticos para tocar los programas?<br \/>\n-\u00bfDedo? &#8211; juego con \u00e9l.<br \/>\n-No, co\u00f1o. Lo de programar.<br \/>\n-Ah. C\u00f3digo fuente.<br \/>\n-Si os consigo el c\u00f3digo fuente, \u00bfpod\u00e9is mirar qu\u00e9 co\u00f1o le pasa a la aplicaci\u00f3n?<br \/>\n-Podemos intentarlo. Pero no le van a dar el c\u00f3digo fuente.<br \/>\n-Ya te digo yo que s\u00ed me lo dan.<\/p>\n<p>Dicho y hecho. Al d\u00eda siguiente $Hyperboss se present\u00f3 en el departamento mientras desayun\u00e1bamos y me puso en la mesa un pendrive con el c\u00f3digo fuente de la aplicaci\u00f3n de los cojones. MKII y yo lo miramos atemorizados. Parece vibrar quedamente, emitir una especie de fulgor fantasmag\u00f3rico. Era algo dif\u00edcil de explicar. Como una luz oscura. Como si estuviese iluminado por la oscuridad que emit\u00eda.<\/p>\n<p>Al final lo cog\u00ed con m\u00e1s curiosidad que ganas y lo puse en mi equipo. Abr\u00ed el pendrive y vi que conten\u00eda un directorio de nombre \u00abSRC\u00bb. Vamos bien, hasta ah\u00ed lo entiendo. Abro el directorio y veo el nombre Suprakillminds. Abro y tenemos \u00absrv\u00bb y \u00abclt\u00bb. Joder, qu\u00e9 bueno soy. Hasta aqu\u00ed entiendo todo.<\/p>\n<p>Abro primero \u00absrv\u00bb y veo un proyecto de Mordor C\u00e9 Cross Plus. Abro el proyecto y ante m\u00ed se muestra en toda su grandeza. Siempre me maravillo cuando veo un programa hecho con un lenguaje orientado a objetos que no implementa ni una clase. De hecho, el programa principal parece ser un monol\u00edtico fichero. Todo corre en un gigantesco loop cuya \u00fanica condici\u00f3n de salida es, al parecer, un valor uno en una variable de nombre \u00absalir\u00bb.<\/p>\n<p>Empiezo a leer mientras MKII gestiona cosas, pero tanto me oye bufar que se trae la silla a mi puesto y se pone a leer en la pantalla.<\/p>\n<p>-Mira, tenemos seis scrolls completos s\u00f3lo para las variables globales. No est\u00e1 mal, \u00bfeh?<br \/>\n-\u00bfY por qu\u00e9 hay tantas variables globales?<br \/>\n-Y \u00a0yo qu\u00e9 s\u00e9. Espera, espera, terrible sospecha. Mira, ah\u00ed est\u00e1.<br \/>\n-\u00bfEl qu\u00e9?<br \/>\n-\u00bfNo lo ves? \u00a1Todas las funciones devuelven void!<br \/>\n-\u00a1No jodas!<br \/>\n-\u00a1Claro! \u00a1Son unos cracks! \u00a1Si todas las variables son globales no hace falta pasar par\u00e1metros ni devolver valores!<br \/>\n-Pero eso no es eficiente.<br \/>\n-\u00a1Porque t\u00fa lo digas! \u00a1Es s\u00faper efectivo! \u00a1Efectivo que te defecas haciendo estrellitas!<br \/>\n-\u00bfHablas en serio?<br \/>\n-No. Ah, mira, \u00bfves? Aqu\u00ed hay funciones que no devuelven void. Desde luego, qu\u00e9 malpensado somos.<br \/>\n-Oye, pero esa funci\u00f3n&#8230;<br \/>\n-S\u00ed, \u00bfqu\u00e9 pasa? Suma dos variables globales y devuelve el resultado. Y te callas que te veo un poco talib\u00e1n del Mordor C\u00e9 Cross Plus.<br \/>\n-\u00bfHablas en serio?<br \/>\n-Que no, co\u00f1o, pero es que si no relajo tensiones con las co\u00f1as me van a empezar a sangrar los ojos.<br \/>\n-Espera, espera, \u00bfqu\u00e9 es eso?- me dice MKII abriendo mucho los ojos y se\u00f1alando la pantalla. Me da palmaditas con su mano helada en el antebrazo.<br \/>\n-Oh. $deity desdoblado.<\/p>\n<p>Me envaro en la silla y empiezo a hiperventilar. Antes nuestros estupefactos ojos se muestran brillantes, s\u00f3lidos, rotundos y pulidos, incontables GOTOs destacando sobre el blanco del editor como una macha de sangre fresca en la nieve. Pero no es s\u00f3lo el GOTO infame. Es que, uno tras otro, y sin orden l\u00f3gico aparente, los GOTOs env\u00edan la ejecuci\u00f3n del programa a etiquetas de nombre tan espec\u00edfico como \u00abLabel1\u00bb, \u00abLabel2\u00bb, \u00abLabel7\u00bb y as\u00ed hasta \u00abLabeln\u00bb siendo n un n\u00famero entero desaforado.<\/p>\n<p>Con los ojos a punto de sal\u00edrsenos de las \u00f3rbitas nos levantamos sin decir nada en busca de b\u00e1lsamo caliente. Por el pasillo nos encontramos a $Hyperboss. Le miramos con nuestra cara de espanto.<\/p>\n<p>-\u00a1Qu\u00e9 tal chicos! \u00bfEntend\u00e9is el c\u00f3digo fuente ese?<\/p>\n<p>Salimos corriendo gritando mucho con los brazos levantadaos. Bueno, esa fue mi primera intenci\u00f3n; y s\u00e9 que MKII me hubiese imitado, pero no. Permanecimos con nuestra cara de espanto estoicamente.<\/p>\n<p>-\u00bfChicos? \u00bfLo pod\u00e9is arreglar?<br \/>\n-Mire, $Hyperboss&#8230; eso no se puede arreglar. Por mucho que queramos. Es una perversi\u00f3n. Es&#8230; es&#8230;<br \/>\n-\u00bfYa estamos con las quejas? Primero que si no ten\u00e9is el c\u00f3digo fuente, luego que si lo \u00a0ten\u00e9is.<br \/>\n-$Hyperboss- dice MKII.- Ese programa es obsceno.<br \/>\n-Est\u00e1 tan mal hecho que parece fabricado con trozos aleatorios de manual.<\/p>\n<p>MKII y yo nos miramos inmediatamente. Claro, por eso las etiquetas de los gotos se llaman Labelx. Trozos de manual.<\/p>\n<p>-Becarios- decimos al un\u00edsono.<br \/>\n-\u00bfDe qu\u00e9 habl\u00e1is?<br \/>\n-Este programa lo han debido hacer becarios en precario.<br \/>\n-\u00bfCon lo que cuesta lo van a haber hecho becarios? \u00a1Que es una empresa seria!<br \/>\n-Con lo que cuesta. El programa compila y funciona cumpliendo los requisitos. Facturado. Los becarios son gratis o baratos. M\u00e1s margen de beneficio.- replico.<br \/>\n-Bueno, da igual. Me ha costado mucho conseguir el c\u00f3digo fuente. Arregladlo como sea.<br \/>\n-Haremos lo que est\u00e9 en nuestra mano.- contesta demasiado dispuesto MKII.<\/p>\n<p>Con un caf\u00e9 en el cuerpo la cosa parece m\u00e1s soportable. El ejecutable principal de la parte cliente no parece tener m\u00e1s problemas que la sobredosis de tumores de c\u00f3digo. El hijo de puta es feo y deforme, pero como s\u00f3lo tiene que recoger unos ficheros, leerlos y meterlos en la base de datos y vive en una m\u00e1quina absolutamente sobredimensionada, corre que se las pela.<\/p>\n<p>-Pero hay una cosa que no veo.- Dice MKII.<br \/>\n-\u00bfEl qu\u00e9?<br \/>\n-\u00bfC\u00f3mo pasa par\u00e1metros desde el bucle principal al programa de impresi\u00f3n?<br \/>\n-No s\u00e9, veamos el programa de impresi\u00f3n.<\/p>\n<p>Abro \u00abprint.cpp\u00bb y busco la entrada de par\u00e1metros. No la veo. Edici\u00f3n, buscar argc. Nop. \u00bfC\u00f3mo es posible? MKII y yo nos miramos extra\u00f1ados. \u00bfC\u00f3mo es posible que un programa necesite un par\u00e1metro para imprimir un resultado y no lo reciba al iniciar la ejecuci\u00f3n? \u00bfC\u00f3mo puede ser tan sofisticado? Una lectura r\u00e1pida de main lo explica de inmediato.<\/p>\n<p>-Esto es lo m\u00e1s grande, MKII.<br \/>\n-\u00bfEs eso lo que parece que es?<br \/>\n-Los par\u00e1metros los coge de una variable de entorno del sistema. \u00bfQu\u00e9 te parece?<br \/>\n-Pero&#8230; \u00bfno se supone que si eso es as\u00ed, se podr\u00eda sobreescribir la variable de entorno y que las impresiones salgan por donde les de la gana?<br \/>\n-Ve\u00e1moslo en el programa principal.<\/p>\n<p>Buscamos la llamada a print. Resulta que no, que no se puede sobreescribir dicha variable de entorno porque resulta que la llamada a print est\u00e1 detr\u00e1s de un bucle del que s\u00f3lo se sale si otra variable de entorno est\u00e1 a cero: la variable \u00abPUEDIMP\u00bb. As\u00ed, tal cual la escribo. Cuando PUEDIMP tiene el valor apropiado (no parece ser booleana, sino otra cosa, tal vez trileana con valores s\u00ed, no y ps\u00e1) se imprime y se cambia de nuevo el valor para indicar que est\u00e1 dispuesta a imprimir otra vez. Un sem\u00e1foro un poco r\u00fastico y sobre todo, muy seguro.<\/p>\n<p>-La madre que los pari\u00f3. \u00bfY t\u00fa sabes lo que ha costado esto, Maqui?<br \/>\n-Lo s\u00e9. Y por eso sufro m\u00e1s que t\u00fa.<br \/>\n-Al comercial de esta casa hay que juzgarlo en Estrasburgo.<br \/>\n-En fin. Sigamos. Esto est\u00e1 feo, pero no afecta a la velocidad. Vamos a ver el cliente qu\u00e9 hace.<\/p>\n<p>Abro el directorio del cliente. Ahogo un grito. Intento tragar saliva y me cuesta horrores. MKII me mira. Mira la pantalla. Suspira hondamente. Me levanto. Voy hacia un armario y con un suspiro lo abro. Aparto las tarjetas serialix, los conmutadores manuales de puerto paralelo, un disco duro de cuarenta megas y una bolsa de conectores BNC. Maldigo no haberme puesto guantes de amianto. Cojo la caja que hay al fondo, blanca y en cuyo frontal reza \u00abVisual Basic 6.0\u00bb.<\/p>\n<p>Saco el disco y lo meto en la unidad. Lo instalo en una m\u00e1quina virtual con XP y abro por fin el proyecto. Reconozco de inmediato los formularios de la aplicaci\u00f3n y paso a ver lo que hay detr\u00e1s. MKII no tiene experiencia con esta atrocidad y no lo lee con la misma fluidez que yo.<\/p>\n<p>-Los controles no tienen nombre. Bueno, tienen el nombre por defecto-le explico.- Bien. Cojonudo. El c\u00f3digo no est\u00e1 indentado. Mejor todav\u00eda.<br \/>\n-Para que luego digan que las llaves de C son un co\u00f1azo.<br \/>\n-Son una bendici\u00f3n divina. No me jodas.<\/p>\n<p>No pasa mucho rato hasta que veo el problema de lentitud de todos los clientes. El problema residen en la comunicaci\u00f3n con la base de datos.<\/p>\n<p>-Mira, MKII, ya he encontrado el porqu\u00e9 de la lentitud.<br \/>\n-\u00bfS\u00ed? \u00bfD\u00f3nde?<br \/>\n-Mira, \u00bfves esta matriz bidimensional?<br \/>\n-La veo.<br \/>\n-Pues ah\u00ed se monta la consulta SQL.<br \/>\n-\u00bfY por qu\u00e9 en una matriz?<br \/>\n-Por joder, porque no es para plantillar.<br \/>\n-Vale, \u00bfentonces a un lado el campo y al otro el valor y luego se concatena la sentencia?<br \/>\n-Que no, que no. A un lado se pone \u00abselect *\u00bb y al otro \u00abfrom tabla\u00bb y ya.<br \/>\n-\u00bfC\u00f3mo que \u00aby ya\u00bb?<br \/>\n-Y ya. No hay where. No se selecciona de m\u00e1s de una tabla.<br \/>\n-\u00bfEntonces c\u00f3mo se filtran los resultados de la consulta?<\/p>\n<p>Sonr\u00edo como un man\u00edaco.<\/p>\n<p>-Muy f\u00e1cil: iteramos todos los valores de la consulta y nos quedamos con el que nos coincida. \u00a1Es genial!<br \/>\n-\u00bfC\u00f3mo? \u00bfC\u00f3mo?<br \/>\n-\u00a1Es genial! Y si necesito una subconsulta&#8230; \u00a1repito el proceso!<\/p>\n<p>Una risa nerviosa se apoder\u00f3 de nosotros y nos tuvo fuera de combate durante una hora.<\/p>\n<p>\u00a1Bimbambidubi! \u00a1Dubi!<\/p>\n<p>-\u00a1Jiajiajiajiajia! \u00a1Sistemas, Joker al habla! \u00a1Jajajajaja!<br \/>\n-Cada d\u00eda est\u00e1is peor ah\u00ed. Oye, que no tenemos internet y necesito entrar en los bancos.<br \/>\n-\u00a1Jajajajaja! \u00a1Jiaaaajajajaja! \u00a1Bancos! \u00a1Bancos! \u00a1No s\u00e9 ni qui\u00e9n eres t\u00fa! \u00a1Jiajajajia! \u00a1Pero da igual! \u00a1Ir\u00e9 puesto por puesto comprobando si tienes internet!<br \/>\n-\u00bfDe qu\u00e9 hablas?<br \/>\n-\u00a1Es s\u00faper r\u00e1pido! \u00a1Jiajiajiaaaaaa!<br \/>\n-\u00bfMe lo arreglas o no?<br \/>\n-\u00a1No! \u00a1Jiaaaaajajajajaaaaa!<\/p>\n<p>Cuando por fin conseguimos rehacernos, desconectamos los tel\u00e9fonos y pasamos varios d\u00edas modificando chapuzas similares en ambas partes del programa. Despu\u00e9s de mucho tocar, de mucho corregir error de compilaci\u00f3n tras error de compilaci\u00f3n, conseguimos meter unos cuantos tumores que suplieran otros cuantos tumores m\u00e1s da\u00f1inos y la aplicaci\u00f3n volvi\u00f3 a correr decentemente.<\/p>\n<p>Como Gargamel no informaba de nuestros progresos a $Hyperboss, decid\u00ed mandarle un correo electr\u00f3nico.<\/p>\n<blockquote><p><strong>Asunto<\/strong>: La aplicaci\u00f3n ya va bien.<\/p>\n<p><strong>Cuerpo<\/strong> del texto: Pues eso.<\/p><\/blockquote>\n<p>A los pocos minutos me llama al despacho.<\/p>\n<p>-He llamado a unos cuantos usuarios para comprobar que va bien y me han dicho que ya va como al principio. \u00bfQu\u00e9 co\u00f1o le pasaba al programa?<br \/>\n-T\u00e9cnicamente a este problema se le conoce como \u00abRendimiento diferencial demo-producci\u00f3n\u00bb o \u00abMal del becario\u00bb.<br \/>\n-\u00bfY eso qu\u00e9 es?<br \/>\n-Pues que si un programa hace lo que tiene que hacer no necesariamente est\u00e1 bien hecho.<br \/>\n-Expl\u00edcate.<br \/>\n-El programa fue bien cuando ten\u00eda pocos datos que manejar. Conforme la base de datos creci\u00f3, result\u00f3 no estar bien preparado para manejar tantos datos.<br \/>\n-\u00bfY c\u00f3mo lo hab\u00e9is solucionado?<br \/>\n-Limitando los registros devueltos por la base de datos. \u00bfPero por qu\u00e9 le interesan los detalles t\u00e9cnicos? Normalmente \u00e9sto le importa una mierda.<br \/>\n-Para dec\u00edrselo al ingeniero de Bullshitsoft.<br \/>\n-Ah, yo les mando un informe.<br \/>\n-\u00bfNo te importa?<br \/>\n-En absoluto.<br \/>\n-Vale, gracias, Wardog.<br \/>\n-De nada. Oiga, una curiosidad. \u00bfC\u00f3mo consigui\u00f3 el c\u00f3digo fuente tan r\u00e1pido?<br \/>\n-\u00bfConoces a Astaroth?<br \/>\n-\u00bfEl abogado?<br \/>\n-\u00c9l se lo trajo en un pendrive en dos horas.<br \/>\n-Joder.<\/p>\n<p>Yo ser\u00e9 BOFH, pero \u00e9ste no veas lo cabr\u00f3n que llega a ser en el mundo real. Astaroth es a los abogados lo que un volc\u00e1n a un mechero de gas. Es capaz de acojonar a Satan\u00e1s.<\/p>\n<p>Volv\u00ed a mi despacho y redact\u00e9 un email<\/p>\n<blockquote><p><strong>Para<\/strong>: jefazos@bullshitsoft.es<br \/>\n<strong>CC<\/strong>: higiniero@bullshitsoft.es<\/p>\n<p><strong>Asunto<\/strong>: Aplicaci\u00f3n arreglada. Informe de reparaci\u00f3n.<br \/>\n<strong>Cuerpo<\/strong>: Ya funciona r\u00e1pido. El problema era que ten\u00e9is a los becarios bajos de az\u00facar. Mantas.<\/p><\/blockquote>\n<p>Enviar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Tengo la boca grande como un buz\u00f3n. Media vida metido en el departamento de inform\u00e1tica y a\u00fan me tengo que castigar el lomo yo mismo por lo inocente que soy. Pero no digo que tenga la boca grande por ser indiscreto, o falt\u00f3n, que tambi\u00e9n; sino porque cada vez que me preguntan contesto con lo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-1088","post","type-post","status-publish","format-standard","hentry","category-sin-categoria"],"_links":{"self":[{"href":"https:\/\/mundowdg.com\/blog\/wp-json\/wp\/v2\/posts\/1088","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mundowdg.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mundowdg.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mundowdg.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mundowdg.com\/blog\/wp-json\/wp\/v2\/comments?post=1088"}],"version-history":[{"count":5,"href":"https:\/\/mundowdg.com\/blog\/wp-json\/wp\/v2\/posts\/1088\/revisions"}],"predecessor-version":[{"id":1098,"href":"https:\/\/mundowdg.com\/blog\/wp-json\/wp\/v2\/posts\/1088\/revisions\/1098"}],"wp:attachment":[{"href":"https:\/\/mundowdg.com\/blog\/wp-json\/wp\/v2\/media?parent=1088"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mundowdg.com\/blog\/wp-json\/wp\/v2\/categories?post=1088"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mundowdg.com\/blog\/wp-json\/wp\/v2\/tags?post=1088"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}