mixiの大規模案件の話
Yokohama.pm #8
2011/11/18
自己紹介
continued...
自己紹介
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
continued...
自己紹介
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
- 所属:mixi, Inc.
continued...
自己紹介
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
- 所属:mixi, Inc.
continued...
自己紹介
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
- 所属:mixi, Inc.
- 育ちは横浜です
continued...
自己紹介
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
- 所属:mixi, Inc.
- 育ちは横浜です
- 横浜ベイスターズをよろしくお願いします > DeNAさん
continued...
自己紹介
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
- 所属:mixi, Inc.
- 育ちは横浜です
- 横浜ベイスターズをよろしくお願いします > DeNAさん
- Yokohama.pmは全参加
continued...
自己紹介
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
- 所属:mixi, Inc.
- 育ちは横浜です
- 横浜ベイスターズをよろしくお願いします > DeNAさん
- Yokohama.pmは全参加
continued...
自己紹介
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
- 所属:mixi, Inc.
- 育ちは横浜です
- 横浜ベイスターズをよろしくお願いします > DeNAさん
- Yokohama.pmは全参加
- スピーカー2回(#3,#4)
- 飲み会幹事も2回(#5,#7)
continued...
自己紹介
- 名前:星野 将(ホシノ マサル)
- id :masartz(マサルツ)
- 所属:mixi, Inc.
- 育ちは横浜です
- 横浜ベイスターズをよろしくお願いします > DeNAさん
- Yokohama.pmは全参加
- スピーカー2回(#3,#4)
- 飲み会幹事も2回(#5,#7)
- あやうく飲み会要員になる所だったので、今日は頑張って喋ります
Agenda
- mixiの大規模案件とは
- 名前空間、モジュール設計
- 単体テスト
- CI(Jenkins)
- プロジェクトを通じて個人的な振り返り
- まとめ
mixiの大規模案件とは
continued...
mixiの大規模案件とは
continued...
mixiの大規模案件とは
continued...
名前空間、モジュール設計
continued...
名前空間、モジュール設計
continued...
名前空間、モジュール設計
- ひとつのリポジトリで世界が構成されている場合
- 名前空間の衝突はリアルに気をつけるべき問題
continued...
名前空間、モジュール設計
- ひとつのリポジトリで世界が構成されている場合
- 名前空間の衝突はリアルに気をつけるべき問題
- 命名規則もトップレベルはサービスを表現できるように
continued...
名前空間、モジュール設計
- ひとつのリポジトリで世界が構成されている場合
- 名前空間の衝突はリアルに気をつけるべき問題
- 命名規則もトップレベルはサービスを表現できるように
- Mixi::Page? Mixi::Pages? Mixi::Town::Page?
continued...
名前空間、モジュール設計
- ひとつのリポジトリで世界が構成されている場合
- 名前空間の衝突はリアルに気をつけるべき問題
- 命名規則もトップレベルはサービスを表現できるように
- Mixi::Page? Mixi::Pages? Mixi::Town::Page?
- 配下の構成は周りと整合性があるように
continued...
名前空間、モジュール設計
- ひとつのリポジトリで世界が構成されている場合
- 名前空間の衝突はリアルに気をつけるべき問題
- 命名規則もトップレベルはサービスを表現できるように
- Mixi::Page? Mixi::Pages? Mixi::Town::Page?
- 配下の構成は周りと整合性があるように
- Entry.pm? Model.pm? Object.pm?
continued...
名前空間、モジュール設計
- ひとつのリポジトリで世界が構成されている場合
- 名前空間の衝突はリアルに気をつけるべき問題
- 命名規則もトップレベルはサービスを表現できるように
- Mixi::Page? Mixi::Pages? Mixi::Town::Page?
- 配下の構成は周りと整合性があるように
- Entry.pm? Model.pm? Object.pm?
- 認識合わせとタスク分担のために結構ガッチリ決めた
名前空間、モジュール設計
continued...
名前空間、モジュール設計
- そんなんやっても大体は仕様追加/変更で思い通りならない
continued...
名前空間、モジュール設計
- そんなんやっても大体は仕様追加/変更で思い通りならない
- とりあえずでつけた名前でそのまま進んだり
continued...
名前空間、モジュール設計
- そんなんやっても大体は仕様追加/変更で思い通りならない
- とりあえずでつけた名前でそのまま進んだり
- 変更しようと思えば出来るけど、大抵そのまま
continued...
名前空間、モジュール設計
- そんなんやっても大体は仕様追加/変更で思い通りならない
- とりあえずでつけた名前でそのまま進んだり
- 変更しようと思えば出来るけど、大抵そのまま
- この辺踏み切り方がわからない
continued...
名前空間、モジュール設計
- そんなんやっても大体は仕様追加/変更で思い通りならない
- とりあえずでつけた名前でそのまま進んだり
- 変更しようと思えば出来るけど、大抵そのまま
- この辺踏み切り方がわからない
- 今回の教訓としては「最初にガッチリ決めるもんじゃない」
単体テスト
continued...
単体テスト
- レイヤごとに適切なテストがある
- 今回はController/Model/DB-Access それぞれで書き分けた && 方針決めた
continued...
単体テスト
- レイヤごとに適切なテストがある
- 今回はController/Model/DB-Access それぞれで書き分けた && 方針決めた
- 開発人数も多かったので、誰の修正がどこで影響するか読みづらい
continued...
単体テスト
- レイヤごとに適切なテストがある
- 今回はController/Model/DB-Access それぞれで書き分けた && 方針決めた
- 開発人数も多かったので、誰の修正がどこで影響するか読みづらい
continued...
単体テスト
- レイヤごとに適切なテストがある
- 今回はController/Model/DB-Access それぞれで書き分けた && 方針決めた
- 開発人数も多かったので、誰の修正がどこで影響するか読みづらい
- テストがより大事になる
- 個々人によるテスト精度のムラを減らしたかった
単体テスト
continued...
単体テスト
- DB-Accessクラスのテスト
- DBとの接続
- SQLを直で書いてます
- アイコンきもい人でもORM使ってないですよ!
continued...
単体テスト
- DB-Accessクラスのテスト
- DBとの接続
- SQLを直で書いてます
- アイコンきもい人でもORM使ってないですよ!
- hashref(のarrayref)の生なデータをやりくりするので、ここを固く書いた
単体テスト
continued...
単体テスト
- select系はis_deeplyで取得結果全体チェック
continued...
単体テスト
- select系はis_deeplyで取得結果全体チェック
「SELECT member_id , status , create_datetime
FROM member WHERE member_id = ? AND service_id = ?」
$sth->execute( $sql , $service_id , $member_id)
continued...
単体テスト
- select系はis_deeplyで取得結果全体チェック
「SELECT member_id , status , create_datetime
FROM member WHERE member_id = ? AND service_id = ?」
$sth->execute( $sql , $service_id , $member_id)
- Insert系もInsert行をSelectしてis_deeplyで全体チェック
continued...
単体テスト
- select系はis_deeplyで取得結果全体チェック
「SELECT member_id , status , create_datetime
FROM member WHERE member_id = ? AND service_id = ?」
$sth->execute( $sql , $service_id , $member_id)
- Insert系もInsert行をSelectしてis_deeplyで全体チェック
「INSERT INTO member
SET member_id = ? , service_id = ? status => ? , create_datetime =? 」
$sth->execute( $sql , $service_id , $member_id , $status , $create_datetime)
continued...
単体テスト
- select系はis_deeplyで取得結果全体チェック
「SELECT member_id , status , create_datetime
FROM member WHERE member_id = ? AND service_id = ?」
$sth->execute( $sql , $service_id , $member_id)
- Insert系もInsert行をSelectしてis_deeplyで全体チェック
「INSERT INTO member
SET member_id = ? , service_id = ? status => ? , create_datetime =? 」
$sth->execute( $sql , $service_id , $member_id , $status , $create_datetime)
- これらの実現のために社内で作成したFixtureモジュールを使用
continued...
単体テスト
- select系はis_deeplyで取得結果全体チェック
「SELECT member_id , status , create_datetime
FROM member WHERE member_id = ? AND service_id = ?」
$sth->execute( $sql , $service_id , $member_id)
- Insert系もInsert行をSelectしてis_deeplyで全体チェック
「INSERT INTO member
SET member_id = ? , service_id = ? status => ? , create_datetime =? 」
$sth->execute( $sql , $service_id , $member_id , $status , $create_datetime)
- これらの実現のために社内で作成したFixtureモジュールを使用
- 最近ではDataFactoryも使用しはじめてる
単体テスト
continued...
単体テスト
- Controllerクラスのテスト
- 実は社内の一番泣き所
continued...
単体テスト
- Controllerクラスのテスト
- 実は社内の一番泣き所
- 今回は手探りな中 Plack::Test::test_psgi を使用してみた
continued...
単体テスト
- Controllerクラスのテスト
- 実は社内の一番泣き所
- 今回は手探りな中 Plack::Test::test_psgi を使用してみた
- Controller自体は現状はPSGI化されてないApache2依存
continued...
単体テスト
- Controllerクラスのテスト
- 実は社内の一番泣き所
- 今回は手探りな中 Plack::Test::test_psgi を使用してみた
- Controller自体は現状はPSGI化されてないApache2依存
- テスト用に上手くやる
continued...
単体テスト
- Controllerクラスのテスト
- 実は社内の一番泣き所
- 今回は手探りな中 Plack::Test::test_psgi を使用してみた
- Controller自体は現状はPSGI化されてないApache2依存
- テスト用に上手くやる
- 結果凄く便利!
continued...
単体テスト
- Controllerクラスのテスト
- 実は社内の一番泣き所
- 今回は手探りな中 Plack::Test::test_psgi を使用してみた
- Controller自体は現状はPSGI化されてないApache2依存
- テスト用に上手くやる
- 結果凄く便利!
- 今後はどこまでやるかの境界線も考えたい
continued...
単体テスト
- Controllerクラスのテスト
- 実は社内の一番泣き所
- 今回は手探りな中 Plack::Test::test_psgi を使用してみた
- Controller自体は現状はPSGI化されてないApache2依存
- テスト用に上手くやる
- 結果凄く便利!
- 今後はどこまでやるかの境界線も考えたい
- チェックしてる : HTTP Status Code
- チェックしてない : テンプレートに展開する変数の中身
業務連絡
- ここで半分くらい?
- っていうのをYAPC::Asia 2011 でやってる人が多かったので真似してみた
CI(Jenkins)
continued...
CI(Jenkins)
- Jenkins?
- perl5の開発にも使われてる by miyagawa bookmark
continued...
CI(Jenkins)
- Jenkins?
- perl5の開発にも使われてる by miyagawa bookmark
- testを書く->ブランチにcommitする->自動テスト!
continued...
CI(Jenkins)
- Jenkins?
- perl5の開発にも使われてる by miyagawa bookmark
- testを書く->ブランチにcommitする->自動テスト!
- テスト結果をプロジェクトチャンネルにIRC通知
continued...
CI(Jenkins)
- Jenkins?
- perl5の開発にも使われてる by miyagawa bookmark
- testを書く->ブランチにcommitする->自動テスト!
- テスト結果をプロジェクトチャンネルにIRC通知
- エラー時の出力メッセージをIRCのキーワード登録しておくと、ピカピカ光る
CI(Jenkins)
continued...
CI(Jenkins)
- scoreboard
- おまけで使える
- commitのスコアを算出してくれるもの
continued...
CI(Jenkins)
continued...
CI(Jenkins)
- 一番最後のリリースの時
- プロジェクトメンバー全員が数ヶ月必死になって書いたテストが含まれたブランチをtrunkにcommitする
continued...
CI(Jenkins)
- 一番最後のリリースの時
- プロジェクトメンバー全員が数ヶ月必死になって書いたテストが含まれたブランチをtrunkにcommitする
CI(Jenkins)
continued...
CI(Jenkins)
continued...
CI(Jenkins)
continued...
CI(Jenkins)
- いまだに一人勝ち状態!
- とってもソーシャルですよね!
プロジェクトを通じて個人的な振り返り
continued...
プロジェクトを通じて個人的な振り返り
- もっとコード書きたかったし書かなきゃいけなかったけど、書かなかった/書けなかった
continued...
プロジェクトを通じて個人的な振り返り
- もっとコード書きたかったし書かなきゃいけなかったけど、書かなかった/書けなかった
- 先のフェーズを見て、必要なことをする
continued...
プロジェクトを通じて個人的な振り返り
- もっとコード書きたかったし書かなきゃいけなかったけど、書かなかった/書けなかった
- 先のフェーズを見て、必要なことをする
continued...
プロジェクトを通じて個人的な振り返り
- もっとコード書きたかったし書かなきゃいけなかったけど、書かなかった/書けなかった
- 先のフェーズを見て、必要なことをする
continued...
プロジェクトを通じて個人的な振り返り
- もっとコード書きたかったし書かなきゃいけなかったけど、書かなかった/書けなかった
- 先のフェーズを見て、必要なことをする
- 色んな約束事を決めたりする
- 環境構築周り
- アプリ運用さん(今回は主にbonnuさん)とごにょごにょする
continued...
プロジェクトを通じて個人的な振り返り
- もっとコード書きたかったし書かなきゃいけなかったけど、書かなかった/書けなかった
- 先のフェーズを見て、必要なことをする
- 色んな約束事を決めたりする
- 環境構築周り
- アプリ運用さん(今回は主にbonnuさん)とごにょごにょする
- ブランチコントロールしたり、リリースフローを調整したりする
continued...
プロジェクトを通じて個人的な振り返り
- もっとコード書きたかったし書かなきゃいけなかったけど、書かなかった/書けなかった
- 先のフェーズを見て、必要なことをする
- 色んな約束事を決めたりする
- 環境構築周り
- アプリ運用さん(今回は主にbonnuさん)とごにょごにょする
- ブランチコントロールしたり、リリースフローを調整したりする
- 必要なライブラリを先に書いたり、直したりする。けど、、
continued...
プロジェクトを通じて個人的な振り返り
- もっとコード書きたかったし書かなきゃいけなかったけど、書かなかった/書けなかった
- 先のフェーズを見て、必要なことをする
- 色んな約束事を決めたりする
- 環境構築周り
- アプリ運用さん(今回は主にbonnuさん)とごにょごにょする
- ブランチコントロールしたり、リリースフローを調整したりする
- 必要なライブラリを先に書いたり、直したりする。けど、、
- 間違いなくプロジェクトメンバーの中で一番コード書かなかった!!
continued...
プロジェクトを通じて個人的な振り返り
- もっとコード書きたかったし書かなきゃいけなかったけど、書かなかった/書けなかった
- 先のフェーズを見て、必要なことをする
- 色んな約束事を決めたりする
- 環境構築周り
- アプリ運用さん(今回は主にbonnuさん)とごにょごにょする
- ブランチコントロールしたり、リリースフローを調整したりする
- 必要なライブラリを先に書いたり、直したりする。けど、、
- 間違いなくプロジェクトメンバーの中で一番コード書かなかった!!
- 忙しさのピークな時も仕事拾えない
プロジェクトを通じて個人的な振り返り
continued...
プロジェクトを通じて個人的な振り返り
continued...
プロジェクトを通じて個人的な振り返り
continued...
プロジェクトを通じて個人的な振り返り
- 皆さんの中にはいませんか?
- 時代は動いてるし
- 転職してる人も多いですよね
continued...
プロジェクトを通じて個人的な振り返り
- 皆さんの中にはいませんか?
- 時代は動いてるし
- 転職してる人も多いですよね
- 年齢も重ねてますよね
- Yokohama.pmが始まってから(2008/06/27)だけでも3年半ですよ!
continued...
プロジェクトを通じて個人的な振り返り
- 皆さんの中にはいませんか?
- 時代は動いてるし
- 転職してる人も多いですよね
- 年齢も重ねてますよね
- Yokohama.pmが始まってから(2008/06/27)だけでも3年半ですよ!
- 多分似たような人がいると思ってる
continued...
プロジェクトを通じて個人的な振り返り
- 皆さんの中にはいませんか?
- 時代は動いてるし
- 転職してる人も多いですよね
- 年齢も重ねてますよね
- Yokohama.pmが始まってから(2008/06/27)だけでも3年半ですよ!
- 多分似たような人がいると思ってる
- 発信してみてほしいです
continued...
プロジェクトを通じて個人的な振り返り
- 皆さんの中にはいませんか?
- 時代は動いてるし
- 転職してる人も多いですよね
- 年齢も重ねてますよね
- Yokohama.pmが始まってから(2008/06/27)だけでも3年半ですよ!
- 多分似たような人がいると思ってる
- 発信してみてほしいです
- Yokohama.pmだし
continued...
プロジェクトを通じて個人的な振り返り
- 皆さんの中にはいませんか?
- 時代は動いてるし
- 転職してる人も多いですよね
- 年齢も重ねてますよね
- Yokohama.pmが始まってから(2008/06/27)だけでも3年半ですよ!
- 多分似たような人がいると思ってる
- 発信してみてほしいです
- Yokohama.pmだし
- YAPC::Asia 2011 だって運用トークがベストスピーカーだし
- DepOpsな方は優秀な方達が近くにいるので、得るもの多いはず
continued...
プロジェクトを通じて個人的な振り返り
- 皆さんの中にはいませんか?
- 時代は動いてるし
- 転職してる人も多いですよね
- 年齢も重ねてますよね
- Yokohama.pmが始まってから(2008/06/27)だけでも3年半ですよ!
- 多分似たような人がいると思ってる
- 発信してみてほしいです
- Yokohama.pmだし
- YAPC::Asia 2011 だって運用トークがベストスピーカーだし
- DepOpsな方は優秀な方達が近くにいるので、得るもの多いはず
- リーダー/マネージャーさんのマネジメントな話も聞いてみたい
- もしくはそういうイベントあったら逆に教えてください
まとめ
continued...
まとめ
- 大規模開発にはそれなりの大変さ
- もちろん大規模だから何もかも凄い訳じゃない
- 例えばスピード感では全然負けてます
continued...
まとめ
- 大規模開発にはそれなりの大変さ
- もちろん大規模だから何もかも凄い訳じゃない
- 例えばスピード感では全然負けてます
- サービス品質だって、まだまだな部分もある
continued...
まとめ
- 大規模開発にはそれなりの大変さ
- もちろん大規模だから何もかも凄い訳じゃない
- 例えばスピード感では全然負けてます
- サービス品質だって、まだまだな部分もある
- CIツールはとっても便利ですので導入してみると良いと思います
continued...
まとめ
- 大規模開発にはそれなりの大変さ
- もちろん大規模だから何もかも凄い訳じゃない
- 例えばスピード感では全然負けてます
- サービス品質だって、まだまだな部分もある
- CIツールはとっても便利ですので導入してみると良いと思います
continued...
まとめ
- 大規模開発にはそれなりの大変さ
- もちろん大規模だから何もかも凄い訳じゃない
- 例えばスピード感では全然負けてます
- サービス品質だって、まだまだな部分もある
- CIツールはとっても便利ですので導入してみると良いと思います
- ガリガリコード書いてるぜ、とはちょっと言えないお仕事している人いませんか?
continued...
まとめ
- 大規模開発にはそれなりの大変さ
- もちろん大規模だから何もかも凄い訳じゃない
- 例えばスピード感では全然負けてます
- サービス品質だって、まだまだな部分もある
- CIツールはとっても便利ですので導入してみると良いと思います
- ガリガリコード書いてるぜ、とはちょっと言えないお仕事している人いませんか?
- 次は「がっつりモジュール作った」みたいな話ができるようにがんばります