• ITに強い編集プロダクション・リブロワークスのWebサイト

    突然ですが、皆さんはポイントカードをお持ちでしょうか?

    会計の際に提示するだけで、支払額の数%がポイントとして貯まっていく代物です。貯めたポイントは支払いに使用できたり、特別な景品と交換できたりと、嬉しい特典がいっぱいです。

    近年では、スマートフォンでポイントカードを利用できるアプリも登場しており、財布がかさばることなくポイントを貯めることができるようになっています。とても便利ですね。私は楽天ポイントを楽天ペイと併用しているのですが、両者でポイントが貯まるためお得な気分です。

    またまた突然ですが、「非同期処理」という言葉をご存知でしょうか?

    これはプログラミングにおける考え方のひとつです。いきなり専門的な用語ですみません。そして私は「非同期処理」という考え方が、ポイントカードと深い関係があるように思えてならないのです。

    ポイントカードと非同期処理

    先日、こんなことがありました。

    飲食店で食事をいただいたあと、レジにてお会計をお願いしたときのことです。店員さんに「ポイントカードはお持ちでしょうか」と尋ねられたので、あらかじめスマートフォンで用意していたポイントカードのアプリを提示しました。画面に表示されたバーコードを店員さんに読み取っていただくことで、手続きは完了です。

    続いて、支払いを済ませなければなりません。私はそのままスマートフォンを操作して、キャッシュレス決済で支払うことにしました。私が使用している「楽天ペイ」のアプリは、ポイントカードとキャッシュレス決済が一体となっているため、そのまま画面を切り替えて決済用のバーコードを表示します。その画面を再び店員さんに読み取っていただき、会計が完了しました。

    さて、お気づきでしょうか? ポイントカードを読み取っていただいたあと、私がアプリを操作している間、僅かではありますが店員さんに待ち時間が発生してしまっているのです。

    これは、ポイントカードをアプリで利用しているが故に起こる事象でもあります。もし、ポイントカードが実物だったとしたら、先にポイントカードをトレイに提出し、店員さんに読み取っていただいている間にキャッシュレス決済のアプリを開いておくことができます。あるいは支払いを現金にする場合も、ポイントカードと現金を別々に用意できるので、待ち時間を最小限にできるでしょう。スマートフォンがポイントカードと決済手段の両方を兼ねている場合にのみ、この2〜3秒の待ち時間は生じてしまうのです。

    私は小心者なので、店員さんを少しでもお待たせしてしまうと、視線が痛いような気がしてしまいます。このときも店員さんに申し訳なく思いながら、ふとこれは「同期処理」「非同期処理」の考え方に通じるものがあると感じたのです。

    同期処理と非同期処理

    「同期処理」「非同期処理」とは、どちらもプログラミングにおける考え方のひとつです。

    少しややこしい話になるのですが、同期処理とは「順番に実行する必要のある処理」とお考えください。ひとつの処理を実行する際、前の処理が終わるのを待たなければならないとき、この処理は同期処理です。

    先ほどの例でいいますと、店員さんにポイントカードや決済用の画面を読み取ってもらう間、私はそれを待つ必要があります。これは同期処理です。

    また、私がポイントカードを読み取ってもらったあと、決済用の画面を開いてる間、店員さんは私を待つ必要があります。これも同期処理ですね。

    対して、非同期処理とは「順番に実行する必要のない処理」とお考えください。先に実行していた処理が終わっていなくても、その途中で別の処理を実行できるとき、先に実行していた処理のことを非同期処理といいます。前の処理が終わっていなくても、次の処理を実行できるのが特徴です。

    もし私がポイントカードを実物として持っていた場合、トレイにポイントカードを提出している間、スマートフォンや財布から支払いの準備ができます。店員さんがポイントカードを読み取り終わるのを待つ必要はありません。つまりこの場合、ポイントカードを読み取ってもらうという一連の作業は非同期処理と呼ぶことができます。

    つまり、待ち時間を発生させないためには、ポイントカードを非同期処理で提示する必要があったわけです。これならば、店員さんからポイントカードを返却していただいたあとでスムーズに支払いを行うことができるため、待ち時間は生じません。

    プログラミングの世界にあてはめると、例えばWebページを表示する際に、必要なデータを取得する処理があったとします。そして、この処理には時間がかかってしまうとします。

    もしそれが同期処理であったのなら、データの取得が完了するまでWebページは表示されず真っ白のままです。しかし、これを非同期処理にすることで、データを取得する必要がある部分以外を先に表示してしまい、データの取得が完了したタイミングで残りの部分を画面に表示することができるのです。

    非同期処理を活用したWebページとして有名なのがGoogle Mapです。地図の表示範囲を移動しても、画面が止まってしまうことはなく、データが読み込まれた段階で画面に地図情報が表示されます。これは、データの取得を非同期処理で行っているためです。

    日常の中の非同期処理

    「同期処理とか非同期処理とか言われても、別にそんなことは普段の生活で考える必要なんてないのでは?」と、そう思われるかもしれません。しかし私は、人は無意識のうちに他の場面でもこのような考え方を応用しているのではないかと思います。

    例えば、仕事では複数のタスクを並行して進めなければならない場面が訪れます。そんなとき、まずは他の人に回すことのできるタスクから先に進めることがあると思います。いったんタスクが自分の手を離れてしまえば、その間に自分は別のタスクを進めることができるからです。これは、非同期処理の考え方と似ているような気がしませんか?

    また、自分のタスクが終わらなければ他の人が作業を進められない場合、そのタスクは同期処理と言えるでしょう。その場合、相手に待ち時間が発生しているので、優先して着手しなければなりません。

    具体的な例を挙げますと、他の方に確認を依頼する必要のある作業は、相手に確認していただいている間は他の作業を進めることができるため、非同期処理といえます。会議のような時間は、相手と同じ時間で話し合う必要があるため、同期処理ですね。「明日は1日中会議があるんだよな……」という日は、それまでに他の方に確認していただく必要のある作業を進めておくと、効率よく仕事ができるはずです。

    あるいは、料理の例でいいますと、鍋に火をかけながらまな板で野菜を切ったりすると思います。これは、つきっきりで鍋の様子を見ている必要がないからで、このとき「鍋に火をかける」という作業は非同期処理といえるでしょう。逆に、タイミングを見て火の加減を確認するという作業は同期処理といえます。

    つまり、「非同期処理のタスクに優先して着手し、それを待っている間に他の作業を進める」ことが、効率よく作業を進めるコツである、ということができるかもしれません(もちろん、現実は他にも様々な要素が影響するため、ここまで単純化できない場面も多く存在すると思います)。

    終わりに

    上述したポイントカードの例では、正直2〜3秒の違いでしかないため、そこまで過敏に非同期処理を意識することはないかもしれません。そもそもポイントカードの受け渡しが同期処理なのか非同期処理なのかがわかったところで、何かに役立つということはありません。

    ですが、「同期処理」「非同期処理」という言葉を知っていると、いま自分が抱えているタスクをどのように分類し、進めていけばいいかを考えるときのひとつの指針になることがあります。また、プログラミングの用語に限らず、とある分野における考え方を別の場面でも応用することで、もしかしたら新たな発見があるかもしれませんね。