mediba を支える技術

# はじめに

こんにちは [mediba advent calendar 2016](http://qiita.com/advent-calendar/2016/mediba) 1日目担当の @medi-sugimoto です。
medibaでは広告システム開発部に所属し、サービス側との仕様調整やマネージメントを主に担当しています。

今回はアドベントカレンダー初日ということもあり、medibaの事業全体と、そこで使われている主要な技術について俯瞰的かつ主観的な視点で書かせてもらえたらと思います。

# 事業組織の話 (2016年12月1日 現在)

まずだいぶざっくりではありますが、組織としてこんな感じです。

<img width="686" alt="スライド1.png" src="https://qiita-image-store.s3.amazonaws.com/0/80867/f8187c28-7466-82b2-d45b-e89b4c61c370.png">

（海外事業やバックオフィス等、開発に絡まない部分については省いています。）

基本的に事業部側でビジネスの責任を、システム本部側はシステムについての責任を負ってるかたちです。

開発サイド メディアシステム開発部、広告システム開発部については、事業部側と連携を密にとり、サービス目的の達成に注力する部門。
IS部（インフラストラクチャー部）、制作部、情報システム部（品質管理G）は、横断部門としてサービス毎に適宜メンバーをアサインし、サービス成長を支える感じとなっています。

## auメディア
* KDDIからの受託や、auの冠を背負うサービスをおもに見る組織
	* au webポータル（ <https://auone.jp> ）
	* auヘッドライン（ <http://hl.auone.jp> ）
	* auスマートパス系（ <http://pass.auone.jp> ）
	* au電気、ウィジェットなど

### 開発の特徴

花形。キャリアのポータルサイトを支える安定したシステム構築と、高トラフィック対応、キャッシュコントロール、コスト最適化などが求められます。
社内の技術的知見の有効活用、人的リソース確保の視点からPHPで構築されているサービスが多いです。インフラについても、安定性からオンプレで構築されていた物も多くありましたが現在AWSへの移行も進んでいます。安定稼働という視点から技術的挑戦は難しい部分もありますが最近ではGolangに取り組んでいたりも。
また、ニアショアによるコスト削減、リモートスクラムなどの新たな試みも行っています。

## 広告ビジネス事業
* KDDIのキャリアレップ事業、広告企画、運用、営業などをおもに行う組織。最近はゲームメディア事業についてもここで見ています。
	* auメディアでのディスプレイ広告
	* リワード事業（ ポイント貯める ）
	* プラスポイントアンケート
	* ホットインフォ（ SP/EZ ）

### 開発の特徴

稼ぎ頭。auメディアによる高トラフィック環境下での広告掲載に耐えうる安定したシステム運用、レスポンスタイム対応、高いセキュリティ意識（個人情報・ポイント・お金）、低コスト・短納期での開発が求められています。
レスポンス対策としてScalaや、開発速度優先でRuby、社内でのナレッジを活かすためにPHPを使うなど、言語としては幅広く利用しています。
インフラについては、オンプレとAWS両方を利用。
基本的に "新しいものはいいものだ" の視点から技術的挑戦を行うことも多いです。が、中の人は遺産に苦しめられていたりも…。

## medibaメディア

* mediba独自のサービス構築と一部のauサービスの運用を行う組織です。
	* ZTOKYO（ <https://ztokyo.net> ）
	* Camily（ <http://camily.jp> ）
	* MANT（ <http://mant.jp> ）
	* わたしねこ（ <https://watashineko.com> ）
		* 本日12月1日ベータリリース！！
	* au占い（ <https://sp.fortune.auone.jp> ）
	* auゲーム（ <https://game.auone.jp> ）

（あとで見て、クローズされてても暖かい目で見てあげてください）

### 開発の特徴
 
期待のホープ。とにかく早く作る。安く作ることが求められます。何があっても壊れないものを作るのではなく、壊れたらいかに早く直せるかに主眼をおいている感じです。
仕様がFixする前にプロジェクトが動き出すことも多く、仕様変更にも対応できる柔軟性とハートが求められます。Android,iOSアプリ、ウェブサービスなど開発するサービスは多方面に及ぶため、広く深い技術領域、サービス視点・ユーザー視点に立った開発センスも必要とされます。

# 開発の進め方

## チーム制

medibaでは、ほとんどのサービス・プロジェクトで組織を横断したのチーム制での開発を行っています。

<img width="686" alt="スライド2.png" src="https://qiita-image-store.s3.amazonaws.com/0/80867/144313d1-beae-a5ba-a2eb-be7b3a916641.png">

多くのチームで、アジャイル、スクラムでの開発を行っており２週間スプリントのチームが多いようです。

サービスの数があまりにも多いため、横断部門にかぎらず複数のチームを兼務しているメンバーも多くいます。これについては、開発速度の低下にも繋がるため、改善が必要な部分となっています。

## ツール

開発推進していく上で重要なツールとしては以下のものを利用しています。

* タスク管理
	* JIRA, waffle.io, Backlog
* ドキュメント管理
	* Backlog, Redmine
* コミニュケーションツール
	* Talknote, Slack

# 横断技術

技術選択は サービス・プロジェクトごとで構成されるチーム にとって最適なツール、技術を選択するかたちになっています。そして個別最適化を意識するあまり、利用技術の発散が一つの課題だったりもしています。

その中でも横断的に利用しているものについて、まとめさせてもらいました。（チームそれぞれの部分も多くすべてを把握しているわけではないですが‥）なんとなく主力っぽいのを **太字** に。

## 開発言語

### サーバーサイド

* **PHP**
	* **Yii2**, **Laravel**, Zendframework
* **Scala**
	* **Akka-Http**, Play2
* Golang
	* (...知らない)
* Ruby
	* Rails

### フロントエンド

* アプリ開発
	* Java, Objective-C, Swift
	* **Cordova**, **Xamarin**
* ウェブ
	* **Vue.js**, Backbone.js, Anguler.js, React, jQuery
	* Sass

## 利用サービス・利用ツール

CI周りとセキュリティ周りについては、現在絶賛自動化を進めている真っ只中です。一部サービスだけではなく、いかに全体に波及させていくかも課題になっているところです。

### CI周り

* ソース管理
	* GitHub
* 構成管理
	* **Docker**, Amazon ECS
	* **Ansible**, Chef
* CI
	* **TravisCI**, jenkins
* デプロイ
	* **Capistrano**, Fabric, CodeDeploy
* タスクランナー
	* Grunt, gulp

### セキュリティ・試験周り

* アプリケーション脆弱性
	* OWASP ZAP
* ミドル脆弱性
	* vuls
* 性能試験
	* **Gatling**, Jmeter, ApacheBench
* レスポンス速度
	* Sitespeed.io

# さいごに

今回、第１回目ということで、medibaの技術についてのまるっとした紹介となってしまいましたが、次回からはよりディープな、技術やデザインの話が出てくるのではないかと思っています。
Advent Calendar形式は、medibaとしてはじめての取り組みとなりますが、技術者ブログ( <http://ceblog.mediba.jp/> )は毎週更新を行っていますのでそちらについても是非ご覧になってみてください。

Advent Calendarを書くに当たり、今年一年間を振り返ってみたのですが、技術的に何にも成長できてないな（書くこと無いなー）なんて思い、来年に向けて気持ちを新たにしているところです。

そんなこんな少し早いご挨拶となりますが、今年もお世話になりました。

以上、杉本でした。