> For the complete documentation index, see [llms.txt](https://weekly-essay.mikey.wang/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://weekly-essay.mikey.wang/es/2022/w01-a-path-to-solving-complex-problems.md).

# W01-Un camino para resolver problemas complejos

El viernes por la noche hablé con Yunfei sobre un problema bastante sutil de una web de comercio electrónico para PC. Recordé que había dedicado una entrada del blog a explicarlo y abrí aquel sitio que llevaba cinco años acumulando polvo.

Volver después de tanto tiempo me produjo una mezcla de cercanía y pudor. En aquella época tenía poco trabajo y muchas ganas de entrar en la industria de internet. Monté un blog en mis ratos libres y me gustaba presumir de algunos detalles técnicos que consideraba profundos, aunque en realidad eran pequeños trucos. Después de revisar varias entradas, bromeé con que ahora me cuesta sentarme a escribir cosas así. Al hacer algo, solo pienso en si puede generar dinero.

Si hay algo de entonces que todavía me enorgullece un poco, es el dominio que registré. Poca gente sabe que existe el dominio de nivel superior .wang, y mi apellido es precisamente Wang. Así que tengo un dominio idéntico a mi nombre en inglés, único en el mundo, sin necesidad de añadir 102 y siempre con HTTPS.

Volvamos al tema. Aquel problema sutil del principio me ha dado algunas ideas nuevas.

Primero, en qué consistía. La portada de la web de JD para PC es obra de Aotu y, por lo que parece, lleva tres o cuatro años sin una gran renovación. Guarda muchos detalles que resisten bien el paso del tiempo. Por ejemplo, el clásico selector de categorías del lado izquierdo. Al pasar el cursor sobre una opción del menú de primer nivel, aparece a su lado el menú de segundo nivel correspondiente. Por tanto, si recorres con el cursor la lista del primer nivel, el segundo va cambiando en tiempo real. Lo interesante es que, cuando mueves el cursor hacia una opción del segundo nivel, los otros elementos del primer nivel que cruzas por el camino no cambian el submenú. Puedes alcanzar con seguridad la categoría que querías.

A primera vista parece muy propio de la IA. Es un problema bastante complejo. Si lo definimos como analizar en tiempo real la trayectoria del ratón para deducir la intención real del usuario, seguramente muchos buscarán una solución en esa dirección.

En realidad, después de analizar y abstraer el requisito, este se convierte en un problema de determinar si un punto está dentro de un triángulo. Una imagen vale más que mil palabras. Al seleccionar «navegación de primer nivel 1», si el cursor atraviesa el triángulo del dibujo camino de una opción de segundo nivel, podemos ignorar el paso por otros elementos del primer nivel o retrasar el cambio de menú.

![](https://km.sankuai.com/api/file/cdn/1270932134/1494009598?contentType=1\&isNewContent=true\&isNewContent=false)

Hay muchas formas de determinar si un punto está dentro de un triángulo. Una solución clásica utiliza el producto vectorial. Implementar operaciones vectoriales básicas en un programa es sencillo: son combinaciones de sumas, restas, multiplicaciones y divisiones.

Ese era el problema. Estas son algunas reflexiones nuevas. Divido el proceso de satisfacer este requisito en cuatro etapas.

La primera consiste en concretar el requisito. Hay que aclararlo y descomponerlo para hacerlo tan tangible como sea posible.

La segunda es «traducir» los requisitos descompuestos, convertirlos en problemas. Es un proceso de modelado dentro de un dominio. En ingeniería de software, por ejemplo, consiste en llevar el requisito a un modelo computable y programable. Ahora considero que este paso es más importante que el posterior «cómo hacerlo». La capacidad de traducir un requisito al problema de «determinar si un punto está dentro de un triángulo» debería ser una competencia avanzada de un ingeniero.

Después viene el cómo. La etapa anterior produce un modelo, que puede ser matemático, físico, estadístico o de otro tipo. Lo que debemos hacer es conectar disciplinas y campos distintos. Si no sabemos determinar si un punto está dentro de un triángulo, buscamos a alguien que sepa matemáticas. Un problema complejo de gran escala puede abarcar varios campos, por lo que este paso consiste en conectar los recursos en una red.

Por último está la implementación. Dedicamos la mayor parte de nuestro tiempo a implementar y a hacer ingeniería. Aquí entran la modularización, la estandarización y todos los demás recursos de ingeniería. Es la parte que se nos da relativamente mejor.
