ニコニコ動画のコード改善の歩み


はじめに

こんにちは。ニコニコ動画開発の小池です。

私の所属するチームではニコニコ動画の動画サービスのサーバーサイドをメインに担当しております。
今回は PHPerKaigi2024 向けの記事として、動画サービスのコード改善についてこれまでの歴史や取り組みとその成果について紹介していきたいと思います。

文中の3つのフレーズをチャレンジトークンとしてみました。ぜひ探してみてください! (※ 記事の見出しにの横についている「#」はチャレンジトークンではありません。チャレンジトークンは文中に配置されています。紛らわしくてすみません!)

2006年: ローンチ

ニコニコ動画は2006年にローンチされて以来、皆様の応援のおかげで現在までサービスが継続されております。
当時はRuby on Railsが流行り始めてCakePHPが出ているかどうかといったくらいの時代で、フレームワークを利用しないというのも十分現実的な選択肢でした。
ユーティリティ関数をまとめた1ファイル、DBアクセスをまとめた1ファイルと、素朴なコードでスタートしたサービスは、その構成のまま急成長していきます。
クラスでの実装もされていましたがデータのやり取りはarrayだったり、ドメインとインフラの分離などは皆無でした。
一部のページでは現在も2006年に書かれたであろうコードが稼働しています。

2015年: モダン実装への取り組み

2015年頃[1]に現代的コーディング規約を適用する新しいコード置き場が作られました。
フレームワークこそ導入しませんでしたが、各所で必要なライブラリを活用していって新しいメンバーにも分かりやすいコードが書かれていくようになりました。
当時はまだ古い実装に依存したラッパーも多かったですが、現在はDDDを適度に適用し、古い実装に依存しないで書き直したり新たに書かれたコードになっています。

コード量の計測

ローンチから改善開始を経て現在と進んできたわけですが、そもそものコードの規模感やレガシー/モダン実装の比率などは誰も見ていませんでした。
そこでバージョン管理で過去に遡りながらコードを分析して行数を記録していく簡単なスクリプトをTypeScriptで実装して計測してみました。

今回はレガシー/モダンの比較という事でそれらのコード量を計測します。(それら以外にもWebページ・APIのエントリポイント・バッチなどが実装としてありますが、それらは除外しています)
またニコニコ動画はバージョン管理をcvs,svn,gitと乗り換えていっており、残念ながら2012年10月[2]までしか戻れませんでした。

集計結果

モダンとレガシーの変遷
モダンとレガシーの合計

グラフにしてみてみると改善の形が分かりやすくて良いですね!
ニコニコ動画(く)の時期にモダン化の改善が急加速し、「2019年01月22日」にレガシー実装のコード量を追い抜いていたことが分かりました。
2021年頃にペースは落ち着きますが、これはコメントサーバーの引っ越し作業やクリエイター向けのニコニコガレージなど、別リポジトリでの開発が活発になってきたのが要因となっています。

ユーティリティとDBアクセサの合計

ローンチ当初から存在するユーティリティとDBアクセサをそれぞれまとめたファイル2つの変遷も見てみましょう。
#12000行弱もあったDBアクセサですが、モダン実装で書き直されていき#2500行まで削減できました。
残っている処理は別システムとの連携専用なので、連携の方法自体を見直して削減していく計画となっています。
ユーティリティも最大時から10%ほどのサイズまで小さくなり、いよいよすべての削除が見えてきました。ファイルを削除できる日が楽しみです。

草むしり

我々のチームでは毎週水曜の朝と夜に「#草むしり」という時間を設けています。
この時間は今担当している案件から頭を切り替えて、コードやドキュメントや環境の整備をしようという事になっています。
この時間のおかげでレガシーコードの削減だけに限らず、日々の開発業務の中で気になった点を放置せず改善にリソースを振ることができるようになっています。

[1]: 2013年10月8日ニコニコ動画:GINZA のリリース日、 2018年6月28日ニコニコ動画(く) のリリース日なので真ん中あたりの時期になります
[2]: 2012年10月17日ニコニコ動画:Q のリリース日になります


ドワンゴではニコニコ動画を一緒に作ってくれる仲間を募集しています。
PHP や Go 言語に興味ある方、ドワンゴに興味がある、または応募しようか迷っている方がいれば、気軽に応募してみてください。