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

# W01-複雑な問題を解くまでの道筋

金曜の夜、云飞とECのPCサイトにある少し厄介な問題について話した。以前、その問題を詳しく書いた記事があったことを思い出し、5年間眠っていたブログを開いた。

久しぶりに見ると、懐かしさと気恥ずかしさがあった。当時は仕事に余裕があり、インターネット業界に憧れていた。空いた時間でブログを作り、自分では高度だと思っていた、実際には小さな工夫にすぎない技術を披露するのが好きだった。しばらく読み返し、「今はこういうものを落ち着いて書くのが難しい。何をするにも儲かるかどうかを考えてしまう」と冗談を言った。

今でも少し誇らしいのは、当時取得したドメインだろう。.wangというトップレベルドメインがあることはあまり知られていないが、私の姓はちょうど王だ。だから英語名とまったく同じドメインを持っている。世界で唯一で、102を付ける必要もなく、ずっとhttpsだ。

本題に戻る。冒頭の厄介な問題から、今の私は新しい示唆を得た。

まず、どのような問題かを説明する。京東のPC版トップページは凹凸チームの作品で、大きな更新は3、4年ほど行われていないように見える。それでも、長く使われる優れた工夫が多く隠れている。画面左側の定番のカテゴリー選択欄もその一つだ。一次メニューにマウスをhoverすると、隣に対応する二次メニューが表示される。一次メニューの一覧をなぞれば、二次メニューも通過した項目に合わせてリアルタイムに切り替わる。面白いのは、選びたい二次メニューへマウスを動かすときだ。途中でいくつかの一次メニューを横切っても切り替わらず、目的の二次カテゴリーを確実に選べる。

一見するとAIらしい、かなり複雑な問題に思える。マウスの移動経路をリアルタイムに分析し、ユーザーの本当の意図を判断する問題だと言われれば、その方向で解決策を探す人は少なくないだろう。

実際には、要件を分析して整理すると、「ある点が三角形の中にあるかを判定する」という問題に置き換えられる。図を見ればわかりやすい。「一次ナビゲーション1」を選んだ後、図の三角形の中を通って二次メニューに向かう間は、横切った一次メニューに反応しないか、切り替えを遅らせればよい。

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

点が三角形の中にあるかを判定する方法はいくつもある。定番はベクトルの外積を使うものだ。プログラムでベクトルの基本演算を実装するのは難しくない。加減乗除を組み合わせるだけでよい。

問題は以上だ。ここからが新しく考えたことになる。この要件を実現する過程を、私は四つの段階に分けた。

まず、要件の具体化。要件を明確にし、分解し、できるだけ具体的にする。

次に、分解した要件を「翻訳」して、要件から問題へ変える。これは領域に結びつけ、モデル化する過程だ。ソフトウェアエンジニアリングなら、要件を計算可能でプログラム可能なモデルに写す。今の私には、この過程が後の「どう実装するか」よりも重要に思える。要件を「点が三角形の中にあるかを判定する」という問題へ変える能力は、エンジニアにとって高度な素養の一つだろう。

その次が、どう解くかだ。前段階の出力はモデルであり、数学、物理、統計などのモデルが考えられる。必要なのは、異なる学問や領域をつなぐことだ。点が三角形の中にあるかを判定する方法がわからなければ、数学の得意な人に聞けばよい。大規模で複雑な問題なら、複数の領域にまたがるかもしれない。これは利用できる資源をネットワークとしてつなぐ過程である。

最後は実装だ。私たちは時間の大半を実装やエンジニアリングに使っている。モジュール化、標準化など、あらゆるエンジニアリングの手段が含まれる。比較的得意な部分だ。
