Para entender este texto, lo mejor será que inicie con una historia: imaginen que ustedes trabajan de cajeros en el OXXO, el OXXO bien buena onda, les otorga seguro y vergo de prestaciones que están muy por encima a lo de la ley, pero para poder darles tanta mamada, pues ustedes acceden a dar en cada quincena una portación voluntaria para tener estas prestaciones, según tu contrato, si logras darme 24 aportaciones seguidas (sin fallar) entonces tienes te las quedas de forma indefinida y bla bla bla, si no la das, entonces pues pura verga recibes (qué rico). Todavía aunado a esto, el OXXO te dice: «Mira, no hay pedo si dichas aportaciones me las das juntas, o sea, si la primera quincena de julio no me pudiste dar tu aportación, dame las de julio al final del mes».
Y es aquí donde empieza el puto caos, esto mismo pasó en un sistema que desarrollamos, justo esa regla, pero para un gobierno mafioso lleno de irregularidades. El cliente vino a quejarse a través de un muy hostil mensaje, que tenía (aproximadamente) poco más de 20 mil cabrones reclamando que no podían dar de alta dichas prestaciones, why?, pues porque el programa que hace dicha validación va y consulta a la base de datos a través de la unión como de 20 tablas, si la serie es consecutiva.
Me explico:
Imagina que cada fila en un excel, tiene determinados datos, pero una columna de esa fila tiene un 1, ese uno significa que sí dio su aportación quincenal, ¿qué hizo el ingeniero a cargo de esta funcionalidad?, pues lo que todos harían (de hecho hay varias aproximaciones), pero el prácticamente hizo un ciclo en el que verificaba si la siguiente fila tiene en esa columna un 1, si es así, pues cuentas, ¿hasta qué número debes contar?, pues hasta el 24, porque esa es la regla de negocio, ¿qué pasa si no encuentras el 1?, pues reinicias el contador a 0 y vuelves a empezar. Supongamos que un trabajador lleva allí unos 10 años, si cada año tiene 52 semanas, podríamos decir que un aproximado de quincenas es 260, o sea, su “excel” tiene 260 filas, y entre esas 260 filas al menos alguna vez se tuvo que haber cumplido que se dieran un consecutivo de 24 para poder decir que es VERDADERO el criterio de selección para estas prestaciones.
Este ingeniero, nunca se le dijo que las aportaciones podían darse juntas, o sea, que hay ocasiones en las que una determinada aportación es dos en uno, ¿y cómo se refleja eso en tu “excel”?, pues lo lógico sería pensar que en vez de un 1 hay un 2, pero nel, nuestro administrador de base de datos diseñó la base de datos con el culo y en una peda, así que ese dato no está en dicha columna, es más, no está ni en dicho excel, digamos que ese dato lo guardaron en servilletas en una caja que está todavía aún más lejos y que sólo ir a leerlo costará mucho tiempo (hablando de complejidad computacional).
Allí es donde entra el equipo de Special Operations Command, donde estoy yo, los ingenieros más pirulas y alcohólicos dispuestos a reparar lo que otros vergas no hicieron bien. Para empezar con la operación pues debes poder entender el problema, así que vas y lees la documentación interna sobre qué hace dicha funcionalidad, luego entrevistas al responsable para tener una idea aún más clara, ya por último vas a la escena del crimen, o sea: revisar el código.
En Software lo más recomendable es no ser un puto tóxico de mierda, porque tarde que temprano vas a depender de algún compañero, pero no mames, cuando vi el código casi me vómito. Imagina que te pido leer en Don Quijote y ver si encuentras algún error, pues ahora imagina el Quijote (que ya es cabrón per se) escrito en una sola línea, sin signos de puntuación (a lo Saramago) y es más: sin espacios.
La tarea ya de por sí cabrona, se vuelve pinche un infierno.
No hay pedo, no te rajas, así que le vas dando, pero mientras haces tus procedimientos forenses, oh sorpresa, tienes una lista de crímenes en espera, porque pues es obvio que todos los inges siempre la cagan, entonces hay una masacre por todos lados. Te interrumpen toda la puta semana para ir a reparar algo «más urgente», y tu entendimiento del caso principal pues va disminuyendo, es casi casi como empezar de cero, porque a diferencia de un lenguaje normal, en la ingeniería de Software es casi imposible memorizar código (salvo que seas Dios).
Me vienen a reclamar con cosas tipo:
─ ¿por qué no has avanzado con eso?, tienes cero horas registradas en dicha tarea.
─ mire señor jefe que sabe programar menos que yo, he estado toda la semana con estas otras mamadas, no diga pendejadas, además, no se le entiende ni vergas, no hay comentarios, está muy mal escrito y yo no tengo todos los documentos que necesito para armar el puzzle, si tanto les urge díganle a Fulano (responsable) que repare su cagadero
─ ah bueno, le voy a decir.
Luego de unas horas dicen:
─ dice fulano que ya no se acuerda que hizo, y que además anda ocupado haciendo cosas súper urgentes que debemos entregar el 2023, vas a tener que hacerlo tú aunque ya tengas otras 10 tareas asignadas
─ ᵃ
Por más que leo, nomás no logro saber la brujería detrás de dicho código, así que para desestresarme me pongo a hacer problemas de programación, hahaha (simón, los ing en software hacemos mamadas bien raras).
Para olvidar un problema, siempre es mejor agarrar otro problema, despejarte, que lo que sea que lleves en tu cabeza se enfríe y ya después ir a buscar otra solución. El problema es cuando el problema que agarras para despejarte… te lleva a caminos todavía más oscuros e inhóspitos.
Presta atención:
Imagina que yo te doy 3 cuadros de papel, no importa la medida, ahora te pongo como regla que hagas las figuras que puedas siempre y cuando pues respetes que la forma de unirse de estos cuadros es a través de los lados.
Tu primera aproximación sería:
[ ][ ][ ]
O sea, formas una especie de rectángulo, otra sería formar una esquina, ¿no?
[ ] [ ][ ]
Algo parecido a una L.
Es más, ¿qué pasaría si te digo que mejor en vez de 3 cuadros te doy 4?
Figura 1:
[ ][ ][ ][ ][ ]
Figura 2:
[ ] [ ] [ ][ ]
Figura 3:
[ ][ ] [ ][ ]
Etc… creo captas la idea. De hecho si prestas atención, notarás que para cuatro cuadritos todas las figuras que puedes formar son las que conforman las piezas del tetris. De hecho de allí proviene el nombre, cada figura del tetris se llama «tetrominó» (tetro = 4).
La generalización de esta regla para formar figuras y el cómo se llaman las figuras resultantes, se denomina «Poliominó». De hecho, con dos cuadros sólo puedes formar una figura, y exacto, adivinaste su nombre: dominó.
Entonces, aquí es donde debes usar la cabeza para encontrar el patrón:
Con dos cuadros sólo formo una figura.
Con tres cuadros formo dos figuras
Podrías usar letras, decir que n es igual al número de cuadros y f las figuras resultantes:
2n = 1f
3n = 2f
Podrías quitar los coeficientes y decir que n es cualquier número natural (exceptuando cero), para poder encontrar una generalización, sólo con esos dos valores pues te das cuenta que la salida es -1 de la entrada. Pero nomás te vas a los putos tetris y ya valió madre tu generalización, porque con 4 cuadritos formas 5 figuras, upsi, y hablo de cinco libres, ponte a jugar y verás que sacas varias “especulares”, o sea, que son la misma figura sólo que la especular es el reflejo en el espejo de la figura original.
La pregunta es:
Para un N dado de cuadritos, ¿existe alguna forma de calcular la cantidad de todas las figuras que van a salir y decir la disposición en un plano R²? (un plano cartesiano).
Pues suena pelada la pregunta, pero no es intuitiva en nada, sólo para darte una idea, con 5 cuadritos (pentominós) salen 12, de allí pues varios fueron eliminados, rotaciones, especulares, simetría axial, etc, etc.
Como puedes observar, de 4 a 5 el número creció mucho, ¿pero cuánto es mucho?, ¿lineal?, ¿cuadrático?, ¿potencia?, ¿exponencial?
Casi casi creo que exponencial, para N = 6, existen 216, ya eliminando los que no son válidos nos quedan 35.
Pues en efecto, después de dedicarle vergo de horas al problema durante casi toda la semana (pues le daba para distraerme del otro problema), terminé dando con algunos papers y artículos, y pues sí, es un problema abierto de las matemáticas, o sea, no existe un método analítico (hasta ahora) para encontrar el número resultante de figuras. Y eso es un problema, porque un algoritmo debe ser una serie de pasos FINITOS, o sea, no se vale que un programa nunca termine.
Sin un método analítico, sabemos que nosotros tampoco vamos a encontrar la formulación general en un algoritmo (por unos teoremas que les enseño cuando sean grandes, salu2 a Dijkstra), al final del día la programación son matemáticas pero escritas de forma más «legible».
¿Qué nos queda?, pues acotar el programa. Tal vez no me interesa cualquier N dado, pero si logro sacar un algoritmo que lo haga para 6, entonces le saco su complejidad computacional en tiempo, y sé qué tanto puedo hacer crecer N y saber al mismo tiempo si voy a tener tiempo de vida suficiente para ver el resultado en la pantalla.
Suena pelada, puedes usar backtracking o programación dinámica para aproximar, pero, pues no del todo… llevo dándole como 4 horas por día y tengo cero progresos, luego me paso al del jale, e igual, cero progreso, ni siquiera he investigado si algún cabrón en alguna parte del mundo ha hecho aproximaciones computacionales o de plano se puso a sacar las figuritas a mano (no lo duden).
Lo único en lo que he progresado es en el pinche GTA V, ya lo pasé anoche, hahaha.
En fin, esa es la vida del ingeniero en software, problemas en el jale, luego agarras más problemas que te llevan a más problemas, algunos incluso fuera del conocimiento humano actual.
En fin, me voy, porque la raza del jale lleva como 15 minutos spammeando en el chat, seguro algo está en llamas y necesitan que deje lo que sea que estoy haciendo para ponerme algo «más urgente».