Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
令和に独自CMSを動かし続けるために
Search
ふぉの
July 12, 2024
Technology
60
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
令和に独自CMSを動かし続けるために
https://otaku.connpass.com/event/318100/
のLTです
ふぉの
July 12, 2024
More Decks by ふぉの
See All by ふぉの
pixivisionを動かし続けるために
fono09
0
2k
Other Decks in Technology
See All in Technology
AIに任せた品質は、誰が見立てるのか - AI時代のテストマネジメント
nakanao
3
2k
現場で役立つ技術負債の効果的な返済方法
masuda220
PRO
9
4.4k
LTのテーマ どうきめてる?〜5つの型と私のやり方〜
yama3133
1
110
事業課題から技術的負債に向き合う
sansantech
PRO
2
1.9k
おい、エージェントを使って終わらせろ
nwiizo
1
620
新機種発売前に見直そう!端末移行で再ログインが要るアプリ・要らないアプリは何が違うのか 〜シームレスに再開できる設計と実装〜
zozotech
PRO
0
200
作品が生態系になった ─ Mini Tokyo 3D から世界へ
nagix
0
190
synctest時代のhttptest Go 1.27で変わるHTTPサーバテストの裏側 / go conference2026 synctest and httptest
budougumi0617
1
3k
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
4
1.3k
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
zozotech
PRO
1
740
30座EKS, 180次升級淬煉的EKS Upgrade Skill 的歷程
eric8230
0
170
Railsのように考える: See through the Master
snoozer05
PRO
4
1k
Featured
See All Featured
How GitHub (no longer) Works
holman
316
150k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
570
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Google's AI Overviews - The New Search
badams
0
1.6k
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
How to build an LLM SEO readiness audit: a practical framework
nmsamuel
1
910
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Code Review Best Practice
trishagee
74
20k
Fireside Chat
paigeccino
43
4k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
460
Transcript
令和に独自 CMSを 動かし続けるためにやったこと pixiv Inc. fono 2024.7.12
2 自己紹介 • ピクシブ事業本部オブザーバーチーム • やっていたこと ◦ pixiv/pixivision(バックエンド) • やっていること
◦ pixiv系バックエンド等 ◦ データ整備(データ基盤) • 趣味 ◦ アニメ一気見(来週まで待てない族) ◦ 旅行: バイク, 鉄道, 自動車 ◦ 自宅サーバ fono
全体の流れ 1. 今日の内容 2. pixivisionとは? 3. 機能のかいしゃく 4. アーキテクチャ改善 5.
韓国語導入 6. 未来へ届ける 3
今日の内容 話すこと • 2021年8月着任時から2024年3月までpixivisionでやってきたこと • 全体を通した技術的な思考、志向、アーキテクチャ • 注: PIXIV MEETUP
2023(招待制)の増補版になります 話さないこと • 実装の細部 • 言語や環境に依存したトリッキーな部分 4
www.pixivision.net のこと(since 2014.6) 歴史的経緯でコードネームはspotlight \ ミテネ! / 5 とは?
公式説明 (/ja/about)は下記の通り イラストやマンガ、ノベルをはじめとした「創 意工夫から生まれる"とっておきの作品"」と オタクカルチャーを多言語で世界に向けて発信 する、毎日に退屈したくない人のための創作系 メディアです。 \ ミテネ! /
6 とは?
7 今回の話1 コードに整頓ルールを決めて適用した ↓before(47 file/directory) after(29 file/dir)→
8 今回の話2 全般的に設計思想を導入して ファクタした • 所謂CQRSがちゃんと刺さる環境だと判断して採用した
9 9 今回の話3 今年3月に韓国語がリリースされた • それまでのリファクタが大きな寄与した
機能のかいしゃく 10
解釈🤔 11
機能実装の経緯と意図を解釈する • 機能の経緯と動作と実運用 • 資料はUMLと文章で構成 • 古いという理由で邪険にしない(不要なバイアス) つぶさに調べて資料にまとめた上で、丁寧に解釈していく 12
つぶさに調べて まとめている様子 UMLでの表現 • ステートマシン図(状態遷移) • 相互作用とフロー(シーケンス図) • 自然言語よりは意味が固まっている •
コード読解より大枠を理解しやすい • 必要な部分は文章で補足 13
つぶさに調べて まとめている様子 文章での表現 • 必要な分だけ • とはいえ少なくできない • 実装経緯 •
期待された・実は違う動作 • 今後の改修方針 14
わ か る 資料はめんどい…… 15
VCSはコードの履歴を残すが 経緯と意図は残してくれない しかしながら 16
だからこそ • 過度に1資料を肥大化させない ⇒カジュアルに新しいページを作る • 惰性で残すことだけに固執しない ⇒Archiveという状態で見えなくする • しっかり資料奉行をやる ⇒読める、書ける、整っているを維持する
17
機能のかいしゃく 18
介錯😇 19
使われていない機能を片付ける 解釈を終えた機能を、精度高く判断して介錯する • 敬意を持って看取る • 安全に消す ◦ 管理画面以外、基本的にメンテナンスで停止しない • 次に活かす
◦ なぜ不要になってしまったのかは軽く考慮する ◦ やむを得ない場合もある(ほとんどかも) 20
看取った機能たち 消したもの 使っていないから看取る • 独自ABテスト • 管理画面の一部ロール • 運用実態のない表示領域 •
記事末導線テンプレート管理 • 公開済み記事の膨大な編集履歴 吸収合併したもの まとめて片寄せする • 記事データ形式(2形式⇒1形式) • 記事サムネイル形式(2形式⇒1形式) 21
確実に実装量は減って 明らかに身軽になった 結果として DB 52カラム廃止 仕様 10+機能廃止 ※チケットベース,統廃合含む 21万+滞留レコード削除 ※本番DB保持から必要なレコードのみデータ基盤退避に仕様変更
22
アーキテクチャ改善 23
アーキテクチャ改善 • 身軽になったので、解釈が十分にできた機能が多くなる • 全体の実装をどのように整理するかの議論ができるようになる • 資料と照らし合わせて差分で検討できる • しかし、まだ実装を諦める機能がある •
全体の構造を見直す時期では? 24
まずは実装を大きく整頓した 平置きだったコードを フォルダに整頓 ※1ファイル1クラス before(47 file)→ after(29 file)→ 単純に認知コストが下がる 25
整頓した結果 • パッケージングを意識し始めることができた • 「こちらを触ってもあちらのパッケージは壊れない」 という安心感が生まれた • 整頓できないクラスの特徴から今後のリファクタ方針が浮かび上がった ◦ OOP,
DDDにおける各種原則の実践も視野に入るようになってきた ◦ 惰性で配置するのではなく、もっと意図した配置とアーキテクチャへ 26
整頓前の何が辛かったか • 全て平置きであり、依存関係が見通せない • 記事に関する神クラスを片付ける目処が立たない • 2017年の段階で 大半の処理が2種類に分けられるとされていたが 実装に反映されていなかった(次のスライドで説明) 27
2種類の分類 赤色 管理画面/ビジネスユーザー側 • 記事の管理 • 諸々の業務システム的な部分 青色 公開画面/記事を表示する側 •
www.pixivision.net • 表示やSNSのシェアといった 公開されるデータを扱う 28
整頓方針 • 分類に名前がついていなかったので Public, Adminと名付けた • 処理の役割に合わせてPublic, Adminの分離を行い CQRSになぞらえて Spotlight
Public Admin Responsive Segregation と名付け「エスパーズ」と呼んだが呼ぶ機会はあまりない 29
整頓方針 • CQRS(クエリコマンド責務分離)とセットで考え 3種類に整頓(4分類だが、1分類は該当処理なし) • 読み書きの偏在を生かして実装時に考えること減らす • 記事本体の読み書きに関して、下記のように整理できた CQRS\SPARS Public
Admin Command N/A(該当処理なし) (表示側で書き込む) Admin/ArticleCommandRoutine (管理側で書き込む) Query ArticleQueryRoutine (表示側で読み込む) Admin/ArticleQueryRoutine (管理側で読み込む) 30
読み書きの偏在 表示と編集を行う処理 • Read/Write • Query, Commandがある 表示に限られた処理 • ReadOnly
• Queryしかない Admin(赤色) Public(青色) 31
保守だけの状態が終わって あるべき問いに帰結した 32
pixivisionでなにしたい? 33
『韓国語入れたい!!!!』 34
韓国語導入 • 軽く調査した結果 • 意外とできそう 35
韓国語導入 • リファクタ前には想像できなかった速度で実装された韓国語 • 2人で実装、10月着手、12月上旬実装完了 • 2ヶ月調整、3月リリース 36
韓国語導入 • これまでのリファクタの成果が軒並み刺さる • 在るべき場所に在るべきコードを書くことで安全に機能が拡張される 37
次の要求に素早く応える 価値あるリファクタに 38
未来へ届ける • 実は最初のQRコードのリンク先はID=1、最初の記事 • 一貫していたのは「過去の記事がそつなく表示できること」 • これまでpixivisionに携わったすべての人が意図してか意図せずか 記事で紹介した作品と作者を尊敬し、未来に届ける という営みが連綿と続いていた •
その営みを、真摯に、されど楽しく受け継いでいきたい 39
pixivision先生の次回作に ご期待ください ご清聴ありがとうございました 40