読者です 読者をやめる 読者になる 読者になる

CA MOBILE エンジニアブログ

株式会社シーエー・モバイルのエンジニアブログです

エンジニアが働きやすい環境を創る(エンジニアのヘッドホン事情)

楽しく働く環境

こんにちは、シーエー・モバイルで、技術人事・技術戦略を担当しているA.Iです。

音楽を聞きながら仕事や勉強をしていると、集中力や効率が上がったという経験をされた方も多いかなーと思います。 弊社でも、ヘッドホンやイヤホンをつけて仕事をしている社員をよく見かけます。 コーディング・製作では、まとまった時間に集中して一気に終わりにしたいという思いからのようです。

f:id:cam-engineer:20160830170220j:plain

今回、エンジニアの楽しく働く環境作りの一貫として、エンジニアのヘッドホン事情に焦点を当ててみました。

そこで、弊社のエンジニアとデザイナーに協力してもらい、社内アンケートをとってみました。 その結果をご紹介します。

現在、開発や製作時に、ヘッドフォンやイヤホンを使っていますか(回答数48)

f:id:cam-engineer:20160808211459p:plain

使っているヘッドフォンやイヤホンの製品名を教えてください(回答数34)

一番多かったのは、意外なことにAppleの純正イヤホンでした。それ以外は個人の趣向で様々でした。

f:id:cam-engineer:20160830164345j:plainf:id:cam-engineer:20160830164353j:plainf:id:cam-engineer:20160830164354j:plainf:id:cam-engineer:20160830164500j:plainf:id:cam-engineer:20160830164459j:plainf:id:cam-engineer:20160830164501j:plain

どんな時に使いますか?(回答35)

やはり一番多かったのは、集中したい時でした。 コーディング作業時以外では、「パワーポイントの資料作成、ドキュメント整備する時」に聞いているようです。また、逆に「障害発生時にすぐ気づいたり、要望や悩みなどを聞き漏らさないように純粋に音楽を聞きたい以外は使わない」という回答もありました。

主にどんなジャンルの音楽を聴いていますか(回答36:複数回答可)

一番多かったのはJ-POP(19)、ついでアニソン(14)でした。ついでサントラ、ロックと続きますが、演歌や歌謡曲はゼロでした。

f:id:cam-engineer:20160808211512p:plain

開発や制作時に、音楽があると、開発や制作の効率やスピードに効果があると思いますか?

ほぼ効果を感じるとの回答でした。

f:id:cam-engineer:20160808211526p:plain

制作・開発作業が中断して、また音楽を聴くと集中力が戻りますか?

”中断時間が短ければ戻る”、”すぐには戻らないが、しばらくソースを書き続ければ戻る”などの意見もあり、概ね肯定的な意見でした

f:id:cam-engineer:20160808211310p:plain

ノイズキャンセルヘッドホンをつけてもらった

f:id:cam-engineer:20160830151019j:plain

"Team Geek"にエンジニアの集中状態を維持するために、ノイズキャンセルヘッドホンを配布したという記載もありました。トライアルで、普段は通常のイヤホンを使っている3名にその効果を試してもらったところ、このような感想がありました。

  • 話し声は聞こえるけど、他の雑音がないので気分的に落ち着いて開発できた
  • 開発に没頭しやすくなった
  • 集中したい時は手放せなくなった

f:id:cam-engineer:20160830165009j:plain

開発や制作の効率をあげていくために、ノイズキャンセリングヘッドホンは会社としても追加購入を検討をしていきたいと思います。

今回のノイズキャンセリングヘッドホンの導入検討や以前紹介させていただいたJetBrainsのIDEを使ってみるなど、シーエー・モバイルでは、エンジニアの楽しく働く環境作りに継続して取り組んでいきたいと思います。

技術力を促進させる横断組織の活動

楽しく働く環境 culture

こんにちは。

シーエー・モバイルで課金事業を担当しているエンジニアのkeny31です。

本日は、去年発足された技術戦略室という社内の技術力強化を推進する横断的な組織と、これまでに行ってきた活動内容を紹介させていただきます。

はじめに

「技術戦略室」とは

  • 社内のエンジニア技術レベル向上
  • 事業の成長に技術力で貢献する

を目的に昨年、2015年12月に発足されたエンジニア主体の横断的組織で、 社内の各事業部に所属している技術に熱いエンジニアで構成されています。

技術戦略室の構成

メンバーの中には、会社設立当初から様々な事業を支えてきたベテランから、 半期ごとに社内の技術力強化に最も貢献したエンジニアに送られる「ベストエンジニア賞」を 受賞したイケイケな若手まで年齢や経験、得意な技術分野も様々です。

現在は、スクラム大好きインテリな室長を中心に10名程で活動しています。

いざキックオフ!!

実際にどのような活動を行っていくか、どのようなエンジニア集団が集まる会社にしていきたいか、 活動内容とロードマップを作るために、今話題の「Chateau Ameba(シャトーアメーバ)」にて1日合宿を行ってきました。

当日の合宿内容に関しては、技術力強化に繋がる施策から環境改善、今後の未来像など、 部屋の壁(ホワイトボード)全てが文字で埋まるほど、白熱した議論で非常に盛り上がりました。

実際に合宿で出てきた内容

f:id:cam-engineer:20160722162219j:plain

ホワイトボードもこんな感じです

f:id:cam-engineer:20160722162217j:plain

私は、「キラキラIT女子エンジニアの積極的採用」による男性エンジニアのモチベーションアップと採用ブランディングを提案したんですが、 盛り上がったものの見事にスルーされました。

色々とやりたい事や改善していきたい事が山のように出てきたのですが、議論を重ねた結果、 下記の課題に対してアクションを考えていくことになりました。

重要課題キーワード

スピード & 品質 両方の実現のために何をするか

技術向上 何を強みとし、何をPRJに浸透定着させていくか

採用&技術ブランディング 優秀な人がきたいと思う組織と文化をどう創るか

技術者育成 技術者として成長するために必要なことなど

技術評価 技術者としてちゃんと評価されるために

働きやすい環境/制度 エンジニアにとって優れた環境、ジョブローテなど

実際に行った活動内容

重要課題キーワードを元に、施策レベルに落とし込んだ内容が下記となります。

  • 全社コード共通規約の作成
  • コードレビューを行う文化創り
  • 各プロダクトのエラー状況可視化と品質向上
  • エンジニアの働きやすい環境整備
  • エンジニアブログの再開
  • 各種勉強会の紹介と参加促進
  • 2016年度新人研修の企画と実施

実際に行動に移してみましたが、手探り感も手伝って、技術戦略室のメンバーだけが空回りしてしまって、周りを巻き込めずに上手くいかなかったものや、 1回きりで継続せずにそのままフェードアウトしてしまったものもありました。

ですが、その中でもエンジニアの反応が良かったものや、継続して行えているもの、来年も是非実施していこうと考えているもの。 そういった喜ばしい成果が上がった施策も出てきており、もっとこういった結果が出てくるように頑張っていきたいと思っています。

KPTで技術戦略室の半期を振り返る

f:id:cam-engineer:20160722162216j:plain

各施策の具体的な内容に関しては、次回以降に話していきたいと思います。

個人的な振り返り

f:id:cam-engineer:20160728182828j:plain

「技術戦略室」として様々な活動を行ってきましたが、個人的に十分に動けていない反省点があるものの、レビュー文化の醸成、プロダクト品質向上、勉強会への参加を増やしていったことなど、今後の改革に寄与できたところもあると思っています。

これからもシーエー・モバイルの技術力の向上、エンジニアの働きやすい環境を創り上げていくことを推進していきたいと思います。

あとは、合宿の時に私が提案した「キラキラITエンジニア女子の積極的採用」を何とか実現させられるよう頑張ります!!

エンジニアが働きやすい環境を創る(JetBrainsのIDEを使ってみる)

tool 楽しく働く環境

こんにちは、シーエー・モバイルで、技術人事・技術戦略を担当しているA.Iと申します。エンジニアが少しでも働きやすい環境、気持ち良く開発できる環境を創るために、日々画策しています。


開発効率を上げるエディタを探す

弊社ではGithub EnterpriseやSlackの有料プランなどを導入して、開発効率を上げる施策を行ってきました。今回は、エンジニアがコードを書く工程で効率を上げるために有料であっても開発効率のよいエディタを検討しました。

JetBrains製品を使ってみる

今回は、数名のエンジニアに協力を得て、”JetBrains製品を使ってみる”ことで、コード品質や開発効率にどういった効果があるのかを試してもらいました。弊社のサーバーサイド開発では、PHP(cake)とRuby On Railsを使用しています。そのため、PhpStorm、RubyMineを使用してもらいました。また、GOなど対応したIDEがなかった言語を書くエンジニアにはIntelliJ IDEAを使用してもらいました。また協力してもらったエンジニアには、アンケートを回答してもらいました。

f:id:cam-engineer:20160630151908j:plain

使ってみた感想(よかったと思えたところ)

アンケートの回答から概ね感想は好感触であり、コード品質向上、開発効率化などの期待感が得られたようです。

  • vim+ctagsで良いと思ってたが、そんなことはなかった。
  • ctagsなどと比べてコードジャンプの性能が非常に高いのが良い
  • リファクタ機能や補完機能が強力で使いやすい。ファイル検索がはやい
  • IDE内でMySQL, SSH, vagrant, gitが使えるため、ウインドウの切り替えが減り、作業しやすい
  • Android StudioとUI・操作方法・設定方法が類似しているので、Webアプリとネイティブアプリが両方あるサービスの開発時に、IDEの学習コストの観点で有利
  • 変数名のサジェスト、未使用変数の警告が出るなど、皆が一定のルールでの命名ができそうで、可読性が上がる期待感がある
  • 個人的に scala の開発がしたいので、複数の言語をサポートできる間口の広さは好ましい。
  • 他のIDEVimなどでも頑張れば同じ便利さを再現できるとは思うが、最初から使えるので楽。Vimキーバインドが良ければPluginもあるのが良い

f:id:cam-engineer:20160630151911j:plain

使ってみた感想(課題)

一方で、以下のような課題もありました。

  • キーバインドを覚えるために初期投資が必要
  • もっと軽いと思ってた
  • 海外製品なので日本語絡みのトラブルに遭いました(解決済)
  • リモート開発のための情報が出てこなくて、苦戦。。。

まとめ

協力してくれたエンジニアのほぼ全員が他の人にも薦めたい、とのことでした。もちろん、それぞれのエンジニアの好みも尊重しながらですが、現在のエディタからの移行を進めていきたいと思います。

シーエー・モバイル新卒エンジニア技術研修2016

研修

こんにちはメディアディヴィジョンの ono です。
シーエー・モバイルには、この4月に6名の新卒エンジニアが入社しました。
今回は、新人エンジニア向けの研修内容についてご紹介いたします。

研修のねらい

今回の研修の目的は「最高のスタートダッシュ」でした。
これまで当社の研修は LAMP 環境構築やシステム概論の講義形式で研修を行っていたのですが、
実際に研修のあとに業務で最高に走り出すためには、
「実務のフローの理解」 「自主的な問題解決」 「シーエー・モバイルの環境理解」
以上 3 点が不可欠と考え、 今回から研修スタイルを刷新しました。

研修テーマ

研修を実務に特化させるべく、新たな試みとして、
「実在の弊社サービスのバグ修正をテーマにした業務チケット消化バトル」
を行うことにしました(研修のために別の環境を用意しました)。

新人に実際に話しただいぶエモい研修説明

時は2016年 シーエー・モバイルに入社してきた6人の若者がやってきた。

若者達は突如試練にぶち当たる。

サービスの前任者が大量のバグを残したまま全員事故に遭ってしまった。

対応できるエンジニアは新人だけ・・・。

2チームに別れ、チーム内で協力しながら、

次の金曜日までにとあるサービスのバグチケットを解消し、リリースしなければならない。

先輩社員の協力を得つつも幾つもの困難を乗り越える

若者達は・・・、

果たして無事サービスをリリースすることができるのか・・・。

研修の事前準備

  • 研修用に用意した環境内で、実在の当社のサービスのコードに、あえてバグを仕込んだリポジトリを準備
  • git log を消すため .git 消して git init してそのあと各チームごとのリポジトリに登録
  • 開発サーバに実際、よく稀にあるようなバグ状態のプロジェクト設置
    • typo があってリンクが切れてる」
    • 「リクエストパラメータつければ他人の情報がみれる」
    • Apache エラーで立ち上がらない」 などなど
      調べる力、探す力、協力を仰ぐ力が試されるようなチケット25個
  • redmine でバグのチケットを起票

新人の実際にやった業務フロー

事前準備

  • ローカル環境セットアップ(Ansible)
  • リポジトリを fork

その上で
1. Redmine 起票されたチケットをアサイン
2. ローカル環境でブランチ作成
3. バグ修正を行う
4. プルリクエストを出す(GitHub Enterprise)
5. 先輩からレビュー(洗礼)を受ける
6. マージされたら開発環境で pull して確認

上記の当社の実際の開発フローを全員に体験してもらいました。

f:id:cam-engineer:20160603142348j:plain プルリクエスト説明中

研修中の様子

スムーズにいけたチームもあれば、環境を破壊してしまったチームもあり、
開発以外でもつまづいたりしていました。
毎日1時間、レビューおよび質疑回答時間として先輩エンジニアがフォローし、
また、Slack でも質問、回答を行い問題解決にあたりました。

悪戦苦闘する新人と先輩社員の図
f:id:cam-engineer:20160603142009j:plain

f:id:cam-engineer:20160603143137j:plain

研修振り返り&まとめ

内容を刷新しての初めての試みでしたが、運営の不備などはありつつも
研修を通して新人はプルリクでレビューを受ける文化に慣れ、
今現在実務に関わり、最高とは言わないまでも 「とびきりのスタートダッシュ」 を決めてくれています。

一方、研修後の振り返りで運営面での課題も多く見つかったので、来年の研修ではより良くなるよう調整をかけていきたいと思います。

この研修を通して、自分の修正内容がマージされることの難しさを感じてくれたと思っています。 配属後、新人が実際のプロジェクトで、初めてのプルリクマージができたら非常に喜んでいて、記念日として祝っているなど、 シーエー・モバイルに一つ面白い文化ができたと感じています。

Rails gem を作ろう 1 - Rails プラグインを作る -

Rails Plugins Ruby

はじめまして、メディア事業部のフォンと申します。今回は Railsプラグインを作る方法を紹介致します。

サービスを開発するとき Rails だけで全部出来ますよね?なぜプラグインまで作らなければならないのでしょうか?

その答えはDRYです。

Don't Repeat Yourself(DRY)「同じことを繰り返さない」という開発パターンを実現するために Rails プラグインという仕組みが大きく役に立ちます。

例えば、大抵のシステムでユーザーテーブルを必要とすると思います。開発対象のサービスはたった一つだけなら問題無いですが、もしチーム内で2つ以上のサービスを開発するようになったら、そこでユーザーテーブルの実装の繰り返しが始まります。それを避けるために Railsプラグインシステムが実現されてあります。

今回は例として(つまらないですが)HelloJapanプラグインを作ります。 注意事項が一つあります。今回作るプラグインは普通の Ruby gem ではなく、Railsプラグインです。間違わないように気をつけてください。 じゃ…早速やってみましょう。

初期化コマンドは下記の通り。

rails plugin new HelloJapan

すると…

      create
      create  README.rdoc
      create  Rakefile
      create  hello_japan.gemspec
      create  MIT-LICENSE
      create  .gitignore
      create  Gemfile
      create  lib/hello_japan.rb
      create  lib/tasks/hello_japan_tasks.rake
      create  lib/hello_japan/version.rb
      create  test/test_helper.rb
      create  test/hello_japan_test.rb
      append  Rakefile
  vendor_app  test/dummy
         run  bundle install

が実行されbundle installの前まで準備してくれます。

では今回の一番重要なファイルを弄ってみましょう。 hello_japan.gemspecファイルですね。 中身をみると…

$:.push File.expand_path("../lib", __FILE__)

# Maintain your gem's version:
require "hello_japan/version"

# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
  s.name        = "hello_japan"
  s.version     = HelloJapan::VERSION
  s.authors     = ["Phone Phone"]
  s.email       = ["phonephone@example.com"]
  s.homepage    = "TODO"
  s.summary     = "TODO: Summary of HelloJapan."
  s.description = "TODO: Description of HelloJapan."
  s.license     = "MIT"

  s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"]
  s.test_files = Dir["test/**/*"]

  s.add_dependency "rails", "~> 4.2.3"

  s.add_development_dependency "sqlite3"
end

まず、TODOの部分を全部直して、Ruby バージョンを指定します。

#coding: utf-8
$:.push File.expand_path("../lib", __FILE__)

# Maintain your gem's version:
require "hello_japan/version"

# Describe your gem and declare its dependencies:
Gem::Specification.new do |s|
  s.name        = "hello_japan"
  s.version     = HelloJapan::VERSION
  s.authors     = ["Phone Phone"]
  s.email       = ["phonephone@example.com"]
  s.homepage    = "http://www.hello-japan.com"
  s.summary     = "Stringクラスにhello_japanヘルパーメソードを追加します。"
  s.description = "NilClassにもhello_japanを追加して文字列がnilになってしまった場合サービスが落ちないようにします。"
  s.license     = "MIT"

  s.files = Dir["{app,config,db,lib}/**/*", "MIT-LICENSE", "Rakefile", "README.rdoc"]
  s.test_files = Dir["test/**/*"]

  s.add_dependency "rails", "~> 4.2.3"
  s.required_ruby_version "~> 2.2.2"

  s.add_development_dependency "sqlite3"
end

あらかじめ test/hello_japan_test.rb の中に欲しい機能をお願いしておきます。

#coding: utf-8
require 'test_helper'

class HelloJapanTest < ActiveSupport::TestCase
  test "truth" do
    assert_kind_of Module, HelloJapan
  end

  test "String has hello_japan method" do
    assert_equal "Hello JapanはHello Japanになります", ":hj:はHello Japanになります".hello_japan
  end

  test "Nil has hello_japan method" do
    assert_nil nil.hello_japan
  end
end

それでrake testを実行してみると、もちろん失敗してしまいます。直しましょう。

vim lib/hello_japan/core_ext.rbで新しいファイルを開いて、下記のコードを書きます。

String.class_eval do
  def hello_japan
    gsub(/:hj:/,"Hello Japan")
  end
end

NilClass.class_eval do
  def hello_japan
    nil
  end
end

もう一度rake testをすると、まだエラーが発生します。 なぜなら、そのcore_ext.rbファイルが自動でrequireされてないからです。 lib/hello_japan.rbの中に

require "hello_japan/core_ext"

を入れて下さい。 今度はrake testが通りました。

# Running:

...

Finished in 0.003512s, 854.1497 runs/s, 854.1497 assertions/s.

念のため、コンソールで確かめてみましょう。 Rails プラグインはテストの為、ダミーアプリが作られますので、

cd test/dummy

rails console

に入ります。そして、コンソールで下記を打つと

> "Good morning. :hj:.".hello_japan

結果が

 => "Good morning. Hello Japan."

になります。 nilも問題無いです。

> nil.hello_japan
 => nil

今回はここで終了致します。

次の機会があったら、ActiveRecordを拡張する方法を紹介します。

幸せな一日を…

iOS 9 でアプリ内のローカライズがうまくいかなくなりました。

Objective-c iOS トラブルシューティング

こんにちは。ono です。

当社では iOS 9 がリリースされたことで、以前 Xcode 6 で開発してリリースしていたアプリにおいてローカライズの言語を間違える事象が発生しました。
今回はその事象と対策についてまとめます。

起きていた事象

iPhone の言語設定が日本語のユーザなのにアプリ上では英語にローカライズされてしまう部分がある。

ローカライズを間違えたコード

既存のソースコードを確認してみると、この部分が誤作動していました

NSArray *languages = [NSLocale preferredLanguages];  
NSString *currentLanguage = [languages objectAtIndex:0];  
if ([currentLanguage isEqualToString:@"ja"] == YES) {  
  // 日本語  
}  
else{  
  // 日本語以外  
}  

ローカライズ間違いの原因

[NSLocale preferredLanguages] の返り値が iOS 9 では ja のみではなく、
ja-jp など地域設定が追加されたため、"ja" と一致で判定すると失敗するようです。

この事象iOS シミュレータの言語設定、地域設定を変更することでも再現できます。

対策

[currentLanguage hasPrefix:@"ja-"] の条件を追加することで jaの地域設定に対応することができました。

if ([currentLanguage isEqualToString:@"ja"] == YES || [currentLanguage hasPrefix:@"ja-"])

参考

iOS9で日本語のLocalizable.stringが適用されない - Qiita

次回は Xcode 6 で開発したアプリのソースコードXcode 7 に移行した時のお話をします。

【Rails5新機能紹介】Ruby Version Supportについて

こんにちは、シーエー・モバイルの新卒エンジニア Miaoです。

今回は、Rails5について話したいと思います。

Rails 5は2015年の秋に正式的公開する予定です。
が、まだ出てないですね。笑 来春あたりになりそうですね。

 

 Rails5の目玉

すでに色々な記事にも書いてありますが、下記はRails5の目玉です

  • Rails5 のRubyバージョンサポート
  • ActionCable
  • Turbolinks 3.0
  • Rails API
  • Others

上記の内容は一本ずつシリーズにして詳しく紹介していきたいと思います。
今回は「Rails5のRubyバージョンサポート」について詳しく紹介していきたいと思います。

 

 Ruby Version Support

Rails5はRuby2.2.1以上のバージョンしかサポートしません。

f:id:miaodi2002:20151027204716p:plain

 

Rails5の新規機能の前に、ruby 2.2の新機能・変更点をいくつかおさらいをしたいと思います。

 

Ruby2.2の新機能・変更点

・Kernel#itself

いわゆる恒等関数と呼ばれる、自身 (self) をそのまま返すメソッド Kernel#itself が追加されました。

Ruby では恒等関数の導入案は以前からありましたが、名前がなかなか決まらなかったという経緯があります。今回は itself という名前に落ち着いたようで、ようやく導入されました。

Kernel#itself は以下のような動きをします。

 

具体的な利用例ですが、以下のように配列の値自身で group_by したい場合に綺麗に書くことが出来ます。

 

Kernelモジュールに馴染みのない人の為に補足しておくと

Kernelモジュールは、グローバル関数(組み込み関数)として使えるメソッドを集めたものです。ObjectクラスはKernelをインクルードしているので、Kernelのメソッドはプログラムのどこからでもレシーバなしで利用できます。  (From AmiWiki)

 

・Binding

 Binding#local_variables
以前から定義済ローカル変数を一覧するKernel#local_variablesメソッドは存在していましたが、Binding#local_variablesはprivateでした。

それがpublicに利用可能となった変更です。

Binding#reciverは、そのbindingオブジェクトが呼び出されたもともとのレシーバ自身を返すメソッドです。(良く利用されるので新しいメソッドとして追加されました)。

Bindingをもっと知りたい方はこちらも参考にしてみてください:
http://qiita.com/lnznt/items/4c3e1050dafd59193808

 

・Enumerable

1. Enumerable#slice_after

Enumerableモジュールに配列処理用のメソッドslice_afterを追加しました。

特定の条件を満たす要素の直後でスライスするメソッドです。

配列処理をより便利になりましたね!

 

2. Enumerable#slice_when

同時にslice_whenメソッドも追加しました。

要素を前から順にブロックで評価し、その結果によって要素をグループ化した要素を持つEnumerator を返します。

1回sortしないと行けないかんじですが、Enumerable内での各要素出現数をカウントする時は使えそうです。

 

 以上

他にもかなり便利なメソッドが追加されていますので興味がある人はリファレンスを熟読されてはいかがでしょうか!

次回は「ActionCable」について紹介したいと思います。

お楽しみにしてください。

参考

1.Rails 5.0 needs ruby 2.2.1 or higher by jvanbaarsen · Pull Request #19257 · rails/rails · GitHub

2.» Ruby 2.2.0 preview1: ついに来ました!恒等関数 Kernel#itself などなど TECHSCORE BLOG

3. New Methods in Ruby 2.2