こんにちは。製品企画室の土井です。
ようやくAtCoderのレートが400を超えました。
今回は、初めてのTOPSIC開発というテーマでお話したいと思います。研修を終え、業務に入り、私が初めて開発した2つの機能についてお伝えします。
一つ目が、お知らせ管理機能です。TOPSICのトップページには、当社からのお知らせを表示する欄が存在します。例えば、イベント開催の告知、問題追加のお知らせ、メンテナンス日程の連絡などです。これらのお知らせ情報を効率良く入力できるような機能を作るのが、最初のTOPSIC開発でした。
既存のページを参考にしながら、分からない部分を調べつつ、少しずつ実装していきました。最終的には、お知らせの新規登録・編集に加えて、一覧表示や検索・ソート機能(Ransack)、ページネーション(kaminari)など様々な機能に触れることができました。今回私が開発した機能は、現在テスト中ですが、問題が無ければ、次のバージョンでリリースされます。
二つ目が、CSV取込機能です。ユーザー情報を含むCSVファイルを取り込み、新規登録と更新を行えるようにします。さらに、データベースに書き込む前に、確認用のプレビュー画面を表示するという機能も追加しました。こちらに関しては、現バージョンのTOPSICに参考にできるような機能がないため、自分で模索しながら開発していく必要があり、非常に苦戦しました。
最大の壁は、パフォーマンスの問題でした。開発中に使用していたのは、ユーザーが10件程度のCSVファイルでした。しかし、一通り機能を作り終えてから、100件、1000件とデータを増やして実験してみたところ、非常に時間がかかってしまいます。100件のプレビュー画面を出すのに約15秒、1000件だと約2分半と使い物にならない状況でした。”とりあえず動くものを作る”という学生時代の考えでは通用しないということがよく分かりました。
ここからパフォーマンスを向上させる作業に入りました。チームの先輩方に相談したところ、ActiveRecordの大量使用(モデルの大量生成)によるメモリ消費が原因ではないかとのことでした。CSVから取り込んだデータを1件ずつモデル化し、プレビュー画面に表示するような処理を行っていましたが、モデルを使わずにハッシュ化だけに止めたところ、処理時間を大幅にカットすることに成功しました。100件の場合は約2秒に、1000件の場合は約5秒に短縮されました。(これでもまだ遅い方ですが…)たったこれだけの変更で、ここまで大きく処理時間が変わることに非常に驚きました。まだまだRailsに関する知識が足りないと実感しました。
今までは、とりあえず正しく動作することを考えて、プログラムを実装してきました。しかし、実際にサービスとして提供するには、利用する人のことを考え、パフォーマンスにも気を配る必要があると感じました。さらに、RubyやRails特有の処理(ActiveRecordの使用)にかかる負荷の大きさなどについても学ばなければならないと思いました。
まだまだ学ぶべきことはたくさんあるので頑張りたいと思います。