エムスリーテックブログ

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

新卒研修にぴったりなタスクで Webエンジニアに入門した

<エムスリー Advent Calendar 2020 まで残り 2 日となりました。Advent Calendar 本編に先んじて新卒 1〜2 年目メンバーが執筆します。>

エムスリーエンジニアリンググループ 電子カルテチーム 新卒1年目の山本です。 今回は私が新卒入社後に取り組んだ業務について振り返ろうと思います。 私は上期に電子カルテ上で作成したカルテを閲覧できる WEB サービスを新規開発しました。 患者を検索してカルテを閲覧できる機能がコアとなるシンプルなサービスです。画面のイメージは PC 版の Gmail に近いです。

使用技術

使用技術と用途は以下になります。

  • React + TypeScript
    • フロントの SPA
  • Go + Gin
    • API サーバー
  • nginx
    • クライアント証明書認証やリバースプロキシ
  • Terraform
    • GCP のリソース管理
  • GCP
    • Cloud Run, Compute Engine, Cloud Storage, Datastore, Cloud KMS 等
    • 本体システムは AWS 環境で稼働していますが、冗長化のため GCP 環境で稼働させます。
  • Ruby (Ruby on Rails)
    • 本体環境から GCP 環境への患者情報やカルテ(PDF)の転送処理。
  • AWS
    • ECS, KMS

よかったこと

Web 開発の経験が浅く初めて触る技術も多かった中で、技術選定、プロトタイプ作成、フロントからインフラの実装と、一貫して開発をすることができて良かったです*1。 また機能はシンプルながらも、セキュリティやスケーラビリティなどそれなりに考えることが多く入門者にはちょうどいい課題でした。

もう少し具体的な話をすると暗号化をしっかりやったというのも良かった点です。 例えば患者情報やカルテは TLS を参考にしたハイブリッド暗号化*2をしてから GCP 環境に 転送し、GCP 上でも暗号化したまま保存しています*3。カルテの場合は 暗号化されたPDF が JSON 形式で GCS に、患者情報に関しては 患者番号,医療機関 ID, 暗号化データ(氏名や生年月日等)の3つカラムで Datastore に保存されています。データの復号を極力控えたり、万が一データが漏洩した場合でも個人情報が保護される仕組みとなっています。暗号化を優先した都合上患者検索は API ではなくフロント側でやるといった工夫もしています。

また、要素要素で大事なポイントを押さえるのという考え方が学びになりました。今回に関しては情報の漏洩や破損、本体システムに対して負荷をかけすぎない等。押さえるところを押さえるというのはエンジニアリング以外でも常に意識したいと思いました。

他にも安全なアプリケーションの作る上で意識すべきこと、バッチ処理のエッセンス*4、MVP の作り方 *5など学びが多かったです。

反省

技術選定に関していくつか思うことがありました。 今回はスケジュール的に余裕がなかったので、フレームワークやライブラリを使える部分は積極的に使うべきでした。例えばセッション管理や CSRF 対策、よくあるフロントの機能など、あえて実装しなくてもよかった部分があったなと思います。 また今回は GCP を利用しましたが、Datastore で like 検索ができない、Cloud Run ではTLS がウェブサービスに到達する前に終了するためクライアント証明書の検証ができない、といった各種制限事項の確認が甘かったです。直前に本番環境で動作確認した際に Cloud Run のリクエストサイズの制限に引っかったりして焦りました。今回は致命的にはならなかったものこの辺は入念に調べるべきでした。

見積もりに関しても先人たちと同じ失敗を繰り返してしまいました。 今回でいうとセキュリティー部分の懸念から作り直しが発生したり、簡単だと思っていた機能の仕様が実は複雑だったりと、スケジュールを大幅にずらしてしまいました*6 。あと精神衛生上スケジュール的な余裕も必要だと身をもって体感しました。

We are hiring!

個人的には新卒研修が充実している会社を羨ましく思ったりしていたのですがエムスリーでは実戦を通して効率よく学習することができます。また入社直後から小さなタスクではなく重要な機能の開発を任せてもらるので、ガンガン成果を出していきたい人にはオススメだと思います。

jobs.m3.com

*1:スケジュールの都合上 nginx の細かい設定や監視等の非機能の部分は手が回らなかったので手伝ってもらいました

*2:公開鍵暗号と共通鍵暗号を活用し、鍵は Cloud KMS で管理します。

*3:HTTPS通信での暗号化やクラウドサービスのデータ保護に加えて独自の暗号化を行なっています。

*4:適切なログ出力、スケーラビリティ、リトライできるように冪等な作りにする等

*5: 優秀なプロダクトマネージャーがおりユーザーインタビュ等を通していい感じの MVP を作る過程を近くで観察することができました。

*6:最初から見積もりが楽観的だったのも一因です