エンジニアが事業開発をリードする。エムスリーキャリア BDEチームの挑戦

はじめに:BDEチームとは?

エムスリーキャリア株式会社にて、BDEチームを担当している近藤です。

BDEとは「Business Development Engineering」の頭文字を取ったもので、事業開発をエンジニアリングで推進することをミッションとしています。BDEは、私たちのエンジニアリング組織におけるキャリアパスの一つであり、同時にチームの名称でもあります。BDEチームは、主に「医師採用支援」「薬剤師採用支援」「健康経営支援」の3つの領域で事業開発に取り組んでいます。

私は中途採用において、カジュアル面談や一次面接を担当しています。その中で「エンジニアは事業開発にどう携わっているのか?」というご質問をいただくことが多いため、本日は私たちの具体的な取り組みをご紹介します。

事例紹介:エンジニアは事業開発にどう関わるのか?

私たちは毎年、テストマーケティング段階のものも含めると、数多くの新規事業にチャレンジしています。

今回はその中から、今年春に正式サービスを開始したオンライン診療サービス「HOTEL de DOCTOR24」に関連した取り組みを紹介します。

HOTEL de DOCTOR 24 - Online Doctor for Tourists in Japan

このサービスは、日本を訪れたインバウンド観光客の方が体調を崩された際に、オンライン診療を提供するものです。

サービスの最大の特徴は、患者様からの予約後、短時間で「患者様・医師・看護師・通訳」の4者をマッチングさせ、診療を可能にする点です。ここには、当社が人材紹介事業で培ってきたマッチングのノウハウが生かされています。

私たちは「どうすれば患者様によりスピーディーに診療を届けられるか」を常に考えています。患者様から直接お話を伺う機会は限られているため、患者様の立場に立って仮説を立て、ミニマムな検証を繰り返しています。

エンジニア自身も数値ベースで仮説を立て、サービスフローの変更を提案することがあります。また、生成AIを活用してユーザー体験を向上させるアイデアを出し、実際にサービスや業務フローに適用しています。

最近の例では、予約可能時間の短縮に取り組み、目に見える成果を出すことができました。 サービス提供側の論理ばかりにならないよう、常にユーザー視点で事業開発に取り組むことを大切にしています。新規事業ではすぐに成果が出ないこともありますが、「どうすれば成果が出るのか」をチーム一丸となって考え抜き、粘り強く取り組んでいます。

生成AIとの向き合い方

エンジニア組織全体としては、主にGitHub CopilotやDevinを利用しています。

「HotelDeDoctor24」のプロジェクトでは、最近の施策でClaudeを活用し、要件を設計にブレークダウンする試みを行いました。また、他のプロジェクトではv0 を利用したLP作成にも取り組んでおり、そこで得た知見をこのプロジェクトにも活用しようとしています。

社内外のユーザー向けの活用としては、患者様からのお問い合わせ対応に生成AIを導入しています。Difyという生成AI向けローコードツールを活用しつつ、日々ブラッシュアップを重ねています。例えば、患者様から想定外のお問い合わせがあった際に、いかに誤解を招かないようご案内するか、そのためのガードレール(安全機能)をどう設計するか、といった課題に取り組んでいます。

このプロジェクト以外にも、全社的に生成AIを推進するバーチャル組織があり、社内業務への適用はこの1〜2年でかなり進みました。エンジニア組織としては、2〜3年後のあるべき姿を描き、そこから逆算して現在のギャップをどう埋めていくか、という視点で取り組みを進めています。

私たちが一緒に働きたい方

今回のブログでは、私たちの事業開発や生成AIへの取り組みについてご紹介しました。

私たちは、このような環境で「事業への関心が高い方」そして「技術への探究心を持つ方」とご一緒したいと考えています。

「事業への関心が高い方」とは、私たちが提供する医療従事者向けの人材サービス、つまり医療や「人」が関わる課題に関心を持っていらっしゃる方、あるいはこれから関心を持てそうだと感じている方をイメージしています。

また、「技術への探究心」とは、生成AIに代表されるように、エンジニアに求められる役割が今後も変化し続ける中で、その未来を自ら考え、行動できる方を想像しています。

おわりに

本日お伝えできたのは、私たちの取り組みのほんの一部です。 もし少しでもご興味をお持ちいただけましたら、ぜひカジュアル面談や一次面接で、より詳しくお話しさせてください。

career.m3career.com

公式noteから紐解く、エムスリーキャリアのエンジニア組織が目指す事業貢献の「本質」

こんにちは!エムスリーキャリアで薬剤師向けサービス開発のエンジニアをしている諸岡です。
先日映画 『沈黙の艦隊 北極海大海戦』を観て、大沢たかお氏演じる主人公のように何事にも動じず冷静沈着であり続けたいと思いました。

エムスリーキャリアテックブログではエンジニアの日々の技術的な挑戦や学びを発信していますが、今回は少し視点を変えて、私たちの「事業」や「組織」について深く知っていただける公式noteをご紹介します。 

note.com

続きを読む

テスト環境のCI/CDを刷新しました

 

はじめに

こんにちは、医師採用支援サービス開発チームメンバーの松永です。

我々のチームでは、長期運用していく中で、テスト環境の占有化やインフラ構成の複雑化などによる開発効率の低下が課題となっていました。

そこで、この度テスト環境のCI/CDを刷新しましたので、取り組みをご紹介いたします。

 

取り組み前までの構成

以前までは、GitLab CI、Jenkins、AWS Codebuild、AWS CodeDeployを用いてCI/CDパイプラインを構築していました。

利用用途としては主に以下の通りです。

 

GitLab CI

Jenkins

Codebuild

CodeDeploy

用途

ユニットテスト

・静的コード解析

カバレッジ計測

・E2Eテスト

・MR作成

AWS EC2へのデプロイ

・CodeBuildの実行

・CodeDeployの実行

マイグレーションの実行

・バッチ実行

・Dockerイメージの生成

・イメージタグの生成

AWS ECSへのデプロイ

・EC2内のDockerへのデプロイ

トリガー

ソースコードへのコミット時

手動実行

Jenkinsからの自動実行

Jenkinsからの自動実行

設定管理

コードベース

コードベース(一部、手動管理)

手動管理

手動管理

 

また、固定で3つのテスト環境があり、それぞれ下記の構成をとっていました。

 

テスト環境1

テスト環境2

テスト環境3

アプリケーションサーバ

AWS EC2

AWS EC2内のdocker

AWS Fargate

デプロイ方法

Jenkinsから直接行う

Jenkinsから、CodeBuild、CodeDeployを介して行う

※ただし、CodeDeploy Agentを介して行う

Jenkinsから、CodeBuild、CodeDeployを介して行う

 

各環境の詳しい構成は以下の通りです。

テスト環境1

開発者がjenkinsからEC2に対してデプロイを行い、EC2をそのまま公開するというシンプルな構成でした。

こちらを図にすると以下の構成になります。

テスト環境2

開発者がjenkinsからEC2に対してデプロイを行うという点はテスト環境1と変わりませんが、EC2内にあるDockerに対してデプロイを行い公開するという構成でした。

そのため、ECRやCodebuildなどの構成要素があります。

こちらを図にすると以下の構成になります。

 

テスト環境3

テスト環境1、2とは違い、サーバーレスであるAWS Fargateに対してJenkinsからデプロイを行い公開を行うという構成でした。

テスト環境2に比べ、よりシンプルな構成でした。

こちらを図にすると以下の構成になります。

 

また、上述した環境はそれぞれ手動管理でした。

 

以前までの構成の課題

テスト環境の番号が進むにつれてモダナイズが進んでおり、これは運用を通して最適な形を模索してきた結果と考えられます。

しかし、コードベースで管理されておらず、各環境で構成が異なっていたため拡張性に欠けており、その結果、主に以下の課題が生じていました。

テストの待ち時間が多発

サーバのアップデートを放置

利用していない間も利用料がかかる

テストの待ち時間が多発

各環境がそれぞれ異なることにより、設定漏れなどが頻発し、特定環境でしかテスト出来ないことなどが発生していました。(例:API連携はQA1環境でしか動作しないなど)

また、環境の増減も容易にできないため、片方の開発者のテストが終わるまでもう片方はテストを待ち続けるということが頻発し、開発者やQAが増えれば増えるほど開発効率が落ちていきました。

 

サーバのアップデートを放置

ほとんどコードベースで管理していないため、手動でそれぞれの環境のバージョンアップをする必要があり運用コストが多くかかっていました。

また、開発者がインフラの管理も行っている都合上、重要な環境のみに限定しサーバーのバージョンアップ等を行っていました。

その結果バージョンアップが行われない環境は放置状態となり、徐々にアップデートが困難になりました。

 

利用していない間も利用料がかかる

前述した通り、特定環境でしか動かないものがあり、殆ど利用しない環境がありました。

そのため、サーバを手動対応で停止するなどしていましたが、環境が足りなく手動で立ち上げて利用することがありました。

しかし、立ち上げ時の手動作業での対応が多く発生したり、停止作業自体を忘れてしまったりするため、徐々に停止作業なども放置されるようになりました。

結果利用しないにも関わらず、利用料が発生していました。

 

総括すると、運用コストが上がり、開発効率が低下するという負のループに陥っていました。

 

改善した構成

上述したように、各環境の運用コストが重く、開発効率の低下が顕著に現れていました。

そのため、インフラをコードベースで管理する事により環境を統一しつつ、出来るだけ運用コストを減らし、複数環境を立ち上げる仕組みを検討しました。

 

基本構成

主に、サーバーレスを採用しているテスト環境3をベースにしつつ、IaC化を行うことで、環境の統一を図っていく方針としました。

また、サーバの運用コストの兼ね合いから、CI/CDにはGithub Actionを採用し、GitLab CI、Jenkinsを廃止しました。

まとめると下記のような構成要素となります。

 

アプリケーションサーバAWS Fargate

IaC:Terraform

CI/CD:Github Action、CodeBuild、CodeDeploy

 

上記を利用して、下記構成を考えました。

  1. テスト環境3の構成のみをTerraform上で管理し、コード自体はインフラ用リポジトリで管理
  2. 専用のCD用リポジトリを作成
  3. アプリケーションリポジトリで、何かしらコミットをすると自動でCD用リポジトリにも同様のブランチを作成
  4. 環境立ち上げ時は、github workflowからデプロイしたいブランチを選択して手動で実行
  5. github action内でterraformのstateファイルを分けて、環境を作成
  6. github action内で作成した環境に対してアプリケーションコードをデプロイ
  7. 作成した環境等は、slackなどで通知する

こちらを図にすると以下のようになります。



また、これでは環境が立ち上がったままとなりコストが上がってしまうため、環境の削除時は下記のような構成としています。

  1. リリース用のstagingブランチにマージした際に、アプリケーション側のブランチを自動削除(中止時は手動でブランチを削除)
  2. 自動で同一名のブランチを対象にterraformを使用して環境削除

こちらを図にすると以下のようになります。

 

構成の利点

前述した構成を取ったことで主に下記のような利点があります。

 

リポジトリを分離したことで、実行権限の管理が容易

・全環境、単一のコードベースで実行されるため、常に同じ環境が保証され、拡張が容易

・サーバーレスアーキテクチャを採用しているため、サーバ管理が軽減された

・ブランチ削除時に環境が消えるため、作業ブランチが綺麗になる

・環境が簡単に増減できるため、必要な時以外立ち上がらないようになり、料金が安くなった

・ブランチ戦略を変えるだけで、環境の増減が可能

まとめ

調査から構成検討、実行まで約1〜2ヶ月かかりました。特にインフラ構成が分散していたため、調査に時間を要し苦労することも多々ありましたが、結果として運用コストを約2割削減できました。以前はデプロイ対応の待ち時間やインフラのエラー調査で開発が丸一日停止することもありましたが、これらの待ち時間がほぼゼロになり、開発に集中しやすくなったため、最終的には実施してよかったと実感しています。

開発効率にも直結するので、定期的にインフラやCI/CDを見直すことをおすすめいたします。

 

「やらないこと」をどう決めるか? 

はじめに

こんにちは。エムスリーキャリアで健康経営事業開発を担当しているエンジニアの金子です。

限られたリソースの中で、いかにして事業課題の解決に繋がるプロダクトを迅速に市場投入するかは多くのエンジニアの悩みの種です。MVP(Minimum Viable Product)はその有効なアプローチの一つですが、実務では「あれもこれも必須だ」と要望が増え、いつの間にか最小からは程遠いものになってしまうことが少なくありません。

このギャップを技術的な視点から埋め、プロダクトを「検証可能な最小限の形」に導くこと。それが、MVP開発におけるエンジニアの重要な役割だと考えています。

この記事では、私たちがMVP開発を進める上で心掛けていること、特に「やらないこと」を明確にし、ビジネスサイドとどう円滑に調整するか、実際に実践している以下の3つの方法をご紹介します。

  1. 議論の軸を作るためのドキュメント
  2. 「やらない」判断を円滑に進めるコミュニケーション
  3. 開発時に注意したいこと(落とし穴)

日々のスコープ決めに悩むエンジニアやプロダクトマネージャーの方にとって、少しでもヒントになれば幸いです。

実践1:議論の軸を作るためのドキュメント

職種や立場が違うと、同じゴールを見ていてもそこに至るイメージは少しずつ異なります。特にシステム開発においては当然ながらエンジニアとビジネスサイドとの間には大きな認識のギャップがあります。そのため、まずチーム全員の目線を合わせ、議論が迷走しないための共通の土台を作ることが効果的です。

私たちは、ヒアリングやブレストを一通り終えたあと、詳細を詰めていく起点として、A4一枚程度のシンプルなドキュメントに以下のような基本的な方針をまとめるようにしています。

  • 目的
    このプロジェクトで何を達成したいのか?
  • 検証したい仮説
    このMVPで何を明らかにしたいのか?
  • リリーススケジュール
    いつまでに市場に投入する必要があるか?
  • やること
    価値を提供でき、かつ仮説検証に必要な最小限の機能の一覧。
  • やらないこと
    スコープ外とする機能の一覧と、その理由代替案や、想定されるリスクと、その回避・軽減策も併記する。

議論が複雑になったり、話が逸れたりしたときに「この機能は、ドキュメントの目的に立ち返ると本当に今やるべきだっけ?」と確認することで、本来の目的に立ち返りやすくなります。

特に「やらないこと」は曖昧にしておくと、開発が進むにつれ「これは必要なのでは?」と突然復活することがよくあります。そんなときにこのドキュメントを元に認識をすり合わせ、開発を本筋に戻すことができます。

実践2:「やらない」判断を円滑に進めるコミュニケーション

MVP開発で特に丁寧さが求められるのが、ビジネスサイドの要望に対して「やらない」と判断し、納得してもらうプロセスです。ここではロジックだけでなく伝え方の工夫も重要になります。

CSや営業から挙がる要望は、貴重な顧客の声です。まずはその背景にある課題をしっかりヒアリングし、理解することから始めます。その上で要望を以下の3つに整理します。

  • 必須の機能
    これがないと顧客が価値を感じられず、仮説検証もできない機能
  • あると良い機能
    価値を高めるが、代替手段があったり、次の開発フェーズでも良い機能
  • スコープ外の機能
    MVPの目的から外れてしまう要望や機能

そして「やらない」と判断したものについては、その理由を技術的な観点や開発スケジュールなどを踏まえて説明します。「やらない」と伝える際は、代替案または想定されるリスクの軽減・回避策と今後の見通しをセットで提示することを心掛けています。

例えば「XXができる運用管理機能が欲しい」という要望があった場合、

やらない理由

MVPの段階では、利用するユーザーが限定的で、運用コスト削減に対して開発コストが見合わない可能性があります。

代替案と今後の見通し

既存の機能の組み合わせで運用コストが削減できるので、まずはこの手順で試してみてはいかがでしょうか。フルスクラッチ開発時には容易に実現できるので優先的に開発を検討しましょう。

と、このように伝えることで、ビジネスサイドにも判断の背景が伝わり、納得感を得やすくなります。

MVP開発で注意したいこと

MVP開発は強力なアプローチですが、その過程にはいくつかの落とし穴も存在します。最後に、私たちが注意している点をいくつか紹介します。

MVPの「次」を見据えた設計

MVPはあくまで始まりです。特にkintoneやBubbleなどのノーコードツールを使って素早く開発する場合、将来の本格開発への移行が困難にならないよう、データ移行のしやすさといった技術的な「次のステップ」を初期段階で少しでも検討しておくと、将来の修正コストが高くなるリスクを減らせます。

スコープ削減の落とし穴①:「作らなさすぎ」の罠

スコープを厳しく絞ることはMVPの基本ですが、それが行き過ぎると、見落としがちな罠に陥ることがあります。それは「作るべき価値ある機能を作らないまま進んでしまう」リスクです。
例えば、ビジネスサイドが「これは実現が難しいだろう」「時間がかかりすぎるだろう」と遠慮してしまうことで起こります。結果として、本当は価値が高く、工夫次第で実現可能な提案を拾えなくなってしまいます。

この罠を避けるには、エンジニアが単にスコープを守るだけでなく「こういう方法なら低コストで実現できますよ」と積極的に技術的な選択肢を示すことが重要です。そして、その土台となるのが、どんなアイデアでも気兼ねなく言える「心理的安全性」の高い環境です。

例えば、エンジニアが専門用語を避け、対等な立場でどんな質問も歓迎する姿勢を示すことで「こんなことを聞いてもいいのだろうか」という無用な遠慮がなくなり、活発な意見交換が生まれます。

スコープ削減の落とし穴②:「安心感」という価値の見落とし

もう一つのスコープ削減の落とし穴が「安心感」という価値を見落としてしまうことです。MVPでは、実際に頻繁に使われるコア機能に目が行きがちです。しかし、顧客が導入を決定する際には「これならちゃんと運用できそうだ」という安心感も重要な判断材料になります。

例えば、レアケースでしか利用しない設定項目なのでその項目をスコープ外とした結果、そのレアケースが心配で導入を見送るという事例が実際にありました。今思えば、導入前のイメージの湧かない段階で顧客が不安に思うことは当然ですが、スコープを削る議論の中でも「この機能がないと、顧客が導入に不安を感じないか?」という視点を忘れないようにしたいものです。

おわりに

MVP開発を成功に導くには、エンジニアがコードを書くだけでなく、ビジネスサイドと連携し、一緒になって事業目的の達成を目指す視点が重要です。そのためには、ビジネスサイドと信頼関係を築き、顧客の課題への深い理解が不可欠となります。

技術的な視点から「何が顧客への価値となり、何を検証すべきか」を考え「やること」と「やらないこと」の判断をサポートし、チームの合意形成を後押しすること。こうした主体的な動きこそが、MVP開発を成功に導く鍵となります。

この記事が、皆さんの日々の開発の参考になれば幸いです。

このように、技術的な挑戦だけでなくビジネスサイドと深く連携し、事業課題の解決に主体的に関わっていくスタイルが、私たちエムスリーキャリアのエンジニアの特色です。

もし、私たちの働き方に少しでも興味を持っていただけましたら、ぜひ下記の採用ページをご覧ください。

career.m3career.com

プログラムコードは腐るのか?

はじめに

はじめまして。エムスリーキャリアの坂口です。 薬剤師向けサービスのプロダクト開発チームに新卒エンジニアとして参画し、約5ヶ月が経ちました。

新卒入社エントリブログのラストバッターとなります。この5ヶ月で私が体験し、学んだことを踏まえ、表題に挙げた「プログラムコードの腐敗」というテーマについて、少し考察をしてみようと思います。

WARNING: Is your code rotting?

プログラムコードは腐るのでしょうか?

結論から言うと、ソフトウェアが腐るという概念は存在するようです。したがって、それを構成する命令文の集合体であるプログラムコードも、同様に「腐敗」という概念で捉えられそうです。

腐るという言葉は奥深いもので、それは単に年月が経つことによって形質が変化する過程を示す概念ではなく、人間の価値観に強く依存するもののようです。例えば、食品における腐敗は、科学的には発酵と同じ過程ですが、その判断は「食べられるかどうか」という人間の価値基準に依存します(参考:https://www.jstage.jst.go.jp/article/jbrewsocjapan/106/4/106_174/_pdf

プログラムコードの腐敗

冒頭に挙げたソフトウェアの腐敗(Software rot)は、主に時間の経過に伴うソフトウェア品質の劣化を指します。具体的には、ソフトウェア(やそれを構成するプログラムコード)が適切に保守されず、長く放置されることによって起きる予期せぬ動作パフォーマンスの低下などが挙げられます。

この場合の「腐敗の基準」は、ユーザーの要求や期待をどの程度満たしているかというソフトウェアの品質にあり、そしてこの品質の判断基準もまた、人間の価値観(ユーザーの要求や期待)に依存しています。したがって、プログラムコードにおけるこれらの現象を「腐る」と表現することには、一種の妥当性が感じられます。

サンプルコード

ECサイトを例に挙げ、ビジネス要件の変化によりコードの品質が低下していく(ビジネス的な要求に対し最適解とならなくなる)様子をシミュレーションしてみます。

バージョン1.0:健全な状態(サービス開始時)

サービスは当初、商品の価格が変動することはなかったと仮定します。税金や送料を含む最終価格は、マスターデータ(products テーブル)で管理しており、注文時にはこのマスターデータから価格を参照するシンプルな設計でした。

# app/models/order.rb

class Order < ApplicationRecord
  belongs_to :product
  
  # 当時のシンプルなビジネスロジックに合致していた
  def calculate_total_price
    # 商品のマスターデータから価格を取得するだけでよかった
    self.product.price
  end
end

サービス初期の少ないリソースと開発期間を考慮し、最低限の要件を満たす上記の設計は合理的と判断され、採択されます。

バージョン2.0:腐敗の始まり(ビジネス要件の複雑化)

サービスの成長に伴い、「期間限定セール」や「クーポン」などのマーケティング施策が導入され、商品の価格が購入タイミングによって変動するようになりました。

しかし、既存のOrderモデルは「商品価格が変動しない」ことを前提として設計されているため、これを踏襲するとなると以下のようにモデルを複雑化していくことになります。

# app/models/order.rb

class Order < ApplicationRecord
  belongs_to :product
  belongs_to :coupon, optional: true # クーポンが適用される場合

  # ビジネス要件の複雑化により、メソッドが肥大化・複雑化
  def calculate_total_price
    # 商品マスターデータから基本価格を取得
    price = self.product.price

    # 期間限定セールに対応するためのロジックを追加
    # セール期間中かどうかの判定、割引率の適用など
    if self.product.on_sale?
      price *= (1 - self.product.sale_discount_rate)
    end

    # クーポンに対応するためのロジックを追加
    # クーポンの種類(%割引、固定額割引)や有効期限の判定など
    if self.coupon.present? && self.coupon.valid?
      case self.coupon.discount_type
      when 'percentage'
        price *= (1 - self.coupon.discount_value)
      when 'fixed_amount'
        price -= self.coupon.discount_value
      end
    end

    # 複雑な計算結果を返却
    price
  end
end

この段階で、すでにバージョン1.0のコードはビジネスの実態を正確に反映しておらず、保守性も著しく低下しています。かといって、「商品価格が変動する」ことを前提とした設計に刷新するには、このメソッドと依存関係にある全ての処理を見直す必要があります。

このように、当初は「最適」だったコードでも、時間の経過やビジネス要件の変化によって価値を失い、有用でなくなってしまいます。

表題のソフトウェア(プログラムコード)が腐るという概念について、ひとまず掘り下げてみました。次に気になるのは、当然この疑問でしょう。

「どうやって、プログラムの腐敗を防ぐのか?」

Fighting the Hidden Rot!

Software Rot、時間経過によるソフトウェア品質の劣化要因として、記事で挙げられているものがいくつかありました。以下、一部を抜粋したものになります。

  • 環境の変化

    • ソフトウェアが依存している外部環境(ハードウェア、OS、ライブラリ等)の変化が起因となり、当初想定していた処理が解決されなくなる
  • 使用頻度の低いコード

    • 実行されることが少ない、あるいは残存している不要なコードが、外部環境の変化や依存関係にある別のコードの変更を受け、予期せぬ動作やエラーの原因となる
  • ソフトウェアエントロピー

    • 新規の要求やバグ修正のためにソフトウェアが絶えず変更されることで、システム構造が当初の設計から徐々に乖離していき、保守性が低下する

ここで、上二つの要因と最後の要因は、少し異なる観点で分類できそうです。それは腐敗の性質が、顕在的潜在的かという観点です。

「環境の変化」「使用頻度の低いコード」

これらの要因は、結果として

  • エラーや予期せぬ動作

  • ビルドの失敗

といった明確な問題(顕在的な腐敗)を引き起こす要因です。

これらは明確であるが故に腐敗していることに気が付きやすく、システムによる検知継続的な保守などで改善が見込めそうです。

「ソフトウェアエントロピー

一方、上記の要因はシステムが継続的な変更により当初の設計から乖離していくことで、コードが複雑になったり、汎用性が失われたりする現象を指していました。これは結果として、

  • 新規機能開発における認知負荷や開発コストを増加

  • セキュリティ上の脆弱性

などを引き起こす、慢性的な問題(潜在的な腐敗)と考えられます。

このソフトウェアエントロピーは、明確な境界線を持たないという点でより「腐敗」としての性質に近く、

「いつから腐り始めたのか定かではないが、気がついたら腐っていた」

という状態になりがちで、ステマティックに状態を監視することが難しいという課題を持っています。

これに立ち向かうにはどうすればいいのでしょうか?

エムスリーキャリアで学んだエンジニアの本質

エムスリーキャリアのエンジニア(「ワイガヤLT大会」の様子)

私はエムスリーキャリアでの体験で、この潜在的な腐敗」に立ち向かう技量こそが、エンジニアに求められる本質的に重要なスキルの一つだと感じました。

それは具体的には、以下のような能力を指すと考えます。

柔軟な設計力

入社後、最初に学んだのは将来的な保守性・拡張性を見据えた設計力の重要さでした。

入社当初、私は設計・コードレビューを自チームのエンジニア全員からいただいていました。誰でもレビューができる=特定の個人に依存しないレビュー体制は、多様な視点やアイデアをチームで共有し、柔軟な設計力を養うことに繋がっています。

見極めと実行力

潜在的な技術的負債は文字通り見えにくいもので、それを見極め、顕在化させることができるのはエンジニアだけであると思います。

私たちのチームでは、開発中に発見した負債を「技術的負債一覧シート」に記録し、Gitで管理しています。これにより、負債を「コードベース上で可視化」し、またこれをAIに参照させることでリファクタリングの実行までを効果的に推進する取り組みを進めています。

事業理解に基づく判断力

事業目標を踏まえた適切なソリューションを計画・立案するディレクションスキルも重要です。

エムスリーキャリアでは、事業部側のMTGにも積極的に関わったり、「エンジニア起票」「つぎつく」といった、エンジニア発信のプロダクト改善施策を推進する取り組みがあります。それは、コードを書くことに囚われない、プロダクトにおけるITのスペシャリストとしての責務を醸成する文化であるといえます。

まとめ

本記事では「プログラムコードは腐るのか?」という問いをフックに、ソフトウェアの腐敗という技術的負債についての考察、そこから導き出されるエンジニアの本質的に重要なスキルについて述べてみました。

学生から社会人となった今、私はプロのエンジニアとして新鮮なソフトウェアを提供する義務があることを実感し、日々業務にあたっていきたいと思っています。

たった5ヶ月ではありますが、入社前では想像もできないほど多くのことを学ばせていただいています。それはエムスリーキャリアのエンジニア組織が、深いプロダクト理解と広い視野で物事を見るスキルを醸成する文化となっているからだと感じています。

この文化を一緒に創っていく仲間を、私たちは常に求めています。

ご興味を持っていただけた方は、ぜひ下記の採用ページをご覧ください!

https://career.m3career.com/midcareer/engineer

新卒エンジニアがClineで開発工数65%削減!開発効率の向上につながった理由とは

はじめに

 こんにちは! 2025年4月にエムスリーキャリアへ新卒エンジニアとして入社しました藤田です。

 弊社では生成AIの業務活用を積極的に推進しており、最先端のツールに触れながら開発を進める機会が豊富にあります。

 今回はその中でも、AIコーディングツール「Cline」を業務でどのように活用しているかについて、具体的な取り組みと共にご紹介します。

恵まれたAI開発環境

 エムスリーキャリアの大きな魅力の一つは、生成AIの活用に対する積極的な姿勢です。GitHub Copilotはもちろん、GeminiDevinClaude Codeなど、多くの外部AIツールが利用可能な状態で提供されています。(使用できるAIモデルも最新...!)

 また、まだ試行錯誤段階ですが、MCP関連も積極的に導入を推進しています。
 

 さらに、必要なツールがあれば、申請を通じて新たに導入することもできます。

 このように、多様なAIツールを試しやすい環境は、エンジニアにとって大きなアドバンテージです。今回は、その中でも私が使用している「Cline (Claude sonet 4)」を使い、既存プロジェクトのアップデート作業の効率化に挑戦しました。

Clineが生んだ「開発の仕方の変化」

 結論から言うと、Clineの導入によって開発工数を大幅に短縮(想定より65%程短縮)することができました。

これは、人間の認知能力を補佐する形で活用できるからです。


 例えば、生成AIにコードを出させることにより、本来であれば時間をかけて読まなければいけないドキュメントなどを、必要な箇所だけ読むことができるようになりました。

 また、開発面においても効率が上がりました。その理由は、単にコード生成が速くなったからだけではありません。Clineのclinerulesという機能を活用することで、開発の進め方そのものを変革できたからです。

 clinerulesは、コード生成のルールをあらかじめ定義しておける機能です。これにより、毎回同じ指示をプロンプトに含める必要がなくなり、出力されるコードの品質と一貫性を飛躍的に高めることができます。

 

clinerulesの実例(チームでの設計思想の共有)

 clinerulesの真価は、チームが持つ設計思想やコーディング規約そのものをAIに学習させられる点にあります。

 例えば、Railsのプロジェクトで私が導入し、チームのルールとなっているものには以下のようなものがあります。

 

  • POROによるObjectの実装 AIにビジネスロジックの分離を指示すると、Active Recordモデルが肥大化する「ファットモデル」を生成しがちです。そこでclinerulesに「ロジックはPORO (Plain Old Ruby Object) を用いて切り出す」というルールを定義し、このアンチパターンを回避しています。
  • 単一責任の原則の徹底 POROに切り出す際、「公開するpublicメソッドは.callメソッド一つに限定する」というルールも定義しています。これにより、クラスの責務が明確になり、単一責任の原則(SRP)に沿ったコードが生成されるようになります。
  • 循環的複雑度の低減 複雑な条件分岐を持つコードを生成させないよう、「循環的複雑度が低くなるようなロジックを生成する」という制約を加えています。これにより、可読性とメンテナンス性の高いコードを維持できます。
  • その他諸々...

 

 

 

 これらのルールを事前定義することで、AIは私たちのチームの設計思想に沿った、高品質なコードを生成してくれるようになりました。

Vitestによるフロントエンドのテストコード生成

 この取り組みはバックエンドに留まりません。私が導入したフロントエンドテストでは、テストフレームワークVitestについてもclinerulesをカスタマイズしました。

 これにより、チームの誰もがある程度精度の高いテストコードを安定して生成できるようになり、触れたことのない技術領域であっても、品質を担保しながら安心して開発を進められるようになりました。

 

  • AAAパターンの明確化 テストコードを「Arrange(準備)、Act(実行)、Assert(検証)」の3つのブロックに構造化するルールです。これにより、テストの目的が明確になり、誰にとっても可読性の高いコードを維持します。
  • モックとスタブの再定義 テストの代役(テストダブル)の役割をチームで統一します。「モック」は振る舞いを検証する偽物、「スタブ」は決められた値を返す偽物と定義することで、テストの意図が明確になり、混乱を防ぎます。

 

 

「チームで育てるプロンプト」という文化

 私たちのチームでは、このclinerulesを個人で利用するだけでなく、チームの共有資産として皆で育てていくという文化が根付いています。

 また、経験豊富なエンジニアが修正したプロンプト定義を見ることにより、チームメンバーのスキルアップに直結します。優れたプロンプトは、単なる指示文ではなく、設計思想やベストプラクティスが凝縮された"生きたドキュメント"でもあるからです。

このようにチームでプロンプトを改善し続けることで、

  • 個人のスキルアップが促進される
  • チーム全体の技術力が向上する
  • コードの品質と一貫性が保たれる

という好循環が生まれています。この取り組みの成果は、社内の共有会でも発表させていただきました。

 

まとめ

 生成AIツール「Cline」と、そのカスタマイズ機能であるclinerulesの活用は、単なる工数削減以上の価値をチームにもたらしました。

 AIに出力の「型」を教え、それをチームで育てていくアプローチは、開発の生産性を飛躍的に高めるだけでなく、チーム全体の技術力向上にも貢献します。

 これからも、チームでプロンプトを育てながら、より高度な開発に挑戦していきたいと思います!

 私たちエムスリーキャリアのチームやエンジニアリンググループに少しでも興味を持っていただけましたら、ぜひ下記の採用ページをご覧ください!

https://career.m3career.com/midcareer/engineer

 

新卒エンジニアによる入社4ヶ月の振り返り

はじめに

エムスリーキャリアに2025年4月に新卒エンジニアとして入社しました、松本です。

今回は、働き始めてからの4ヶ月経った振り返りをまとめてみたいと思います。

 

入社前の私とエムスリーキャリアを選んだ理由

 

 私は大学生の頃にプログラミングを初めてその楽しさを知って以来、私はすっかりコードを書くことに夢中になりました。特に3年の春頃に始めた競技プログラミングは非常に面白く、積極的に取り組んでいました。ハッカソンにも参加するなど、プログラミングに対する「好き」という気持ちは自分でもかなり大きいと思います。

 一方で私は人と関わることも好きで、仕事においても周りとコミュニケーションを取りながら、チームで協力して物事を進めたいという気持ちもありました。

 こうした思いから、医療という社会貢献性の高い領域で、現場の方と要件を擦り合わせながら主体的に開発を進められる開発体制が整っているエムスリーキャリアは自分にとって適した環境だと感じ、入社することを決めました。

入社後の流れ

 エムスリーキャリアでの社会人生活は、まず1週間の全体研修からスタートしました。ビジネスマナーの基礎から会社の事業内容、理念まで、社会人として必要な知識を同期と一緒にじっくりと学ぶ期間でした。

今年入社した営業職含む50人以上の新卒社員の同期と顔を合わせ、交流を深める良い機会にもなり、安心して社会人の一歩を踏み出せました。

 研修で会社の全体像を掴んだ後、いよいよエンジニアとして本格的に配属となりました。他の会社ではこの後数ヶ月間の技術研修があることが多いですが、エムスリーキャリアのエンジニア組織では、OJT(On-the-Job Training)がメイン入社してすぐ実際のプロジェクトに参加し、実践を通して技術を習得していくスタイルです。

私は最初は社内の人が使用する管理者画面のカスタマイズや、LPサイトの表示崩れの修正など、簡単な仕事から始めて次第にチームで使用しているプロダクトへの理解を深めました。

 入社前からプログラミングや開発経験はあったものの、実務ならではの考慮すべき点や複数人での開発をするときの連携の仕方など、覚えることは多く、戸惑いながらも新しい学びの連続で、あっという間に4ヶ月が過ぎて行きました。

入社してみて実感したこと

 配属後、実際に働き始めて特に感じたエムスリーキャリアの特徴や、組織で働き始めて感じたことをいくつかご紹介します。

AIの活用が盛ん

 会社で働く中で特に感じるのは、AI技術を積極的に開発フローに取り入れている点です。GitHub Copilotのような、今や多くの開発現場で使われているものに留まらず、DevinやDifyといったツールも積極的に検証・活用しています。

 また、エンジニア職に限らず社内全体でGeminiやNotebookLMといった生成AIツールが業務に活用され、業務効率化を図っている事例を頻繁に耳にします。

(GitLab CIからGitHub Actionsへの移行作業をDevinに任せている)

(Difyで作成された社内用bot。エンジニア以外も申請すれば全社員が利用できる)

全社的にAIを活用していこうという風土が根付いていることを日々実感しています。常に刺激を受けながら、新しい技術に触れられるところは魅力の一つです。

 

エンジニア側からの改善提案

 エムスリーキャリアでは、依頼された改修の実装だけでなく、エンジニア側からも改善提案を行い、システムの価値向上に貢献しています。改善提案を行うことは、チームの評価項目としても重視されています。

 開発者ならではの視点は新機能の開発につながることもあり、開発効率を向上させるためのアーキテクチャの選定や技術的負債の解消にも欠かせません。

 この文化のおかげで日頃の開発業務で生まれる「ここはこうした方がいいんじゃないか」という気づきを大事にすることができています。

 

裁量が大きい開発環境

 エムスリーキャリアのエンジニア組織は、それぞれ数人のチームでプロダクトを開発しています。そのため、一人ひとりの裁量権が大きいのが特徴です。新卒の私でも、任された案件は概ね一人で責任を持って取り組むことになります。

 分からないことがあれば自分で調べ、どのような方法で解決するのか、どのような抽象化を行うのが最適なのかといった選択を迫られる場面も多々あります。

 しかし、その分、自分の選択が直接プロジェクトに反映されるため、サービスがリリースされた時の達成感は格別です。もちろん、困った時はすぐに相談できる環境があり、先輩方も的確なアドバイスやサポートをしてくださるので、安心して挑戦できています。

 

入社して変わったこと

 入社する前の私のプログラミング経験は、競技プログラミングハッカソンなど、「早く動く」ことを念頭に置いたものが多かったです。目の前の課題をいかに効率良く解決するか、といった短期的な視点での開発が中心でした。

 しかし、エムスリーキャリアに入社してからは、保守性や可読性・拡張性といった概念や、人の書いたコードを読んで意図を理解する能力も非常に重要であることを痛感しました。

 そこで、業務後の空いた時間にGitHubで色々なOSSオープンソースソフトウェア)のコードを読み、アーキテクチャや抽象化の工夫を学ぶことを日課として行うようにしました。

 そのおかげでエンジニアとしての視点が大きく広がり、プロダクト開発に単に「早く動かす」から「長く使える、メンテナンスや機能追加のしやすいものを作る」という視点を持つことができ、個人で行っている開発にもその視点が活かされるようになったのを実感しています。

最後に

 この4ヶ月で、私自身のエンジニアとしての視野とスキルは大きく広がったと実感しています。これからもエムスリーキャリアの事業に貢献できるエンジニアを目指し、新しい技術にも積極的に挑戦していきたいです。

 私たちエムスリーキャリアのチームやエンジニアリンググループに少しでも興味を持っていただけましたら、ぜひ下記の採用ページをご覧ください!

https://career.m3career.com/midcareer/engineer