SlideShare a Scribd company logo
1 of 57
Download to read offline
Hyper→
 Highspeed→
  Development
              @yoppiblog
              Akatsuki.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日月曜日
2. Case Study

              • Team
               • エンジニア: 2人
               • ディレクター: 1人
               • デザイナ: 1人
              • チーム戦闘力
               • エンジニア両名ともRails歴2年以上、ソシ
                  ャゲ開発経験1年以上

               • フリーザ様くらいは...
13年3月25日月曜日
2. Case Study

              • 朝会(standup meeting)
               • 進捗確認/共有
              • Redmine
               • タスク管理/Product Backlog
              • gitflow
               • コードレビューの下地
              • GitHub business plans
               • コードレビュー場
13年3月25日月曜日
Why not
              GitHub Enterprise(GHE)?
     • GHE
      • サーバの面倒見なければならない
      • お高い...(最低20人からスタート$5000)
     • GitHub Business
      • Githubの新機能をすぐに使える
      • 社内にgitサーバをミラーリングしている
13年3月25日月曜日
閑話休題



13年3月25日月曜日
2. Case Study

              • コードレビュー
               • 複数人で開発する上で一番重要
               • よりプロダクトの質を上げようという
                 意識付
              • git-flow
               • 必ずfeatureブランチを切ってpull
                  request
               • そのタイミングでコードレビュー
13年3月25日月曜日
2. Case Study - git flow



                            feature

                                      develop

                      feature




13年3月25日月曜日
2. Case Study - git flow



                            pull request

                                    develop
                            code review
                      pull request




13年3月25日月曜日
2. Case Study - GitHub




         • 口頭でレビュー
          • 明らかなバグがある場合「バグがあるから直し
            て」は言いやすい

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




13年3月25日月曜日
2. Case Study - Code Review on GitHub



         • GitHub上でコードレビューする
          • コミット一つ一つやコードの特定の行にコメン
             トを残せる

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

               • コーディング規約違反/悪い変数名etc...
              • 「コードを憎んで人を憎まず」を実践できる

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::RcovFormatter
  SimpleCov.start

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


13年3月25日月曜日
CIを回す

         • プロジェクト初日からJenkinsを導入
          • 自動テスト/自動カバレッジ計測
            • クリーンな環境でテストするので開発環境と
              の違いにより漏れたバグ発見

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

              • staging環境に自動デプロイ
               • 本番環境で、必ず動かない何かがある
               • それを早期に発見することが目的
13年3月25日月曜日
モダン開発 - フロントエンド

         • ソシャゲもリッチ化しておりjsを書く量が増加
         • 頑張って生js書く...
          • 凄腕JSerがいればメンテも可能か
         • 平凡なjs使いは...




13年3月25日月曜日
S   CoffeeScript
                    +




13年3月25日月曜日
モダン開発 - フロントエンド

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

              • メンテンナス/リファクタリングもより簡単に
         • Backbone.js
          • コード量を削減するのではなく、コーディング
            規約のように書き方を統一的に

              • Viewでのイベントの貼り方
              • Modelでのデータの定義の仕方
13年3月25日月曜日
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;
    }

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




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日月曜日
$ bower install

    # 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




13年3月25日月曜日
モダン開発 - フロントエンド

         • デザインもリッチに...
          • アイコン数増えて手動でsprite作る...?
          • 似たようなCSS使いまわしたいけどコピペ改
            変...?




13年3月25日月曜日
13年3月25日月曜日
モダン開発 - フロントエンド

         • compassで楽をする
          • 自動でsprite画像を生成
          • mixinを簡単化




13年3月25日月曜日
# Gemfile
  group :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日月曜日
モダン開発 - バックエンド(Controller)

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

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

              • params[:key]を書かなくてすむようになる
         • デメリット
          • filterでは書けないので、filterを多様すると統
            一性がなくなる

              • とはいえ全体的にすっきりするので使ったほう
                が楽になる
13年3月25日月曜日
# Gemfile
  gem '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
    end
  end




13年3月25日月曜日
モダン開発 - バックエンド(NoSQL)

         • 揮発性データ
          • ユーザデータ
          • イベント
          • エンカウント情報
          • お知らせ
          • etc...
         • 参照される頻度が高く集計が必要
          • ランキングデータ
          • イベントデータ
13年3月25日月曜日
13年3月25日月曜日
モダン開発 - バックエンド(redis)

         • memcahcedと違いデータ構造を保持できる
          • List
            • 未読お知らせ
          • Hash
            • 友達間でのボスエンカウント情報
          • Sorted Hash
            • イベントランキングデータ


13年3月25日月曜日
モダン開発 - バックエンド(redis)

         • Railsで使うには
          • redis-objects(https://github.com/
            nateware/redis-objects)

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




13年3月25日月曜日
# app/models/user_status.rb
  class UserStatus
    include Redisable
    ...
  end
  module 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日月曜日
モダン開発 - 裏方で支えてくれるgem達

         • annotate
          • モデルに自動でカラム、index情報を挿入
          • schema.rbを見ることなくmodelでの作業が実
             現
         • bullet
          • N+1問題をアラート
         • turbo-sprockets
          • asset precompileを高速化
         • pry-nav, pry-rails
         • rails-erd ER図を自動生成
13年3月25日月曜日
モダン開発 - バックエンド(非同期処理)

         • ユーザのアクションに応じて発生
         • その場で処理していると応答時間が長くなるので
           バックグラウンドでタスクを実行させる

         • job queueを使う




13年3月25日月曜日
Sidekiq


13年3月25日月曜日
モダン開発 - バックエンド(非同期処理)

         • sidekiq
          • resqueと同じjob queueライブラリ
          • 良いところ
             • Resque互換API
             • Thread model
              • 大量のスレッドをたちあげてマルチコアを
                 活かせる

              • 悪いところ
               • メモリリーク等によるプロセス肥大化に弱い
               • スレッドセーフじゃないコードは向かない
13年3月25日月曜日
# Gemfile
  gem 'sidekiq'
  class RaidBossCleaner
    include Sidekiq::Worker

    def perform(raid_boss_id)
      #...
    end
  end

  RaidBossCleaner.perform_async(raid_boss.id)




13年3月25日月曜日
まとめ


     • 積極的にコードレビューする
     • 何は無くともCI
     • その時にプロジェクトにあったモダンな技術を取り入
         れていく




13年3月25日月曜日

More Related Content

What's hot

What's hot (14)

JavaScriptで味わう! 関数型プログラミングのメリット!!
JavaScriptで味わう! 関数型プログラミングのメリット!!JavaScriptで味わう! 関数型プログラミングのメリット!!
JavaScriptで味わう! 関数型プログラミングのメリット!!
 
capybara で快適なテスト生活を
capybara で快適なテスト生活をcapybara で快適なテスト生活を
capybara で快適なテスト生活を
 
TypeScript 独習会
TypeScript 独習会TypeScript 独習会
TypeScript 独習会
 
こんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツールこんなに使える!今どきのAPIドキュメンテーションツール
こんなに使える!今どきのAPIドキュメンテーションツール
 
自ら肥え太る執事を現場に入れてみた
自ら肥え太る執事を現場に入れてみた自ら肥え太る執事を現場に入れてみた
自ら肥え太る執事を現場に入れてみた
 
Machine learning CI/CD with OSS
Machine learning CI/CD with OSSMachine learning CI/CD with OSS
Machine learning CI/CD with OSS
 
TypeScript 入門してみる
TypeScript 入門してみるTypeScript 入門してみる
TypeScript 入門してみる
 
【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js【LT】 怖くない恐怖のScala.js
【LT】 怖くない恐怖のScala.js
 
Pythonによる非同期プログラミング入門
Pythonによる非同期プログラミング入門Pythonによる非同期プログラミング入門
Pythonによる非同期プログラミング入門
 
PHP Application E2E with Capybara
PHP Application E2E with CapybaraPHP Application E2E with Capybara
PHP Application E2E with Capybara
 
Creators meetup5
Creators meetup5Creators meetup5
Creators meetup5
 
20121019-jenkins-akiko_pusu.pdf
20121019-jenkins-akiko_pusu.pdf20121019-jenkins-akiko_pusu.pdf
20121019-jenkins-akiko_pusu.pdf
 
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション
2015年GMOペパボ新卒エンジニア研修 Webオペレーション研修イントロダクション
 
3日時間をもらったのでTypeScriptを触ってみた
3日時間をもらったのでTypeScriptを触ってみた3日時間をもらったのでTypeScriptを触ってみた
3日時間をもらったのでTypeScriptを触ってみた
 

Viewers also liked (9)

20130719 始めるdev ops
20130719 始めるdev ops20130719 始めるdev ops
20130719 始めるdev ops
 
Deploy Rails Application on Docker with Elasticbeanstalk
Deploy Rails Application on Docker with ElasticbeanstalkDeploy Rails Application on Docker with Elasticbeanstalk
Deploy Rails Application on Docker with Elasticbeanstalk
 
黒板プロジェクト
黒板プロジェクト黒板プロジェクト
黒板プロジェクト
 
千メモUiの秘密
千メモUiの秘密千メモUiの秘密
千メモUiの秘密
 
スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介
スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介
スマホアプリにおけるマルチプレイアクションゲーム開発の実例紹介
 
RoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理するRoRとAWSで100,000Req/Minを処理する
RoRとAWSで100,000Req/Minを処理する
 
Cocos2d x-sprite3d
Cocos2d x-sprite3dCocos2d x-sprite3d
Cocos2d x-sprite3d
 
アカツキはどのようにAWSを活用しているか #jawsug
アカツキはどのようにAWSを活用しているか #jawsugアカツキはどのようにAWSを活用しているか #jawsug
アカツキはどのようにAWSを活用しているか #jawsug
 
Kibanaでログを可視化してみた
Kibanaでログを可視化してみたKibanaでログを可視化してみた
Kibanaでログを可視化してみた
 

Similar to Hyper → Highspeed → Development

JavaScript on GitHub (#kyotojs)
JavaScript on GitHub  (#kyotojs)JavaScript on GitHub  (#kyotojs)
JavaScript on GitHub (#kyotojs)
y_uuki
 
Building Static Website With Github And Jekyll
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And Jekyll
Yoji Shidara
 
Sinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶSinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶ
Hiroshi Oyamada
 

Similar to Hyper → Highspeed → Development (20)

EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
EmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤とEmbulkとDigdagとデータ分析基盤と
EmbulkとDigdagとデータ分析基盤と
 
mruby for embedded systems
mruby for embedded systemsmruby for embedded systems
mruby for embedded systems
 
Haikara
HaikaraHaikara
Haikara
 
マジカルsvnとキュアgit
マジカルsvnとキュアgitマジカルsvnとキュアgit
マジカルsvnとキュアgit
 
JavaScript on GitHub (#kyotojs)
JavaScript on GitHub  (#kyotojs)JavaScript on GitHub  (#kyotojs)
JavaScript on GitHub (#kyotojs)
 
JUC2012
JUC2012JUC2012
JUC2012
 
ICSE2014参加報告 (SE勉強会 6/12)
ICSE2014参加報告 (SE勉強会 6/12)ICSE2014参加報告 (SE勉強会 6/12)
ICSE2014参加報告 (SE勉強会 6/12)
 
Building Static Website With Github And Jekyll
Building Static Website With Github And JekyllBuilding Static Website With Github And Jekyll
Building Static Website With Github And Jekyll
 
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオンSageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
 
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
GitLab から GitHub + CircleCI に乗り換えてチーム運用を改善しつつある話
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
 
20150228_渋谷Webエンジニア朝会LT資料
20150228_渋谷Webエンジニア朝会LT資料20150228_渋谷Webエンジニア朝会LT資料
20150228_渋谷Webエンジニア朝会LT資料
 
Sinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶSinatraでwebアプリケーション開発を学ぶ
Sinatraでwebアプリケーション開発を学ぶ
 
大規模ソフトウェア開発とテストの経験について
大規模ソフトウェア開発とテストの経験について大規模ソフトウェア開発とテストの経験について
大規模ソフトウェア開発とテストの経験について
 
サーバサイドコース Sinatra + SPARQL 編
サーバサイドコース Sinatra + SPARQL 編サーバサイドコース Sinatra + SPARQL 編
サーバサイドコース Sinatra + SPARQL 編
 
Hatena blogdevelopmentflow
Hatena blogdevelopmentflowHatena blogdevelopmentflow
Hatena blogdevelopmentflow
 
今さら聞けない人のためのGit超入門 GitLab 13対応版
今さら聞けない人のためのGit超入門 GitLab 13対応版今さら聞けない人のためのGit超入門 GitLab 13対応版
今さら聞けない人のためのGit超入門 GitLab 13対応版
 
今さら聞けない人のためのgit超入門
今さら聞けない人のためのgit超入門今さら聞けない人のためのgit超入門
今さら聞けない人のためのgit超入門
 
今さら聞けない人のためのGit超入門 2019/11/21
今さら聞けない人のためのGit超入門 2019/11/21今さら聞けない人のためのGit超入門 2019/11/21
今さら聞けない人のためのGit超入門 2019/11/21
 

Hyper → Highspeed → Development

  • 1. Hyper→ Highspeed→ Development @yoppiblog Akatsuki.inc 13年3月25日月曜日
  • 2. @yoppiblog • エンジニア(フロントエンド/バックエ ンド/インフラ) • • ソーシャルゲーム開発 • Ruby(Rails)/js 13年3月25日月曜日
  • 3. About Social Game • 莫大な量のトラフィック • が、許されない遅延 • しかも、短期間にトレンドが変化 • その中でもコンスタントに質の高いプロダクト を作らなければならない 13年3月25日月曜日
  • 6. 1. チームで実践できるアジャイル • 「アジャイルプラクティス」 2. Case Study • GitHubコードレビュー 3. RailsでHighSpeedで開発する • フロント/バックエンド/インフラ • 便利gemを使いこなす • Rails4を見据えた構成 13年3月25日月曜日
  • 7. 1. チームで実践できるアジャイル • 「アジャイルプラクティス」 2. Case Study • GitHubコードレビュー 3. RailsでHighSpeedで開発するには • フロント/バックエンド/インフラ • 便利gemを使いこなす • Rails4を見据えた構成 13年3月25日月曜日
  • 8. 1. チームで実践できるアジャイル • まずはチームの戦闘力を測る • いますぐできること • 習熟していけること • 機能しないもの 13年3月25日月曜日
  • 10. 1. チームで実践できるアジャイル • 「成果を上げるのが仕事」 • 「変化に付いていく」 • 「いつでもリリース」 • 「作る前から使う」 • 「コードで伝える」 • 「メンターになる」 • 「コードをレビューする」 • ... 13年3月25日月曜日
  • 11. 1. チームで実践できるアジャイル • 「成果を上げるのが仕事」 • 「変化に付いていく」 • 「いつでもリリース」 • 「作る前から使う」 • 「コードで伝える」 • 「メンターになる」 • 「コードをレビューする」 • ... 13年3月25日月曜日
  • 12. 1. チームで実践できるアジャイル • 「アジャイルプラクティス」 2. Case Study • GitHubコードレビュー 3. RailsでHighSpeedで開発する • フロント/バックエンド/インフラ • 便利gemを使いこなす • Rails4を見据えた構成 13年3月25日月曜日
  • 13. 1. チームで実践できるアジャイル • 「アジャイルプラクティス」 2. Case Study • GitHubコードレビュー 3. RailsでHighSpeedで開発する • フロント/バックエンド/インフラ • 便利gemを使いこなす • Rails4を見据えた構成 13年3月25日月曜日
  • 14. 2. Case Study • Team • エンジニア: 2人 • ディレクター: 1人 • デザイナ: 1人 • チーム戦闘力 • エンジニア両名ともRails歴2年以上、ソシ ャゲ開発経験1年以上 • フリーザ様くらいは... 13年3月25日月曜日
  • 15. 2. Case Study • 朝会(standup meeting) • 進捗確認/共有 • Redmine • タスク管理/Product Backlog • gitflow • コードレビューの下地 • GitHub business plans • コードレビュー場 13年3月25日月曜日
  • 16. Why not GitHub Enterprise(GHE)? • GHE • サーバの面倒見なければならない • お高い...(最低20人からスタート$5000) • GitHub Business • Githubの新機能をすぐに使える • 社内にgitサーバをミラーリングしている 13年3月25日月曜日
  • 18. 2. Case Study • コードレビュー • 複数人で開発する上で一番重要 • よりプロダクトの質を上げようという 意識付 • git-flow • 必ずfeatureブランチを切ってpull request • そのタイミングでコードレビュー 13年3月25日月曜日
  • 19. 2. Case Study - git flow feature develop feature 13年3月25日月曜日
  • 20. 2. Case Study - git flow pull request develop code review pull request 13年3月25日月曜日
  • 21. 2. Case Study - GitHub • 口頭でレビュー • 明らかなバグがある場合「バグがあるから直し て」は言いやすい • ただ、読みにくいコードを書いていて直してほ しい場合だとどうしても感情が入りがち 13年3月25日月曜日
  • 22. 2. Case Study - Code Review on GitHub • GitHub上でコードレビューする • コミット一つ一つやコードの特定の行にコメン トを残せる • 「この行はこのモジュールと整合性がとれてい なから修正お願いします」 • コーディング規約違反/悪い変数名etc... • 「コードを憎んで人を憎まず」を実践できる 13年3月25日月曜日
  • 23. 2. Case Study - GitHub 13年3月25日月曜日
  • 24. 2. Case Study - GitHub 13年3月25日月曜日
  • 25. 1. チームで実践できるアジャイル • 「アジャイルプラクティス」 2. Case Study • GitHubコードレビュー 3. RailsでHighSpeedで開発する • フロント/バックエンド/インフラ • 便利gemを使いこなす • Rails4を見据えた構成 13年3月25日月曜日
  • 26. 1. チームで実践できるアジャイル • 「アジャイルプラクティス」 2. Case Study • GitHubコードレビュー 3. RailsでHighSpeedで開発する • フロント/バックエンド • 便利gemを使いこなす • Rails4を見据えた構成 13年3月25日月曜日
  • 27. 開発速度を上げるには? • リファクタリング可能である • CIを回す • モダンな開発を徹底する • モダンなコーディング方法 • モダンなライブラリ(gem)を取り入れる • 本番環境で動かしてプロダクトと呼べる。早期に本番 環境を構築する 13年3月25日月曜日
  • 28. リファクタリング可能なプロダクト • ユニットテスト(spec)が存在する • pendingをコミットしない • 常にgreen • ローカルで常にユニットテストが実行される状況 を作っておく • redになることをすぐに検出 13年3月25日月曜日
  • 29. リファクタリング可能なプロダクト • Railsでテスト環境を構築するgem • rpec, rspec-rails • factory_girl_rails • guard, guard-rspec • webmock • timecop • capybara • rr • spring 13年3月25日月曜日
  • 30. 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::RcovFormatter SimpleCov.start if defined?(Spring) Spring.after_fork do FactoryGirl.reload end end 13年3月25日月曜日
  • 31. CIを回す • プロジェクト初日からJenkinsを導入 • 自動テスト/自動カバレッジ計測 • クリーンな環境でテストするので開発環境と の違いにより漏れたバグ発見 • カバレッジは自己満 テストされていない箇所 を発見 • staging環境に自動デプロイ • 本番環境で、必ず動かない何かがある • それを早期に発見することが目的 13年3月25日月曜日
  • 32. モダン開発 - フロントエンド • ソシャゲもリッチ化しておりjsを書く量が増加 • 頑張って生js書く... • 凄腕JSerがいればメンテも可能か • 平凡なjs使いは... 13年3月25日月曜日
  • 33. S CoffeeScript + 13年3月25日月曜日
  • 34. モダン開発 - フロントエンド • CoffeeScript • チーム内でそこそこのRuby力なら誰が書いて もそれなりのコードになる • メンテンナス/リファクタリングもより簡単に • Backbone.js • コード量を削減するのではなく、コーディング 規約のように書き方を統一的に • Viewでのイベントの貼り方 • Modelでのデータの定義の仕方 13年3月25日月曜日
  • 35. 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; } resetBpgage: (bp) -> $("#bp-gage-#{n}").attr("disabled", true) for n in [1+bp..3] 13年3月25日月曜日
  • 36. モダン開発 - フロントエンド • jsライブラリが増加 • jquery • backbone • underscore • ... • 有名どころのjsライブラリは、rails-xxxという gemが用意されている • 自分で書いたjquery-plugin等も管理したい場合 できない 13年3月25日月曜日
  • 37. モダン開発 - フロントエンド • bowerで管理する • Twitter社が作成しているパッケージ管理ツール • Node製 • gemに依存しないので、自由に更新したり、追 加可能 • GitHubのリポジトリや、gistに貼ったスクリプ トからなんでも管理可能 13年3月25日月曜日
  • 38. $ 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日月曜日
  • 39. $ bower install # 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 13年3月25日月曜日
  • 40. モダン開発 - フロントエンド • デザインもリッチに... • アイコン数増えて手動でsprite作る...? • 似たようなCSS使いまわしたいけどコピペ改 変...? 13年3月25日月曜日
  • 42. モダン開発 - フロントエンド • compassで楽をする • 自動でsprite画像を生成 • mixinを簡単化 13年3月25日月曜日
  • 43. # Gemfile group :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日月曜日
  • 44. モダン開発 - バックエンド • Controllerをよりスッキリと書く • 揮発性データ/重要ではないが参照されることが 多いデータを扱う • アクションをtriggerにバックグラウンドで動く非 同期処理 13年3月25日月曜日
  • 45. モダン開発 - バックエンド(Controller) • action_args • アクションに必要なパラメータを仮引数で定義 する • そのアクションが必要なパラメータが一目でわ かる • params[:key]を書かなくてすむようになる • デメリット • filterでは書けないので、filterを多様すると統 一性がなくなる • とはいえ全体的にすっきりするので使ったほう が楽になる 13年3月25日月曜日
  • 46. # Gemfile gem '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 end end 13年3月25日月曜日
  • 47. モダン開発 - バックエンド(NoSQL) • 揮発性データ • ユーザデータ • イベント • エンカウント情報 • お知らせ • etc... • 参照される頻度が高く集計が必要 • ランキングデータ • イベントデータ 13年3月25日月曜日
  • 49. モダン開発 - バックエンド(redis) • memcahcedと違いデータ構造を保持できる • List • 未読お知らせ • Hash • 友達間でのボスエンカウント情報 • Sorted Hash • イベントランキングデータ 13年3月25日月曜日
  • 50. モダン開発 - バックエンド(redis) • Railsで使うには • redis-objects(https://github.com/ nateware/redis-objects) • ohm(https://github.com/soveran/ohm) • 多機能で、少し使いにくかったのでredisだけ使 用して独自の薄いmoduleを作成して使用してい る(https://gist.github.com/yoppi/ b3b911977c0b1a3b8f6d) 13年3月25日月曜日
  • 51. # app/models/user_status.rb class UserStatus include Redisable ... end module 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日月曜日
  • 52. モダン開発 - 裏方で支えてくれるgem達 • annotate • モデルに自動でカラム、index情報を挿入 • schema.rbを見ることなくmodelでの作業が実 現 • bullet • N+1問題をアラート • turbo-sprockets • asset precompileを高速化 • pry-nav, pry-rails • rails-erd ER図を自動生成 13年3月25日月曜日
  • 53. モダン開発 - バックエンド(非同期処理) • ユーザのアクションに応じて発生 • その場で処理していると応答時間が長くなるので バックグラウンドでタスクを実行させる • job queueを使う 13年3月25日月曜日
  • 55. モダン開発 - バックエンド(非同期処理) • sidekiq • resqueと同じjob queueライブラリ • 良いところ • Resque互換API • Thread model • 大量のスレッドをたちあげてマルチコアを 活かせる • 悪いところ • メモリリーク等によるプロセス肥大化に弱い • スレッドセーフじゃないコードは向かない 13年3月25日月曜日
  • 56. # Gemfile gem 'sidekiq' class RaidBossCleaner include Sidekiq::Worker def perform(raid_boss_id) #... end end RaidBossCleaner.perform_async(raid_boss.id) 13年3月25日月曜日
  • 57. まとめ • 積極的にコードレビューする • 何は無くともCI • その時にプロジェクトにあったモダンな技術を取り入 れていく 13年3月25日月曜日