scala workshop 20131019
Post on 20-Jun-2015
1.282 Views
Preview:
TRANSCRIPT
Scalaで実現、楽しいチーム開発!
2013.10.19 怖くないScala勉強会
@ benzookapi
自己紹介名前: 岡村 純一職業: エンジニア(企画、設計、PGなどなんでも)株式会社シャノンで研究開発チームのマネージャをしていますTwitter: @benzookapi
Scala歴(Play歴):約1年(現職歴とほぼ一緒)趣味:お酒、飲み会、コンパぽいやつ、音楽、漫画
今日お話したいこと
・会社でSca laを使って作ってるもの・なぜScalaを使いはじめたのか・Sca laを使ったチーム開発の楽しさ・Scalaを使う場合の注意点・Scalaに今後もとめること
主に現場体験談
会社紹介株式会社シャノン http://www.shanon.co.jp/
2000年創業(現在14期生) 従業員数約100名(東京本社、うち開発は20数名)中国子会社、宮崎支社を今年設立マーケティング全般(セミナー、リアル展示会、3Dバーチャルイベント、ソーシャル、メール、WEB解析...)のオールインワンSaasの提供ならびにコンサル、SIなどをやっている、ソフトウェアベンダ兼サービスベンダお客様は大手企業が多く、いわゆるBtoBベンダです
どんなサービス形態か・自社データセンタやAWS、Herokuなどを使ったSaasであり全顧客が同じインスタンスを使用する・1顧客(企業)=1ドメインのマルチテナントタイプ。URLは顧客ごとのドメインが使われる事が多い・月額やデータ従量による課金・現在契約顧客数は300以上、7800万以上の個人データを蓄積・URL的には統合されているが、実際のAPサーバーや開発言語などは内部で分かれている
どんな開発をしているか・非エンジニア(売り手)の割り合いが高く、売り手の要望を吸い上げる形で製品をつくっています・Perl製のコア部分を作ってるチームとScalaで新機能開発をしてるチーム(僕ら)に、最近上海の開発チームが加わり、相互に連携した開発をしています・一部製品は開発パートナーに委託してたりします・チームは全てアジャイルを採用、開発計画はPivotalで管理、ソースコード管理はほぼGitHubを使用・僕らは2週間に一度のスプリントレビューで売り手のフィードバックをうけつつ開発を進めています
主力製品
Perl製の超レガシーアプリケーションでも稼ぎ頭
新製品
Heroku+Rubyで作った3D展示会プラットフォーム展示会以外にも利用可で導入数増加中
...
その他(新製品や新機能)ソーシャルシェアと解析
Scala+Playで作る新付加価値的アプリ、機能群これからのビジネスのブレークスルーとなる存在
ソーシャルアプリレコメンドエンジン
ユーザーマッチング
リアルタイムデータ配信
僕らが作ってる部分=今回お話する対象
デモSHANON MARKETING PLATFORM
(by Perl+Catalyst)
SHANON SOCIAL SPREADER
(by Scala+Play2)
両者はURL的には統合されていて、Scalaで開発された後者は前者の一機能として顧客には提供されています
お問い合わせはこちらまで! https://shanon.smartseminar.jp/public/application/add/161
Scalaを使い始めた経緯
僕らのチームについて・研究開発チーム(R&D)であり、ビジネス的インパクトの大きい新製品、機能を世に出すのが使命・同時に他チームへの技術提供や技術広報(プレゼン、ブログ投稿、メディア露出など)も役目・発足は去年の夏ごろでメンバーは中途採用者がほとんど(現在4名)・元はテクニカルサポートのような部でSDKやSIの開発をメインにやっていたが、会社の製品力強化にともない、メンバ構成、チーム名、ミッションを変更
開発体制と使用言語
MARKETING PLATFORMコアチーム
Perl
研究開発チーム(僕ら)
API連携上海開発チーム
Java
API連携
API連携
外部開発パートナー
Ruby...
API連携
API連携
今期から注力してるところ・チーム開発によるスピードと品質アップ(x2=3or4...)・共通化による重複開発の減少、成果物の資産化・徹底したAPI化によるデザイン非依存、機能のポータル化、異なる開発言語間の連携
使っている技術開発言語:Scala
フレームワーク:Play2
データベース:MongoDB or PostgreSQL
ライブラリ:Akka、Anorm、Casbah、ReactiveMongo、LiftJson...
ビュー関連:Scalaテンプレート、jQueryライブラリ、mustache、handlebar...
テスト関連:spec2、cucumber、phantomJS、SCCT、jacoco...
サーバー:データセンタ、AWS、Heroku....
Scalaを使い始めた理由・元々Perlはやめたいって意見があった(レガシーだし...使ってる人ごめんなちゃい><)・Rubyは?(大規模とかエンタープライズに向くのかな?Cookpadさん使ってるけど...)・Javaは?(Servletとか古いフレームワークもう使いたくないし...)
フレームワークいけてればJavaでよくね?
まずはJava+Play1を試してみた
・Java版Railsみたいでなかなかいい・動的コンパイルも快適・もう二度とstrutsとかに戻れないいいいいい!・テクニカルサポート時代は、これでいくつかSIや小さな製品を作った
でも...
もっと新しいことを試したい世の中には「関数型言語」というとっても柔軟なプログラミングができる言語があるらしい...
Scalaって言語でそれができるらしい...
しかもScalaって野郎は関数型以外にも便利な機能がたくさんあるらしい...
使ってみたい...みたい...みたい...
使ってみた・チームも新しく、作るものも新しいのでやってみようというチャレンジで、まずはソーシャル系のアドオン開発で使ってみた(ちょっとやって無理そうだったらJavaで書く条件で)・ネットの解説よみながら悪戦苦闘していると、2週間ぐらいでなんとか書けるようになってきた(初めvar多用してたけど)
しかも...
ちゃんと書けるようになってくると
楽しい!(今日のテーマ)
かくしてScalaは開発言語に・その後メンバも数人加わりいずれもScala未経験者ながら独学とGitHub上のレビューで短期間でScalaコーダーに成長・ただし納期の厳しいSI業務のメンバは安全策でPlay1+Javaを使っていました
R&Dというチームの特質がScala導入を助けたのかも
以上、半分妄想による経緯説明なぜ妄想かというと、Scala導入を決めていたころまだ僕は今の会社に入社しておらず、伝え聞きのためです...
弊社のPlayとScala導入を推し進めたのは、今は別の会社にいらっしゃる前マネージャの方です。(Play1のコミッタであり、Playのコントリビュータにも掲載されています)https://github.com/ikeike443
Scala導入の詳細については今年のScalaカンファレンスで、僕と前マネージャの共作という形で発表したので、ぜひ参考までにご覧になってくださいhttp://www.slideshare.net/ikeike443/scala-conf2013JavaエンジニアがどうやってScalaを身につけたかを、現場目線でJavaと比較対比しています(今日の発表のきっかけとなったスライドです)
Scala導入が成功した理由・言い出しっぺの人がフレームワークに精通、スキルもしっかりしていて関数型言語への知識もあった(導入判断に必要な情報やメリットを把握出来ていた)・チームメンバも独自に習得できるだけのスキルや経験があった(優れたプログラマは新技術の習得も早いという法則)・ど新卒教育や社外エンジニアとのコラボは考えていない・採用がんばった(優秀な人選んだ。多分)
平均的なプログラマを大量に使う場合にはまだ向かないかも
Scala導入その後
かくして1年ちょっと経過します...
現在どうなっているのか...
チーム開発現場でのScala
僕らのチーム開発・1プロジェクト最低二人以上のエンジニアでコーディング(1匹狼で全部作るのは原則なし)・コードレビューはGithub上でチーム全員でレビュー・スプリントレビューも原則全員参加・細かい規約は決めない、方針やノウハウだけ(camel vs snakeとか本質でない)
チーム構成①JOさん(僕)(♂):Java、PHP、C#など経験。企画、設計から製品を作り上げて世に出すのが好き②YOさん(♂):ヤ◯ーさんから転職。PHP、Rubyなど経験。高学歴数学科卒でコーディング能力高い③CIさん(♀):大手SI会社から転職。Javaで主にサーバー処理を経験。本格的なweb開発ははじめて④STさん(♂):古株。Perl大好き。node.jsも触れる。元コアチームで製品に精通
一見バラバラに見えるチームですが...
実はScala(とPlay)が取りまとめてくれている気がする
それは...
Scalaって
楽しい!から
(今日のテーマ)
どの辺が楽しいのか?・工夫次第で会心のコードがかける(モナドサイコーとか)・バージョンアップや新しいライブラリを使う楽しさ(ReactiveMongoクール!とか)・デザインパターンの開拓の余地(applyメソッドの色んな応用とか)・非同期、分散、Websocketとか新しめのアプローチが割と簡単に試せる(Akkaを使ったリモート分散とか)
特にチーム開発となると・自分の発見した解決策や会心コードをレビューで共有できる・逆に人のうまいコードをどんどん吸収できる・みんなで教え合う平等なコミュニケーションを作れる・言語スキルアップと共に製品も出来上がっていく楽しさ
こんなイメージ
ノンブロッキング
(非同期)系
MongoDBライブラリビュー周り
ラムダ、モナド系
sbtなどの依存解決
有用なコードスニペットの集大成
他の言語も楽しいよ?・確かに楽しいけど、定着しきった言語よりも開拓余地のある言語のほうがより楽しい・未開拓でもエンジニアを引きつける要素のない言語はそれほど楽しくない・今のScalaだから感じられる先乗り感
楽しくなるポイントの例・map、fold系がすいすい使えこなせて気づくとvar(再代入)を全く使わなくなった時・Javaだと大掛かりになるDI(依存注入)をすいすい書けた時・Promiseとかの仕組みが分かって非同期処理がうまく動いた時など
楽しくなるポイントの詳細については前出のこちらのスライドをごらんになってくださいhttp://www.slideshare.net/ikeike443/scala-conf2013
その他Scala使ってよかった所・僕らのように、MongoDB+JSON APIでシステムを組むことが多い場合はライブラリが充実している・リファクタリングや設計変更は比較的しやすいのでアジャイルには向いていると思う(関数渡しや暗黙引数、柔軟なジェネリクスなどで変更しやすい実装を仕込める。モデルの定義も多様)
結果的に1年運用してみて・意見の衝突でレビュー欄が炎上することもあったが、皆でコードやルールを作っていく達成感を得れた・バラバラのスキルセットだったチームが今はバランスよくスキルが統一され、レビューや設計がしやすくなっている・ライブラリの情報の少なさや下位互換のなさには泣かされた
運用できた要因・メンバみんなが学習意欲が自主性のある人だったから・議論と喧嘩を区別できる大人な人達だったから・少々つっこまれてもめげないタフな人達・イケてるコードを書くことを楽しめる人達
Scalaを使う点での注意事項
いい(楽しい)ところと裏表・柔軟性+高機能->オレオレルールで他人が超メンテしづらいコードに(特に意味もなく色々省略しちゃうとか、implicit系の乱用とか)・開拓性がある->新しいバージョンは不安定だったり、下位互換全くないとか。ある程度余裕あるときでないとバージョンアップできない
全く無法地帯ではよくない
・Javaなどに比べて自由度が高いため、「時間計算量、空間計算量を抑えかつ人がメンテしやすいコード」といった本質的な判断ができる人が必要・新しい技術=なんでもOKと、はきちがえてはいけない
その他・依存解決とビルドツールのsbtは設定が柔軟すぎてはまる・form+RDB系の定番webアプリ作成は逆にいまいちかも(formでタプル22問題とか)・ScalaとPlayはコンパイルがだんだん遅くなってるような....
・英語とソースコードは読む覚悟(日本語ドキュメントだけで開発は多分無理)
注意する点の詳細については
前出のこちらのスライドをごらんになってくださいhttp://www.slideshare.net/ikeike443/scala-conf2013
Scalaに今後求めること
ずばり
それだけです、とりあえず...
適度な下位互換とコンパイル速度改善!
その他の求める点については
前出のこちらのスライドをごらんになってくださいhttp://www.slideshare.net/ikeike443/scala-conf2013
まとめ
開発は楽しさとチームワークが大事・新しい技術を導入するのは色々大変だが、もし可能ならScalaを使った楽しい開発を試してもらいたい・関数型でJVMという女子が寄り付かなさそうな固いイメージがあるScalaだが決してそんなことはない・テキストありきの個人学習も大事だけど、チームワークで作り上げていく学習も実りのあるものだと思う
ご清聴ありがとうございました!(次はテキテキした話したいな。。)
2013.10.19 怖くないScala勉強会
@ benzookapi
top related