ニコニコAndroid- サーバ編 -間島 大智
目次•ニコニコAndroidサーバって何?•Scalaいいところ・わるいところ•サーバチームの仕事の流れ
間島 大智•株式会社ドワンゴ•ニコニコAndroidサーバチーム•2012年新卒入社
間島 大智•株式会社ドワンゴ•ニコニコAndroidサーバチーム•2012年新卒入社
間島 大智•株式会社ドワンゴ•ニコニコAndroidサーバチーム•2012年新卒入社•化学の知識を活用できるWebサービスのプロジェクトまだですかね
ニコニコAndroidサーバって?社内向けAPI・DBニコニコAndroidサーバAndroidアプリau STBアプリ様々なアプリでニコニコを使うために必要なAPIを提供
プロジェクトの歴史•2012/02 プロジェクト発足•2012/08 au STBアプリリリース•2012/11 Androidアプリリリース•74 API•330万リクエスト/日
サーバ側メンバー• mashijp (github)• @kozo1215• @mtgto• @mitikage• @kimwoonsung• インフラ2人
環境•言語: Scala•フレームワーク: Play Framework 2.0•IDE: IntelliJ IDEA 11, 12•CI: Jenkins社内初
ニコニコAndroidサーバって?
ニコニコAndroidサーバの役目社内向けAPI・DBニコニコAndroidサーバAndroidアプリau STBアプリこの位置に求められることって…?
ニコニコAndroidサーバに求められること社内向けAPI・DBニコニコAndroidサーバAndroidアプリau STBアプリアプリにとって使いやすいAPIを提供すること
使いやすいAPIとは?•用語が統一されている•用語が直感的に理解できる•内部的な細かい仕様を知らなくていい•ドキュメント化されている
•用語が統一されている•用語が直感的に理解できる•内部的な細かい仕様を知らなくていい逆にこの3つを満たしていないAPIって?
社内APIを変えればいい?長い歴史があるもの(社内API)にはどうしてもわかりにくい用語・仕様がまじってしまう社内APIを修正すればいい…?
そう簡単には変えられない•社内APIは多数の社内サービスが既に使っている•仕様を変更するのは容易ではない
サーバで内部仕様を吸収mylist.list deflist.listmylist.remove deflist....GET /xxx/mylists/:id社内向けAPI・DBニコニコAndroidサーバAndroidアプリau STBアプリわ...
ドメイン層Androidアプリau STBアプリインフラストラクチャ層社内向けAPI・DBAPI層ドメイン駆動設計による浄化社内APIを叩くことだけに専念ビジネスロジックだけに専念リクエストの処理だけに専念明確にレイヤー分離された設計をしています
社内向けAPIドキュメント•Confluence(Wikiみたいなもの)で管理•全てのAPIについて細かく記述している
ドキュメントの例
ドキュメントの例
ドキュメントの例
ドキュメントの例共通で使うレスポンスの形は別ページにしている(多重管理を避けるため)
APIドキュメントの記述•社内向けAPIドキュメントだからといって決して手を抜いていない•多重管理を避け、ドキュメントが古くなってしまうことを避けている
使いやすいAPIが実現できた•用語が統一され、直感的に理解できる•内部的な細かい仕様を知らなくていい•ドキュメント化されている→Scalaでモデルを再定義しアプリに提供→社内向けだからといって甘えていない 管理しやすく見やすいドキュメント作成
Scalaの良い所・悪い所
環境•言語: Scala•フレームワーク: Play Framework 2.0•IDE: IntelliJ IDEA 11, 12•CI: Jenkins
•昨年6月、新卒研修が終わりニコニコAndroidチームに配属された•入社前•Javaは趣味で触ってた•が、 Scala は名前すら知らないScala…?!
Java利用者にとってのScala実体験をふまえて
Scalaって?•静的型付け言語•関数型言語とオブジェクト指向言語のハイブリッド•JVM上で動く•Javaのコードも簡単に混ぜられる
Scalaって?•静的型付け言語•関数型言語とオブジェクト指向言語のハイブリッド•JVM上で動く•Javaのコードも簡単に混ぜられるって言われても何が良いのかわからん!
便利やでScala•型推論•コレクション関数•対話環境•Option型
型推論String str = fugahoge ;String piyo = str + piyo ;Java
型推論String str = fugahoge ;String piyo = str + piyo ;Java
型推論String str = fugahoge ;String piyo = str + piyo ;Java↑書かなくても右辺見ればわかる
型推論String str = fugahoge ;String piyo = str + piyo ;JavaScala↑書かなくても右辺見ればわかる
型推論String str = fugahoge ;String piyo = str + piyo ;JavaScala↑書かなくても右辺見ればわかるval str = fugahogeval piyo = str + piyo
型推論String str = fugahoge ;String piyo = str + piyo ;JavaScala↑書かなくても右辺見ればわかるval str = fugahogeval piyo = str + piyo↑コンパイラが...
型推論
Scala型推論
Scala型推論def replaceAbc(str: String) = {str.replaceAll( abc , def )}val fuga = replaceAbc( abcdef )
Scala型推論def replaceAbc(str: String) = {str.replaceAll( abc , def )}val fuga = replaceAbc( abcdef )↑メソッドの返り値はStringと推測される
Scala型推論def replaceAbc(str: String) = {str.replaceAll( abc , def )}val fuga = replaceAbc( abcdef )↑メソッドの返り値はStringと推測される↑よ...
Scala型推論def replaceAbc(str: String) = {str.replaceAll( abc , def )}val fuga = replaceAbc( abcdef )↑メソッドの返り値はStringと推測される↑よ...
コレクション関数JavaString[] strs = { a , fuga , bb , hogee };List<String> result = new ArrayList<String>();for(String str : strs)...
コレクション関数Scalaval strs = List( a , fuga , bb , hogee );return strs.filter(_.length >= 3)強力なコレクション関数+型推論によりコード記述量を大幅に減らせる
ちなみに•ニコニコAndroidサーバのコードにはfor文は7つしかない
Scalaのfor使うときval list1 = List( a , b , c )val list2 = List(1, 2, 3)for(a <- list1; b <- list2) {println(a+b)}
Scalaのfor使うときval list1 = List( a , b , c )val list2 = List(1, 2, 3)for(a <- list1; b <- list2) {println(a+b)}出力結果: a1 a2 a...
Scalaのfor使うときval list1 = List( a , b , c )val list2 = List(1, 2, 3)for(a <- list1; b <- list2) {println(a+b)}出力結果: a1 a2 a...
強力なコレクション関数+for•コード記述量が大幅に減った•単純なコレクションの処理をする際にfor文使うことほぼなし•たまに「forどうやって書くんだっけ」という声がでるほど…
対話環境
強力なimport文•ブロックの中にかける•別名をかけるScala
importをブロックの中にかけるimport java.util.Date;public void methodA(){Date date = new Date(). .......}public void methodB(){java.sq...
importをブロックの中にかけるdef methodA() = {import java.util.Dateval date = new Date(). .......}def methodB() = {import java.sql.Dat...
別名をつけられるimport java.util.Dateimport java.sql.{Date => SqlDate}def methodA() = {val date = new Date(). .......}def methodB(...
強力なimport文•ブロックの中にかける&別名をつけることができる•クラス名をつける際に「かぶりそうだな…」と怯えることがなくなった•短いクラス名をどんどんつけちゃう•例) Client (Redis接続用クラス)
Option型Java・このメソッドってnull返すことあるっけ? えーとドキュメント...・あ、そうだ nullチェックしないと... if (result != null) { ....
Option型Java・このメソッドってnull返すことあるっけ? えーとドキュメント...・あ、そうだ nullチェックしないと... if (result != null) { ....NullPointerException
Javaでぬるぽを起こす例JavaMap<String, String> map = getMap();String result = map.get(fieldName);if (result.length() >= 3) {return 長さ...
Javaでぬるぽを起こす例JavaMap<String, String> map = getMap();String result = map.get(fieldName);if (result.length() >= 3) {return 長さ...
Javaでぬるぽを起こす例JavaMap<String, String> map = getMap();String result = map.get(fieldName);if (result.length() >= 3) {return 長さ...
nullチェック追加Map<String, String> map = getMap();String result = map.get(fieldName);if (result != null && result.length() >= 3)...
nullチェック追加Map<String, String> map = getMap();String result = map.get(fieldName);if (result != null && result.length() >= 3)...
Option型って?Option[T]Some[T] None値がある 値がない値がある・ないを型で表現しているScala
Option型の挙動Scalaval map = Map("key1" -> "value1", "key2" -> "value2")// Map#getの返り値はOption型(ここではOption[String])println(map....
型で値がないことに気づけるval map = getMap()val result = map.get(fieldName)↑resultの型は Option[String]この時点で「値がないこともありうる」ということに気づけるScala
val map = getMap()val result = map.get(fieldName)result.filter(_.length > 3).map(e => 長さは +e.length).getOrElse( 短い )さっきの例をSc...
ぬるぽがない安心感•Scalaの標準ライブラリは原則nullを返さない(Scalaはnullを使わない文化)•つまりnullチェックを書く必要がない
社内向けAPIドキュメント
社内向けAPIドキュメントnullがありうるものをドキュメントに残すのに苦労しなかった
Scalaの悪いところ...•コンパイル遅すぎ!•社内にScalaについて聞ける人が少ない
コンパイル•遅い!!とにかく遅い!!•メモリ食い過ぎー!•ビルド時のJavaの設定-Xms512m -Xmx1024m -XX:MaxPermSize=512mScala
コンパイル•遅い!!とにかく遅い!!•メモリ食い過ぎー!•ビルド時のJavaの設定-Xms512m -Xmx1024m -XX:MaxPermSize=512mScalaJenkinsで並行ビルドするとスワップアウト...→ Jenkinsサー...
社内に聞ける人が少ない•弊社内でScalaのプロジェクトはニコニコAndroidサーバが初めて•社内ノウハウが少ない…•Scala書ける人もあんまりいない…
学習コストはそんなにかからない開発メンバー5人中4人がScalaをはじめて1年たっていない
学習コストはそんなにかからない開発メンバー5人中4人がScalaをはじめて1年たっていないでも1ヶ月勉強したら業務で書けるようになった
どうやって勉強?•おすすめ本「JavaプログラマのためのScalaプログラミング」•疑問は社内IRCでブツブツ言う•誰か答えてくれる•#scalaというチャンネルもできた
少しずつ広まっている...!最近は社内でもScalaを使う流れができつつあり、今後は改善されそう!ドワンゴでは4プロジェクトがScala使ってます
チームの実際の仕事の流れ
仕事のサイクル計画振り返り 実装レビューリリースマージ1周=2週間のアジャイル開発
開発メンバー全員で2週間にやることを計画誰がどの仕事をするか割り振る全員で計画する
計画の前準備会議をする前に各自でやらないといけないことを洗い出し、チケットとして作成チケット管理にはAtlassian製品のJIRAを使っています
全員で見積もるチケットを作った人がチケットの内容を説明工数見積もり(予想)を各自で出す見積もりがあわなかったら最大3回やる全員でやることを共有できているので突然誰かが倒れても大丈夫なチームに
実装する• IntelliJ IDEA 12 Ultimate($200)使ってます• キャンペーンのときに全員買った• 買うまではCommunity Edition(無料)• 会社で買ってくれるという話も出てる• ScalaのIDEはInte...
テストに力を入れています1000以上のテストケースによりコードカバレッジ80%以上を達成
FishEyeでコードレビュー全員が仕事を理解しているので誰でもレビューできるみんなで気軽にレビューコメントをつける
GitHub:eよりFishEyeのほうが便利•誰がレビューOK出しているのか、どれぐらい見ているのかがすぐ分かる!全員のレビューOKが出ればマージする
Jenkins•ビルド•テストの実行•developブランチにマージするとJenkinsが動き出す•テストが落ちるとチームメンバーに罵られる
振り返る(KPT)毎週水曜日にKPTKeep(続けたいこと), Problem(困ったこと),Try(次やりたいこと) をみんなで自由に書く
KPTで改善された例Jenkins用サーバで並行ビルドできないもっとスペックの高いJenkins用サーバを調達し、並行ビルド可能にProblemTry
思ったことを気軽に書けるので「ちょっとした問題」を改善していく流れを作ることができた
強いチーム作りに成功「全員で」計画し「全員で」振り返ることで常に意識を共有全員が主体的に動く強いチームを作っています
ドワンゴで働きませんか• Scalaに興味のある人もない人も• 「ドワンゴ 採用」で検索!• http://info.dwango.co.jp/recruit/• 7月から新オフィス(歌舞伎座)お待ちしています!
まとめ• 美しいAPIをアプリチームに提供できた• Scalaで再モデリング・ドキュメント整備• Scalaを業務で楽しく使ってます!• 強力なScalaの機能で効率の良い開発が可能に• 強いチームでやってます• 全員が仕様を理解できている• ...
Upcoming SlideShare
Loading in...5
×

ニコニコAndroid(サーバ編) - Scalaを業務で使って

13,920

Published on

2013 JJUG(http://www.java-users.jp/?page_id=330) #jjug_ccc
※一部発表時と異なる点があります

Published in: Technology
0 Comments
67 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
13,920
On Slideshare
0
From Embeds
0
Number of Embeds
11
Actions
Shares
0
Downloads
45
Comments
0
Likes
67
Embeds 0
No embeds

No notes for slide

Transcript of "ニコニコAndroid(サーバ編) - Scalaを業務で使って"

  1. 1. ニコニコAndroid- サーバ編 -間島 大智
  2. 2. 目次•ニコニコAndroidサーバって何?•Scalaいいところ・わるいところ•サーバチームの仕事の流れ
  3. 3. 間島 大智•株式会社ドワンゴ•ニコニコAndroidサーバチーム•2012年新卒入社
  4. 4. 間島 大智•株式会社ドワンゴ•ニコニコAndroidサーバチーム•2012年新卒入社
  5. 5. 間島 大智•株式会社ドワンゴ•ニコニコAndroidサーバチーム•2012年新卒入社•化学の知識を活用できるWebサービスのプロジェクトまだですかね
  6. 6. ニコニコAndroidサーバって?社内向けAPI・DBニコニコAndroidサーバAndroidアプリau STBアプリ様々なアプリでニコニコを使うために必要なAPIを提供
  7. 7. プロジェクトの歴史•2012/02 プロジェクト発足•2012/08 au STBアプリリリース•2012/11 Androidアプリリリース•74 API•330万リクエスト/日
  8. 8. サーバ側メンバー• mashijp (github)• @kozo1215• @mtgto• @mitikage• @kimwoonsung• インフラ2人
  9. 9. 環境•言語: Scala•フレームワーク: Play Framework 2.0•IDE: IntelliJ IDEA 11, 12•CI: Jenkins社内初
  10. 10. ニコニコAndroidサーバって?
  11. 11. ニコニコAndroidサーバの役目社内向けAPI・DBニコニコAndroidサーバAndroidアプリau STBアプリこの位置に求められることって…?
  12. 12. ニコニコAndroidサーバに求められること社内向けAPI・DBニコニコAndroidサーバAndroidアプリau STBアプリアプリにとって使いやすいAPIを提供すること
  13. 13. 使いやすいAPIとは?•用語が統一されている•用語が直感的に理解できる•内部的な細かい仕様を知らなくていい•ドキュメント化されている
  14. 14. •用語が統一されている•用語が直感的に理解できる•内部的な細かい仕様を知らなくていい逆にこの3つを満たしていないAPIって?
  15. 15. 社内APIを変えればいい?長い歴史があるもの(社内API)にはどうしてもわかりにくい用語・仕様がまじってしまう社内APIを修正すればいい…?
  16. 16. そう簡単には変えられない•社内APIは多数の社内サービスが既に使っている•仕様を変更するのは容易ではない
  17. 17. サーバで内部仕様を吸収mylist.list deflist.listmylist.remove deflist....GET /xxx/mylists/:id社内向けAPI・DBニコニコAndroidサーバAndroidアプリau STBアプリわかりやすい!モデルもScalaで再定義
  18. 18. ドメイン層Androidアプリau STBアプリインフラストラクチャ層社内向けAPI・DBAPI層ドメイン駆動設計による浄化社内APIを叩くことだけに専念ビジネスロジックだけに専念リクエストの処理だけに専念明確にレイヤー分離された設計をしています
  19. 19. 社内向けAPIドキュメント•Confluence(Wikiみたいなもの)で管理•全てのAPIについて細かく記述している
  20. 20. ドキュメントの例
  21. 21. ドキュメントの例
  22. 22. ドキュメントの例
  23. 23. ドキュメントの例共通で使うレスポンスの形は別ページにしている(多重管理を避けるため)
  24. 24. APIドキュメントの記述•社内向けAPIドキュメントだからといって決して手を抜いていない•多重管理を避け、ドキュメントが古くなってしまうことを避けている
  25. 25. 使いやすいAPIが実現できた•用語が統一され、直感的に理解できる•内部的な細かい仕様を知らなくていい•ドキュメント化されている→Scalaでモデルを再定義しアプリに提供→社内向けだからといって甘えていない 管理しやすく見やすいドキュメント作成
  26. 26. Scalaの良い所・悪い所
  27. 27. 環境•言語: Scala•フレームワーク: Play Framework 2.0•IDE: IntelliJ IDEA 11, 12•CI: Jenkins
  28. 28. •昨年6月、新卒研修が終わりニコニコAndroidチームに配属された•入社前•Javaは趣味で触ってた•が、 Scala は名前すら知らないScala…?!
  29. 29. Java利用者にとってのScala実体験をふまえて
  30. 30. Scalaって?•静的型付け言語•関数型言語とオブジェクト指向言語のハイブリッド•JVM上で動く•Javaのコードも簡単に混ぜられる
  31. 31. Scalaって?•静的型付け言語•関数型言語とオブジェクト指向言語のハイブリッド•JVM上で動く•Javaのコードも簡単に混ぜられるって言われても何が良いのかわからん!
  32. 32. 便利やでScala•型推論•コレクション関数•対話環境•Option型
  33. 33. 型推論String str = fugahoge ;String piyo = str + piyo ;Java
  34. 34. 型推論String str = fugahoge ;String piyo = str + piyo ;Java
  35. 35. 型推論String str = fugahoge ;String piyo = str + piyo ;Java↑書かなくても右辺見ればわかる
  36. 36. 型推論String str = fugahoge ;String piyo = str + piyo ;JavaScala↑書かなくても右辺見ればわかる
  37. 37. 型推論String str = fugahoge ;String piyo = str + piyo ;JavaScala↑書かなくても右辺見ればわかるval str = fugahogeval piyo = str + piyo
  38. 38. 型推論String str = fugahoge ;String piyo = str + piyo ;JavaScala↑書かなくても右辺見ればわかるval str = fugahogeval piyo = str + piyo↑コンパイラが勝手にStringと推測
  39. 39. 型推論
  40. 40. Scala型推論
  41. 41. Scala型推論def replaceAbc(str: String) = {str.replaceAll( abc , def )}val fuga = replaceAbc( abcdef )
  42. 42. Scala型推論def replaceAbc(str: String) = {str.replaceAll( abc , def )}val fuga = replaceAbc( abcdef )↑メソッドの返り値はStringと推測される
  43. 43. Scala型推論def replaceAbc(str: String) = {str.replaceAll( abc , def )}val fuga = replaceAbc( abcdef )↑メソッドの返り値はStringと推測される↑よって、fugaもString
  44. 44. Scala型推論def replaceAbc(str: String) = {str.replaceAll( abc , def )}val fuga = replaceAbc( abcdef )↑メソッドの返り値はStringと推測される↑よって、fugaもString冗長な記述をしなくていい
  45. 45. コレクション関数JavaString[] strs = { a , fuga , bb , hogee };List<String> result = new ArrayList<String>();for(String str : strs) {if (str.length >= 3) { result.add(str); }}return result;
  46. 46. コレクション関数Scalaval strs = List( a , fuga , bb , hogee );return strs.filter(_.length >= 3)強力なコレクション関数+型推論によりコード記述量を大幅に減らせる
  47. 47. ちなみに•ニコニコAndroidサーバのコードにはfor文は7つしかない
  48. 48. Scalaのfor使うときval list1 = List( a , b , c )val list2 = List(1, 2, 3)for(a <- list1; b <- list2) {println(a+b)}
  49. 49. Scalaのfor使うときval list1 = List( a , b , c )val list2 = List(1, 2, 3)for(a <- list1; b <- list2) {println(a+b)}出力結果: a1 a2 a3 b1 b2 b3 c1 c2 c3
  50. 50. Scalaのfor使うときval list1 = List( a , b , c )val list2 = List(1, 2, 3)for(a <- list1; b <- list2) {println(a+b)}出力結果: a1 a2 a3 b1 b2 b3 c1 c2 c3複数のコレクションの組み合わせを網羅するのに非常に便利
  51. 51. 強力なコレクション関数+for•コード記述量が大幅に減った•単純なコレクションの処理をする際にfor文使うことほぼなし•たまに「forどうやって書くんだっけ」という声がでるほど…
  52. 52. 対話環境
  53. 53. 強力なimport文•ブロックの中にかける•別名をかけるScala
  54. 54. importをブロックの中にかけるimport java.util.Date;public void methodA(){Date date = new Date(). .......}public void methodB(){java.sql.Date date = new java.sql.Date(..). .......}Java名前が衝突するのでimportできず、フルネームで書くしかない
  55. 55. importをブロックの中にかけるdef methodA() = {import java.util.Dateval date = new Date(). .......}def methodB() = {import java.sql.Dateval date = new Date(..). .......}Scala
  56. 56. 別名をつけられるimport java.util.Dateimport java.sql.{Date => SqlDate}def methodA() = {val date = new Date(). .......}def methodB() = {val date = new SqlDate(..). .......}Scala
  57. 57. 強力なimport文•ブロックの中にかける&別名をつけることができる•クラス名をつける際に「かぶりそうだな…」と怯えることがなくなった•短いクラス名をどんどんつけちゃう•例) Client (Redis接続用クラス)
  58. 58. Option型Java・このメソッドってnull返すことあるっけ? えーとドキュメント...・あ、そうだ nullチェックしないと... if (result != null) { ....
  59. 59. Option型Java・このメソッドってnull返すことあるっけ? えーとドキュメント...・あ、そうだ nullチェックしないと... if (result != null) { ....NullPointerException
  60. 60. Javaでぬるぽを起こす例JavaMap<String, String> map = getMap();String result = map.get(fieldName);if (result.length() >= 3) {return 長さは +result.length();} else {return 短い!! ;}Mapからとってきたものが3文字以上かどうかチェックするメソッド
  61. 61. Javaでぬるぽを起こす例JavaMap<String, String> map = getMap();String result = map.get(fieldName);if (result.length() >= 3) {return 長さは +result.length();} else {return 短い!! ;}Mapからとってきたものが3文字以上かどうかチェックするメソッド
  62. 62. Javaでぬるぽを起こす例JavaMap<String, String> map = getMap();String result = map.get(fieldName);if (result.length() >= 3) {return 長さは +result.length();} else {return 短い!! ;}NullPointerException!!!   ( ・∀・)   | | ガッ  と    )    | |    Y /ノ    人     / )    <  >__Λ∩   _/し //. V`Д´)/  (_フ彡        /そんなキーねえよMapからとってきたものが3文字以上かどうかチェックするメソッド
  63. 63. nullチェック追加Map<String, String> map = getMap();String result = map.get(fieldName);if (result != null && result.length() >= 3) {return 長さは +result.length();} else {return 短い!! ;}Java
  64. 64. nullチェック追加Map<String, String> map = getMap();String result = map.get(fieldName);if (result != null && result.length() >= 3) {return 長さは +result.length();} else {return 短い!! ;}Javaどうしてもnullチェック忘れてしまう…!
  65. 65. Option型って?Option[T]Some[T] None値がある 値がない値がある・ないを型で表現しているScala
  66. 66. Option型の挙動Scalaval map = Map("key1" -> "value1", "key2" -> "value2")// Map#getの返り値はOption型(ここではOption[String])println(map.get( key1 ))//→ Some(value1)println(map.get( fuga ))//→ Nonemap.get( key1 ).getOrElse( ないとき )//→ value1map.get( fuga ).getOrElse( ないとき )//→ ないときSomeのときは中身を取り出し、Noneのときは引数を返す
  67. 67. 型で値がないことに気づけるval map = getMap()val result = map.get(fieldName)↑resultの型は Option[String]この時点で「値がないこともありうる」ということに気づけるScala
  68. 68. val map = getMap()val result = map.get(fieldName)result.filter(_.length > 3).map(e => 長さは +e.length).getOrElse( 短い )さっきの例をScalaで実装Scala
  69. 69. ぬるぽがない安心感•Scalaの標準ライブラリは原則nullを返さない(Scalaはnullを使わない文化)•つまりnullチェックを書く必要がない
  70. 70. 社内向けAPIドキュメント
  71. 71. 社内向けAPIドキュメントnullがありうるものをドキュメントに残すのに苦労しなかった
  72. 72. Scalaの悪いところ...•コンパイル遅すぎ!•社内にScalaについて聞ける人が少ない
  73. 73. コンパイル•遅い!!とにかく遅い!!•メモリ食い過ぎー!•ビルド時のJavaの設定-Xms512m -Xmx1024m -XX:MaxPermSize=512mScala
  74. 74. コンパイル•遅い!!とにかく遅い!!•メモリ食い過ぎー!•ビルド時のJavaの設定-Xms512m -Xmx1024m -XX:MaxPermSize=512mScalaJenkinsで並行ビルドするとスワップアウト...→ Jenkinsサーバのメモリ増設(4GB → 8GB)
  75. 75. 社内に聞ける人が少ない•弊社内でScalaのプロジェクトはニコニコAndroidサーバが初めて•社内ノウハウが少ない…•Scala書ける人もあんまりいない…
  76. 76. 学習コストはそんなにかからない開発メンバー5人中4人がScalaをはじめて1年たっていない
  77. 77. 学習コストはそんなにかからない開発メンバー5人中4人がScalaをはじめて1年たっていないでも1ヶ月勉強したら業務で書けるようになった
  78. 78. どうやって勉強?•おすすめ本「JavaプログラマのためのScalaプログラミング」•疑問は社内IRCでブツブツ言う•誰か答えてくれる•#scalaというチャンネルもできた
  79. 79. 少しずつ広まっている...!最近は社内でもScalaを使う流れができつつあり、今後は改善されそう!ドワンゴでは4プロジェクトがScala使ってます
  80. 80. チームの実際の仕事の流れ
  81. 81. 仕事のサイクル計画振り返り 実装レビューリリースマージ1周=2週間のアジャイル開発
  82. 82. 開発メンバー全員で2週間にやることを計画誰がどの仕事をするか割り振る全員で計画する
  83. 83. 計画の前準備会議をする前に各自でやらないといけないことを洗い出し、チケットとして作成チケット管理にはAtlassian製品のJIRAを使っています
  84. 84. 全員で見積もるチケットを作った人がチケットの内容を説明工数見積もり(予想)を各自で出す見積もりがあわなかったら最大3回やる全員でやることを共有できているので突然誰かが倒れても大丈夫なチームに
  85. 85. 実装する• IntelliJ IDEA 12 Ultimate($200)使ってます• キャンペーンのときに全員買った• 買うまではCommunity Edition(無料)• 会社で買ってくれるという話も出てる• ScalaのIDEはIntelliJ IDEA一択• EclipseでのScala開発はめっちゃ重い…
  86. 86. テストに力を入れています1000以上のテストケースによりコードカバレッジ80%以上を達成
  87. 87. FishEyeでコードレビュー全員が仕事を理解しているので誰でもレビューできるみんなで気軽にレビューコメントをつける
  88. 88. GitHub:eよりFishEyeのほうが便利•誰がレビューOK出しているのか、どれぐらい見ているのかがすぐ分かる!全員のレビューOKが出ればマージする
  89. 89. Jenkins•ビルド•テストの実行•developブランチにマージするとJenkinsが動き出す•テストが落ちるとチームメンバーに罵られる
  90. 90. 振り返る(KPT)毎週水曜日にKPTKeep(続けたいこと), Problem(困ったこと),Try(次やりたいこと) をみんなで自由に書く
  91. 91. KPTで改善された例Jenkins用サーバで並行ビルドできないもっとスペックの高いJenkins用サーバを調達し、並行ビルド可能にProblemTry
  92. 92. 思ったことを気軽に書けるので「ちょっとした問題」を改善していく流れを作ることができた
  93. 93. 強いチーム作りに成功「全員で」計画し「全員で」振り返ることで常に意識を共有全員が主体的に動く強いチームを作っています
  94. 94. ドワンゴで働きませんか• Scalaに興味のある人もない人も• 「ドワンゴ 採用」で検索!• http://info.dwango.co.jp/recruit/• 7月から新オフィス(歌舞伎座)お待ちしています!
  95. 95. まとめ• 美しいAPIをアプリチームに提供できた• Scalaで再モデリング・ドキュメント整備• Scalaを業務で楽しく使ってます!• 強力なScalaの機能で効率の良い開発が可能に• 強いチームでやってます• 全員が仕様を理解できている• 誰が風邪引いても困らない
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×