見出し画像

好意とソフトウェア修正技術

教えられたウェブサイトで新規ユーザーを登録すると、すぐにログインできた。アリスさん最初の日報を書き込みましょう、というメッセージにしたがって、「あああ」と意味のないテスト日報を投稿する。自分で「いいね」をつけると、日報の右上に「いいね♡1」と表示された。

ログアウトして、今度はボブというユーザーを登録してログインする。さきほどの「あああ」という日報を見つけて、いいねをつける。いいねしたユーザーのリストにはアリスとボブ、ふたつの名前が並んだ。しかし日報の右上には「いいね♡1」が表示されたままだ。再読み込みしても変わらない。アリスでログインし直しても「いいね♡1」のままだ。

インターホンが鳴ったので、立ち上がって玄関に出てみると酒屋さんだった。缶ビールと炭酸水を一ケースずつ受け取って、冷蔵庫に入れる。画面の前に戻ってきて、再読み込みすると「いいね♡2」と表示された。

昨日、世話になっている人から、話だけでも聞いてやってくれないかと、依頼主を紹介された。日報を共有するウェブサービスで、表示内容がおかしくなるという。だが、具体的にどんな操作をしたら、どのようにおかしくなるのかが、よく分からない。開発会社が直せずにいるので、手伝ってほしいという依頼だ。その場で時間と金額の見積もりを求められたが、難易度も規模も分からないから見積もれないと答えた。依頼主の表情が険しくなる。

早く修正しないと、ユーザーのみなさんに迷惑がかかるんです。すでに問い合わせが何件もきていて、放置するわけにはいきません。これは急を要する作業なのです。特にいいね数は日報を書くユーザーにとって、とても重要なモチベーションであり、このまま誤差が表示され続けることを看過できません。

それは依頼主の問題であって、使い捨てのフリーランサーには関係のない話だと思ったが、口には出さないでおいた。代わりに、状況を確認してからて回答すると伝える。依頼主は不服そうに分かりましたと言い、細々とメモしはじめた。そのオレンジ色の表紙のメモパッドは、別れた恋人も使っていた。

プログラムを調べていくと、いいね数を表示する箇所が、すぐに見つかる。「あああ」と書いた日報に、アリスがいいねすると、プログラムはデータベースに情報を書き出す。

   { 日報:9784 / ユーザー:アリス }

9784というのは、日報を識別する番号だ。データベースには、どの日報に、どのユーザーがいいねしたか、という記録が大量に保存されている。

   { 日報:9784 / ユーザー:アリス }
   { 日報:2265 / ユーザー:チャーリー }
   { 日報:1920 / ユーザー:デイビッド }
   ……

日報ごとのいいね数が必要になると、プログラムはデータベースに「日報:9784」を含むいいねの個数を問い合わせる。データベースは該当する情報を探し出し、数え上げてプログラムに渡す。データベース内を検索するということは、いくつもの情報を走査する必要があるため、処理に時間がかかる。

三年前、仕事をとおして知り合った恋人は、オレンジ色の表紙のメモパッドに、いつも細かくメモを残していた。打ち合わせが長引いたときに、お腹が空きましたね、と一緒に夕食にすることになった。けれど仕事以外の話題がなく、仕方なく自分たちの個人的なことを話して、間をつないだ。意外な共通点や相違点に驚き、お互いを知ることは楽しかった。

交際が始まると、わざわざ聞かなくてもよい、というシチュエーションが増えてくる。最初に注文する飲み物、疲れているときに食べたい料理、並んで歩くときの右側は誰か、帰宅後すぐに眠るのか。互いを知っているという自覚は、心地よかった。

プログラムを読み進めると、データベースの検索を減らす工夫が見つかった。データベースからいいね数を読み取ったら、キャッシュと呼ばれる一時記憶領域に保存している。

   [ 日報:9784 ⇒ 1 ]

プログラムが、いいね数を表示しようとするとき、まずキャッシュに「日報:9784」を問い合わせ、キャッシュは対応する「1」という情報を返す。このとき走査して数え上げることなく一発で情報を返せるので、高速化と計算資源節約の有効なアプローチだ。

問題はここからだ。続いてボブが日報にいいねすると、プログラムはデータベースに情報を書き出す。

  { 日報:9784 / ユーザー:アリス }
  { 日報:9784 / ユーザー:ボブ }

もう一度、いいね数を表示しようとすると、プログラムはまずキャッシュに問い合わせる。キャッシュは、

  [ いいね・日報:9784 ⇒ 1 ]

という情報を保持しているため、「1」を返す。キャッシュがいつまでも古い情報を保持して、データベースの最新情報を持っていないから、いいね数が増えないように見えるのだ。

さらに詳しく調べると、キャッシュは三分で情報を破棄する設定になっている。酒屋さんからビールと炭酸水を受け取って、冷蔵庫に入れているあいだにキャッシュが破棄されたのだろう。時間がたってから再読み込みしたとき、プログラムはキャッシュからいいね数を取得できなかった。だから、データベースを検索し、正確ないいね数を取得できたのだ。これが、一貫性のない現象の原因だ。

恋人との関係が長くなり、一緒に暮らすようになると、言った言わない、察する察しないで喧嘩をすることが増えた。

疲れたときは炭酸水を飲むのが好きだと言ってたから、わざわざ買ってきてあげたのに、飲まずに冷蔵庫に入れて、誰かにもらった紅茶を飲んでいるのは、あてつけなのか。右側に立たれるのは嫌だと言ったかもしれないけど、今日はかばんにパソコンが入ってて重たいから、ときどき持ち替えてる。ずっと右側にいられると歩きにくいことくらい分かるべきだ。辛いものが苦手だと言うからメニュー選びに気をつけていたのに、今夜の四人での会食ではキムチを食べていた。毎年帰省しないと言っていたのに、今年は法事があるいう理由で帰省するのか、それはこの部屋から離れるための口実ではないのか。

言い争いをするとき、恋人はオレンジ色の表紙のメモパッドをぱらぱらと乱暴にめくり、証拠のメモ書きを見せつけてきた。

ユーザーがいいねするとき、データベースへの書き込んでから、キャッシュをクリアすればいいだろうか。いや、まだ日報ごとのいいね数が間違って表示される、という現象を確認できただけだ。問題はもっと複雑かも知れない。いいねに関連する情報が、他にもキャッシュされているかも知れない。ユーザーが退会したとき、いいねは取り消すのか、それとも残すのか。全体の大きな設計方針と、個々の細かい実装は互いに依存している。大きめの紙を机に広げた。プログラムとデータベースとキャッシュの依存関係を、図にまとめるためだ。

恋人と明け方まで言い争ったある日、ぼんやりした頭で仕事をしていたら、誤ってデータベースの情報を削除してしまった。復旧作業に手こずり、終電の時刻をすぎても帰れそうになかった。恋人に連絡すると、疑い、罵倒、泣き落としのメールが届き続け、夜が明けるころには携帯電話のバッテリーが切れてしまった。

翌日の昼すぎにデータベースが復旧し、報告書を書いて、会社を出た。がらんとした電車の座席に腰をおろし、目が覚めたときには最寄りの駅をとっくに過ぎて、終点だった。かばんを中を手で探ると、くしゃくしゃになった何かの申請書が出てきた。ひざの上に置いたかばんを下敷きにして、申請書の裏面に、頭に浮かんだことを書き出していった。

つかれた。仕事つかれた。仕事してるだけなのに、怒られるのもつかれた。そりゃ悪いこともあったけど、なんなの。思いどおりじゃないのが気に入らない? でもイメージどおりにいかなこともある。どうしてアップデートしてくれないのか。お互いさまか。変わったこととか、予想とちがったこととか、受け入れてないな。話を聞いてもらえないし、こっちも聞いてないし。それどころじゃないし。粗探しばっかりしてる。

紙面がいっぱいになるまで書き続けていたら、反対側の終点に到着した。そして、関係を修復できそうにないこと、これまでの努力は役に立たなかったこと、もう憎しみだけが絆になっていること、そういったことを認めるしかなかった。その日のうちに、夜逃げ専門の引越し業者を手配して、家を飛び出した。予想どおりメールや電話でさんざん揉めることになる。

別れて言い争いがなくなると、何もしない時間が増えた。何かを言ったら怒鳴られる、というようなネガティブな反応さえ恋しくなる。あまりに衝動的な別れ方ではなかったかと不安になる。そんなときには、くしゃくしゃになった何か申請書の裏面にの乱れた字を読み返し、他の選択肢はなかったことを思い出した。相手のことも自分のことも更新せず、自分の望む姿に固定しようと必死だったのだと、今なら分かる。好意ではなく、依存と束縛だった。

プログラムとデータベースとキャッシュのつながりは、複雑ではあったけれど、丁寧に機能をまとめれば解決しそうだ。データベースに新しい情報を書き出すときには、かならず関連するキャッシュをクリアするように制約すればいいだろうか。いや、データベースの検索が増えたら、時間がかかってユーザーはまどろっこしく感じるかも知れない。そうだ、プログラムが「この情報は最新じゃなくてもいい」と明示したときは、キャッシュを保持すればいい。最新の情報が必要なときと、少しくらい情報が古くてもいいときがある。情報の鮮度を分かっていること大事なのだ。

ソフトウェア修正を承りますと依頼主にメールした。それから、冷蔵庫から炭酸水をとりだし、ひとくち飲んだ。まずはデータベースの読み書き処理を集約するところから手をつけることにする。

いいなと思ったら応援しよう!