hyper → highspeed → development

57
Hyper Highspeed Development @yoppiblog Akatsuki.inc 13325日月曜日

Upload: aktsk

Post on 25-May-2015

2.084 views

Category:

Documents


0 download

DESCRIPTION

2013/3/25 http://atnd.org/events/37175 の資料です。

TRANSCRIPT

Page 1: Hyper → Highspeed → Development

Hyper→ Highspeed→ Development

@yoppiblogAkatsuki.inc

13年3月25日月曜日

Page 2: Hyper → Highspeed → Development

@yoppiblog

•エンジニア(フロントエンド/バックエンド/インフラ)

• •ソーシャルゲーム開発• Ruby(Rails)/js

13年3月25日月曜日

Page 3: Hyper → Highspeed → Development

About Social Game

•莫大な量のトラフィック•が、許されない遅延•しかも、短期間にトレンドが変化•その中でもコンスタントに質の高いプロダクトを作らなければならない

13年3月25日月曜日

Page 4: Hyper → Highspeed → Development

開発速度を上げクリエイティブに専念したい

13年3月25日月曜日

Page 5: Hyper → Highspeed → Development

How?

13年3月25日月曜日

Page 6: Hyper → Highspeed → Development

1.チームで実践できるアジャイル

•「アジャイルプラクティス」2.Case Study

• GitHubコードレビュー3.RailsでHighSpeedで開発する

•フロント/バックエンド/インフラ•便利gemを使いこなす• Rails4を見据えた構成

13年3月25日月曜日

Page 7: Hyper → Highspeed → Development

1.チームで実践できるアジャイル

•「アジャイルプラクティス」2.Case Study

• GitHubコードレビュー3.RailsでHighSpeedで開発するには

•フロント/バックエンド/インフラ•便利gemを使いこなす• Rails4を見据えた構成

13年3月25日月曜日

Page 8: Hyper → Highspeed → Development

•まずはチームの戦闘力を測る•いますぐできること•習熟していけること•機能しないもの

1.チームで実践できるアジャイル

13年3月25日月曜日

Page 9: Hyper → Highspeed → Development

1.チームで実践できるアジャイル

13年3月25日月曜日

Page 10: Hyper → Highspeed → Development

•「成果を上げるのが仕事」•「変化に付いていく」•「いつでもリリース」•「作る前から使う」•「コードで伝える」•「メンターになる」•「コードをレビューする」• ...

1.チームで実践できるアジャイル

13年3月25日月曜日

Page 11: Hyper → Highspeed → Development

• 「成果を上げるのが仕事」

• 「変化に付いていく」

• 「いつでもリリース」

• 「作る前から使う」

• 「コードで伝える」

• 「メンターになる」

• 「コードをレビューする」

• ...

1.チームで実践できるアジャイル

13年3月25日月曜日

Page 12: Hyper → Highspeed → Development

1.チームで実践できるアジャイル

•「アジャイルプラクティス」2.Case Study

• GitHubコードレビュー3.RailsでHighSpeedで開発する

•フロント/バックエンド/インフラ•便利gemを使いこなす• Rails4を見据えた構成

13年3月25日月曜日

Page 13: Hyper → Highspeed → Development

1.チームで実践できるアジャイル

•「アジャイルプラクティス」2.Case Study

• GitHubコードレビュー3.RailsでHighSpeedで開発する

•フロント/バックエンド/インフラ•便利gemを使いこなす• Rails4を見据えた構成

13年3月25日月曜日

Page 14: Hyper → Highspeed → Development

• Team

• エンジニア: 2人

• ディレクター: 1人

• デザイナ: 1人

• チーム戦闘力

• エンジニア両名ともRails歴2年以上、ソシャゲ開発経験1年以上

• フリーザ様くらいは...

2.Case Study

13年3月25日月曜日

Page 15: Hyper → Highspeed → Development

• 朝会(standup meeting)

• 進捗確認/共有

• Redmine

• タスク管理/Product Backlog

• gitflow

• コードレビューの下地

• GitHub business plans

• コードレビュー場

2.Case Study

13年3月25日月曜日

Page 16: Hyper → Highspeed → Development

Why not GitHub Enterprise(GHE)?

• GHE

• サーバの面倒見なければならない

• お高い...(最低20人からスタート$5000)

• GitHub Business

• Githubの新機能をすぐに使える

• 社内にgitサーバをミラーリングしている

13年3月25日月曜日

Page 17: Hyper → Highspeed → Development

閑話休題

13年3月25日月曜日

Page 18: Hyper → Highspeed → Development

•コードレビュー•複数人で開発する上で一番重要•よりプロダクトの質を上げようという意識付

• git-flow•必ずfeatureブランチを切ってpull request

•そのタイミングでコードレビュー

2.Case Study

13年3月25日月曜日

Page 19: Hyper → Highspeed → Development

2.Case Study - git flow

develop

feature

feature

13年3月25日月曜日

Page 20: Hyper → Highspeed → Development

2.Case Study - git flow

develop

pull request

pull requestcode review

13年3月25日月曜日

Page 21: Hyper → Highspeed → Development

• 口頭でレビュー

• 明らかなバグがある場合「バグがあるから直して」は言いやすい

• ただ、読みにくいコードを書いていて直してほしい場合だとどうしても感情が入りがち

2.Case Study - GitHub

13年3月25日月曜日

Page 22: Hyper → Highspeed → Development

• GitHub上でコードレビューする

• コミット一つ一つやコードの特定の行にコメントを残せる

• 「この行はこのモジュールと整合性がとれていなから修正お願いします」

• コーディング規約違反/悪い変数名etc...

• 「コードを憎んで人を憎まず」を実践できる

2.Case Study - Code Review on GitHub

13年3月25日月曜日

Page 23: Hyper → Highspeed → Development

2.Case Study - GitHub

13年3月25日月曜日

Page 24: Hyper → Highspeed → Development

2.Case Study - GitHub

13年3月25日月曜日

Page 25: Hyper → Highspeed → Development

1.チームで実践できるアジャイル

•「アジャイルプラクティス」2.Case Study

• GitHubコードレビュー3.RailsでHighSpeedで開発する

•フロント/バックエンド/インフラ•便利gemを使いこなす• Rails4を見据えた構成

13年3月25日月曜日

Page 26: Hyper → Highspeed → Development

1.チームで実践できるアジャイル

•「アジャイルプラクティス」2.Case Study

• GitHubコードレビュー3.RailsでHighSpeedで開発する

•フロント/バックエンド•便利gemを使いこなす• Rails4を見据えた構成

13年3月25日月曜日

Page 27: Hyper → Highspeed → Development

開発速度を上げるには?

• リファクタリング可能である

• CIを回す

• モダンな開発を徹底する

• モダンなコーディング方法

• モダンなライブラリ(gem)を取り入れる

• 本番環境で動かしてプロダクトと呼べる。早期に本番環境を構築する

13年3月25日月曜日

Page 28: Hyper → Highspeed → Development

• ユニットテスト(spec)が存在する

• pendingをコミットしない

• 常にgreen

• ローカルで常にユニットテストが実行される状況を作っておく

• redになることをすぐに検出

リファクタリング可能なプロダクト

13年3月25日月曜日

Page 29: Hyper → Highspeed → Development

• Railsでテスト環境を構築するgem

• rpec, rspec-rails

• factory_girl_rails

• guard, guard-rspec

• webmock

• timecop

• capybara

• rr

• spring

リファクタリング可能なプロダクト

13年3月25日月曜日

Page 30: Hyper → Highspeed → Development

guard 'rspec', spring: true do ...end

ENV["RAILS_ENV"] ||= 'test'require File.expand_path("../../config/environment", __FILE__)require 'rspec/rails'#require 'rspec/autorun'require 'factory_girl_rails'require 'simplecov'require 'simplecov-rcov'

SimpleCov.formatter = SimpleCov::Formatter::RcovFormatterSimpleCov.start

if defined?(Spring) Spring.after_fork do FactoryGirl.reload endend

13年3月25日月曜日

Page 31: Hyper → Highspeed → Development

• プロジェクト初日からJenkinsを導入

• 自動テスト/自動カバレッジ計測

• クリーンな環境でテストするので開発環境との違いにより漏れたバグ発見

• カバレッジは自己満 テストされていない箇所を発見

• staging環境に自動デプロイ

• 本番環境で、必ず動かない何かがある

• それを早期に発見することが目的

CIを回す

13年3月25日月曜日

Page 32: Hyper → Highspeed → Development

• ソシャゲもリッチ化しておりjsを書く量が増加

• 頑張って生js書く...

• 凄腕JSerがいればメンテも可能か

• 平凡なjs使いは...

モダン開発 - フロントエンド

13年3月25日月曜日

Page 33: Hyper → Highspeed → Development

SCo!e"Scrip#+

13年3月25日月曜日

Page 34: Hyper → Highspeed → Development

• CoffeeScript

• チーム内でそこそこのRuby力なら誰が書いてもそれなりのコードになる

• メンテンナス/リファクタリングもより簡単に

• Backbone.js

• コード量を削減するのではなく、コーディング規約のように書き方を統一的に

• Viewでのイベントの貼り方

• Modelでのデータの定義の仕方

モダン開発 - フロントエンド

13年3月25日月曜日

Page 35: Hyper → Highspeed → Development

resetBpgage: (bp) -> $("#bp-gage-#{n}").attr("disabled", true) for n in [1+bp..3]

resetBpgage: function(bp) { var n, i, ref, results; _results = []; for (n = i = ref = 1 + bp; ref <= 3 ? i <= 3 : i >= 3; n = ref <= 3 ? ++i : --i) { results.push($("#bp-gage-" + n).attr("disabled", true)); } return results;}

13年3月25日月曜日

Page 36: Hyper → Highspeed → Development

• jsライブラリが増加

• jquery

• backbone

• underscore

• ...

• 有名どころのjsライブラリは、rails-xxxというgemが用意されている

• 自分で書いたjquery-plugin等も管理したい場合できない

モダン開発 - フロントエンド

13年3月25日月曜日

Page 37: Hyper → Highspeed → Development

• bowerで管理する

• Twitter社が作成しているパッケージ管理ツール

• Node製

• gemに依存しないので、自由に更新したり、追加可能

• GitHubのリポジトリや、gistに貼ったスクリプトからなんでも管理可能

モダン開発 - フロントエンド

13年3月25日月曜日

Page 39: Hyper → Highspeed → Development

# Asset Pathを通す(config/application.rb)config.assets.paths << Rails.root.join('vendor', 'assets', 'components')

# assets/javascripts/application.js//= require underscore/underscore-min//= require backbone/backbone-min//= require jquery.clickex/index

$ bower install

13年3月25日月曜日

Page 40: Hyper → Highspeed → Development

• デザインもリッチに...

• アイコン数増えて手動でsprite作る...?

• 似たようなCSS使いまわしたいけどコピペ改変...?

モダン開発 - フロントエンド

13年3月25日月曜日

Page 41: Hyper → Highspeed → Development

13年3月25日月曜日

Page 42: Hyper → Highspeed → Development

• compassで楽をする

• 自動でsprite画像を生成

• mixinを簡単化

モダン開発 - フロントエンド

13年3月25日月曜日

Page 43: Hyper → Highspeed → Development

# Gemfilegroup :assets do gem 'compass-rails'end

# app/assets/application.css.scss@import "sprites/*.png";@include all-sprites-sprites;$sprites: sprite-map("sprites/*.png");

<span class="icon-rare-n"></span>

13年3月25日月曜日

Page 44: Hyper → Highspeed → Development

• Controllerをよりスッキリと書く

• 揮発性データ/重要ではないが参照されることが多いデータを扱う

• アクションをtriggerにバックグラウンドで動く非同期処理

モダン開発 - バックエンド

13年3月25日月曜日

Page 45: Hyper → Highspeed → Development

• action_args

• アクションに必要なパラメータを仮引数で定義する

• そのアクションが必要なパラメータが一目でわかる

• params[:key]を書かなくてすむようになる

• デメリット

• filterでは書けないので、filterを多様すると統一性がなくなる

• とはいえ全体的にすっきりするので使ったほうが楽になる

モダン開発 - バックエンド(Controller)

13年3月25日月曜日

Page 46: Hyper → Highspeed → Development

# Gemfilegem 'action_args'

class WeaponsController < GameController def index(page=nil) @weapons = current_user.weapons.page(page) end

def show(id) @weapon = current_user.weapons.find id endend

13年3月25日月曜日

Page 47: Hyper → Highspeed → Development

• 揮発性データ

• ユーザデータ

• イベント

• エンカウント情報

• お知らせ

• etc...

• 参照される頻度が高く集計が必要

• ランキングデータ

• イベントデータ

モダン開発 - バックエンド(NoSQL)

13年3月25日月曜日

Page 48: Hyper → Highspeed → Development

13年3月25日月曜日

Page 49: Hyper → Highspeed → Development

• memcahcedと違いデータ構造を保持できる

• List

• 未読お知らせ

• Hash

• 友達間でのボスエンカウント情報

• Sorted Hash

• イベントランキングデータ

モダン開発 - バックエンド(redis)

13年3月25日月曜日

Page 50: Hyper → Highspeed → Development

• Railsで使うには

• redis-objects(https://github.com/nateware/redis-objects)

• ohm(https://github.com/soveran/ohm)

• 多機能で、少し使いにくかったのでredisだけ使用して独自の薄いmoduleを作成して使用している(https://gist.github.com/yoppi/b3b911977c0b1a3b8f6d)

モダン開発 - バックエンド(redis)

13年3月25日月曜日

Page 51: Hyper → Highspeed → Development

# app/models/user_status.rbclass UserStatus include Redisable ...endmodule Redisable def self.included(base) base.extend ClassMethods base.send :include, InstanceMethods base.send :include, KVSKey end

module ClassMethods attr_accessor :redis_server def redis n = redis_server.presence || :game RedisConf.conn(n.to_s) end end module InstanceMethods ...end

13年3月25日月曜日

Page 52: Hyper → Highspeed → Development

• annotate

• モデルに自動でカラム、index情報を挿入

• schema.rbを見ることなくmodelでの作業が実現

• bullet

• N+1問題をアラート

• turbo-sprockets

• asset precompileを高速化

• pry-nav, pry-rails

• rails-erd ER図を自動生成

モダン開発 - 裏方で支えてくれるgem達

13年3月25日月曜日

Page 53: Hyper → Highspeed → Development

• ユーザのアクションに応じて発生

• その場で処理していると応答時間が長くなるのでバックグラウンドでタスクを実行させる

• job queueを使う

モダン開発 - バックエンド(非同期処理)

13年3月25日月曜日

Page 54: Hyper → Highspeed → Development

Sidekiq

13年3月25日月曜日

Page 55: Hyper → Highspeed → Development

• sidekiq

• resqueと同じjob queueライブラリ

• 良いところ

• Resque互換API

• Thread model

• 大量のスレッドをたちあげてマルチコアを活かせる

• 悪いところ

• メモリリーク等によるプロセス肥大化に弱い

• スレッドセーフじゃないコードは向かない

モダン開発 - バックエンド(非同期処理)

13年3月25日月曜日

Page 56: Hyper → Highspeed → Development

# Gemfilegem 'sidekiq'

class RaidBossCleaner include Sidekiq::Worker

def perform(raid_boss_id) #... endend

RaidBossCleaner.perform_async(raid_boss.id)

13年3月25日月曜日

Page 57: Hyper → Highspeed → Development

まとめ

• 積極的にコードレビューする

• 何は無くともCI

• その時にプロジェクトにあったモダンな技術を取り入れていく

13年3月25日月曜日