土台の大工事 — Prisma v7メジャーアップに追従する
一括採点は、ほかの人が作って公開しているたくさんの部品を組み合わせて作られています。 その土台の一つ「Prisma」という部品が、大きく作り直されました。 便利になる一方で、これまでの使い方が通じなくなる変更も多く、 使わせてもらっているこちらも、それに合わせる作業がたくさん必要になりました。 その裏側の話です。
Prismaって何をする部品?
Prismaは、一括採点が生徒・点数・答案などのデータを保存する データベースとやりとりするための道具です。 「この点数を取り出して」「この答案を保存して」といった指示を、 データベースに伝える窓口の役目をしています。 以前からデータの読み書きに使っていて、その紹介はなぜSQLiteを選んだのかやPrisma標準マイグレーションへの移行でも触れています。
メジャーアップと「破壊的変更」
部品には「バージョン」という番号があり、改良のたびに数字が上がります。 中でも先頭の数字が変わる更新をメジャーアップデートと呼びます (今回は6から7へ)。これは小さな改良ではなく、大きな作り直しです。
大きく作り直すと、これまでの書き方が通じなくなることがあります。 これを破壊的変更といいます。 前向きな変更なのですが、使う側から見れば 「昨日までのやり方が急に使えなくなる」ということでもあります。 今回は、この破壊的変更があちこちに及びました。
なぜPrismaは作り直したのか
v7でPrismaがいちばん大きく変えたのは、自身の心臓部です。 これまでは処理の要となる部分をRustという別の言葉で作っていましたが、 それをJavaScript / TypeScript(Prismaの外側と同じ言葉)に作り直しました。 Rustで書かれた部分はサイズが大きく、開発や手直しの手間もかかっていました。 サーバーやクラウドなど、動かす環境がどんどん多様になるなかで、 言葉を一つにそろえて身軽にし、Prisma自身の開発の負担を減らす——それが主な狙いです。
開発元は「小さく・速くなった」とも説明しています。 ただ、一括採点はパソコンの中のデータベースを直接読み書きする作りなので、 先生が日々の操作で速さの違いを感じるような変化ではありません。 つまりこの作り直しは、Prismaが自分たちの事情で決めたことです。 環境がいろいろに広がった今、その判断はもっともなものだと思います。 Prismaはありがたく使わせてもらっている部品ですから、 大きく変われば、こちらもそれに合わせて手を入れていくのが自然なことです。 とはいえ今回は、その作業がなかなか大変でした。この記事は、その裏側の話です。
すぐには上げず、しばらく待った
大きな破壊的変更をともなう更新では、すぐに飛びつかず、 しばらく様子を見てから移るのはよくあることです。 一括採点でも、安定していたv6のまま使い続けて待ちました。
Rustをやめるという方針には、 「速さが得意なRustをやめて、かえって性能が落ちるのでは」という懸念の声もあり、 しばらく議論が続いていました (その後、開発元はベンチマークを示して、むしろ速くなったと説明しています)。 v7が版を重ねて落ち着き、周りの部品も追いついてきたころに、 ようやくv7へ移りました。
合わせるための作業
心臓部が替わると、周りのつなぎ方も変わります。 一括採点の側では、次のような手直しが芋づる式に必要になりました。 専門的な言葉が続きますが、要は「つなぎ方の作法があちこちで変わった」ということです。
- データベースへのつなぎ方 — v7では、Prismaが接続の部分を自前で抱えるのをやめ、 外部のドライバをアダプター(変換器)で挟む方式に変わりました。 そこで、SQLiteを読み書きするbetter-sqlite3という外部の部品 (Prismaとは別の開発者が公開しているもの)を通してつなぐように書き換えました。
- プログラムの組み立て工程 — つなぎ方の作法が変わったため、 プログラムを組み立てる工程そのものも、新しい道具に入れ替えました。
- コード中の古い書き方 — 「この書き方はもう使えません」となった箇所を、 一つひとつ新しい書き方に置き換えていきました。
いちばんの難所 — 部品のかみ合わせ
いちばん手こずったのは、プログラムが正しく動くかを自動で確かめる仕組み (テスト)が、まるごと動かなくなったことです。 いつもは「どこも壊れていないか」を自動でチェックしているのですが、 その土台が、Prismaの作り直しの巻き添えで止まってしまいました。
原因はいくつも重なっていました。 古い命令が廃止されていたり、設定の読み込み方が変わっていたり。 中でも根が深かったのが、better-sqlite3の「バージョンのかみ合わせ」です。
この部品は、アプリを動かす土台(Electron)に合わせて作られています。 ところがテストは、少し別の土台(パソコン標準のNode)の上で動きます。 この2つで土台の規格(部品どうしのかみ合わせのバージョン)が食い違い、 同じ部品なのに「規格が合わない」と拒否されてしまうのです。 そこで、テストのときはその場で部品を作り直す、といった対処が必要でした。
ほかにも、もともと潜んでいた計算のごくわずかな誤差 (本来128になるはずが127.99999…になる、というコンピュータ特有のクセ)が、 止まっていたテストを立て直す過程で表に出てきて、判定を狂わせていた、 といった細かな落とし穴もありました。 こうした一つひとつを地道につぶして、ようやくテストがまた動くようになりました。
まとめ
土台の部品Prismaが大きく作り直され、一括採点もそれに合わせる作業を行いました。
- 心臓部がRustからJavaScript / TypeScriptへ作り直され、Prismaが身軽になった
- 接続は外部のドライバをアダプターで挟む方式に変わり、組み立て工程も入れ替えた
- テストが止まり、部品のかみ合わせのズレなどを地道に直した
こうした裏側の作業は、ふだん画面には出てきませんし、 目に見えて派手な変化があるわけでもありません。 それでも、便利な部品を使わせてもらう以上、その作り直しに合わせ続けることが、 これからも安心して使えるアプリを保つことにつながっています。
関連記事
- Prisma標準マイグレーションへの移行 — データベース管理の進化 - Prismaまわりの以前の改善
- なぜSQLiteを選んだのか - データ保管庫にSQLiteを使う理由
- Tkinterの限界と、新しい技術の選択 - 技術選定の考え方