YAPC::Hakodate 2024で「データマイグレーションの成功戦略:サービスリニューアルで失敗しないための実践ガイド」という話をしました

少し、いやだいぶ時間が経ってしまったのですが、YAPC::Hakodate 2024で登壇してタイトルの話をさせていただきました。資料は以下です。

speakerdeck.com

ごく一般的なWebエンジニアならエンジニア人生で一度か二度あるくらいだろうサービスリニューアル、それに伴うデータ移行を、どういう因果か大きいもので3回も経験することができたので、その3回でどういうことを学び、どういう改善をしてきたか、という話をしたつもりです。したつもりですというのは、あまりうまく話せなかったなという反省があり、もしかしたら伝わっていないかもなと考えているからです。ちなみに「大きいもので3回」と書きましたが、細かいものや前職のものを含めると6回くらいはありそう。それだけリニューアル系の仕事に関わることができているので、振り返ってみるとラッキーだなとも思います(これは本当に思っている)。

ということでトークの内容を少し補足します。

データの「把握」は考古学

この辺りは残りの時間がほぼなくなっていてめちゃくちゃ駆け足になってしまったんですが、言いたかったのは「実際どういうデータがあるかはスキーマや仕様をみるだけではわからない」ということでした。さすがにスキーマとは違うデータが入っていることはないんですが、準備できたぞということでいざ実際にデータ移行を実行してみると、仕様から外れていたり、ドキュメントに残っておらず、想定外のデータが入っているということが経験上ほぼ100%起きています。内訳は(主観ですが)「当時はそうせざるを得なかった」というような、いわゆる歴史的経緯によって生み出されていることが多いのかなと思います。

例えば、サービスに新機能を追加するので「DBの既存のテーブルにカラムを追加したい」ということはよくあることだと思います。ではそのカラムをNOT NULLなカラムにして、今後追加/更新されるデータは確実に何かしらの値が入るとして、更新されないかもしれない既存のデータはどうするでしょうか?少なくともカラム追加の時には何かしら入れておく必要があるでしょう。それを何かしらの値で埋めておいて、コード側でエラーにならないように少し手を入れるということをやったことはないでしょうか?あるいは日付カラムなので、エラーにならないように遠く未来の日付にしておく、みたいなことをやったことはないでしょうか?ちなみにこのように運用上必要になったなど、何らかの理由で手で追加された・更新されたデータのことを「地層」と勝手に呼んでいます。

実際どう対応するべきかについてはここでは言及しませんが、それらの対応自体はその時点ではベストな対応だったのです。あるいはもしかしたら苦渋の対応だったのかもしれません。しかし時間の経過と共にチームからそういう知識とか事情が失われ、あとから見た時に少し不思議だったり、想定外な状態に見えるということが起きるのだと思います。こういうものは埋もれていることが多く、運良く(?)何かしらの不具合だったりなどと一緒に顕現することもありますが、掘り返さない限りどんどん埋もれていきます。掘り返すタイミングが、不具合だったり利用者からの問い合わせだったり、リニューアルに伴うデータ移行だったりするのです。 当日のトークではこういう手で入れるタイプの特殊なデータは作らないよう努めるのも必要という話をしましたが、実運用ではかなり難しいでしょう。何かしらやりようはあるかもしれませんが、特にほとんどのWebサービスは変わっていくことが前提のはずで、どちらかというと、チームから知識が失われないように努力するほうがいいのかもしれません。なんにしろ自分がいなくなってもサービスやその機能が続く限りはデータは残る、ということは意識するのがいいと思います。この辺の話にも思うことがあるけど、まあまた別のエントリで。

現況が優先される

過去にどういう事情があって今の状態になっているかわからないこともあるものの、移行するにあたっては、今の状態から新システムに移すにあたっての困り事を解決しないと進めません。過去の事情を調べることは重要な工程ですが、一方で移行しようとしている時点でデータの状態を見た時、もう必要のない要件だったり仕様だったりするかもしれません。そういうものは捨てていくのがよいでしょう。過去の何らかの事情で不思議な状態になっていたとして、その過去の事情を新しいシステムに持ち込む必要があるかという判断が必要です。それもデータ移行時に必要な作業です。これは新しい賃貸物件や不動産を探す時にたまに見る「現況を優先する」という概念に似ているなと思うことがあります。

なんか長文になってしまった。トークでも話したのですが、もしもサービスリニューアルに伴うデータ移行をやることになったらこのことを思い出してもらえたら嬉しいです。

おわりに

ここからはトークの補足ではなく感想です。自分がYAPCに初めて参加したのは2017年のYAPC::Fukuokaでした。それまで大きい技術イベントにそれほど参加したことはなかったのですが、その時すごく刺激をもらったし、いつかはこういう場で登壇したいなと強く思ったのを覚えています。一方で自分にはあまり縁のないことかなとも思っていました。YAPCで登壇できて、一つ目標が達成できたのは良かったなと思います。もう少し上手く話せたら良かったなという反省はありつつ、それはまた次回以降ということで...

約3ヶ月も寝かせてすみません。気がついたら2024年から2025年になってしまった... かなり今更ですが、参加者の皆さん、スタッフの皆さんお疲れ様でした。また次回以降にお会いしましょう。