■ 導入:当初の指示は「Alt+Tabを回数で回してほしい」だけだった
今回紹介する案件は、
複数のChromeウィンドウに対して同じ操作を順番に行っていくという依頼でした。
最初にいただいた指示はとてもシンプルで、
「Alt + Tab の回数をカウントアップすることで複数ウィンドウを順番に切り替えて操作Aをしていきたい」
という内容でした。
ただ、この段階で聞けていたのは“表面上のやりたいこと”だけ。
ヒアリングを重ねるうちに、
この案件の本質はもっと深いところにあることが分かっていきました。
■ 課題:Alt+Tab方式では順番が安定せず、本当にやりたいことが達成できない
依頼者がやりたいことの中で、実は最も重要だったのは、
「各ウィンドウで操作Aを行い、
その途中で発生する待ち時間を活かして、
他のウィンドウでもAを進めていき、
途切れなくAを回し続けたい」
という点でした。
この“本当の目的”は、最初の指示では表に出ていませんでした。
実際、操作Aには途中で必ず n秒の待ち時間 が生じます。
1つのウィンドウだけでAを行うと、この待ちのたびに時間が止まる。
そこで依頼者は、複数ウィンドウを並列的に使い、
無駄な時間を無くしたい と考えていました。
しかし Alt+Tab は、
ウィンドウの順番が保証されない
新しいウィンドウを開くと並びが変わる
「1→2→3→4…」のように確実に回せない
という特徴があるため、
並列処理の前提が崩れてしまう方法でした。
ここで初めて、
Alt+Tab方式では依頼者の本当の目的を実現できない
ことが明確になりました。
■ 改善:複数ウィンドウを正確に列挙し、“n秒の待ち”と“並列操作”を両立させる設計へ
そこで私は、
ウィンドウの扱い方を根本から変えることにしました。
WinGetListでChromeウィンドウを正確に列挙
ハンドル(HWND)で順番を確定
必ず1→2→3→…という順でAを実行
認識失敗時はスキップしつつ進む
すべてのウィンドウでAを行い、
最初のウィンドウに戻ってきたタイミングがちょうど “n秒後” になるよう調整
こうして、
並列処理+n秒の待ち を両立した仕組みが成立しました。
さらに、
ウィンドウ数によって調整が必要な部分(Sleep、切り替え操作など)を
自動で最適化するロジックとして組み込みました。
ウィンドウが多ければ動作を少し詰め、
ウィンドウが少なければ待機を増やし、
結果として、
どんなウィンドウ数でも“1周がn秒になる”
という目的を満たすように設計しました。
■ 気づき:メッセージだけで“本当にやりたいこと”を合わせる難しさと大事さ
この案件では、
最初の依頼内容(Alt+Tab方式)だけを見ると、
やるべきことは単純に見えました。
しかし実際には、
操作Aに複数回の待ちがある
その待ち時間を別ウィンドウで埋める必要がある
全体として途切れなく回り続けるのが目的
各ウィンドウの再実行可能なタイミングがN分後
ウィンドウ数に合わせて内部処理を最適化する必要がある
という、かなり複雑な要件が背景にありました。
これはヒアリングをしないと絶対に見えてこなかった部分です。
相手の「やりたいこと」と、
私が思い描く「実現方法」を同期させる難しさ。
そして、
だからこそヒアリングが重要
ということを強く感じた案件でした。
■ 成果:並列処理+正確な周期処理という、依頼者の本当の目的を形にできた
最終的にスクリプトは、
ウィンドウ数に関わらず
順番を絶対に崩さず
並列的に操作Aを行い
Aの待ち時間を無駄なく使って
1周がちょうどN分(またはn秒単位)で循環する
という動作を安定して行えるようになりました。
依頼者の最初の言葉だけでは伝わらなかった要件も、
ヒアリングを重ねることで明らかになり、
そのうえで“最適な形”で実現できた案件です。
■ まとめ:本質を聞き出してから設計するという姿勢
この案件は、
表面上の指示と、本当に必要な仕組みは違う
という典型的な例でした。
大事なのは、依頼者が口にしていない背景まで丁寧に掘り下げ、
そのうえで“最も安定して動く形”に仕上げること。
次回以降も、
このような実例を通じて、
私がどうやって「依頼内容の奥にある本質」を見つけ、
仕組みとして落とし込んでいったのかを書いていきます。
▶「自分の作業も最適な形で自動化したい」「背景の整理から一緒に考えてほしい」という方はこちら