エムスリーテックブログ

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

エムスリーは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/

育児休業を支えるあれこれ

エンジニアリングGの冨岡です。

私は昨年の11月に第一子が生まれてから3ヶ月間、育児休業(以下、育休)を取得していました。昨今は比較的育休を取得する男性も増えてきたように思います(私は男性です)。実際に私も育休を取得して気づいたことがたくさんあります。全く論理的でも科学的でもなく、ハッピーな話ばかりでもありませんが、育休中の人、これから育休を検討している人、育休に入りそうなチームメンバーがいる人など、何かの参考になれば幸いです。(テックブログですがテクノロジーの話は出てきません)

TL;DR

  • 育休はバカンスではない
  • 父親の育休は家族を救う
  • ありがとう

育休とは

はじめに、そもそも育休とは何か、というところをざっくりと把握するためにWikipediaを参照すると、以下のように書いてあります。

育児休業(いくじきゅうぎょう)とは、子を養育する労働者が法律に基づいて取得できる休業のことである。

育児休業 - Wikipedia

多くのケースでは、期間や給付金はざっくり以下のようです。給付金は雇用保険に加入しているなどの条件で給付されます。

  • 期間は原則1年まで
  • 給付金は取得時点の給与の67%(上限あり)

条件によって細かくいろいろあるので会社の人事や労務の方がいれば相談すると良いでしょう。

育児のつらみ

まず、育休はバカンスではありません。仕事を休み、万全の体制で育児に備えるわけですが、それはそれだけ育児が大変であるということの裏返しでもあります。私が育休中に特に感じた育児のつらみは以下の3つです。

  • 生活リズムの崩壊
  • 不安と自己嫌悪
  • 睡眠不足

ここからはかなり主観的な話を書きます。育休を取得したいち男性が感じた素直な感想として参考にしていただければと思います。なお前提として、私も妻も仕事を休み家に100%いる状態です。

生活リズムの崩壊

生まればかりの赤ちゃんは昼も夜も関係なく突然泣き出すので、それに対処する必要があります。割り込みです。

家で誰にも邪魔されずに黙々と好きな作業をする・・ということは残念ながらしばらくできません。育児をするなら、赤ちゃんのペースに合わせて生活することになります。昼夜問わず断続的に無視できないアラートが飛んでくるようなイメージです。

不安と自己嫌悪

突然泣き出す赤ちゃんは、しかし、なんで泣いているのかを教えてくれません。例えるなら、[ERROR] something is going wrong.というエラーメッセージだけが唯一の手がかりのような状態です。何もわかりません。

オムツは替えた。ミルクは飲んだばかり。抱っこをして家の中をぐるぐると歩きながら、何がいけないんだろう、何が不満なんだろう、病気じゃないのだろうか・・と不安が頭をぐるぐるし、次第にどうしても泣き止まない赤ちゃん(はっきり言ってめちゃめちゃうるさい)に対してイライラし、そんな自分を自己嫌悪しました。

睡眠不足

これらのつらみを何倍にも増幅させるのが、睡眠不足です。生まれてすぐの赤ちゃんはたいてい1〜3時間おきに起きて泣く、またはミルクを飲ませる必要があるので、その都度起きることになります。

当然、睡眠不足になります。体力的にも精神的にもきつい状況に、畳み掛けるように止まらない赤ちゃんの鳴き声。不安と自己嫌悪が膨らんでいき、この生活がいつまで続くのだろうか・・とマイナスの思考になっていきました。育児ノイローゼになる気持ちがわかります。

解決策

退院後1週間で早くも私たちは疲弊していました。殆どのお世話は二人で分担していたにも関わらず、です。なんとかするために以下のような解決策を試みました。

交互に寝る

夜の赤ちゃんの世話をする担当を1日ずつ交代し、担当でない方は別の部屋で寝ることにしました。片方が夜の世話で疲弊していても、じっくり寝た方が翌日の朝から面倒を見ます。

これはとても良く機能しました。生活にメリハリができ、夜の担当のときも、前日にぐっすり寝ているので苦になりません。睡眠不足が解消されることであらゆることに前向きに対応できるようになりました。

自分の時間を確保する

2人とも休んでいるので、1人はでかけることができます。私はときおりサッカーをしに外出し、妻はときおりヨガに行くなどしました。

家で育児をしているとずっと赤ちゃんのペースで行動することになりますが、自分のコントロールできる時間を過ごすことはお互いにとってリフレッシュする機会になりました。

完璧を諦める

突然親になった私は、必要以上に責任感を感じ、「子どもが最優先でなければいけない」と意識しすぎていたようです。それは一種の呪いです。

しかし、完璧にしようとする窮屈なイラ立ちを子どもにぶつけるくらいなら、まぁいっかと開き直って、多少ダメでも気持ちよく子どもと接する方が良いと途中から考えました。

例えば皿洗いの途中で赤ちゃんが泣き出したとして、今までは手を止めて真っ先に対応していたところを、「ちょっと待ってねー!」とか言いながら待たせておいて、皿洗いを終えてから対応するようにしました。一刻を争うようなアラートはほとんど起きないとわかったからです。

こういった少しの諦めで、自分のコントロールできる時間を少しずつ取り戻していった私は、比較的穏やかな気持ちで子どもと接することができるようになりました。根拠はありませんが、私は完璧を諦めることで楽になりました。

男性の育休

心の余裕は子どもへの接し方に出る

母親は、妊娠・出産という人生最大級のダメージを体に負った状態で過酷な育児に立ち向かうことになります。元気な私ですら、始めはとても辛いものでした。深夜にどうしても泣き止まないとき、イライラが抑えられずに叫んだこともあります。

上記のような解決策の効果もあり、ペースを掴み生後1ヶ月がたつころには私も妻もかなり安定して、"楽しく"育児をすることができました。私たちが余裕を持てたことは、きっと子どもにとっても良いことだったのではないかと思います。

全てを一人で抱えていたら、こんなにも余裕は持てなかったでしょう。

母親1人の仕事にしない

妊娠・出産で極限状態の母親が、過酷な育児を一人で行うとしたらそれがどれだけ酷なことか、と私は実感しました。「母乳をあげる以外のことは、男もできる」といいますが、その通りです。逆に、母乳が出ないことを不便に感じるでしょう。深夜にミルクを作るのは結構めんどうです。

育休が取得できない場合も、里帰り出産など、両親が頼れるものなら頼るのが良いと思います。育児は、それだけ大変なことです。ベビーシッターなどのサービスを利用するのも良いでしょう。どちらもできない場合も、休日は面倒を見るとか、平日早く帰るとか、やれるだけのことをやれるといいのかなと思います。

私たちのように里帰り出産せずに2人で育てる場合においては、私が育休を取得し2人で育児に専念できることが本当に助けになりました。

男性で育休を検討している方、本当に家族の助けになります。オススメです。取得できないと思っている方、もう一度だけ、ほんとうに取得できないか、考えるだけの価値が育休にはあります。どうしてもできない場合があると思いますが、そのときは奥さんを全力でサポートしてあげてくださいね。

ありがとう

ここまで家族のことに関してばかり書いてきましたが、これは会社やチームメンバのサポートがなければできませんでした。

特に私はグループ会社のCTOを勤めており、チームに穴を開けることに心配もありました。しかし、育休の相談を持ちかけると、誰もが快く応援してくれました。

様々なオプション含め相談に乗ってくれたVPoEや人事・労務のみなさん、「ぜひ取ってください!」と背中を押してくれた新卒スーパーエンジニアの@ryo-kato2(チームを任せられる、彼のようなエンジニアがチームにいたのは幸運でした)を始め、育休中もさらにサービスを成長させてくれたチームメンバーや会社のみなさんに、この場を借りて感謝申し上げます。

おかげで家族と大切な時間を過ごすことができました。

最後に

育休を取得して本当に良かったと思っています。

復帰以来、育休エヴァンジェリスト(自称)として、チームメンバーや周りの人には「私が全力でサポートするから、子どもが産まれた際はぜひ育休をとってくれ」と言っています。今は数が少ないですが、男性で育休を取得した人はみんなそういう気持ちになるんじゃないかと思います。

しかし、現実的には全ての育休取得者をサポートするには、私一人では手が足りません。エムスリーでは育休取得をサポートしあうエンジニアを絶賛募集中です!

jobs.m3.com

ニューラルネットの推薦システムに時間・場所等のデータを活用する(Latent Cross)

機械学習エンジニアの西場(@m_nishba)です。主に自然言語処理を使ったリコメンドや文書分類、ユーザー分析を行っています。

最近、読んだ論文を社内データに対して試したので紹介します。

コンテンツ

論文の紹介

概要

今回読んだ論文はLatent Cross: Making Use of Context in Recurrent Recommender Systemsです。 これはWSDM 2018でのFull Presentationの論文で、Googleの人たちによって書かれています。

この論文の主題は、「ニューラルネットを用いた推薦システムにおいて、時間や場所等のcontextual dataをどのように活用するか」です。

これまで推薦システムにおいて、時間等のcontextual dataを使わない、または単純に結合する方法が採用されていました。

そこで論文ではLatent Crossという方法を提案しています。

既存の単純な方法

単純に時間等のcontextual dataを結合する場合、 例えば、商品の埋め込みベクトル{ h }と時間の埋め込みベクトル{ w }を結合すると下記のような特徴ベクトル{ v }を作ることになります。 { v = (h, w) } この{ v }を全結合層やRNNの入力として使うことになります。

しかし、この方法だと単純な例でも上手く学習できない/深い層が必要になるケースがあります。 例えば協調フィルタリングを考えます。 協調フィルタリングでは、ユーザー{ i }の埋め込みベクトル{ u_i }、商品{ j }の埋め込みベクトル{ v_i }とした場合におけるユーザー{ i }の商品{ j }に対する評価{ r_{ij} }は下記のように近似します。

{ r_{ij} \approx u_i \cdot v_j }

これを2つの埋め込みベクトルを結合し全結合層を使って { r_{ij} } を近似できるか実験すると下図のようになります。

f:id:nsb248:20180401144928p:plain

([1]より転写)

各埋め込みベクトルの次元が20の内積を考えた場合(r=1, m=2のカラム)でも1層ではかなり精度が低いです。現実の問題ではかなり深い層を必要とする可能性があります。

Latent Cross

論文では上記の方法を解決するためLatent Crossを提案しています。 Latent Crossは既存のニューラルネットを用いた推薦システムにcontextual dataを取り入れる方法です。

既存の推薦システムのある層の出力{ h_t }をcontextual dataの埋め込みベクトル{ w }を使って下記のように調整します。 { h_t \leftarrow (1 + w) \ast h_t }

ここで { \ast } は要素ごとの掛け算です。こうすることで前述した単純な結合では表現できなかったようなケースにも対応できます。 また推薦システム以外の研究でも重要性が示されているattentionの一種だとみなすことができます。 { w }の値の調整により、中間層の出力に対して次元のマスキングをすることができます。

実際に論文ではRNNを用いたYouTubeの推薦システムにcontextual dataとして時間を取り入れたモデルで数値検証を行っています。

f:id:nsb248:20180401144851p:plain

([1]より転写)

ベースとなるRNN(Plain, no time)と比べ、RNN(Concatenated { \Delta t })、RNN with { \Delta t } Latent Crossの順にPrecisionとMAPが改善しています。

社内データでの数値実験

概要

Latent Crossは推薦システム以外にも応用ができそうなので、文書分類について実験します。 CNNと協調フィルタリングを使った日本語文書のリコメンド でも使った”ニュースのタイトルから「地域」タグがつくかどうかの2値問題”を扱います。

様々な新聞社からニュースが配信されており、地域密着の新聞社の場合、地域のニュースが多いと予測できます。そこで、新聞社を埋め込みベクトルにして、Latent Crossを適用しようと思います。

モデルの詳細についてこちらをご覧ください。

結果

  • CNN(Plain, no publisher)
              precision    recall  f1-score   support

          0      0.893     0.894     0.894      1048
          1      0.923     0.922     0.922      1436

avg / total      0.910     0.910     0.910      2484
  • CNN(Concatenated)
             precision    recall  f1-score   support

          0      0.891     0.888     0.890      1048
          1      0.919     0.921     0.920      1436

avg / total      0.907     0.907     0.907      2484
  • CNN(Latent Cross)
             precision    recall  f1-score   support

          0      0.912     0.887     0.899      1048
          1      0.919     0.937     0.928      1436

avg / total      0.916     0.916     0.916      2484

ぐぬぬ。ほとんど変わらないですね。この問題において新聞社は特徴量として効かないようです。 他の要素やLatentCrossの入れる層などを検討し、精度改善を進めたいと思います。

最後に

弊社では、医療分野における

といったコンテンツが豊富にあり、分析によってビジネスを加速することができます。 (医療分野に特化した翻訳や動画からの特徴量抽出にも取り組もうとしています)

弊社のデータ分析・機械学習業務の特徴として、

  • ビジネスに直結している
  • メインサービスにアルゴリズムの導入ができる。
  • アルゴリズムのABテストをビジネスサイドが受け入れてくれる
  • 動画等に対する長期的なアルゴリズム開発にも挑戦できる。
  • 外部API等では実現できない面白い課題に専念できる。(外部APIでできる問題は外部APIを使います。)
  • 新卒・中途関係なく、自分が担当する案件のメイン開発者になれる。

といったところがあります。

もし興味のある方は応募フォームまたは@m_nishibaまでご連絡ください。

ScalaMatsuri2018で登壇してきました

エンジニアリングGの冨岡です。3/16~18 まで、三日間に渡って開催されたScalaMatsuri 2018で、登壇させていただきました。

speakerdeck.com

発表では、ボトムアップ的なアプローチで実際の現場に関数型プログラミングのテクニックを導入することについて話させていただきました。関数型プログラミングのテクニックはよく話題になると思うのですが、とはいえ実際のプロジェクトではどうすれば・・といったところがあまり語られていないように思います。今回は、そこに対する一つのアプローチ法として、私たちの事例を紹介しました。

発表はランチタイムで一番大きなホールにも関わらず、たくさんの方が聴きにきてくれました。

f:id:jooohn:20180320110228j:plain

セッションに参加いただいた方からは「実践的でよかった」とか「地に足ついたアプローチでよかった」といった感想をいただきました。また @nakayama_san さんにトークの内容を1枚の絵にまとめてシェアいただきました。こうやって皆さんからのフィードバックをもらえるのが、登壇する上で何よりもうれしいですね!ありがとうございました!

最後に

私は一昨年以来2回目のScalaMatsuri参加でした(去年は自分の結婚式が丸かぶりしていけませんでした・・!)。今回初めてスピーカーとして参加させていただきましたが、スタッフの方や参加者の方の協力があってこのようなカンファレンスが成り立っていることを強く実感しました。皆さんの協力のおかげで今回の発表をする機会が持て、一昨年よりもさらに充実した楽しい祭になりました。ありがとうございました!

一緒に開発してくれる仲間を募集中です!

エムスリーでは Scala だけでなく、JavaRuby、Elixir、Kotlin などが適材適所で大活躍してます。 一緒に開発する仲間を絶賛募集中です!メンバーとカジュアルに話す場も設けてますので是非気軽にお問い合わせください!

jobs.m3.com