hyper → highspeed → development
DESCRIPTION
2013/3/25 http://atnd.org/events/37175 の資料です。TRANSCRIPT
Hyper→ Highspeed→ Development
@yoppiblogAkatsuki.inc
13年3月25日月曜日
@yoppiblog
•エンジニア(フロントエンド/バックエンド/インフラ)
• •ソーシャルゲーム開発• Ruby(Rails)/js
13年3月25日月曜日
About Social Game
•莫大な量のトラフィック•が、許されない遅延•しかも、短期間にトレンドが変化•その中でもコンスタントに質の高いプロダクトを作らなければならない
13年3月25日月曜日
開発速度を上げクリエイティブに専念したい
13年3月25日月曜日
How?
13年3月25日月曜日
1.チームで実践できるアジャイル
•「アジャイルプラクティス」2.Case Study
• GitHubコードレビュー3.RailsでHighSpeedで開発する
•フロント/バックエンド/インフラ•便利gemを使いこなす• Rails4を見据えた構成
13年3月25日月曜日
1.チームで実践できるアジャイル
•「アジャイルプラクティス」2.Case Study
• GitHubコードレビュー3.RailsでHighSpeedで開発するには
•フロント/バックエンド/インフラ•便利gemを使いこなす• Rails4を見据えた構成
13年3月25日月曜日
•まずはチームの戦闘力を測る•いますぐできること•習熟していけること•機能しないもの
1.チームで実践できるアジャイル
13年3月25日月曜日
1.チームで実践できるアジャイル
13年3月25日月曜日
•「成果を上げるのが仕事」•「変化に付いていく」•「いつでもリリース」•「作る前から使う」•「コードで伝える」•「メンターになる」•「コードをレビューする」• ...
1.チームで実践できるアジャイル
13年3月25日月曜日
• 「成果を上げるのが仕事」
• 「変化に付いていく」
• 「いつでもリリース」
• 「作る前から使う」
• 「コードで伝える」
• 「メンターになる」
• 「コードをレビューする」
• ...
1.チームで実践できるアジャイル
13年3月25日月曜日
1.チームで実践できるアジャイル
•「アジャイルプラクティス」2.Case Study
• GitHubコードレビュー3.RailsでHighSpeedで開発する
•フロント/バックエンド/インフラ•便利gemを使いこなす• Rails4を見据えた構成
13年3月25日月曜日
1.チームで実践できるアジャイル
•「アジャイルプラクティス」2.Case Study
• GitHubコードレビュー3.RailsでHighSpeedで開発する
•フロント/バックエンド/インフラ•便利gemを使いこなす• Rails4を見据えた構成
13年3月25日月曜日
• Team
• エンジニア: 2人
• ディレクター: 1人
• デザイナ: 1人
• チーム戦闘力
• エンジニア両名ともRails歴2年以上、ソシャゲ開発経験1年以上
• フリーザ様くらいは...
2.Case Study
13年3月25日月曜日
• 朝会(standup meeting)
• 進捗確認/共有
• Redmine
• タスク管理/Product Backlog
• gitflow
• コードレビューの下地
• GitHub business plans
• コードレビュー場
2.Case Study
13年3月25日月曜日
Why not GitHub Enterprise(GHE)?
• GHE
• サーバの面倒見なければならない
• お高い...(最低20人からスタート$5000)
• GitHub Business
• Githubの新機能をすぐに使える
• 社内にgitサーバをミラーリングしている
13年3月25日月曜日
閑話休題
13年3月25日月曜日
•コードレビュー•複数人で開発する上で一番重要•よりプロダクトの質を上げようという意識付
• git-flow•必ずfeatureブランチを切ってpull request
•そのタイミングでコードレビュー
2.Case Study
13年3月25日月曜日
2.Case Study - git flow
develop
feature
feature
13年3月25日月曜日
2.Case Study - git flow
develop
pull request
pull requestcode review
13年3月25日月曜日
• 口頭でレビュー
• 明らかなバグがある場合「バグがあるから直して」は言いやすい
• ただ、読みにくいコードを書いていて直してほしい場合だとどうしても感情が入りがち
2.Case Study - GitHub
13年3月25日月曜日
• GitHub上でコードレビューする
• コミット一つ一つやコードの特定の行にコメントを残せる
• 「この行はこのモジュールと整合性がとれていなから修正お願いします」
• コーディング規約違反/悪い変数名etc...
• 「コードを憎んで人を憎まず」を実践できる
2.Case Study - Code Review on GitHub
13年3月25日月曜日
2.Case Study - GitHub
13年3月25日月曜日
2.Case Study - GitHub
13年3月25日月曜日
1.チームで実践できるアジャイル
•「アジャイルプラクティス」2.Case Study
• GitHubコードレビュー3.RailsでHighSpeedで開発する
•フロント/バックエンド/インフラ•便利gemを使いこなす• Rails4を見据えた構成
13年3月25日月曜日
1.チームで実践できるアジャイル
•「アジャイルプラクティス」2.Case Study
• GitHubコードレビュー3.RailsでHighSpeedで開発する
•フロント/バックエンド•便利gemを使いこなす• Rails4を見据えた構成
13年3月25日月曜日
開発速度を上げるには?
• リファクタリング可能である
• CIを回す
• モダンな開発を徹底する
• モダンなコーディング方法
• モダンなライブラリ(gem)を取り入れる
• 本番環境で動かしてプロダクトと呼べる。早期に本番環境を構築する
13年3月25日月曜日
• ユニットテスト(spec)が存在する
• pendingをコミットしない
• 常にgreen
• ローカルで常にユニットテストが実行される状況を作っておく
• redになることをすぐに検出
リファクタリング可能なプロダクト
13年3月25日月曜日
• Railsでテスト環境を構築するgem
• rpec, rspec-rails
• factory_girl_rails
• guard, guard-rspec
• webmock
• timecop
• capybara
• rr
• spring
リファクタリング可能なプロダクト
13年3月25日月曜日
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日月曜日
• プロジェクト初日からJenkinsを導入
• 自動テスト/自動カバレッジ計測
• クリーンな環境でテストするので開発環境との違いにより漏れたバグ発見
• カバレッジは自己満 テストされていない箇所を発見
• staging環境に自動デプロイ
• 本番環境で、必ず動かない何かがある
• それを早期に発見することが目的
CIを回す
13年3月25日月曜日
• ソシャゲもリッチ化しておりjsを書く量が増加
• 頑張って生js書く...
• 凄腕JSerがいればメンテも可能か
• 平凡なjs使いは...
モダン開発 - フロントエンド
13年3月25日月曜日
SCo!e"Scrip#+
13年3月25日月曜日
• CoffeeScript
• チーム内でそこそこのRuby力なら誰が書いてもそれなりのコードになる
• メンテンナス/リファクタリングもより簡単に
• Backbone.js
• コード量を削減するのではなく、コーディング規約のように書き方を統一的に
• Viewでのイベントの貼り方
• Modelでのデータの定義の仕方
モダン開発 - フロントエンド
13年3月25日月曜日
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日月曜日
• jsライブラリが増加
• jquery
• backbone
• underscore
• ...
• 有名どころのjsライブラリは、rails-xxxというgemが用意されている
• 自分で書いたjquery-plugin等も管理したい場合できない
モダン開発 - フロントエンド
13年3月25日月曜日
• bowerで管理する
• Twitter社が作成しているパッケージ管理ツール
• Node製
• gemに依存しないので、自由に更新したり、追加可能
• GitHubのリポジトリや、gistに貼ったスクリプトからなんでも管理可能
モダン開発 - フロントエンド
13年3月25日月曜日
$ npm install -g bower
// .bowerrc{ “directory”:“vender/assets/components”}
// component.json{ “name”:“Project Name”, “dependencies”: { “underscore”: “~1.4.4”, “backbone”: “~0.9.10”, “jquery.clickex”: “https://gist.github.com/yoppi/4942811/raw/3b235944b9d9abf82199c437af0170745c45d4cc/jquery.clickex.js” }}
13年3月25日月曜日
# 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日月曜日
• デザインもリッチに...
• アイコン数増えて手動でsprite作る...?
• 似たようなCSS使いまわしたいけどコピペ改変...?
モダン開発 - フロントエンド
13年3月25日月曜日
13年3月25日月曜日
• compassで楽をする
• 自動でsprite画像を生成
• mixinを簡単化
モダン開発 - フロントエンド
13年3月25日月曜日
# 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日月曜日
• Controllerをよりスッキリと書く
• 揮発性データ/重要ではないが参照されることが多いデータを扱う
• アクションをtriggerにバックグラウンドで動く非同期処理
モダン開発 - バックエンド
13年3月25日月曜日
• action_args
• アクションに必要なパラメータを仮引数で定義する
• そのアクションが必要なパラメータが一目でわかる
• params[:key]を書かなくてすむようになる
• デメリット
• filterでは書けないので、filterを多様すると統一性がなくなる
• とはいえ全体的にすっきりするので使ったほうが楽になる
モダン開発 - バックエンド(Controller)
13年3月25日月曜日
# 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日月曜日
• 揮発性データ
• ユーザデータ
• イベント
• エンカウント情報
• お知らせ
• etc...
• 参照される頻度が高く集計が必要
• ランキングデータ
• イベントデータ
モダン開発 - バックエンド(NoSQL)
13年3月25日月曜日
13年3月25日月曜日
• memcahcedと違いデータ構造を保持できる
• List
• 未読お知らせ
• Hash
• 友達間でのボスエンカウント情報
• Sorted Hash
• イベントランキングデータ
モダン開発 - バックエンド(redis)
13年3月25日月曜日
• 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日月曜日
# 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日月曜日
• annotate
• モデルに自動でカラム、index情報を挿入
• schema.rbを見ることなくmodelでの作業が実現
• bullet
• N+1問題をアラート
• turbo-sprockets
• asset precompileを高速化
• pry-nav, pry-rails
• rails-erd ER図を自動生成
モダン開発 - 裏方で支えてくれるgem達
13年3月25日月曜日
• ユーザのアクションに応じて発生
• その場で処理していると応答時間が長くなるのでバックグラウンドでタスクを実行させる
• job queueを使う
モダン開発 - バックエンド(非同期処理)
13年3月25日月曜日
Sidekiq
13年3月25日月曜日
• sidekiq
• resqueと同じjob queueライブラリ
• 良いところ
• Resque互換API
• Thread model
• 大量のスレッドをたちあげてマルチコアを活かせる
• 悪いところ
• メモリリーク等によるプロセス肥大化に弱い
• スレッドセーフじゃないコードは向かない
モダン開発 - バックエンド(非同期処理)
13年3月25日月曜日
# Gemfilegem 'sidekiq'
class RaidBossCleaner include Sidekiq::Worker
def perform(raid_boss_id) #... endend
RaidBossCleaner.perform_async(raid_boss.id)
13年3月25日月曜日
まとめ
• 積極的にコードレビューする
• 何は無くともCI
• その時にプロジェクトにあったモダンな技術を取り入れていく
13年3月25日月曜日