エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

JJUG CCC 2018 Springにゴールド&コーヒースポンサーとして参加しました

こんにちは、エンジニアの池田(@progrhyme)です。

去る5/26(土)、ベルサール新宿グランドにてJJUG CCC 2018 Springが催されました。

昨年の秋( *1 )に引き続き、エムスリーはゴールド&コーヒースポンサーとして、本イベントの開催を後押しさせて頂きました。

私もエンジニアの一人としてイベントに参加して来ましたので、簡単にレポートしたいと思います。

JJUG CCCとは

JJUG CCCとは、日本最大のJavaコミュニティである日本Javaユーザーグループ(Japan Java User Group = JJUG)による国内最大のJavaコミュニティイベントです。
CCCとは、Cross Community Conferenceの略だそうです。

もっと詳しく知りたい方は、今回のJJUG CCCで行くとランチセッションのスライドを見ると良さそうです。

私自身、JJUG CCCには初めての参加だったのですが、このランチセッションでJJUGのカルチャーや雰囲気について学ぶことができ、大いに参考になりました。

エムスリーエンジニアの登壇セッション

弊社からは、エンジニアの矢崎が「Spring Boot と一般ライブラリの折り合いのつけかた」という題で登壇しました。

資料は既にQiitaやSpeaker Deckで公開されています。

Spring Boot と一般ライブラリの折り合いのつけかた - Qiita

追って、当ブログ上で本人による登壇レポートも公開される予定です。

コーヒースポンサー

エムスリーは、昨年に引き続きコーヒースポンサーを務めさせて頂きました。
今回は下のようなカップをデザインし、提供いたしました。

f:id:progrhyme:20180529204523j:plain

f:id:progrhyme:20180529204539j:plain

表面(上の画像)ではコーヒーにちなんで、弊社が運営するアスクドクターズというサービスから、コーヒーに関するQ&Aの内容を抜粋して紹介しております。

残念ながら、昨年のデザインコップ( *2 )ほどの話題を生むことはできなかったようですが、少なくともコップを捨てるときの心理的な抵抗は、昨年のものより減ったのではないかと思います(笑)

今回作ったデザインコップは今後、弊社で開催するテックトークなどのイベントでも配布される見込みです。

他のセッションについて

さすがは国内最大のコミュニティイベントということで、7トラック x 7セッション + ランチセッション & LT等と盛りだくさんな内容でした。

私はショートセッションやランチセッションを含めて、以下の10セッションを聴講しました。(※敬称略)

  • 「Javaはコミュニティの力で再び偉大になれるのか(JJUG基調講演)」 / 鈴木 雄介
  • 「Kotlin + Spring Bootでサーバー開発」 / soranaka
  • 「ざっくりわかった気になるモダンGC入門」 / tomoya yokota
  • 「普通の人のためのJavaコミュニティイベントのススメ」 / 杉山 貴章
  • 「LINE LIVE のチャットが 30,000+/min のコメント投稿を捌くようになるまで」 / 萩原 豪
  • 「Spring Boot と一般ライブラリの折り合いのつけかた」 / 矢崎 聖也
  • 「古いフレームワークでもマイクロサービスアーキテクチャにしたい」 / 佐藤 慧太
  • 「Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例」 / 磯田 浩靖, 吉井 弘
  • 「GKEとgRPCで実装する多言語対応・スケーラブルな内部API」 / 高橋 秀平
  • 「Google Dataflow(Java)を使ったビッグデータのバリデーション」 / 丹野 航

個々のセッションについては、とてもこの記事内では語り尽くせませんが、濃い内容のものが多く勉強になりました。

なお、当日のセッション資料については、 https://github.com/jjug-ccc/slides-articles-2018Spring に集まるようです。 既にほとんどの資料がこちらからリンクされています。

そのほか全体的な感想について

懇親会では新鮮な寿司も振る舞われ( *3 )、何名かのスピーカーの方々やJavaチャンピオンの方と話すこともできて、大変満足度の高いイベントでした。

懇親会を除いて無料のイベントながら、これだけの規模のものをコミュニティ主導で運営・実施できるのはすごいなと思いました。
会場内・ルーム内の案内内容やタイミングも適切で、目立った混乱もなく、素晴らしい運営だったと思います。
このようなイベントを、スポンサーという形で微力ながらお手伝いできたなら幸いです。

お疲れ様でした&ありがとうございました!!

最後に

エムスリーでは、JavaやScala, KotlinなどJVM上で動く言語を用いてサーバーサイドやAndroidの開発をしたいエンジニアを大募集しています!
気になった方やご興味のある方は、下記サイトのフォーム等で是非お気軽にお問い合わせください。

*1:http://www.m3tech.blog/entry/2017/11/20/162741

*2:参考: https://togetter.com/li/1112205

*3:寿司スポンサーはLINE株式会社様

WEBリサーチビジネスの業務プロセス・システムを改革していく

エンジニアリングGの井口です。WEBリサーチビジネス事業グループのエンジニアチームリーダをしています。

当グループは主に、「会員の皆様にアンケートにご協力いただき、集まった情報を元に、クライアントの課題を解決していく」というサービスを提供しています。

少し前に、グループの経営メンバーで相談し、
「ここ数年業務プロセスが大きく変わってない」→「今までのやり方じゃダメだ」→「やり方を変えて抜本的な業務プロセス・システム改革を進めよう」
という感じで、開発方針を転換したので、その取り組みについて紹介させていただきます。

業務プロセス・システム改革の進め方

大きな改革は、小さな改善を積み重ねても起こすのが難しく、「長期的なビジョン(と長期的なLTVを考慮したROI)に基づいて計画的に実施していく必要がある」という結論に至りました。ここでは、実際にどんな感じで進めているかについて、紹介したいと思います。

この結論に至った経緯は下の方に書いてあります。

1) トップレベルのミッションを明確にする

まずは、「WEBリサーチビジネスの業務プロセス」を最上位レベルで捉えました。 f:id:rinoguchi:20180517185903p:plain これをどうしたいのかを改めて考えたたところ、我々のミッションはシンプルに、
このプロセスを少しでも早く精度高くできるようにすること
だと結論付けました。

2) 具体的なゴールを描く

次に上記の1つの業務プロセスの箱の中に、役割ごとにモジュールを定義しました。
このモジュールごとに責務が分かれており、システム的にも基本的には独立するイメージです。
f:id:rinoguchi:20180518135700p:plain

これに対して、2020年度末までに、システムで何をやるべきかを、ミッションに立ち返りながら整理しました。 f:id:rinoguchi:20180521143445p:plain xxxxxxの部分は各システムで本当にやりたいことを1〜2行でまとめた内容です。

後続の開発フェーズで自由なアイデアが出るの阻害しないように、このフェーズではあまり細かいことは書かないようにしました。

実際にシステムを作る際にやりたいことに対してフラットな状態で情報を収集し、最適なものを選択していくほうが良い結果が出そうです。

3) 経営メンバーでゴールを共有する

上記内容をベースに具体的な実現例を口頭補足しながらビジネスサイドに共有し、方向性が間違ってないことを確認しました。
あわせて、システム毎に

  • 工数(○人月、半年、一年ぐらいの粒度)
  • 定量効果(◎、○、△ぐらいの粒度)
  • 定性効果(ここは結構しっかり記載)

などの情報を整理し、とりあえず最初の1システム目着手を合意、今後3年間のだいたいのスケジュールイメージも共有しました。

4) 個別のシステム開発を進める

四月後半から1システム目に着手しています。基本個別のシステム開発は、担当エンジニアに基本リードしてもらう方針です。

自分が気にしているのは、

  • 外部仕様をざっくり把握。過去案件をピックアップし、設計段階で成り立つかを検証してもらう
  • レアケースなど新システムで出来ないことがあった場合の代替方法があるか
  • 意味のある単位でなるべくこまめにリリースして、段階的に導入すること

ぐらいです。

要は「作ったけど使われないリスク」だけを避けていければ、担当エンジニアが良いものを作ってくれるだろう!という考えです。

着手中の「アンケート回答の集計・見える化システム」の技術スタック

f:id:rinoguchi:20180518190134p:plain 結論、「フロントエンドはReact.js、バックエンドはGo」で行きます。
今後作っていくシステムも、特別な理由がなければこの構成で行く予定です。

技術選定は結構チーム内でも意見が別れました。

フロントエンドは、Vue.jsと迷っていたのですが、先行して開発を進めているGUIアンケートシステムでReact.jsを採用しており、コンポーネントの使い回しなどを優先し(車輪の再発明を避けたい)、React.jsを採用することになりました。

バックエンドAPIサーバは、最初は固く「Java+Spring Boot」で行くべきか?と考えていましたが、新しくチームにJoinしたメンバーから非常に強くGoを勧められ、最終的にGoで行くことになりました。

採用理由は、

  • Goはシンプルな言語で学習コストが低い(優秀なエンジニアならすぐキャッチアップできる)
  • システム開発上の関心事(ルーティング、例外ハンドリング、DBアクセスなど)をサンプルアプリを作ってくれて、実装イメージが湧いた
  • フレームワークの機能が薄く、最悪別フレームワークに切り替える様なことになっても、比較的工数がかからなそう
  • Javaでこれだ!と言い切れるフレームワークがない。Spring Frameworkもハマることが多く学習コストが高くて、閉塞感を感じていた

などです。

あと、自分が意識したのは、浅い理解で変に全てをコントロールしようとせず、自分が重視/不安視している最低限の部分だけを明らかにする努力をした上で、詳細はメンバーの総意に従うようにしました。

最初迷いはありましたが、決まってしまえば「Goで開発」することに、すごくワクワクしてます!

みんなで進めていきます

まるで全て自分でやってるかのように書いてきましたが、たまたま私がブログを書いているだけで、実際には、

  • 強力に上記プロセスを推進してくれるシステム企画責任者の相原さん
  • チームにJoinしたばかりで技術面を協力にリードしてくれる滝安さん、冨岡さん
  • GUIアンケートシステム構築を推進、フロントエンド技術をリードしてくれる岩本さん
  • 現行システムの保守、PDCA、改善をきっちり進めてくれるチームメンバー
  • 進め方に理解を示し、協力してくれる経営メンバー

チームみんなで進めているプロジェクトです。
今後も皆で協力して進めていきたいと思ってます!!

[参考] 開発方針変更の経緯

そもそもなぜ業務プロセス・システム改革を始めることになったのか、についても参考までに記載しておきたいと思います。 興味なければ、読み飛ばしてください。

1) 問題点

ビジネス側に目標達成に対するボトルネックヒアリングした際に、「社内作業が雑多で営業活動になかなか時間を割けていない」という声が上がりました。

自分たちとしてはこれまでもきちんと業務ヒアリングをして、改善を積み重ねてきたつもりだったので、結構心外な感じでした。

しかし、ちゃんと振り返ってみると、「一連の業務システムは昔と同じことを効率的にやっているだけで、根本的には変わっておらず、システムに依存する業務プロセスも当然大きな改善はできていない」ということに気が付きました。

2) 原因

そもそもこれまで、業務プロセス・システムを今後どうしていきたいか、長期的なビジョンを定義したことがありませんでした。 その結果、エムスリーの文化でもある「ROIを計算して、ROIの高いものから優先順位を付けて対応する」を実現しやすい、眼の前すぐに効果が出るような施策や改善ばかりを採用し、根本的な変化を起こすような改革が進みにくかったのだと思います。

3) 対策

対策は普通のことかもしれませんが、「小さな改善はこれまで通りのROI優先のプロセスで進める一方で、大きな改革は長期的なビジョン(と長期的なLTVを考慮したROI)に基づいて計画的に実施していくこと」だと判断しました。

まとめ

  • 大きな改革は、長期ビジョンをうまく整理して、経営レベルで合意した上で進めていくのがよさそう(今のところは破綻なし)
  • WEBリサーチビジネス事業グループは基本的に「React.js+Go」を採用することにした
  • 今後、業務プロセス・システム改革を皆で進めていきます!

エンジニアを募集しています!

WEBリサーチビジネス事業グループでは「React.js+Go」を使って、一緒に業務プロセス・システム改革を進めてくれるエンジニアの仲間を募集中です!勉強会の見学やカジュアル面談も随時受け付けてますのでご興味があれば是非ご応募ください!

jobs.m3.com

Kotlinエバンジェリスト 長澤さん・株式会社ジノビア代表 堀井さんがエムスリー エンジニアリング フェローに就任しました!

エンジニアリンググループ VPoEの山崎です。本日はエンジニアリング フェローの就任についてお知らせいたします。

エンジニアリング フェローとは

在籍中または卒業後に顕著な活躍をしたエンジニアに対して、エムスリーを卒業後しても継続的にフェローとして称えるものです。また、エムスリー卒業生として定期的な意見交換を行ったり、エムスリーとエンジニアコミュニティをつなぐハブを担ってもらうという役割もあります。

フェローの紹介

長澤 太郎さん
マルチデバイスチームの発足時よりAndroidアプリのプロジェクトをリード、またKotlinエバンジェリストとしての活躍、執筆活動などを称えフェローに就任いただきました!

f:id:otkmym:20180525173458p:plain:w300

早稲田大学情報理工学科を卒業後、メーカー系SIerでシステムエンジニアを経験、2013年にエムスリーに入社し2018年4月まで在籍。マルチデバイスチームで医療従事者向け情報プラットフォーム「m3.com」のAndroidアプリのプロジェクトの開発を担当。また「m3.com」アプリが使用するREST APIや、プッシュ通知基盤システムの開発・運用も主なミッションであった。

また、Kotlinのエバンジェリストを自ら名乗り、講演や執筆などを通じて、啓蒙活動に尽力。DroidKaigiやJJUG CCCなどの大規模なカンファレンスから、地域コミュニティが主催する勉強会など、そのイベント規模や場所を問わずに駆けつけてKotlinの素晴らしさ、面白さを伝えている。著書に「Kotlinスタートブック」(2016年 リックテレコム刊)など、共同訳書に「Kotlinイン・アクション」(2017年 マイナビ出版刊)がある。

2018年5月にAI医療スタートアップのUbie株式会社にソフトウェアエンジニアとして入社(現職)。「世界中の人々を適切な医療に案内する」をミッションに日々奮闘中。

ビールとラーメンが、コードを産む原動力。休日は舞浜にいることが多い。


堀井 俊和さん
現在もエムスリーのメールマーケティングを支えているメール配信システムを刷新、またヘルステック業界での活躍を称えフェローに就任いただきました!

f:id:otkmym:20180525173509p:plain:w300

北海道大学理学部物理学科・低温科学研究所を卒業後、ベンチャー企業やスタートアップでのCTOを経て、2011年3月にエムスリー入社。2015年2月まで在籍。入社当初は薬剤師向けのキャリア支援サービスの開発を担当し、その後、基盤開発チームに移籍。プレイングマネージャとしてm3.comの各サービスを横断的に支える仕組みの開発・運用に携わった。

薬剤師キャリア事業の担当時に、当時全社で使われていたメール配信システムの刷新を提案。会員1人1人に対して高度にカスタマイズしたコンテンツを届けるためのアプリケーションフレームワークと配信エンジンからなる「メールコンシェルジュ」を設計・開発した。この配信システムは現在もエムスリーのメールマーケティングを支えている。また、この配信システムの開発では、現在エムスリーで主要開発ツールの1つとなっているRuby/Railsを 初めて提案・採用している。

エムスリー退職後、2015年3月に株式会社ジノビアを創業。「テクノロジーを通じて人や社会をEmpowerする」ことを目指し、新規事業の創出、およびヘルスケア領域を始めとするスタートアップの新規事業(ゼロイチ)支援に取り組んでいる。現在はブロックチェーン/暗号技術を重点領域の一つと考え、医療xブロックチェーンの事業プランでプロトタイプを開発中。また、現在も個人としてエムスリーの新規事業や医療xAIの取り組みへの技術・開発支援を行っている。

ボルドーワインとシングルモルトウィスキー好き。


今後もエンジニアリング フェロー含めた卒業生ネットワークを充実させていきたいと考えております!

もちろん、エムスリーのメンバとして日本・世界の医療をイノベーションする仲間も募集中です。カジュアル面談やTech Talkへの参加のご希望がありましたらお気軽にお問合せください。 jobs.m3.com

エムスリーはRubyKaigi2018に参加します!

みなさんこんにちは。エンジニアの @suusan2go です。

エムスリーはPlatinum SponsorとしてRubyKaigi 2018に協賛しています!当日はブースも出しますのでお楽しみに。医療系WEB企業らしく、みなさんの健康にコミットするいろいろを配る予定ですのでお楽しみください。

エムスリーからは以下のエンジニアが参加します。誰かはブースにいますので、話を聞いてみたい方もそうでない方もぜひお立ちよりください!

余談ですが、RubyKaigiには全員業務として参加しており、宿泊費と交通費を会社から負担してもらっています!

エムスリーはRubyのイメージがそれほどないかもしれませんが(最近、何故かC#の会社ですよね?って言われました…)、Rubyは社内の至るところで使われており、エムスリーのビジネスには欠かせない存在となっています*1

最後に

会場でこんなポロシャツを見かけたら気軽にお声掛けください。

f:id:suzan2go:20180528180116j:plain

それでは、RubyKaigi 2018でお会いしましょう!

*1:もともとJavaがメインの会社だったらしいのですが、3〜4年ほど前からRuby /Railsのシステムが増え、今では社内の半数ほどのシステムがRubyRailsで動いています。

私と、エムスリーと、ときどきインターン

エムスリー新卒入社エンジニアの青木です。

インターンを経て、今年4月にエムスリーに入社しました。 現在はクラウド電子カルテの開発・運用に携わっており、RubyやJSなどを主に触っています。

学生インターンの時期ということで、今回の記事では「エムスリーのインターンはいいぞ!」ということを皆さんに伝えられればいいなと思います。

自己紹介

私自身プログラミングを始めた時期は遅く、大学3年生の時の自主制作講義(個人で何かプロダクトを作る講義)で本格的に始めました。 そこでOpenGLARToolKitなどを使ったARゲームなどを作成し、そこからAR/VRに興味を持ち始めたので、大学院までARやVRの研究をしていました(今とは全然方向性がちがいますね........)。

研究を続けつつ就活もしなくてはいけないので、就活生のための逆求人イベントに大学院1年生の秋頃に参加し、そこで初めてエムスリーという企業を知りました。

エムスリーとの出会い

逆求人イベントの参加企業一覧でエムスリーを知った当時は、どういった企業かよくわかりませんでした

イベントでも人事の方やエンジニアの方に企業の概要については教えていただいたのですが、正直ピンときていなかったので、もう少し詳しい話を聞くためにオフィスにカジュアル面談にいくことにしました。

カジュアル面談ではエンジニアの方々3名とお話して、エムスリーでのエンジニアの働き方や実際の開発プロセス、使っている技術などなど気になってることをズカズカ聞きました。 そのおかげもあって、エムスリーでのソフトウェアエンジニアとしての仕事に興味が出てきたため、選考に進み、最後にインターンを行うことになりました。

私の場合、最終面接を終えてからインターンを始めました。エムスリーから内定通知はもらったけども、他にもいくつか内定をもらっており、どこに決めるか悩んでいたところ、「じゃあインターンで内部を知ってから判断してもらいましょう!」ということになったためです。このように、インターンの内容や期間などは個々人に合わせてアレンジ可能です。

インターン期間でやったこと

インターン期間では電子カルテの開発・運用のチームに配属されました。 当初、電子カルテと聞くとオフライン動作するちょっと古めかしいアプリケーションを想像していたのですが、そこで開発されている電子カルテScalaなどのモダンな技術で作られたクラウド電子カルテでした。

そのチームではちょうどフロント(JavaScript)側でAngularJS (v1) からReactへの移行が行われていたので、私もその移行作業に携わることとなりました。 JS自体ほとんど触ったことがなく、しかもReactという新しいフレームワークの考え方も学ばなくてはならず怯えていましたが、チームの方々がしっかりと支えてくれたので、のびのびとコーディングに集中できました。わからないことがあって「ここがわからないんですが.....」と聞くと、忙しい中であっても作業の手を止めて丁寧に説明をしてくれたのはとてもとても嬉しかったです。

本来は2週間で終わるはずのインターンも、楽しさのあまり気づけば2ヶ月くらいになっており、AngularからReactへの移行以外にもテストカバレッジを出したり、現場で出たバグへの対応など、プロダクト開発の現場でしか味わえない経験もしました。

f:id:otkmym:20180524191413j:plain

そんな中「モバイル開発もやってみないか?」と声をかけて頂き、モバイル開発のチームへと移りました。 モバイル開発チームではAndroidアプリへの機能追加が主なタスクでした。

Android開発自体も、少しだけ経験がある程度だったので、異動当初は「ちゃんと書けるかな。大丈夫かな。」と緊張していましたが、やはりチームの方々にサポートしていただき、無事開発を進めることができました。皆さん当時はありがとうございました!

初めは「医療系IT企業」と聞いて古めかしい企業体質を想像していましたが、どちらのチームでも開発速度はとても速く、ライブラリの導入やクラス設計、具体的な実装などに関して一人一人に裁量権があり、その開発方式はとてもベンチャー的(書類を上司に渡して承諾を得て.....のようなプロセスは特にない)でした。 エンジニアとしてバリバリとコーディングがしたかったので、こういう速度で開発が進むのは本当に楽しかったです。

エムスリーでインターンした感想

先程も書きましたが、やはり驚きというか想像とのギャップが大きかったです。

医療系企業なので堅いイメージがあったのですが、中に入って仕事をしてみるとベンチャーと変わらない速度で開発が進んでいますし、プロダクトの技術的な方向性もエンジニア主導で決定していました。

しかもエムスリーはそこそこに大きな企業(時価総額は約1.5兆円!)なので「色々なことに挑戦してもよい」という安心感がありました。 社内では複数の挑戦的なプロジェクトが並行して動いていますし、エンジニア本人の希望によっては別のチームへ異動(もしくは兼務)することもできます。色々なチームやプロダクトに関わることができるというのは、エムスリーの利点だと思います。

なので、インターンを通じてエムスリーに対して抱いた印象は「ベンチャー的な開発が可能な、安心できる企業」というモノでした。 決定がすべて合理的で速い(目的に沿っているからやろう、というのを現場が判断して決定できる)し、自分で考えて行動・決定できるのでエンジニアとしてかなりの速度で成長できると感じました。 しかも周りのエンジニアのレベルが高いので、「自分も頑張るぞい!」という風に自然に引っ張られる環境でした。

f:id:otkmym:20180524215617p:plain

特に気に入ったのは、仕事のペースを個々人が裁量をもって決められるという点でした。 「エンジニアって残業多いんでしょ?」という偏見を以前は持っていたんですが、仕事をしている面々は早く帰るときには帰るスタイルを貫いていたので、学生だった当時は安心しました(あと、ヘッドフォンをつけて仕事ができるのは結構ポイント高かったですね。配属当初デザイナーの方がヘッドフォンしながらノリノリで作業していたのは印象的でした)。

なぜ私がエムスリーに?

先程も書きましたが、エムスリーのいいところは開発のスピード感、合理性、そして自由さです。 大きめの企業なので色々な事に挑戦できますし、合理性を重んじるので主張が理に叶っていれば、ベンチャーと同じく1人のエンジニアが色々な事を決められます。 またプライベートに関しても、働く時間をある程度自由に調整することができるので、余った時間に自分の好きなことができます(朝早くに出社して夕方には帰る、というスタイルをとっている方もいます)。

開発をガッツリやってエンジニアパワーを高めることに加え、自分の生活も大事にしたい私にとってエムスリーは最高の舞台だと考えて「よし!入社するか!」と思い立ち、入社のハンコを押しました。

入社して1ヶ月が経ちますが、周りの方々のサポートを受けてバリバリと開発できていて楽しいです。......リリース直後にエンバグに気がついたのも今となってはいい思い出です。 そんなこんなで入社してからはとても充実した毎日です。同僚の皆さん、いつもありがとうございます!

後輩にメッセージ

私自身、ほとんど経験のないWeb系の企業に就職するのは少し怖かったです。 ただ、自分が経験したことのない新しい分野に飛び込んでみないと、自分の本当にやりたいことが見つからないんじゃないかな〜と最近はちょっと思ったりしてます。 そういった意味で、インターンというのは新しい分野を知る・実践するいい機会だと思います。インターンだからこそ大胆な「チャレンジ」ができる、というのはとても魅力的です。

エムスリーは「スピード感を持ちながらバリバリ開発したい!」と思っている皆さんにもお勧めですし、「新しい分野に今から手をつけるのは怖い」と思ってる皆さんのことも、その深い懐で受け止めてくれると思っています。 ぜひインターンとして、赤坂インターシティのオフィスで僕と握手しましょう。 jobs.m3.com

エムスリーで「サーバサイドKotlin」を導入したチームに話を聞きました

はじめまして、人事の友永です。エムスリーのエンジニアが日々どのようなチャレンジをしているのか、もっと皆様にお届けしたい!という思いから、インタビューシリーズを始めることになりました。

エムスリーのプロダクトは医療従事者向けのものが多く (注)、 実際にユーザーとして利用することが難しいこともあり「どんなプロダクトを作っているのかイメージしにくい」という声をいただいていました。そこで今回は、インタビューを通じてエンジニアの取り組みや普段の雰囲気もお伝えしたいと思います!

注) コンシューマ向けプロダクトもあります

第1回目は医師・薬剤師キャリアチームで行ったサーバサイドKotlin導入事例についてお話しを伺います。

f:id:otkmym:20180522183141j:plain
写真左から滝安、鈴木、前原

友永: まず始めにプロジェクトの生みの親である前原さん、簡単に自己紹介お願いします。

前原: エムスリーには4年前に入社し、現在は医師・薬剤師のキャリア支援事業のエンジニアチームリーダーを担当しています。担当している事業の事業規模は年間売上高100億円超と急成長しているのですが、一方で扱っているシステムは10年前の技術スタックをベースにしているなど老朽化が進んでおり、開発効率が落ちている点が問題でした。

これをなんとかしたいと思い、2017年4月にリニューアルプロジェクトを立ち上げました。 モノリシックなJavaの独自フレームワークで作られていたシステムを、APIサーバとフロントに分離し、APIサーバをKotlin(Spring Boot)・フロントをRuby on RailsとVue.js(Nuxt.js)でリニューアルするというものです。


友永: リニューアルプロジェクトを一緒に進めている滝安さん、鈴木さんも自己紹介をお願いします。

滝安: 2017年8月の入社です。前職はファイルストレージの開発というWeb開発とは全然違うことをしていました。エムスリーへ入社後、医師キャリアリニューアルを担当し、いきなりKotlinを使ってWeb開発を行いました。前職ではCを業務で使うことが多かったですが、Kotlin習得にあたっては特に違和感はなく便利な言語だなという印象でした。ちなみに、個人的に好きな言語はGoで、もくもく会を開催しています。

鈴木: 2017年11月に入社しました。前職ではRubyでの開発がメインでしたが、技術的に新しいことがやりたいと思っていたところ、今回のリニューアルプロジェクトで何かできそうと感じエムスリーに入社しました。入社後はサーバサイド:Kotlin、フロント:Vue.js(Nuxt.js)でサーバ側もフロント側の開発も行っています。私は薬剤師キャリア事業のリニューアルプロジェクトを担当しています。


友永: サーバサイドにKotlinを導入した経緯など教えてください。

前原: 私達のチームでは先ほどお話したモノリシックなJavaアプリケーションだけでなく、Ruby on Railsも多く利用していたので、全てRuby on Railsでリニューアルするという選択肢もあったのですが、複雑なビジネスロジックが集まるサーバーサイドは型がある言語でカッチリ書きたいという思いが以前からありました。

型がある言語として、JavaScala、Goなどを複数の項目で比較検討しましたが、その中でもKotlinはRubyとsyntaxが似ていて、チームのRubyエンジニアがキャッチアップしやすそうだと感じた点がKotlinを採用した理由として大きかったです。

また、サーバサイドにKotlinを導入したという事例は当時国内ではあまり見当たらず、先駆的なチャレンジをすることで、「技術的チャレンジを好む仲間を集めたい」という思いもありました。国内の導入事例は少ないものの、Kotlinでプロトタイプを作ってみたり、JavaフレームワークであるSpringがKotlinを公式でサポート予定と発表しているのを見て、これはイケるぞと判断しました。

f:id:otkmym:20180522183252j:plain

友永: RubyエンジニアがKotlinを触ってみてどうでしたか?

鈴木: まず、syntaxがRubyと似ています。特にリストに対する操作は似ていたのでキャッチアップしやすかったです。 またKotlinは静的型付け言語ではありますが型推論が効くので、型を書かない動的型付け言語のRubyと比べても面倒臭さはなく抵抗はなかったです。

前原: KotlinとRubyで書いたコードを並べて比べたことありますが、リスト操作のsyntaxが非常に似ており、キャッチアップしやすかったですね。

参考:
10年前のレガシーシステムをサーバーサイドKotlinでフルリニューアルしている話 #jjug_ccc #ccc_g2 // Speaker Deck

滝安: 私はプライベートでRubyを使っていました。Rubyは1人で開発する分には素早く書けていい言語だけど、大規模に開発する場合は型があったほうが壊れにくいのでいいかなと。初めてKotlinでNull Safetyな言語に触れたのですが、NullPointerExceptionが発生しうる書き方をするとコンパイルエラーになってくれるので、安心して書けるなと思いました。


友永: Kotlin導入のメリットについて教えてください。

前原: 当初の想定どおり、RubyとKotlinはsyntaxが似ているので、Rubyエンジニアのキャッチアップが早く、かつ型やNull Safetyのおかげで堅牢に書けるというのはとてもよかったです。

また、エムスリーではRubyJVM系のプロジェクトが多いため、社内の共通ライブラリは基本的にRubyJava版が提供されています。KotlinはJVM系の言語の為、Javaのライブラリを使える。つまり、社内の共通ライブラリをKotlinから呼べる、これもよいところでした。社内のライブラリだけでなく、オープンソースJavaライブラリも使えるため、言語周辺のエコシステムが既に存在しているというのもよかったですね。

鈴木: ライブラリはJavaのものであれば使えるものが多いです。多少Kotlin用のモジュールを入れないと動かないというものもありますが、Kotlinをサポートしていく方針のものも多いので、あまり心配しなくていいかなと。Spring Bootも開発途中に2.0がリリースされましたが、特に問題なくアップデートできました。

前原: 数ヶ月前に第1段階目のリリースを完了させたのですが、Kotlin起因のバグはなかったですね。

滝安: KotlinよりSpring Bootの話ですが、レイヤードアーキテクチャにマッチしていたのが良かったですね。冗長に書かなくてもアプリケーションフレームワークがケアしてくれるので無駄がない。その分学習コストが高いデメリットもあったけど笑 Kotlinはそこに乗っかれるのがよかったです。

鈴木: Data Class がよかったなと思います。シンプルな記述で、コンストラクタとプロパティが記述できるので、パラメータを初期化し忘れるとかそういった単純なミスが防げるなと、Kotlinをやってから他の言語を触ると特に感じます。

今回リニューアルしているシステムは、歴史も長くDBのスキーマは正直あまり綺麗な状態とは言えない状態でしたし、ビジネスロジックもいろんなところに散らばっている状態だったのですが、DDDの考え方を取り入れたり、レイヤーをきちんと定義したことで、今後の変更がし易い状態になったかなと思います。

KotlinでDDDやる事例はまだなかったので、Scalaで既にやられている方の資料を読んだり、実践ドメイン駆動設計を読んだりしました。ユースケースがみんな違うので自分達はどうしていくべきなのか考えるのは難しかったですね。

前原: Data Classは凄くよいなと思いました。Data Classのcopy()関数を使うと、既存オブジェクトのプロパティの一部だけ変更して新しいオブジェクトを作ることが出来るのですが、これを用いると、一つのテストデータの雛形から様々なテストデータを生成する、といったことが簡単にできるので、重宝しました。


友永:導入時の注意点やハマったことについても是非教えてください。

前原: Kotlinの拡張関数の使い所には迷いました。拡張関数は便利だけど、やたらめったら使うとぐちゃぐちゃになるので、結果として私たちのチームでは本当に必要な時以外は使わないと定めました。

鈴木: 使いどころが難しいですね。Rubyでモンキーパッチを当てて拡張していくのは、メンテナンスを考えるとなかなかカジュアルにできませんが、Kotlinの場合はコードで追えてしまうので逆に使い所に悩む。

滝安: レイヤーで責務をまとめているのに、関係ないところで書き換えられちゃうと、その構造の意味が薄れてくるので、あんまり使いたくなかったですね。そもそも自分らで書いているところなんだから、拡張じゃなくで大元を直しなよ、と笑

前原: 私たちは拡張関数の使い所を、テストコードで既存のテストライブラリにちょっと便利なメソッド生やしたい時に使うくらいにとどめました。MockMvcBuildersに便利な拡張関数生やしたりとか。その場合範囲がテストの中にとどまるし、メリットの方が大きいと考えました。

鈴木: gRPCを使っていた時に、LocalDateTimeをgRPC用のフォーマットに変える時は使いどころかなと思い使ってみました。プリミティブなというか元々あるクラスを拡張する時は使いどころかもしれないですね。

拡張関数でアプリケーションのドメインを生成していたりするのはちょっと微妙かなと思いますが、単純なフォーマット変換などコンテキストを絞って使うのはアリかなと。

滝安: アノテーション周りははまりどころが多かったです。SpringFoxというライブラリを使って、クライアントライブラリを自動生成しているのですが、関数名がちょっと変わってライブラリが作られちゃう、例えばisAdminがis取れちゃって、adminになっちゃうとか。

他にも、バリデーションをかけるのにSpring Bootのアノテーションをつけて、うまく効かないというのもありました。これは、Kotlinは一回Javaに変換してからコンパイルされるので、変換した後だと思ったところにアノテーションがついていないのが原因でした。

鈴木: バリデーションでget:をつけていないと利かないというのもありました。利かないけど何も教えてくれないとか。モック系のライブラリがKotlinのNull Safetyで落ちるとか。マニアックなやつだと、enumのクラスでメソッドをoverrideしているときだけ起きるバグを踏みました。 それくらいですかね、エッジなバグ踏んだの笑

f:id:otkmym:20180522183336j:plain

前原: ハマりどころがあったとしても、大概調べたら解決方法がでてくる程度のものでしたね。Javaのライブラリを使う時にたまにあるくらいで。モックのやつもワークアラウンドをこうすればいいというのも調べたら出てきました。

鈴木: 情報が徐々に増えてきていて、基本的に普通のユースケースで見つかるバグは誰かが潰しているか、ワークアラウンドがすぐ見つかる状況でした。

前原: サーバサイドでKotlinを使うケースはまだあまり聞かないけれど、AndroidでKotlinを使うケースはとても増えているので、知見がネットにもあがっていますね。

また、今回Kotlinを選択した大きな追い風として2017年のGoogle I/OGoogleがKotlinをAndroidの開発言語として正式にサポートすると発表したことも大きかったです。困ったらKotlinのGithubのプロジェクトを調べれば色々出てくるし、どこにも情報なくて困るということは殆どありませんでした。

滝安: Javaの情報を頭の中で翻訳すればKotlinの情報になるので、そんなにそれ自体で困ることはなかったですね。あと、IDEがすごい強力というのもあります。下線がにゅーってなっているところの指摘通り書くときれいに書けます。


友永: 最後にサーバサイドKotlinを導入してよかったことをまとめてください。

前原: 私たちのプロジェクトではKotlinを使ってよかったし、正解だと思っています。また、これをきっかけに社内だけじゃなくて、社外で勉強会を開催して広がりができたのも非常によかったです。エムスリー主催で「どこでもKotlin」という勉強会をこれまで5回開催しましたが、社外の方にも多く登壇いただいくことで、情報交換ができました。サーバーサイドKotlinをやっている人、検討している人にもたくさん会うことで、共通の悩みを共有できました。実際、鈴木さん、滝安さんもこういったチャレンジを対外的に発表していたから入社してくれたのかなと笑

鈴木: Kotlinでサーバサイド開発を行う事例は、当時あまり聞いたことがなかったし、技術的に面白そうだと思いました。

滝安: 私は個人的にはGoが好きだけど、それ以外の言語が嫌なわけではなくて、新しいことに技術を使って挑戦できるのがいいなと思いました。Kotlinというイマドキの技術を使って抜本的なリニューアルをしていくのは、面白そうだなと。他社のエンジニアと話すときにサーバサイドKotlinやってる、と言うとびっくりされることもあって、技術だけ見ても新しさはありますかね。

前原: 冒頭に話しましたが、今回のプロジェクトでは、技術的なチャレンジをすることで、チャレンジが好きな仲間を集めたいという思いがありました。それを魅力に感じてくれたのれあればよかったです!現在では、社内の他チームでもKotlin採用事例が増えてきていますしね!

ということで、Kotlinで開発したい人、一緒に働きましょう!!!

jobs.m3.com

新卒エンジニアがグループ会社の臨時 CTO を務めた話、そして入社 1 年を振り返って

--- 2018-05-15 追記 ---

当初、記事のタイトルや本文中で「チームの臨時 CTO」という表現を使っていましたが、より正確な「グループ会社の CTO」という表記に改めました。 グループ会社のエンジニアリング面を私たちのチームで担当しており、チームリーダーがグループ会社の CTO を務める、という背景があります。

--- 追記終わり ---

エムスリーエンジニアの加藤です。 担当サービスでは主に Ruby, Scala, JS (Browser, Node), Swift, Java を使用しています。 今回は、昨年 2017 年 4 月に新卒入社してから 1 年間の振り返りをテーマとして記事を書きました。 ソフトウェアエンジニアとしての進路を検討している学生の方などへ参考になれば幸いです。

入社前 〜きっかけ・面接〜

私は学部 3 年の 11 月に逆求人イベントで初めてエムスリーを知りました。 その後エムスリー含めて 2 社受けましたが、モノづくりに対してより真摯に 向き合っている印象を受けたので、最終的にエムスリーへの就職を決めました。 今となってその印象は、生身の肌でそのまま感じる実感に変わっています。

なお、一次面接は実際に現場でコードを書くエンジニアが面接官でしたが、 事前に受験したオンラインコーディングテスト(私は Node で書きました)の結果や、 HTML & CSS で履歴書を組んだ時に遭遇して実際に報告したブラウザのバグ、web の未来など、 楽しくわいわい話して時間が過ぎた気がします。

入社当初 〜web アプリ開発の現場を知る〜

軽い入社式を終えた後すぐ席へ案内され、配属先のチームに挨拶、机上に置かれた MacBook のセットアップへ そのまま取り掛かり、リポジトリを clone し、チケットがアサインされ、というスピード感で入社初日はスタートしました。

最初に実装したのはファイルを D&D でアップロードする機能でした。 Docker Compose で 6 個の Service を立ち上げての開発、 フロントサイドの JS、サーバサイドの Ruby (Rails)、Amazon S3 との連携、 巨大なコードベース(現在 JS・Ruby ともに > 50k COL) から必要な箇所を特定するスキルなど、 web アプリ開発の第一歩としては好例でした。

開発をする中でひたすら D&D をしていたら腱鞘炎になりかけたので、つらい時に挙げる札を挙げてアレをソレしたら Magic Trackpad 2 が届いていました。

現場での開発に必要な知識が自分の中で圧倒的に不足していたため、ひたすらドキュメントを読み漁っては 試行錯誤を繰り返す日々でしたが、周りの同僚エンジニア・デザイナーさんからの親身なサポートなどもあり、 何とか新機能を予定通りユーザへ届けることができました。 ユーザから感謝のフィードバックが届いたときの嬉しさは忘れられません。

ただし、バグに起因するアラートが飛んできた時は寿命が 3 年ほど縮まった心地になりました…

その後も新機能開発やバグ対応などを通じて、Rails & JS での web アプリ開発の勘所、SQL や DB の肌感覚などを 徐々に養われていきました。

入社 5 ヶ月 〜Scala による JVM関数型言語へのキャリアチェンジ〜

その頃、担当サービスでは Scala による大型新機能の開発が進んでおり、私はコードレビューなどで 少しだけ状況を覗く程度でしたが、8 月下旬頃から実際に Scala での開発に参加することになりました。

RubyECMAScript に一部見られる関数型的なアプローチに慣れ親しんでいたとはいえ、 Scala における関数型の深いアプローチや、関数型プログラミング用ライブラリ Cats による新しい概念、 サービスの性質上要求される専門的なドメイン知識など、入社当初を彷彿とさせるような困難に直面しました。

しかし、同僚のスーパー Scala エンジニア冨岡や、ドメインエキスパートの方々の支えもあって、 実際に自分の書いた Scala コードを無事リリースに含めることができました。 この時の開発体験は、今振り返ってみてもかなり濃いものだったと強く実感します。

Ruby・JS に加えて Scala へ触れたことで、静的型言語・動的型言語の pros/cons、JVM の特性(特に GC など) を知るきっかけとなり、ソフトウェアエンジニアとしてのキャリア形成に大きく寄与したと思います。

また、ちょうどこの時期 RubyKaigi 2017 に参加させてもらう機会 があり、普段使っている gem のメンテナさんや Ruby の「いま」を作っている方々と同じ時間・空間を共有するという貴重な経験をしました。

入社 8 ヶ月 〜グループ会社の臨時 CTO に〜

私が入社してから約半年経つと、SRE の id:progrhyme や、M3 UK office Front-side eng. の Chris が join したりと、 チームの環境も変わりましたが、チームでエンジニアリングを担当しているグループ会社 CTO の冨岡が 3 ヶ月間の育休に入った ことを受けて、 結果的にサービスへの累積関与率が最も大きかった私が、エンジニア 4 人ほどのチームを率いるグループ会社の臨時 CTO になりました。

それ以前と比較して、自分でも分かるほど明らかにチームへの当事者意識が変わりました。 それ以前は自分のタスクに専念した上でメンバーのタスクを気にかける、それ以降はスプリント設計に一定の責任を持ってメンバーのタスクからまず考えるように。 それ以前はミーティングの議題のうち自分に関係するものに一生懸命考えて答える、それ以降はすべての議題に関して自分の中で一定以上の理由付けを持って考えるように。 などなど。

開発を担当する領域も増え、Node (Socket.IO), Java, Swift に触れたことで、担当サービスで使用されている言語全てを一通り 経験するという実績を解除しました。

新機能を同僚と一緒に英語で議論しながら設計して実装のサポートをする機会もありました。やはり言語よりもホワイトボードで図を描いた方が速かったり、 英語に翻訳しづらいドメイン知識を伝えるには、類義語を 3 つぐらい言うと伝わる確度が上がるというハックも身に付きました。 実際にリリースしてユーザから高評価のフィードバックを得た時は、互いにガッツポーズで喜びました。

経営会議にも出席させてもらいました。一番印象に残っているのは、新しく開発するサービス案を議論している際の 「一番需要があるからこれを作ります、で論理が終わるなら『トイレのスリッパを売ります』になるはず。でもそういうことじゃない。」 という言葉です。

育休を取得するエンジニアの事例がこれほど身近にいたことで、自分が今後エンジニアとして人生を歩む上で非常に参考となるロールモデルとなりました。

また、この期間に id:progrhyme から誘いを受けて Microservices Meetup での LT という貴重な経験をしました。 100 人規模のイベントで話すのは久し振りでしたが、Twitter などでそこそこ反響もあり良い体験でした。

また、臨時 CTO という役割を担ったため、規模は小さくあれどエンジニアのマネジメントに関わる経験もいくつかしました。 人前で指揮する立場・役回りは昔から苦手で、今振り返るともっと良い立ち回り方はあったはずと反省点が多い 3 ヶ月間でしたが、 ありがたいことに良いフィードバックを後日いただきました。

まとめと今後

同じチームの冨岡は ScalaMatsuri 2018 に登壇していたり、同期の id:oboenikui は社内セキュリティコンテストを開いたり DroidKaigi 2018 に登壇していたり、ありとあらゆるインフラ事案を片っ端から捌く人、BigQuery を含めたデータ分析基盤の設計・運用まで 丸ごとこなせる人、機械学習のタスクで世界トップレベルの性能を出す人、本当にすごい人が多い環境だと常日頃感じています。

また、勉強会やイベントで知り合う他社の同年代エンジニアでも目が眩むほどすごい人が数多くいてすごい。

自分も負けないようにやっていく所存です。

エムスリーでインターンしてみませんか?

エムスリーではインターンを随時受付中です。私は入社前にインターンした経験が(エムスリー以外でも)ありませんでしたが、 攻めの技術スタックやビジネス領域の特殊性による相乗効果で、面白いネタがそこらじゅうに転がっているので、 一度現場の空気感を感じてみるのも一興かと思います。

応募はこちらから https://jobs.m3.com/engineer/