VOYAGE GROUP ECナビからPHPカンファレンス2016で発表した内容です。
老舗メディアが改善に取り組んでいる話VOYAGE GROUPECナビ事業本部駒崎大輔
View Slide
自己紹介● SIer○ 約10年 PG、SE● Web(ECパッケージ開発)○ 約2年 SE、PM兼インフラとか色々● Web(自社サービス) ←今ココ○ 約3年 ソフトウェアエンジニア
● 小さく素早くリリース● 不要なコードを葬る● 改善習慣を身につける今日話すこと
VOYAGE GROUP 「2016年9月期通期 決算説明資料」から抜粋
ECナビ
ECナビ 「ECナビ MEDIA GUIDE 2016年10月〜12月」から抜粋
ECナビ● 1999年: MyID(懸賞サイト)● 2004年: ECナビECナビとして12歳!MyIDから数えると17歳!!
ECナビのシステム概要
● 古き良き200x年代のあるある構成○ LAMP(PHP/Perl + MySQL + Apache)○ PHP5.6.24, PHP5.x● OracleがコアなDB(OLTP)○ ポイントとユーザなど、サイトの基幹データを管理● 長年オンプレECナビのシステム概要
● 15名○ 新卒組、中途組がバランスよく配置○ 中途の平均35才前後、在籍5年くらい● 「事業に貢献する技術」志向が強め○ 技術改善チームが5人● 和気あいあい、チームワーク重視ECナビのエンジニア組織
コード
17年
慎重かつビッグなリリース● バージョン管理(SVN)の問題● リリースフローの問題過去に実在した課題
開発環境 デプロイサーバSVNsvn commit 開発svn up deploylogin当時のリリースフロー
当時のリリースフロー
● SVNでの運用○ commit ≠ リリースOK当時のリリースフロー
辛かった。。。
解決策● SVNからGitHubへの移行● リリースフローの自動化
1. リリースしてないファイルの検知2. チームのgitレベルアップ3. ハードコードされているパスワードの退避4. リリースフローの整備、自動化やったこと
1. リリースしてないファイルの検知commitしてあるけど未リリースのファイル検知
git-lady(ready)1. リリースしてないファイルの検知チェックし始めたころリリース前日
● エンジニアは大丈夫!2. チームのgitレベルアップ
● デザイナーへのフォローアップ○ 本を配ってハンズオンの勉強会を開催○ GUIのツールは導入検討したがやめた■ エンジニアと同じインターフェース(CUI)で■ デザイナーからも行けそうという声○ デザイナーチームの協力もあり無事2. チームのgitレベルアップ
2. チームのgitレベルアップhttp://book.impress.co.jp/books/1114101005
3. ハードコードされているパスワードの退避
● ハードコードされているパスワードを環境変数に追い出し○ DB、APIの認証情報等…● 環境変数の読み込みには phpdotenv を利用○ https://github.com/vlucas/phpdotenv3. ハードコードされているパスワードの退避
3. ハードコードされているパスワードの退避https://12factor.net/config
やったこと1. リリースしてないファイルの検知2. チームのgitレベルアップ3. ハードコードされているパスワードの退避4. リリースフローの整備、自動化
● デプロイサーバにログインしなくても良いように● 問題があったらすぐrevertできる● リリースを記録する4. リリースフローの整備
開発環境 デプロイサーバSVNsvn commit 開発svn up deploylogin4. リリースフローの整備Before
4. リリースフローの整備開発環境 デプロイサーバGitHub開発deployjenkinsデプロイ指示After PRをMerge
4. リリースフローの整備Inspired by Mercarihttp://tech.mercari.com/entry/2015/10/15/183000
1. リリースしてないファイルの検知2. チームのgitレベルアップ3. ハードコードされているパスワードの退避4. リリースフローの整備、自動化やったことClear!
どうなった?● リリーススピードアップ○ 余計な気を使わずに済むようになった● 小さくリリースが進んで、より安全に○ リリース回数は2-3倍以上● レビューが活発に
1800 - 600 = 1200 1200 - 300 = 900
1800 - 600 = 1200機能1200 - 300 = 900テーブル
不要なコードを葬る17年物システムの氷山
1. 機能の棚卸し2. 不要なコードを葬っていくやったこと
1. 機能の棚卸し
機能とテーブルの一覧を作る1. 機能の棚卸し
● テーブルと機能の関連性を調べる○ Database接続ライブラリにログを仕込む1. 機能の棚卸し
1. 機能の棚卸しGraphVizで生成
● 使われてるか○ エンドポイントへのアクセス○ データの増減2. 不要なコードを葬っていく
● 葬り実行○ コード○ テーブル○ その他設定2. 不要なコードを葬っていく
2. 不要なコードを葬っていく
● 機能数 1800 => 1200● テーブル数 1200 => 900どうなった?
8 x 15 x 8 = 960
● サービス成長に掛ける比重が大きすぎて時間がとれない● 改善を日常業務に組み込む習慣がない改善習慣を身につける
KAIZEN会● やること自由● 丸1日セミナールームにエンジニアが篭る● 基本全員参加inspired by Mercari (Be Professional Day)http://tech.mercari.com/entry/2016/02/01/164829
KAIZEN会● タイムスケジュール○ 10:00-12:00 作業時間○ 12:00-13:00 お昼(お弁当支給)○ 13:00-17:30 作業時間○ 17:30- KPT
KAIZEN会
KAIZEN会● 月1回● 全員参加● 8ヶ月間継続中
KAIZEN会● どうだった?○ エンジニアの声■ 集中して作業できる■ 昔自分が書いたコードをリファクタリング■ 普段見ないコードを見る機会が増えた
KAIZEN会● どうだったか?○ 実際にやったこと例■ 古い作りを新しいフレームワークに乗せる■ デバッグ用タイムトラベル機能の実装■ テストしづらい機能のデータ作成補助機能
PhpMetrics2016年3月 2016年10月
改善の歩み● GitHub化○ 2014年12月〜2015年4月● 棚卸し&スリム化○ 2015年10月〜現在● KAIZEN会○ 2016年3月〜現在小さく早くリリースできるようになった!機能数 1800 => 1200テーブル数 1200 => 900月1回 全員参加 8ヶ月継続
その他の取り組み● DevOps的な取り組み○ インフラとアプリエンジニアの交換留学○ サイトパフォーマンスチェックをみんなでやる会
その他の取り組み● 外部サービス、ツールの活用例○ Datadog○ Re:dash○ Docker○ horenso(https://github.com/Songmu/horenso)○ site24x7
その他の取り組み● 週1回の読書会○ プログラマが知るべき97のこと○ @t_wadaさん!!の解説つき=> 「voyage 読書会」で検索https://www.oreilly.co.jp/books/9784873114798/
● システムはもちろんチームが良くなっている● 歴史を繰り返さないように改善を続けていくまとめ
まとめ● 大きなチャレンジに取り組んでく気持ち↑↑○ AWS移転プロジェクトを立ち上げ
● 小さく素早くリリース● 不要なコードを葬る● 改善習慣を身につける今日話したこと