> 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/pt-br/2022/w01-a-path-to-solving-complex-problems.md).

# W01-Um caminho para resolver problemas complexos

Na sexta-feira à noite, conversei com Yunfei sobre um problema difícil no site de comércio eletrônico para PC. Lembrei que havia escrito um texto só sobre isso e reabri meu blog, parado havia cinco anos.

Foi uma mistura de familiaridade e vergonha. Na época, o trabalho era tranquilo, eu queria entrar no setor de internet e montei um blog nas horas livres. Gostava de exibir detalhes técnicos que achava profundos, mas eram apenas engenhosos. Depois de folhear os textos, brinquei que hoje dificilmente consigo sentar para escrever esse tipo de coisa: só penso se dá para ganhar dinheiro.

O que ainda me dá um pequeno orgulho é o domínio que registrei. Pouca gente sabe que existe o domínio de topo .wang, e meu sobrenome é Wang. Assim, tenho um endereço exatamente igual ao meu nome em inglês, único no mundo, sem precisar acrescentar 102 e sempre com HTTPS.

Voltando ao assunto, aquele problema me trouxe novas ideias agora.

A página inicial para PC da JD, feita pelo Aotu, parece não ter passado por grandes mudanças em três ou quatro anos. Ela guarda soluções que continuam boas, como a seleção de categorias à esquerda. Ao passar o mouse sobre um menu principal, o submenu aparece ao lado. Portanto, ao percorrer a lista, o submenu muda em tempo real. O curioso é que, quando você move o mouse em direção a um submenu, os itens principais atravessados no caminho não provocam a troca. Você chega com segurança à categoria desejada.

À primeira vista, parece algo de IA e um problema complexo. Se o descrevermos como analisar a trajetória do mouse em tempo real para inferir a intenção do usuário, muita gente procurará soluções nessa direção.

Mas, depois de analisar e organizar o requisito, ele vira uma pergunta: como saber se um ponto está dentro de um triângulo? A imagem explica melhor. Ao selecionar “navegação principal 1”, enquanto o mouse atravessa o triângulo em direção ao submenu, podemos ignorar os menus principais cruzados ou atrasar sua ativação.

![Triângulo entre a posição do mouse e a área do submenu](https://km.sankuai.com/api/file/cdn/1270932134/1494009598?contentType=1\&isNewContent=true\&isNewContent=false)

Há várias formas de verificar se um ponto está em um triângulo. Uma clássica usa produto vetorial. Implementar as operações básicas é simples: combinações de adição, subtração, multiplicação e divisão.

Esse era o problema. Hoje, divido o processo de atendê-lo em quatro etapas.

Primeiro, tornar o requisito concreto, esclarecendo e decompondo o máximo possível.

Segundo, “traduzir” os requisitos decompostos em problemas. É um processo de domínio e modelagem. Na engenharia de software, significa mapeá-los para um modelo computável e programável. Hoje vejo essa etapa como mais importante que o “como fazer” posterior. Transformar o requisito em “verificar se um ponto está em um triângulo” exige uma competência avançada de tradução do engenheiro.

Depois vem o como fazer. A etapa anterior produziu um modelo, que pode ser matemático, físico ou estatístico. Precisamos conectar disciplinas e domínios. Se não sabemos testar o ponto no triângulo, procuramos alguém bom em matemática. Um problema grande pode envolver várias áreas; é um processo de organizar uma rede de recursos.

Por fim, vem a implementação. É onde passamos a maior parte do tempo, usando modularização, padronização e todos os meios de engenharia. É a parte em que temos mais prática.
