-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,92 +1 @@ | ||
<!DOCTYPE html> | ||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" > | ||
|
||
<head> | ||
<link href="http://gmpg.org/xfn/11" rel="profile"> | ||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> | ||
<meta http-equiv="Pragma" content="no-cache"> | ||
<meta http-equiv="Cache-Control" content="no-cache"> | ||
<meta http-equiv="Expires" content="0"> | ||
<meta name="generator" content="Hugo 0.122.0"> | ||
|
||
<meta property="og:type" content="website" /> | ||
<meta property="og:url" content="https://dwango.github.io/404.html" /> | ||
|
||
<meta property="og:title" content="404 Page not found - dwango on GitHub"> | ||
|
||
<meta property="og:description" content="ドワンゴ社内の様子や、文化、技術をご紹介します。" /> | ||
|
||
<meta property="og:image" content="https://dwango.github.io/images/logo.png"> | ||
|
||
<meta name="twitter:card" content="summary"> | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1"> | ||
|
||
<title>404 Page not found - dwango on GitHub</title> | ||
|
||
|
||
<link rel="stylesheet" href="https://dwango.github.io/css/print.css" media="print"> | ||
<link rel="stylesheet" href="https://dwango.github.io/css/poole.css"> | ||
<link rel="stylesheet" href="https://dwango.github.io/css/syntax.css"> | ||
<link rel="stylesheet" href="https://dwango.github.io/css/hyde.css"> | ||
<link rel="stylesheet" href="https://dwango.github.io/css/custom.css"> | ||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Abril+Fatface|PT+Sans:400,400i,700"> | ||
|
||
|
||
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/apple-touch-icon-144-precomposed.png"> | ||
<link rel="shortcut icon" href="/favicon.ico"> | ||
|
||
|
||
<link href="" rel="alternate" type="application/rss+xml" title="dwango on GitHub" /> | ||
</head> | ||
|
||
<body class="theme-dwango "> | ||
<div class="sidebar"> | ||
<div class="container sidebar-sticky"> | ||
<div class="sidebar-about"> | ||
<h1><a href="https://dwango.github.io/">dwango on GitHub</a></h1> | ||
</div> | ||
|
||
<ul class="sidebar-nav"> | ||
<li><a href="https://dwango.github.io/">Home</a></li> | ||
<li><a href="/articles"> Articles </a></li><li><a href="/niconico"> ニコニコ開発者向け情報 </a></li><li><a href="https://dwango.co.jp/"> 会社情報 </a></li><li><a href="https://recruit.dwango.co.jp/"> 採用情報 </a></li> | ||
</ul> | ||
|
||
<h2>Links</h2> | ||
<ul class="sidebar-nav"> | ||
<li><a href="https://dwango.github.io/oss"> dwango OSS </a></li><li><a href="https://blog.nnn.dev/"> 教育サービス開発者ブログ </a></li><li><a href="https://vrm.dev/"> VRM </a></li><li><a href="https://dmv.nico/ja/"> Dwango Media Village </a></li> | ||
</ul> | ||
|
||
<p class="copyright"> | ||
|
||
Copyright © DWANGO Co., Ltd. | ||
|
||
</p> | ||
</div> | ||
</div> | ||
|
||
<div class="content container"> | ||
<h1>404: Page not found</h1> | ||
<p class="lead">Sorry, we've misplaced that URL or it's pointing to something that doesn't exist. <a href="https://dwango.github.io/">Head back home</a> to try finding it again.</p> | ||
</div> | ||
|
||
|
||
<script> | ||
var doNotTrack = false; | ||
if (!doNotTrack) { | ||
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; | ||
ga('create', 'G-LF3Z3TQ34F', 'auto'); | ||
|
||
ga('send', 'pageview'); | ||
} | ||
</script> | ||
<script async src='https://www.google-analytics.com/analytics.js'></script> | ||
|
||
</body> | ||
</html> |
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,228 +1 @@ | ||
<!DOCTYPE html> | ||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja" > | ||
|
||
<head> | ||
<link href="http://gmpg.org/xfn/11" rel="profile"> | ||
<meta http-equiv="content-type" content="text/html; charset=utf-8"> | ||
<meta http-equiv="Pragma" content="no-cache"> | ||
<meta http-equiv="Cache-Control" content="no-cache"> | ||
<meta http-equiv="Expires" content="0"> | ||
<meta name="generator" content="Hugo 0.122.0"> | ||
|
||
<meta property="og:type" content="website" /> | ||
<meta property="og:url" content="https://dwango.github.io/articles/2024-02_nvcore_code/" /> | ||
|
||
<meta property="og:title" content="ニコニコ動画のコード改善の歩み - dwango on GitHub"> | ||
|
||
<meta property="og:description" content="ドワンゴ社内の様子や、文化、技術をご紹介します。" /> | ||
|
||
<meta property="og:image" content="https://dwango.github.io/images/logo.png"> | ||
|
||
<meta name="twitter:card" content="summary"> | ||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1"> | ||
|
||
<title>ニコニコ動画のコード改善の歩み - dwango on GitHub</title> | ||
|
||
|
||
<link rel="stylesheet" href="https://dwango.github.io/css/print.css" media="print"> | ||
<link rel="stylesheet" href="https://dwango.github.io/css/poole.css"> | ||
<link rel="stylesheet" href="https://dwango.github.io/css/syntax.css"> | ||
<link rel="stylesheet" href="https://dwango.github.io/css/hyde.css"> | ||
<link rel="stylesheet" href="https://dwango.github.io/css/custom.css"> | ||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Abril+Fatface|PT+Sans:400,400i,700"> | ||
|
||
|
||
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/apple-touch-icon-144-precomposed.png"> | ||
<link rel="shortcut icon" href="/favicon.ico"> | ||
|
||
|
||
<link href="" rel="alternate" type="application/rss+xml" title="dwango on GitHub" /> | ||
</head> | ||
|
||
<body class="theme-dwango "> | ||
<div class="sidebar"> | ||
<div class="container sidebar-sticky"> | ||
<div class="sidebar-about"> | ||
<h1><a href="https://dwango.github.io/">dwango on GitHub</a></h1> | ||
</div> | ||
|
||
<ul class="sidebar-nav"> | ||
<li><a href="https://dwango.github.io/">Home</a></li> | ||
<li><a href="/articles"> Articles </a></li><li><a href="/niconico"> ニコニコ開発者向け情報 </a></li><li><a href="https://dwango.co.jp/"> 会社情報 </a></li><li><a href="https://recruit.dwango.co.jp/"> 採用情報 </a></li> | ||
</ul> | ||
|
||
<h2>Links</h2> | ||
<ul class="sidebar-nav"> | ||
<li><a href="https://dwango.github.io/oss"> dwango OSS </a></li><li><a href="https://blog.nnn.dev/"> 教育サービス開発者ブログ </a></li><li><a href="https://vrm.dev/"> VRM </a></li><li><a href="https://dmv.nico/ja/"> Dwango Media Village </a></li> | ||
</ul> | ||
|
||
<p class="copyright"> | ||
|
||
Copyright © DWANGO Co., Ltd. | ||
|
||
</p> | ||
</div> | ||
</div> | ||
|
||
<div class="content container"> | ||
|
||
<div class="post"> | ||
<time class="content-date" datetime="2024-02-19 00:00:00 +0900 JST" itemprop="datepublished" | ||
>2024-02-19 Mon</time | ||
> | ||
<h1 class="article-title">ニコニコ動画のコード改善の歩み</h1> | ||
|
||
<div> | ||
|
||
<aside> | ||
<h2>目次</h2> | ||
<nav id="TableOfContents"> | ||
<ul> | ||
<li><a href="#はじめに">はじめに</a></li> | ||
<li><a href="#2006年-ローンチ">2006年: ローンチ</a></li> | ||
<li><a href="#2015年-モダン実装への取り組み">2015年: モダン実装への取り組み</a></li> | ||
<li><a href="#コード量の計測">コード量の計測</a></li> | ||
<li><a href="#集計結果">集計結果</a></li> | ||
<li><a href="#草むしり">草むしり</a></li> | ||
</ul> | ||
</nav> | ||
</aside> | ||
<hr /> | ||
|
||
<article id="content"><h2 id="はじめに">はじめに</h2> | ||
<p>こんにちは。ニコニコ動画開発の小池です。</p> | ||
<p>私の所属するチームではニコニコ動画の動画サービスのサーバーサイドをメインに担当しております。<br> | ||
今回は <a href="https://phperkaigi.jp/2024/">PHPerKaigi2024</a> 向けの記事として、動画サービスのコード改善についてこれまでの歴史や取り組みとその成果について紹介していきたいと思います。</p> | ||
<p>文中の3つのフレーズを<span style="color:#ff2790">チャレンジトークン</span>としてみました。ぜひ探してみてください! (※ <strong>記事の見出しにの横についている「#」はチャレンジトークンではありません</strong>。チャレンジトークンは文中に配置されています。紛らわしくてすみません!)</p> | ||
<h2 id="2006年-ローンチ">2006年: ローンチ</h2> | ||
<p>ニコニコ動画は2006年にローンチされて以来、皆様の応援のおかげで現在までサービスが継続されております。<br> | ||
当時はRuby on Railsが流行り始めてCakePHPが出ているかどうかといったくらいの時代で、フレームワークを利用しないというのも十分現実的な選択肢でした。<br> | ||
ユーティリティ関数をまとめた1ファイル、DBアクセスをまとめた1ファイルと、素朴なコードでスタートしたサービスは、その構成のまま急成長していきます。<br> | ||
クラスでの実装もされていましたがデータのやり取りはarrayだったり、ドメインとインフラの分離などは皆無でした。<br> | ||
一部のページでは現在も2006年に書かれたであろうコードが稼働しています。<br></p> | ||
<h2 id="2015年-モダン実装への取り組み">2015年: モダン実装への取り組み</h2> | ||
<p>2015年頃<sup id="ref1"><a href="#note1">[1]</a></sup>に現代的コーディング規約を適用する新しいコード置き場が作られました。<br> | ||
フレームワークこそ導入しませんでしたが、各所で必要なライブラリを活用していって新しいメンバーにも分かりやすいコードが書かれていくようになりました。<br> | ||
当時はまだ古い実装に依存したラッパーも多かったですが、現在はDDDを適度に適用し、古い実装に依存しないで書き直したり新たに書かれたコードになっています。<br></p> | ||
<h2 id="コード量の計測">コード量の計測</h2> | ||
<p>ローンチから改善開始を経て現在と進んできたわけですが、そもそものコードの規模感やレガシー/モダン実装の比率などは誰も見ていませんでした。<br> | ||
そこでバージョン管理で過去に遡りながらコードを分析して行数を記録していく簡単なスクリプトをTypeScriptで実装して計測してみました。<br></p> | ||
<p>今回はレガシー/モダンの比較という事でそれらのコード量を計測します。(それら以外にもWebページ・APIのエントリポイント・バッチなどが実装としてありますが、それらは除外しています)<br> | ||
またニコニコ動画はバージョン管理をcvs,svn,gitと乗り換えていっており、残念ながら2012年10月<sup id="ref2"><a href="#note2">[2]</a></sup>までしか戻れませんでした。<br></p> | ||
<h2 id="集計結果">集計結果</h2> | ||
<p><div class="article-img"> | ||
|
||
<img src="https://dwango.github.io/images/2024-02_nvcore_code/chart1.png" alt="モダンとレガシーの変遷" /> | ||
|
||
</div> | ||
|
||
<div class="article-img"> | ||
|
||
<img src="https://dwango.github.io/images/2024-02_nvcore_code/chart2.png" alt="モダンとレガシーの合計" /> | ||
|
||
</div> | ||
</p> | ||
<p>グラフにしてみてみると改善の形が分かりやすくて良いですね!<br> | ||
ニコニコ動画(く)の時期にモダン化の改善が急加速し、「2019年01月22日」にレガシー実装のコード量を追い抜いていたことが分かりました。<br> | ||
2021年頃にペースは落ち着きますが、これはコメントサーバーの引っ越し作業やクリエイター向けのニコニコガレージなど、別リポジトリでの開発が活発になってきたのが要因となっています。<br></p> | ||
<div class="article-img"> | ||
|
||
<img src="https://dwango.github.io/images/2024-02_nvcore_code/chart3.png" alt="ユーティリティとDBアクセサの合計" /> | ||
|
||
</div> | ||
|
||
<p>ローンチ当初から存在するユーティリティとDBアクセサをそれぞれまとめたファイル2つの変遷も見てみましょう。<br> | ||
<span style="color:#ff2790">#12000行弱もあったDBアクセサ</span>ですが、モダン実装で書き直されていき<span style="color:#ff2790">#2500行まで削減</span>できました。<br> | ||
残っている処理は別システムとの連携専用なので、連携の方法自体を見直して削減していく計画となっています。<br> | ||
ユーティリティも最大時から10%ほどのサイズまで小さくなり、いよいよすべての削除が見えてきました。ファイルを削除できる日が楽しみです。<br></p> | ||
<h2 id="草むしり">草むしり</h2> | ||
<p>我々のチームでは毎週水曜の朝と夜に「<span style="color:#ff2790">#草むしり</span>」という時間を設けています。<br> | ||
この時間は今担当している案件から頭を切り替えて、コードやドキュメントや環境の整備をしようという事になっています。<br> | ||
この時間のおかげでレガシーコードの削減だけに限らず、日々の開発業務の中で気になった点を放置せず改善にリソースを振ることができるようになっています。<br></p> | ||
<p><small id="note1">[1]: <code>2013年10月8日</code> が <code>ニコニコ動画:GINZA</code> のリリース日、 <code>2018年6月28日</code> が <code>ニコニコ動画(く)</code> のリリース日なので真ん中あたりの時期になります <a href="#ref1">↩</a></small><br> | ||
<small id="note2">[2]: <code>2012年10月17日</code> が <code>ニコニコ動画:Q </code>のリリース日になります <a href="#ref2">↩</a></small><br></p> | ||
<hr> | ||
<p>ドワンゴでは<span style="font-weight:bold">ニコニコ動画を一緒に作ってくれる仲間を募集</span>しています。<br> | ||
PHP や Go 言語に興味ある方、ドワンゴに興味がある、または応募しようか迷っている方がいれば、気軽に応募してみてください。</p> | ||
<ul> | ||
<li><a href="https://dwango.snar.jp/index.aspx">新卒採用はこちら</a></li> | ||
<li><a href="https://hrmos.co/pages/dwango">キャリア採用はこちら</a></li> | ||
</ul> | ||
</article> | ||
</div> | ||
<div class="content-info"> | ||
<div class="post-categories"> | ||
|
||
</div> | ||
|
||
<div class="post-tags"> | ||
|
||
</div> | ||
<div class="share"> | ||
<a | ||
href="https://twitter.com/share?ref_src=twsrc%5Etfw" | ||
class="twitter-share-button" | ||
data-text="ニコニコ動画のコード改善の歩み - dwango on GitHub" | ||
data-url="https://dwango.github.io/articles/2024-02_nvcore_code/" | ||
data-show-count="false" | ||
>Tweet</a | ||
> <script | ||
async | ||
src="https://platform.twitter.com/widgets.js" | ||
charset="utf-8" | ||
></script> | ||
<a | ||
href="http://b.hatena.ne.jp/entry/https://dwango.github.io/articles/2024-02_nvcore_code/" | ||
class="hatena-bookmark-button" | ||
data-hatena-bookmark-layout="basic-label-counter" | ||
data-hatena-bookmark-lang="ja" | ||
title="このエントリーをはてなブックマークに追加" | ||
><img | ||
src="https://b.st-hatena.com/images/entry-button/button-only@2x.png" | ||
alt="このエントリーをはてなブックマークに追加" | ||
width="20" | ||
height="20" | ||
style="border: none" | ||
/></a> | ||
<script | ||
type="text/javascript" | ||
src="https://b.st-hatena.com/js/bookmark_button.js" | ||
charset="utf-8" | ||
async="async" | ||
></script> | ||
<iframe | ||
src="https://www.facebook.com/plugins/share_button.php?href=https%3a%2f%2fdwango.github.io%2farticles%2f2024-02_nvcore_code%2f&layout=button&size=small&mobile_iframe=false&width=61&height=20&appId" | ||
height="20" | ||
width="69" | ||
style="border: none; overflow: hidden" | ||
scrolling="no" | ||
frameborder="0" | ||
allowTransparency="true" | ||
></iframe> | ||
</div> | ||
</div> | ||
</div> | ||
|
||
</div> | ||
|
||
|
||
<script> | ||
var doNotTrack = false; | ||
if (!doNotTrack) { | ||
window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date; | ||
ga('create', 'G-LF3Z3TQ34F', 'auto'); | ||
|
||
ga('send', 'pageview'); | ||
} | ||
</script> | ||
<script async src='https://www.google-analytics.com/analytics.js'></script> | ||
|
||
</body> | ||
</html> |