株式会社ヘンリー エンジニアブログ

株式会社ヘンリーのエンジニアが技術情報を発信します

入社オンボーディング「病院ごっこ」で体感した病院の複雑さ

4月に入社したてホヤホヤエンジニアのこん(@k0n_karin)です。入社後3日間のオンボーディングで「病院ごっこ」というヘンリーならではのプログラムを体験させていただいたので、病院ごっこで実際に何をしたのか、そしてそれを通して感じた「病院業務の難しさ」と「それを日々回している医療従事者のすごさ」を、入社直後の視点で書いていきます。

本記事がヘンリーや医療ドメインに興味を持つきっかけになれば幸いです。

ヘンリーは何をしているか?

病院ごっこの前に、まずは簡単にヘンリーの紹介をします。

株式会社ヘンリーは、病院向けの基幹システムとして、電子カルテとレセプトコンピューター(会計・請求システム、通称レセコン)を開発・提供している会社です。提供している「Henry」は、電子カルテとレセコンが一体になった病院向けの業界唯一のクラウドネイティブ型のマルチテナントシステムで、病院業務のDXを進めることを目指しています。 (なお、医療機関には大きく「クリニック(診療所)」と「病院」があります。病院は入院(病棟)がある分業務フローが増え、多職種連携や会計・請求も複雑になりやすいのが特徴で、ヘンリーが向き合っているのはまさにこの領域です。 )

入院の業務フローの複雑さがとてもわかる図

背景として、日本の医療は制度と業務が複雑で、会計・請求の仕組み(診療報酬制度)に強く依存します。そのため中核のレセコンは更新が難しく、20年以上前に作られたシステムが主流になってきました。医療システムはオンプレ中心で、クラウドでも病院ごとに専用環境を用意する形が多く、マルチテナント型のシステムが前提になりにくい領域でした。

ヘンリーはここに対して、スタートアップとして「自社でレセコン一体型電子カルテを作る」ところから挑戦し、クラウドネイティブならではの継続的な改善を医療現場に提供しています。「社会課題を解決しつづけ、より良い世界をつくる」をミッションに、難易度の高い医療領域に向き合っているのがヘンリーです。

ヘンリーは中小病院向けで唯一のクラウドネイティブなレセコン一体型電子カルテプレーヤー

病院ごっことは?

名前は「ごっこ」ですが、中身はかなり本気で、病院の実際の業務フローを一通りなぞりながら、Henryをご利用いただいている医療現場のお客様を本気で理解するプログラムです。

病院ごっこ当日の様子

病院ごっこで登場するロール

すべてのロールを説明しているとキリがないため、ここでは一部を列挙するだけにします。

  • 医師
  • 看護師
  • 医療事務
  • 薬剤師
  • 臨床検査技師
  • 放射線技師
  • 管理栄養士・栄養士
  • リハビリセラピスト
  • 医療ソーシャルワーカー

そして、それぞれのロールが医師の指示(オーダー)を受け、患者に様々な医療行為をします。

実際の病院では、上記以外にも多数のロールが登場し、それぞれのロールが患者に対し医療行為を行うため、ロールの数だけオーダーも増え難しくなります。またオーダーの種類の多さもさることながら、多くのロールが国家資格を有するため、オーダーの内容も非常に専門性が高くなっています。

エンジニアとしては、患者情報や各種オーダーをどのようにモデリングし、どのロールが見てもわかりやすいようなUIを表現できるか、に思いを馳せていました。

病院ごっこで体験した業務フロー

8種類の業務フローに取り組みました。

  • 外来(初診)
  • 外来(再診)
  • 入院準備〜入院当日
  • 入院中のあれこれ
  • 転棟・退院
  • レセプト業務
  • 外来のリハビリテーション
  • 入院のリハビリテーション

外来の受診はほとんどの人が患者として経験したことがあると思いますが、患者からは見えない入院時の業務やレセプト業務は想像しづらかったです。

一例として、特に難しい入院準備〜入院当日のフローを紹介します。一人の患者が入院するシナリオがこのようになっています。

入院準備〜入院当日のフロー

かなり詳細を省いて簡略化していますが、これでも一人の患者が入院するためのプロセスが多いことがわかります。またそれぞれのステップで確認・入力する内容が専門的で量も多いです。

このフローを二人一組でペアを組んでいくつかのロールを担当して、Henry上で操作していきます。すべて完了するまでに2時間以上かかり、その難易度の高さからみんな頭を抱えていました。

頭を抱える新入社員

また、レセプト業務という言葉はあまり聞き馴染みがないかもしれません。

医師が各ロールに対しオーダーを出し、オーダーに従って様々な医療行為を行います。この医療行為に対して診療報酬が発生します。皆さんも医療機関を受診した際に会計で受け取るこういう紙です。

診療報酬が書かれた請求書

診療報酬は1点=10円で計算され、この診療報酬が病院の収益の源泉となっています。診察した際には患者の健康保険に応じて総額の1〜3割程度を請求し、残った金額は後日まとめて審査支払機関に申請して受け取る必要があります。 審査支払機関に提出するデータ(レセプトデータ)は当月の全患者分の診療報酬の明細をまとめ、翌月10日までに提出する必要があります。休日・祝日・年末年始は考慮されません(!?)。 提出したデータが審査され、受理されれば翌々月に支払われます。もし、提出したレセプトデータに不備があると返戻(へんれい)され、修正して再提出しなければなりません。

レセプト業務の流れ

さらに診療報酬のルールはこれくらい厚みがある上に、2年に一度改定があります。

診療報酬のルールの厚みがわかる図

これだけでレセプト業務がいかに難しいかわかりますね。これを知ってから、医療機関に行った際の業務や会計の見え方がかなり変わりました。

病院ごっこで感じたこと

病院ごっこを通して病院内の業務フローを体感できたのはもちろんですが、やはり業務の難しさが非常に印象的でした。難しい上に、患者さんをケアしながらカルテの記載などの事務作業も並行する必要があることを知り、医療従事者の方々の日々の業務がいかに大変かを実感できました。

ロールによって電子カルテとは別の専門システムなども操作する必要があり、薬剤師なら調剤システム、放射線技師ならPACS(医用画像管理システム)など、この他にも多種多様なシステムが存在します。それらと電子カルテを連携させることを前提に開発する必要性も知りました。同時にヘンリーでは、患者さんのケアを妨げず、どんなロールでもスムーズに操作できるプロダクトを提供する必要があります。複雑な業務フローをいかにシンプルで簡単な体験として提供できるかをこれから考え続け、理想の状態を目指して開発していきたいと感じました。

また、レセプトに関わる業務は、さながらエンジニアリングのデバッグのような難しさを感じました。行った医療行為や患者の疾病に対して、分厚いルール本を読み解き適切な診療報酬を請求する中で、ときには過不足がある状態や誤ったレセプトになることもあります。誤ったレセプトで返戻が多発すると、病院の資金繰りが悪化するため、レセプトは病院の経営に直結しています。社内で過去に医療事務の経験がある方もおり、レセプト業務は「宝探しみたいで楽しい」と表現される方もいらっしゃるようでした。

レセプトのさらに難しいところは、公費の存在です。患者への請求は健康保険の種別や自治体ごとの公費によって支払い額が決まります。 公費は、国や地方自治体から補助される制度で、わかりやすいもので言うと国の指定難病の医療費助成や東京都の乳幼児や子どもの医療費助成です。この公費は国や都道府県のレベルだけでなく、市区町村のレベルで独自の制度を持っています。全国の市区町村の総数を考えると、恐ろしく膨大な量のルールになりそうです。

ここまでの内容はヘンリーが扱う難しさのごく一部で、これ以外にも様々なところで医療ドメイン特有の難しさがあるそうです。震えますね。医療ドメインのキャッチアップはまだまだかかりそうです。こういった難しさと向き合う中で、社内ではBiz・Dev問わず、実際にHenryを導入いただいた病院や導入前の病院に見学に行き、ヒアリングや検証を行って顧客理解を深めています。

おわりに

このように、病院の業務は複雑かつ多種多様で、膨大な知識量が求められます。人一人ではとてもカバーしきれず、昨今の生成AIでも簡単に解決できるものではありません。本記事を読んで、ヘンリーに興味を持ってくれた人はぜひ勉強会やカジュアル面談でお話しましょう。

jobs.henry.jp

Claude Code Marketplaceを使ったSkillのチーム展開とPlugin化の恩恵

株式会社ヘンリーでソフトウェアエンジニアをしているwarabiです。

今回はClaude Code Skillを社内に展開する際に選択したClaude Code Marketplaceの導入と、SkillのPlugin化による副次的な恩恵についてお話しします。

背景

ヘンリーの業務でClaudeCodeを今よりもっと活用するために、開発業務を全自動で行うOrchestrator型Skillの作成と、Skillのチーム展開に関する課題整理をこれまで行ってきました。

それぞれ詳細は以下のブログにまとめてあります。

チーム展開の課題を整理した結果、チームSkill展開について以下の方針を取りました。

個人SkillとチームSkillは別で管理する

Skillはdotfilesやエディタ設定と同じく、個人の作業効率を高めるための環境構築の一部として考える。

各自はSkillという個人の環境を改善していき、そのうえで作られたSkillや知見をチームに還元する。

チームに展開する汎用SkillはStarter Kitの位置づけにし、利用するかどうかは任意とする

Skillの作成についてはまだ十分な知見が溜まっていない。この状態でSkillの利用を必須とすると、どう更新していくか意見の衝突が起きやすくなりSkill作成・更新の停滞に繋がりかねない。

チームSkillは「Starter Kit」の位置づけにし、自身のSkill環境が用意できていない人向けの出発点とする。

方針が固まったので、今回はこのStarter Kitを具体的にどうやってチームに届けるかを考えます。

Claude Code Marketplace

結論から言うと、Claude CodeのMarketplace機能を使いSkillのチーム展開を行いました。

Claude Codeは公式のMarketplaceから様々なPluginが展開されており、利用者は好きなPluginを選択することで便利なSkillを簡単に導入することができます。

Figma, Linearなど外部サービス連携や、skill-creatorのような便利系など様々なPluginが公式から提供されています。

このMarketplace機能ですが、公式のMarketplaceだけでなくGitHubリポジトリを使うことで各自がMarketplaceを簡単に作成することができます。

Marketplaceとして認識させるために必要な設定ファイル、およびPluginフォルダを含めることでGitHubリポジトリをMarketplaceとして扱うことができます。

Marketplaceの登録もコマンド1発で済みます。

/plugin marketplace add [organizaion-name]/[repository-name]

設定ファイルなど詳細については公式ドキュメントを参考にしてください。

https://code.claude.com/docs/ja/plugin-marketplaces

補足説明: Pluginについて

新しくPluginというワードが出てきましたが、これは複数Skillや複数Agentなどを纏めて管理する単位と思っていただければ大丈夫です。

marketplace/plugins
├── github-pr // GitHub操作に関するSKillをまとめたplugin
│   └── skills
│       ├── review-pr
│       │   └── SKILL.md
│       └── triage-github-pr-comments
│           └── SKILL.md
├── dev-workflow // 開発系Skill,Agentをまとめたplugin
    ├── agents
    │   ├── create-pr-agent.md
    │   ├── ...
    │   └── triage-review-agent.md
    └── skills
        ├── dev
        │   └── SKILL.md
        ├── ...
        └── plan-implementation
            └── SKILL.md

Skill, Agentの他にもhooksやsettingsの管理なども行えます。

https://code.claude.com/docs/ja/plugins

Marketplaceの利点

Marketplaceを使ったSkillのチーム展開にはいくつかの利点がありました。

GitHubでのSkill管理の流れと整合する

チーム管理とするStarter Skillは公開後もPullRequestが送られて成長していくことを前提としており、1つのリポジトリで管理する想定でした。

リポジトリをそのままMarketplaceとして登録できる機能はこの想定と合致しています。

自動更新機能がある

これまでのSkill作成の経験から、Skillは一度作ったら終わりではなくそこから育てていくものと私は認識しています。

定期的にSkillの更新を行う場合、その度にSkillを利用するメンバーに毎回手作業での更新を促すのは全員にとって手間があり現実的ではありません。

その点Marketplace機能は登録したリポジトリを監視する機能があり、更新があれば自動で各自の環境に反映をすることができます。

利用するPluginを取捨選択できる

Starter Kit自体を利用する・しないの判断は各自に任せていますが、Marketplace機能を使うとStarter Kitの中でも更に必要なPluginを選択してインストールできます。

またSkill開発者目線でも、利用者への影響を気にせず新しいPluginをMarketplaceに追加できる利点もあります。

これらMarketplaceが持つ機能の恩恵もあってチームへのSkill展開がアナウンスや勉強会での紹介だけで済み、想像より簡単に浸透させることができました。

Skillを直す時もPullRequestをマージすれば各自の環境に自動更新されるためアナウンスも不要となり、導入だけでなくSkill改善のコストも低くおさえることができています。

他に検討した案

Marketplaceの他に、いくつか検討した案についてそれぞれ見送った理由を書いておきます。

案1: 開発本体のリポジトリにSkillとして配置する

ヘンリーの開発環境はモノレポではなく、複数のリポジトリに同じSkillを配置する必要が出てきます。更新の同期が破綻する未来が見えていたので候補から外しました。

案2: ローカルの ~/.claude にcloneする

  • ~/.claude には他のClaude設定ファイルが既に存在しており、それらを除外する手間がかかる
  • 最新版を取り込み直すたびにgit pullが必要になる
  • pushしたくないローカル専用のSkillとコンフリクトする可能性がある

設定ディレクトリに配布物を混ぜること自体に抵抗を感じたというのが正直なところです。

案3: MDMを使った配布

Skillを配りたいだけの目的に対して仕組みが大げさすぎました。管理の複雑さも増すため候補から除外。

Marketplaceによる副次的な恩恵

またチームへの展開手段とは別で、Skill開発者向けの大きな利点がMarketplaceにはありました。

それは、Plugin化によるフォルダの整理です。

PluginによってSkillの境界を引ける

現状のClaude Codeでは単純にSkillを作成・管理する場合 ローカルの~/.claude/skills やプロジェクトの .claude/skills にフラットに配置する構造になります。

Skillの数が少ないうちはあまり問題になりませんが、Skillを作り込んでいくうちにその数は確実に増えていきます。

特にOrchestratorSkillのように親Skillが子Skillを呼び出す構成では、一つのワークフローに対して複数のSkillファイルが必要となります。今後もSkillを作り続けると、100を超えるSkillがフラットに並ぶ日も来るかもしれません。

この問題にMarketplaceのPluginという単位が効いてきます。関心事によってPluginを分けられるため、1つのPluginに含まれるSkill数を抑えつつ、全体の整理もつけやすくなります。

ローカル管理の場合(フラットな配置)

.claude/
├── agents
│   ├── create-pr-agent.md
│   ├── implement-agent.md
│   ├── plan-agent.md
│   ├── plan-review-agent.md
│   ├── review-agent.md
│   ├── triage-agent.md
│   ├── triage-execute-agent.md
│   └── triage-review-agent.md
└── skills
    ├── check-updates
    │   └── SKILL.md
    ├── create-plugin
    │   └── SKILL.md
    ├── create-pr
    │   └── SKILL.md
    ├── dev
    │   └── SKILL.md
    ├── implement
    │   └── SKILL.md
    ├── improvement
    │   └── SKILL.md
    ├── linear-manage
    │   └── SKILL.md
    ├── linear-triage
    │   └── SKILL.md
    ├── linear-triage-execute
    │   └── SKILL.md
    ├── linear-triage-review
    │   └── SKILL.md
    ├── lint-settings
    │   └── SKILL.md
    ├── memory-manager
    │   └── SKILL.md
    ├── plan-implementation
    │   └── SKILL.md
    ├── retrospective
    │   └── SKILL.md
    ├── review-lint-rules
    │   └── SKILL.md
    ├── review-pr
    │   └── SKILL.md
    └── slack-notify
        └── SKILL.md

Marketplace管理の場合(Plugin化による整理)

marketplace/plugins
├── dev-workflow
│   ├── agents
│   │   ├── create-pr-agent.md
│   │   ├── implement-agent.md
│   │   ├── plan-agent.md
│   │   ├── plan-review-agent.md
│   │   ├── review-agent.md
│   │   ├── triage-agent.md
│   │   ├── triage-execute-agent.md
│   │   └── triage-review-agent.md
│   └── skills
│       ├── create-pr
│       │   └── SKILL.md
│       ├── dev
│       │   └── SKILL.md
│       ├── implement
│       │   └── SKILL.md
│       ├── linear-manage
│       │   └── SKILL.md
│       ├── linear-triage
│       │   └── SKILL.md
│       ├── linear-triage-execute
│       │   └── SKILL.md
│       ├── linear-triage-review
│       │   └── SKILL.md
│       └── plan-implementation
│           └── SKILL.md
├── github-pr
│   └── skills
│       ├── review-pr
│       │   └── SKILL.md
│       └── triage-github-pr-comments
│           └── SKILL.md
├── retrospective
│   └── skills
│       ├── improvement
│       │   └── SKILL.md
│       └── retrospective
│           ├── SKILL.md
│           └── template.md
├── sentry-triage
│   ├── agents
│   │   └── sentry-investigate-agent.md
│   └── skills
│       ├── sentry-investigate
│       │   ├── SKILL.md
│       │   └── template-result.md
│       └── sentry-triage
│           └── SKILL.md
└── slack-notify
    └── skills
        └── slack-notify
            └── SKILL.md

dev-workflowには開発フロー全体のSkillが、github-prにはPRレビュー関連が、といった具合に関心事で区切られています。フラットなskillsフォルダに全部を並べていた頃と比べると、どのSkillがどの文脈に属するのかが構造として表現されるようになりました。

Skill同士の依存関係が組めるわけではなくSkillの記述次第ではPluginの境界を越えた呼び出しも行えてしまうため、これはあくまでファイル整理上の利点ではあります。ただ、フラットに置くことしかできなかったSkillにPluginという1段区切りを設けることができるのは、Skill開発者にとって大きなメリットとなります。

おわりに

Claude Code Marketplaceを導入したことで、Skillのチーム展開における配布と更新の課題をシンプルに解決できました。GitHubリポジトリとの親和性が高く、既存の開発フローに自然に組み込むことができています。

そして当初は配布手段として検討したMarketplaceでしたが、Plugin単位でSkillの境界を引けるという副次的なメリットも得られました。Skillの数が増えるほど、この整理の恩恵は大きくなると感じています。

フルリモートでも“ワンチーム”だった。入社1ヶ月エンジニアが語るヘンリーの魅力

今年の3月にヘンリーにジョインしました、フロントエンドエンジニアの昆野(@238_k_)です!現在は電子カルテを作るチームでお医者さんや病院スタッフがオーダーをやり取りする機能などを作っています。

本記事では、入社して1か月経った私が感じるヘンリーの魅力をエンジニアの視点から紹介します。フルリモートなのにお互いの理解度が高いこと、質の高いオンボーディングで新しいメンバーから元々いるメンバーまで会社が一つのチームとなって難しい課題を解決していることなど、たくさんの魅力がありました。

自己紹介

私はフロントエンド専門の受託制作会社でキャリアをスタートし、自動車業界のソフトウェアエンジニアを経たのちにヘンリーにジョインしました。もともとは動きのあるコンテンツが大好きで、インタラクティブなコンテンツやアニメーション、3Dといった案件を中心にこなしてきました。

転機となったのはある大規模案件に携わったときでした。100人近くの人が関わる大規模なプロジェクトに参加して複雑なアプリケーションを作る中で、一つの画面やUIのような短い時間のユーザー体験だけでなく、より広く長い時間軸でのユーザー体験というものに興味を持ち、システムや設計といった目に見えないデザイン領域にも興味をもつようになりました。

そんな折、去年の9月に転職サイト経由でカジュアル面談に誘われヘンリーを知りました。実はそれまでヘンリーを知りませんでしたが、話す中でよりよい社会を作ろうという燃える理想をひしひしと感じました。世の中の不便や苦しみを解消する仕事に自分もエンジニアとして加わって、より使いやすいソフトウェアを作るお手伝いをしたいと思いました。

その後、ありがたいことに内定をもらって今年の3月、晴れてジョインすることとなりました。

入社して感じたヘンリーの魅力

実はヘンリーの入社前後で印象は大きくは変わっていません。ヘンリー理想駆動ラジオで中の人たちの生の声を聞けたのが大きかったと思います。仕事の楽しいことや難しいこと、ヘンリーという会社の空気などリアルな話を聞けます。ヘンリーに興味を持っている人はぜひ聞いてみてください。

また、Henry Engineer Meetupなどの勉強会で実際にお話してヘンリーのことを根堀り葉掘り聞けたのもヘンリーの理解を深めるうえで役に立ちました。こちらもぜひ参加してみてください。

ヘンリーの人

入社前から、ヘンリーは「感じのいい人」が本当に多いという印象をもっています。これは入社を決めた一番の決め手でもあります。

面接でも勉強会でもいろんなコミュニケーションが心地よく、お互いに思いやりをもって接してる会社だなぁというのはずっと感じています。「コミュニケーションの質が高い」と表現したら、社内でも共感してくれる人が多くいました。

また、部署を問わず人と人との距離が近いので、会社の目標や戦略が入社1か月の私でも明確に見えているのは入ってから驚いたことの一つでした。フルリモートの会社だからこそ、コミュニケーションをしっかり取っているのが理由かもしれません。今のプロダクトの状態ややるべきことがなぜこうなっているか、それぞれはっきりと根拠があります。

さらに、例えば営業チームが良い成果をあげたときは開発も企画も関係なく盛り上がるように、部署の垣根なく一つのチームで仕事ができているのはヘンリーに入ってよかったと心から思える理由のひとつです。

ヘンリーの仕事

医療ドメインの難しさや病院業界の課題は「病院ごっこ」と呼ばれるオンボーディングなどの中で解像度高く理解できました。他にも、部署ごとに部署の紹介をする時間を毎日取ってくれたりと、ヘンリーのオンボーディングは本当に充実していてすごいです。

入社一ヶ月ではまだ開発の中で複雑さを感じる場面はそれほど多くありませんが、過去のドキュメントやコードを読み漁ると、何度も試行錯誤して解決してきた様子が読み取れます。きっと私も数カ月後には複雑さに直面してヒーヒー言っていることでしょう。

また、ヘンリーの開発は積極的にClaude CodeやCodexといったAIエージェントを活用しており爆速で開発が進められています。入社一ヶ月の私でもバリバリ機能開発して戦力と呼んでもらえるのはAIのおかげです。もうなかった時代には戻れない。

開発速度が上がったおかげでエンジニアもQAに携わったり振り返って改善する時間が増え、より品質を上げる取り組みができるようになりました。

ヘンリーのチーム

ヘンリーでは少人数のチームを組んで開発をしています。チームにはエンジニアだけでなく、デザイナー、QA、プロダクトオーナーなどがいて、わいわい話しながらスクラムを回しています。

スクラムイベントは目的を持たないとあっという間に形骸化することが多いですが、ヘンリーでのスクラムはなんというかすごく「ちゃんとアジャイルをやって」いました。

スプリントレトロスペクティブで出たTryはその日から実践され、翌週の振り返りで効果を話し合って微妙だったらやめるという実行力とスピード感は今まで経験したことのないものでした。例えばレビュー依頼を積極的にしようというTryが出た週はその直後から実践され、ちょっとしたレビューも依頼しやすくなる空気が生まれました。

どうすればもっといい開発ができるかみんなが考えているチームだからこそできることだと思います。

これからの私

ヘンリーのプロダクトはまだまだ成長期なのでやることはゴマンとあります。その中で私がやっていくことは、まずは病院現場でどんな仕事が行われているのか、そのプロセスをより詳細に理解すること。そして今後Henryを導入いただく病院に必要な機能を作っていくことです。

AIエージェントの進化によって機能を作るハードルはかなり下がりました。フロントエンドエンジニアの私でも簡単なバックエンドの実装ならできるほどです。その一方で、「何を作るか」だったり「使いやすさ」みたいなものはユーザーの声を聞き、人間が考えなくてはいけません。

病院現場の人が真に使いやすい、手触りのいいプロダクトを作れるフロントエンドエンジニアとして今後も精進していきます。

おわりに

燃える理想を掲げる仲間を募集しています!本記事を読んで、ヘンリーに興味を持ってくれた人はぜひ勉強会やカジュアル面談でお話しましょう。

jobs.henry.jp

HenryにおけるCREとは何か - 信頼性を仕組みで積み上げる部門をつくる

株式会社ヘンリーでVP of Productを務めている縣です。

この記事では、ヘンリーが2026年4月に新設するCRE部(Customer Reliability Engineering)について、なぜこの部門が必要なのか、ヘンリーにおけるCREの定義とは何か、そしてどんな人と一緒にこの部を立ち上げたいのかをお伝えします。

Customer Reliability Engineering

CRE (Customer Reliability Engineering)という言葉を聞いたとき、多くのエンジニアが思い浮かべるのは、Googleが2016年に提唱したCREではないでしょうか。

GoogleのCREは、SRE(Site Reliability Engineering)の考え方を顧客向けに拡張した概念で、SLO/SLIやエラーバジェットをベースに顧客のシステム信頼性をプロバイダーと共同で管理するというものです。一方、日本のSaaS企業では、CREを「問い合わせ起点で技術的な調査を行い、開発チームへエスカレーションする組織」や「カスタマーサポート・カスタマーサクセスの業務効率化のための開発組織」として運用しているケースなど、各社それぞれの形があります。

このように、CREという言葉が指す責務の範囲は企業によってかなり幅があります。この記事では、ヘンリーがCREをどう定義し、何を担う組織として立ち上げたのかを明確にしたいと思います。

ヘンリーのプロダクトが持つ特殊性

ヘンリーが提供しているのは、クラウド型の電子カルテ・レセコンシステムです。医療業界は法令規制と業務の複雑性・専門性が極めて高い領域で、プロダクトを「使えるようにする」までのプロセスが、一般的なSaaSとは桁違いに重いという特徴があります。

たとえば、提供する医療の種類が異なる病院ごとに合わせた設定作業、既存システムからのデータ移行、導入後の保守改善。これらはプロダクトの機能開発とは別のレイヤーにある仕事ですが、ここが崩れると顧客は安定して価値を受け取れません。

また、機能開発の観点でも課題があります。電子カルテ・レセコンは機能の面が広大で、開発チームのキャパシティで全ての面をカバーし続けることは現実的に難しい。どうしても手が回りにくい機能が生まれ、そこに信頼性を下げる要因が溜まっていきます。こうした問題を放置せず潰していくには、意識的に仕組みを設計しなければ達成できません。

つまり、ヘンリーにとっての「信頼性」は、システムの稼働率やレスポンスタイムだけでは語れない。導入、設定、移行、保守改善まで含めて、顧客が安定して成果を出せる状態をつくること、それが僕たちの考える Customer Reliability です。

なぜ今、専門の部門が必要なのか

これまでヘンリーでは、こうした顧客に近い運用業務を専任の小さなチームと、電子カルテや医事会計を開発するエンジニアが兼務的に支えてきました。プロダクトの成長初期にはそれでも回っていましたが、導入病院数が増え、中小病院への展開を本格化するフェーズに入ると、いくつかの構造的な課題が顕在化してきました。

ひとつは、属人化です。設定やデータ移行のノウハウが特定の人に集中し、その人がいないと案件が進まない。もうひとつは、開発部門の余力の圧迫です。プロダクト開発を担うエンジニアが、本来注力すべき新規開発ではなく、導入・保守に近い運用業務に時間を取られてしまい、機能拡充の速度が出せない状態になっていました。

これらを個々の工夫で乗り越え続けるのは限界があります。だからこそ、顧客に近い運用を属人的な対応で終わらせず、再現可能な仕組みに変えることや製品に還元することを専門で担う部門が必要だと判断しました。

HenryのCRE部が担うこと

CRE部のミッションを一言で表すなら、「顧客に近い運用で見つかる課題を、プロダクトと運用の両面から再現可能な仕組みに変える」ことです。

具体的には、以下のような領域を担います。

  • Henry の導入を効率化するためのエンジニアリング的サポートや業務フロー設計
  • 設定やデータ移行といった、製品オンボーディングの効率化のための製品開発
  • 顧客からの声の収集と、それに応じた製品改善

逆に、CRE部が担わないことも明確にしています。プロダクトの新規機能開発に関しては他部署にフルサイクルな形で託し、責任者や完了条件が曖昧な依頼・機能領域をそのまま引き受ける「何でも屋」にはなりません。責務を明確にすることで、CRE部も他部署もそれぞれの領域に集中できる状態をつくることが、組織設計上の最も大事なポイントだと考えています。

「問い合わせ対応」を超えて、再発しない仕組みをつくる

ヘンリーのCRE部では、問い合わせ起点で顧客の課題に触れることも当然あります。ただし、それを一時的な解決で終わらせず、根本的な解決につなげるところまでをCRE部の責務として位置づけています。 そして、解決手段の中で最も優先度が高いのはプロダクトの改善です。運用手順や運営モデルを整備することも重要ですが、そもそもプロダクト側で解決できるなら、それが顧客にとっても組織にとっても最も良い形です。ヘンリーのCRE部が目指すのは、顧客に近い運用の中で見つかった課題をプロダクトの改善として還元し、同じ問題が起きない状態をつくる組織です。

CRE部のエンジニアを募集しています

CRE部は立ち上がったばかりの組織です。やるべきことは山ほどあるのに、まだまだ人が足りていません。 元々この領域に取り組んでいた数名のメンバーも引き続きCRE部として活動予定ですが、事業の状況から逆算した本来的に成し遂げたい責務に対しては、純粋にリソースが不足しすぎている状況です。

CRE部のエンジニアには高いエンジニアリングスキルが求められます。Henryは電子カルテ・レセコンという広大なドメインをカバーするプロダクトであり、CREはその機能や実装を俯瞰的に把握したうえで、必要があれば自ら修正を加えていくことが求められます。単一の機能を開発するのとは異なる難しさがあり、プロダクト全体を横断的に見る力が必要です。

裏を返すと、CRE部は電子カルテ・レセコンという広大なドメインに対して最速で俯瞰的な視点を得られる部署だと考えています。将来的にはCRE部と他の開発部門との交換留学や異動を通じて、相互の知識と経験を融合させていくことも視野に入れています。

加えて、新設の部門をゼロから一緒につくるフェーズなので、エンジニアリングだけでなく、責務定義や運営モデルの設計、チームづくりにも関わることになります。顧客に近い運用とプロダクト開発側の制約の両方を見ながら、事業に直結する仕組みを作る。エンジニアリングと組織づくりの両方に手を伸ばしたい人にとって、面白い環境だと思います。

僕たちが一緒に働きたいのは、曖昧な責務境界を放置せず構造化できる人、現場の泥臭さを理解しつつ属人運用を仕組みに変える意思のある人、そして部門最適ではなく事業全体にとっての優先順位で意思決定できる人です。

おわりに

CRE部はまだまだ立ち上がろうとしている段階の組織です。ここに書いたことも、今時点で考えていること・狙っている方向性であり、今後ヘンリーにおけるCREの定義自体も変化していくと思います。

それでも、僕たちが向き合っている課題感、つまり医療という複雑なドメインで導入から保守改善まで含めた「顧客が安定して成果を出せる状態」を再現可能な形で作り続けたいという方向性が少しでも伝わっていれば嬉しいです。

この挑戦に興味を持っていただけた方は、ぜひカジュアル面談でお話ししましょう。

hrmos.co

Claude Codeでドメインエキスパートを育てる ── 解体新書自動生成Pluginの設計と実践

はじめに

株式会社ヘンリーでソフトウェアエンジニアをしているUGAです。

ヘンリーでは電子カルテ・レセコン一体型のクラウドサービス「Henry」を開発しています。

医療ドメインのプロダクト開発では、コードの複雑さだけでなく、その背景にある医療ドメイン知識の複雑さが大きな壁になります。

この記事では、Claude Codeを使ってコードベースから体系的な技術ドキュメント「解体新書」を自動生成するClaudeCodePluginを開発した話を紹介します。単なるドキュメント自動化の話ではなく、ドメインエキスパートAIをチームで育てるというビジョンに基づいた取り組みです。

きっかけ

ヘンリーの開発では、ドメインが複雑であるが故に、日常的にSlackで他のメンバーに質問のメンションを飛ばし、返事を待ち、回答をもらってようやく作業に取りかかるというやり取りが少なくありませんでした。これは聞かれる側も自分のタスクを中断して答える必要があり、双方にとってコストの高いやり取りでした。

コードを直接読みに行くこともできますが、医療ドメインのコードは「何をしているか」は読めても「なぜそうなっているか」が分からないことが多いです。結局、ドメイン知識を持った人に聞くしかない場面に戻ってきます。この状況をどうにかできないかと、ずっと考えていました。

複雑なドメイン開発の難しさ

医療ドメインに限らず複雑なドメイン開発では、以下のような問題があります。

  • 知識の属人化: 「入院フローのことならAさん」「コスト連携ならBさん」と、特定のメンバーに知識が集中する。その人が異動や休暇になると、チームの開発速度が目に見えて落ちる
  • 新メンバーのオンボーディングコスト: コードベースを読んでも全体像が掴めず、既存メンバーへの質問に頼らざるを得ない。
  • 繰り返される一からの調査: 知りたいことだけをClaude Codeでコードベースを都度調査しても、同じ領域を何度も探索することになる。調査結果は個人のコンテキストに留まり、チームの資産にならない

散発的にドキュメントを残したりして対処しようとしても、コードと乖離してしまうことがほとんどです。コードベースと連動した体系的な知識基盤が求められます。

ドメインエキスパートをチームで醸成する

そんな中、同僚がClaude Codeのプロンプトを調整しながら一部機能の技術ドキュメント(後に「解体新書」と呼ぶもの)を作成しているのを見ました。コードベースを体系的に調査し、ドメインモデルやデータフロー、設計判断の背景までまとめたドキュメントです。その成果物を見て、これをチームで育てるのはどうだろうかと考えました。

ただし、個人のプロンプト作業では、品質にもバラつきが出てしまいます。そして何より、特定の人しか生成できないという属人化の問題がそのまま残ります。

そこで、この取り組みをSkill/Plugin化し、誰でも同じ品質のドキュメントを生成・活用・改善できる仕組みにすることにしました。

Pluginの全体構成

今回作成したプラグイン(henry-anatomy-skills)は、Henryプロダクトの各機能領域をコードベースから調査し、体系的にまとめた技術ドキュメント(解体新書)を作成・検索できるようにしたものです。2つのPlugin(search / editor)から構成されています。

ディレクトリ構成

henry-anatomy-skills/
├── .claude-plugin/
│   └── marketplace.json         # マーケットプレース定義
├── plugins/
│   ├── henry-anatomy-search/    # 分析・検索系プラグイン
│   │   ├── .claude-plugin/
│   │   │   └── plugin.json
│   │   ├── docs/                # 解体新書ドキュメント
│   │   │   ├── injection-order-anatomy/
│   │   │   ├── cost-sync-anatomy/
│   │   │   ├── hospitalization-anatomy/
│   │   │   ├── out-of-hospital-anatomy/
│   │   │   └── auto-print-anatomy/
│   │   ├── skills/
│   │   │   └── search-anatomy/
│   │   └── README.md
│   └── henry-anatomy-editor/    # 作成・更新系プラグイン
│       ├── .claude-plugin/
│       │   └── plugin.json
│       ├── skills/
│       │   ├── generate-anatomy/
│       │   └── revise-anatomy/
│       └── README.md
└── README.md

各解体新書の構成

henry-anatomy-skills/plugins/henry-anatomy-search/docs 配下の各解体新書は共通の構成に従います。

{topic}-anatomy/
├── 00-index.md              # 目次・概要・読み方ガイド
├── 01-overview.md           # 全体像
├── 02-xxx.md〜              # 各章
└── appendix/
    ├── glossary.md          # 用語集
    └── important-files.md   # 重要ファイル一覧

なぜドキュメントをpluginに同梱したのか

ドキュメントの置き場所には他にも選択肢がありました。notionやconfluenceのようなドキュメントツールに置く方法、プロダクトのリポジトリに同梱する方法、あるいは専用のドキュメントリポジトリを用意する方法です。

それらではなくpluginへの同梱を選んだのは、解体新書の最大の利用者がclaude codeであるということに基づいています。search-anatomyスキルがドキュメントを検索して回答する際、ファイルがローカルにあればそのまま読めます。外部サービスにドキュメントがあると、api経由での取得が必要になり、レイテンシや認証の問題が生じます。

また、githubでバージョン管理されることで、解体新書の変更履歴がコードと同じワークフローで追跡できます。PRでレビューでき、誰がいつ何を変えたか分かるので透明性が得られます。

Pluginの設計:3つのSkillで回すサイクル

このPluginは、3つのSkillで「生成 → 活用 → 改善」のサイクルを回す設計になっています。

generate-anatomy:コードベースから解体新書を生成

/generate-anatomy 注射オーダー のようにトピック名を指定すると、コードベースを自動で調査し、解体新書を生成します。

内部はマルチエージェント構成で、以下のステップで動作します。

  1. 並列コードベース探索: バックエンド・フロントエンドそれぞれの探索エージェントが並列に起動し、ドメインモデル、DB設計、APIエンドポイント、画面構成などを徹底的に調査する
  2. 章立て計画: 探索結果をもとに章構成を設計し、セルフレビューの後にユーザーの承認を得る
  3. 章ごとの執筆: 計画に沿って各章を順に執筆する
  4. セルフレビュー: 生成後にコードとの整合性・網羅性・一貫性をチェックする

revise-anatomy:フィードバックに基づく修正

/revise-anatomy ADLの説明がない --anatomy cost-sync のように、自然言語のフィードバックで修正を依頼できます。

修正の際にはコードベースと突合し、ドキュメントの記述が実装と合っているかを検証します。フィードバックに基づく修正だけでなく、突合の過程で発見した乖離も合わせて修正するため、ドキュメントの鮮度が自然と保たれます。

search-anatomy:解体新書の横断検索

/search-anatomy 注射オーダー 診療科 のようにキーワードを指定すると、複数の解体新書を横断的に検索し、関連情報を統合して回答します。

ここで重要なのが、読み手の切替機能です。Claude Code の AskUserQuestion を使って、はじめにエンジニア向けなのか、非エンジニア向けなのかを質問するようにしています。エンジニア向けにはコードパスやクラス名を含めた詳細な回答を、非エンジニア向けには概念や業務フローを中心としたわかりやすい回答を返します。

これまでは、どちらかを意識したドキュメントを書かなければなりませんでしたが、AIエージェントを挟むことによって、どちらの読み手にも適した出力になるのが特徴です。

search/editorの2Plugin構成について

このPluginは、検索系(henry-anatomy-search)と編集系(henry-anatomy-editor)の2つのプラグインに分かれています。

理由はシンプルで、editor側はコードベースへのアクセスが必要ですが、search側は解体新書ドキュメントを同梱しているためコードベースが不要です。この分離により、PdMやQAなどのコードベースを持たないメンバーもsearch側だけをインストールしてドメイン知識にアクセスできます。

なお、ヘンリーではPlugin Marketplaceでチーム内に配布する運用が進んでいますが、この仕組みについては別の記事で紹介予定です。

設計で注力したポイント:ドキュメントの構成設計

search-anatomy は質問がある時に使うスキルですが、オンボーディングの時など、そもそもの機能を理解したい時にはまとまった情報を読むことが有用な場合もあります。そこで、生成されたドキュメントは人が読むことも意識して、「構造」をしっかりと設計することを行いました。

Part→章の階層構成

各解体新書は、以下のPartに分かれています。

Part 内容 目的
Part 1: 概要 全体像、登場人物、主要概念 まず大枠を掴む
Part 2: ドメインモデル クラス設計、値オブジェクト、集約 設計の「なぜ」を理解する
Part 3: 主要フロー 業務フローごとの処理の流れ 実装の道筋を掴む
Part 4: DB設計 テーブル構造、リレーション データの持ち方を把握する
Part 5: システム連携 外部システムとの接続 影響範囲を理解する
Part 6: 付録 用語集、重要ファイル一覧 辞書として使う

この構成は、読者が第1章から順に読んでも段階的に理解が深まるように設計しています。新メンバーは最初から通読し、既存メンバーは必要な章だけ参照する、という使い分けが自然にできます。

読者が迷わないための工夫

各章には以下の要素を含めるようにしています。

  • 学習目標: その章で何が分かるようになるか
  • 概念説明 → コード例 → まとめの繰り返し構造
  • Mermaid図: フロー図、状態遷移図、シーケンス図、ER図を適宜配置
  • 比較表: 類似概念の違いを明確化

また、付録の用語集と重要ファイル一覧により、「この用語の意味は?」「このロジックはどのファイルにある?」といった問いにも対応できるようにしています。

ビジョン:ドメインエキスパートAIをチームで育てる

解体新書Pluginの本質は、単にドキュメントを自動生成することではありません。チームでドメインエキスパートAIを育てる基盤を作ることです。

解体新書 = ドメインエキスパートの知識ベース

解体新書をコンテキストとして読み込んだエージェントは、そのドメインの専門家として振る舞えます。例えば「注射オーダー」の解体新書を読み込んだエージェントは、注射オーダーの専門家として以下のようなことができます。

  • 「注射オーダーの実施記録を変更したいが、影響範囲は?」に対して、コスト連携や監査への波及を含めた正確な回答を返す
  • 実装時のコンテキストとして機能し、ドメインの慣例に沿った設計判断を提案する
  • コードレビューで、ドメインロジック上の矛盾を指摘する

コードベースを毎回探索するのとは異なり、体系的に整理された知識に基づいて回答するため、精度と速度の両方が向上します。

非エンジニアも含めた知識の民主化

search-anatomyの「読み手切替」は、この思想を体現した機能です。エンジニアはコードレベルの詳細を確認でき、PdMやQAはビジネスフローレベルで理解を深められる。同じ知識基盤を、それぞれの立場で活用できます。

コードベースを持っていなくてもsearch Pluginさえインストールすれば使えるため、ドメイン知識へのアクセスに技術的な障壁がありません。

育てるサイクル

ドキュメントは一度作って終わりにしません。revise-anatomyでフィードバックを反映し、コードとの突合で乖離を検出し、修正する。このサイクルを回すことで、解体新書は徐々に精度を上げていきます。

実際に、解体新書の内容に不足を見つけたメンバーが自発的にreviseを実行し、改善してくれるケースが生まれています。

とはいえ、現状のサイクルは人の自発性に依存しています。コードは日々変わるので、理想的にはソースコードの変更に連動して解体新書も自動更新されるべきです。現在、GitHub Actionsに組み込んで差分を検知し、影響のある章の更新を自動で走らせる仕組みを検討しています。人手による改善と自動更新の両輪が揃えば、解体新書の鮮度はより安定して維持できるようになるはずです。

そして解体新書の精度向上は、そのままドメインエキスパートAIの進化に直結します。チームのメンバーがフィードバックを通じてドキュメントを改善するたびに、エキスパートAIが賢くなっていく。これは従来のドキュメント管理とは異なる、チーム全体でAIを育てるという新しいアプローチです。

  ┌─────────────┐
  │  generate   │ コードベースから解体新書を生成
  └──────┬──────┘
         ▼
  ┌─────────────┐
  │   search    │ ドメインエキスパートとして活用
  └──────┬──────┘
         ▼
  ┌─────────────┐
  │   revise    │ フィードバックで精度向上
  └──────┬──────┘
         │
         └──────▶ ドメインエキスパートAIの進化

現状の効果と今後

コードから探したり、「あの人に聞かないと分からない」が減った

解体新書の導入前、ドメイン知識を得る手段はコードを読みに行くか、詳しい人に聞くかの大きく2つしかありませんでした。しかもその「詳しい人」は別チームにいることも珍しくなく、「あの仕様どうなってましたっけ」という質問がSlackで飛び交っていました。何度も回答しているだろう質問も中にはあり、申し訳なくなる時もあります。

解体新書の導入後は、それが少しずつ改善されているように思います。まず、エンジニアがコードから探す時間が削減されました。 そして以前なら別チームのメンバーに質問していたような場面でも、解体新書を引けば答えが見つかるようになったので、問い合わせを受ける側の負荷軽減にもつながりました。

さらに嬉しかったのは、QAメンバーからの反応です。「エンジニアに聞かなくても仕様が理解できるようになった」という声をもらいました。コードベースから生成されたドキュメントが、エンジニア以外にも価値を届けられている。これは当初想定していた以上の効果でした。

自発的に広がるアクセスの輪

もうひとつ、作り手として特に嬉しい変化がありました。解体新書をNotionやSlackと連携して、エンジニア以外も含めてもっとアクセスしやすくしよう、という動きがチーム内で自発的に生まれました。ツールは作った人が「使ってください」と言い続けなければ広まらない、というのはよくある話ですが、逆に価値を感じた人が自ら広めてくれるのは、仕組みとしてうまく回り始めたサインだと感じています。

これからやりたいこと

このスキルを利用して動くドメインエキスパートエージェントとして開発フローに組み込むことです。設計レビューで「この変更、〇〇の機能に影響しませんか?」と指摘してくれるエージェント。実装時に「この領域の設計パターンはこうなっています」と教えてくれるエージェント。解体新書という知識基盤があるからこそ実現できる、ドメインを理解したAIとの協働を目指しています。

もうひとつの課題は鮮度の維持です。コードは日々変わっていくので、解体新書も放っておけば陳腐化します。コード変更を検知して、影響のある章の更新を自動で提案する仕組みを作れれば、「ドキュメントがコードに追従し続ける」という、これまで不可能だったことが現実になります。

「ドメインエキスパートAIをチームで育てる」というビジョンは、まだ道半ばです。でも、QAメンバーが仕様を自力で読み解き、チームメイトが自発的に活用の輪を広げてくれているので、そのビジョンはきっと達成できるものだと思います。

おわりに

医療ドメインのように複雑な領域では、ドメイン知識そのものが開発の生産性を左右します。Claude Code Pluginでドメイン知識を体系化し、チームで育て、エンジニアも非エンジニアも活用できる形にする。この取り組みはまだ発展途上ですが、ドメインエキスパートAIをチームで育てるというビジョンに向けて着実に歩みを進めています。

この記事が、複雑なドメインを持つプロダクトの開発に関わる方の参考になれば幸いです。

基幹業務システムはどのようにオンプレからクラウドネイティブに変化してきたのか

株式会社ヘンリー VPoTの戸田です。弊社ではクラウドネイティブ型電子カルテをご提供するうえで、オンプレやクラウドリフト、シングルテナントといったシステム構成とクラウドネイティブ型マルチテナントがどう違うのかを説明する機会が多くあります。都度相手に合わせて内容を調整したご説明をしているのですが、一度基幹業務システムの変化について網羅した説明をすることが今後の役に立つと考え、こちらの記事としてまとめました。

なお筆者が基幹業務システムに関わり始めたのは2000年代後半からで、それよりも古いものには伝聞が入っています。もしお気づきの点があれば @Kengo_TODA までコメントいただくか、はてなブックマークなどでコメントいただければ幸いです。


基幹業務システムはこの30年で大きく姿を変えてきました。

  • メインフレーム(ホストコンピュータ)
  • 拠点内オンプレミス
  • データセンターでの運用代行
  • IaaS上へのクラウドリフト
  • クラウドシフト(クラウドネイティブ化)
  • そして、シングルテナントからマルチテナントへ

本記事では、これらの変化が「なぜ起きたのか」を、技術とビジネスの両面から整理します。またこうした流れは多くの例外を含むものであり、ここに記載していない事例や動きもあると思いますが、ご理解ください。

※本稿ではメインフレームは目的から離れるため割愛します。

1. クライアントサーバー時代(2層構造)

メインフレームから汎用系に移行した段階では、多くの業務システムはいわゆるクライアントサーバー型(クラサバ型)でした。

  • Windows上の実行ファイル(業務アプリ)
  • Oracle Database / IBM Db2 / SQL Server などのデータベース
  • クライアントが直接SQLを発行
flowchart LR
    subgraph 拠点内LAN
        Client[業務クライアント(exe)]
        DB[データベースサーバー]
    end
    Client -->|SQL| DB
    Client -->|SQL| DB
    Client -->|SQL| DB

特徴と制約

  • クライアントとDBが頻繁に通信するため、低遅延なLANが前提。たとえば東京にあるDBに大阪から繋ぐような構成では体験が悪くなる。
  • 低遅延を実現するため、サーバーは業務拠点内に設置されることが多い。
  • 端末ごとのインストール・設定作業が必要。端末数に応じた課金体系であることも多いため、利用者間で端末を共有させる力学が働いた。

この構造では、クライアントとサーバーが物理的に同じ拠点内にあることが前提でした。多拠点利用や在宅勤務といった働き方とは相性がよいとは言えません。またクライアントの管理がクライアントのユーザに委ねられているため、古いクライアントが使われ続ける・データベースに破壊的な変更を入れにくいなどの問題もありました。

2. 三層構造とWebアプリの普及

クラサバ型の制約を緩和するために登場したのが、三層構造(Web三層アーキテクチャ)です。国内のERPでは2006年前後の登場だったと思われます。

flowchart LR
    Client[クライアント(専用アプリ / ブラウザ等)]
    subgraph "サーバー設置拠点(拠点内またはDC)"
        Web[Webアプリケーションサーバー]
        DB[データベース]
    end
    Client -->|HTTP| Web
    Web -->|SQL| DB
    Web -->|SQL| DB
    Web -->|SQL| DB

何が変わったのか?

  • クライアントはHTTPリクエストを送る役割に単純化、人間とのコミュニケーションを担当。
  • DBとの通信をサーバー側に集約することで、通信回数が増える複雑な機能でも高速に動作。
  • 低遅延なネットワークはデータセンター内でのみ求められるように変化。

これにより、クライアントとデータベースが直接通信する必要はなくなり、物理的な距離の制約が緩和されました。これは今日のSaaSと近い構成だと言えます。

ただし三層構造になったからといって、すぐに「ブラウザだけで完結」したわけではありません。2000年代には Java Applet や Silverlightのようなリッチクライアントと呼ばれる技術も試みられていました。これは当時のWeb標準技術だけでは、業務アプリに求められる操作性や表現力が十分でなかったためだと言えます。

その後、

  • HTML5やシングルサインオン技術などの標準化
  • JavaScriptエンジンの実行性能の改善
  • ブラウザやフレームワークの改善、ベストプラクティスの蓄積によるセキュリティの向上
  • Ajaxなど非同期通信の普及

といったWeb技術の成熟により、ブラウザ単体で高度な業務アプリケーションを実装できるようになりました。現在主流となっているHTMLベースのWebアプリは、こうした進化の結果だと言えます。

この段階で、「サーバーは必ずしも拠点内に置く必要はない」という前提が現実味を帯びてきました。ディザスタリカバリの観点からも複数箇所にシステムやデータを散らせられるなら強みになりますし、遠隔地に置けば土地代電気代をオフィスに置くよりは節約できるかもしれません。しかし遠隔地での保守作業が発生し、これを個社で負担するのは難しいものと思われました。

3. データセンターでの運用代行

次の段階は、事業者が実行環境を引き取るモデルです。専用事業者によるデータセンターでの運用代行そのものは大企業を中心に古くから実施されていましたが、サービス事業者が直接運用代行を提供するようになったのは2012年に提供されたCOMPANY on Cloud Managed Service (CCMS)*2や2013年に提供されたSAP HANA Enterprise Cloud*3からでしょう。

flowchart LR
    Client[クライアント(専用アプリ / ブラウザ等)]
    subgraph "サーバー設置拠点(事業者が管理するDC)"
        Web[Webアプリケーションサーバー]
        DB[データベース]
    end
    Client -->|HTTP| Web
    Web -->|SQL| DB
    Web -->|SQL| DB
    Web -->|SQL| DB

この流れをさらに後押ししたのが、従来暗黙の了解としてあった「社内ネットワークは安全である」という前提の限界が見えたことにあります。2014年以降にGoogleが提唱したBeyondCorp*4では、拠点内ネットワークに依存したセキュリティモデルはもはや成立しないこと、そして「出社して社内ネットワークからアクセスする」ことを前提にしたシステム設計自体が時代遅れになりつつあることが示されています。 オンプレミスで拠点内にシステムを置くモデルは物理的な境界を信頼の根拠としていましたが、クラウドサービスの業務利用増加やこれに伴う物理オフィスへの依存低下、リモートワークやモバイル端末の普及、攻撃の高度化などの要因により、その前提が崩れたのです。この流れはこの後のコロナ禍によって加速されることになります。

こうした問題意識は、データセンター移行の合理性を説明するうえでも重要です。物理的な拠点境界ではなく、ユーザーとデバイス単位で信頼を判断する設計へと移行する中で、システムをデータセンター側に集約することは自然な流れだったともいえます。この流れは「所有から利用」とも呼ばれ、ITシステム部門がシステムの面倒を見る役割だけでなく、ITをテコにして業務改革を推し進める役割を深めるきっかけを作りました。

何が変わったのか?

システム構造自体は従来の三層構造のままです。ここでは技術的な革新以上に、ビジネス観点の変化が大きかったと言えるかもしれません。顧客がしたいのはシステムの保守や運用ではなく、そこから得られるアウトカムにこそ関心があるのだということが一般に理解されてきたということです。

筆者はエリヤフ・ゴールドラット博士の著書「チェンジ・ザ・ルール!(原著 Necessary But Not Sufficient)」が好きなのですが、この物語ではまさに運用代行というビジネスモデルが出てきます。これが書かれた2001年前後では大企業を中心とした一部分でのみで運用代行が行われていたようですが、BeyondCorpが出た2014年時点では前述のとおりサービス事業者が手掛けることが基幹業務システムにおいても一般的になっています。実績が認められキャズムを超えて、よりスケールする方法として洗練したタイミングだと言えるでしょうか。

もちろん基幹業務システム事業者から見た場合に、顧客の拠点においてあるシステムよりも自社のインフラで運用されているシステムの方が保守業務とくにハードウェア増強がしやすいという観点もあります。しかしこの時点では基幹業務システムはコードやデータベースに手を加えて(カスタマイズして)使うことが一般的で、システム更新のしやすさという観点ではそこまで大きな飛躍はなかったと考えます。

4. クラウドリフト(IaaS上でのそのまま移行)

これはデータセンターでの運用代行と同時期に進んだものと思われます。2006年に登場したAWS EC2のようにインフラストラクチャを画面やAPIから調達できるIaaSが登場すると、既存システムをそのままパブリッククラウド上に移行する「クラウドリフト」が始まります。ランニングコストではデータセンターに劣ることが多いものの、ハードウェアの納品を待つ必要がない・APIによる自動化の幅が大きかったことは大きな魅力でした。特に検証用環境*5は夜間や祝日は不要となるため、従量課金の恩恵を得やすい環境でした。

その後は2013年にRDSが一般公開されるなど、従来オンプレで動かしていたシステムをEC2, S3, EBS, RDSなどを組み合わせて動かせるようになっていき、爆発的に普及していきます。

flowchart LR
    subgraph AWS
        EC2[EC2上のアプリ]
        RDS[RDS / DB]
    end
    User --> EC2
    EC2 --> RDS

IaaSの利点は、何と言っても既存コードが流用可能なことです。今までのアーキテクチャのまま、小さな初期投資だけでクラウド上にサービスを稼働させられます。オートスケールや分散処理のようなクラウドの潜在的な可能性を引き出すには不十分ですが(Ansibleなどを整理しても実装に手を加えなければ効果が薄い)、システム運用をしなければならないという顧客のペインをスピーディに解消するには十分でした。

5. クラウドシフト(クラウドネイティブ化)

クラウドの強みを活かすにはオートスケールや分散処理を活かすためのアーキテクチャでシステムを組み直す必要があります。状態を持たないサーバ、筐体が壊れたら捨てて新しいものに乗り換える仕組み、負荷に応じて計算機資源を追加・削除する自動化、クラウド事業者が提供するプラットフォームを活用することによる運用責任の縮小などを前提にシステムを組むのです。コンテナの活用もこれに含まれます。こうした変化を受け入れてはじめて、次のようなクラウドの恩恵を享受できるようになります:

  • 計算機資源を想定される最大負荷に合わせて調達するのではなく、都度必要な分だけ支払う従量課金
  • 縦方向(筐体の能力向上)だけでなく、横方向(筐体台数の追加)による柔軟な拡張
  • 複数データセンターでの同時サービス運用による高可用性の実現

サービスの更新におけるサービス停止の必要性が下がったのも特徴で、これにより継続的なデプロイが可能になりました。いままではサービス停止を避けるためにマスタや設定の更新で乗り切っていた機能提供や法対応もより素直な方法で行えるようになり、また脆弱性対応もスムーズに行えるため、サービス事業者側の運用コストも下がったと考えられます。

6. シングルテナントからマルチテナントへ

もうひとつの大きな変化がテナントモデルの変化です。従来は顧客ごとに専用環境を構築しており、これが顧客ごとにデータベースやコードを改修すること(カスタマイズ)を可能としていました。またシステムを止めてメンテナンスをするタイミングも顧客が選べていました。

これらは一見便利ですが、カスタマイズがシステムの更新を難しくし脆弱性を生み出したこと、システムが硬直化することで業務の運用も硬直化してしまうこと、新しい技術が採用しにくく結果的に競争力を失うこと、何よりも運用と更新の手間とコストが高いため情報投資効率が上がらないことが課題になりました。

たとえば基幹業務システムに何らかの不具合が見つかったとします。その際はすべての顧客が使っているバージョンを洗い出し、そのバージョンそれぞれに対するパッチの作成とビルド、出荷物の作成及び評価そしてお客様環境での適用が発生します。シングルテナントのシステムでこのコストが非常に高くつくことはご想像のとおりですし、オンプレミスのシステムであればさらに稼働環境の多様性という問題も出てくることになります。

クラウドネイティブ型かつマルチテナントの基幹業務システムであれば、保守するバージョンを少なく保つこともそれを顧客にデリバリーすることも比較的容易にできます。浮いた工数を製品の機能や運用の改善に充てることで、より本質的な価値を顧客に届けることに注力できると期待できます。

APIによる拡張

マルチテナントが可能になったことは、すなわちカスタマイズ文化を捨てられたことを意味します。ではなぜそれまでは必須だと思われていたカスタマイズをやめられたのでしょうか?その背景にはAPIの普及があります。

ERP界隈では統合型ERPからコンポーザブルERPへの移行と表現されました*6が、サービスに直接手を加えるのではなく、サービスがデータを交換する仕組みを提供することで従来やっていた独自運用を実現できるようになったのです。APIが互換性を維持すれば基幹業務システムの更新とアドオンの更新とは分けて実施ができますから、異なる事業者が提供するシステムを組み合わせて運用を実現することも十分に可能です。

7. 経済合理性の転換

もうひとつ興味深い変化として会計・財務構造の転換があります。

クライアント数に応じたライセンス(クラサバ型)

従来のオンプレミス型、特にクラサバ型では次のような費用感が一般的です。初期投資が大きく、利用者数が増加すると追加ライセンス購入になります

  • サーバー購入(固定資産)
  • CAL(Client Access License)購入
  • 5年程度を前提とした減価償却

特にCALモデルでは、「1ユーザーあたり何ライセンス」という考え方が前提となるため、端末や利用者を柔軟に増やすことが難しい場合がありました。

クラサバ型だった時代にCALが必要とされた背景には、クライアント端末ごとに業者側がメンテナンスコストを負担していたという事情があります。業務アプリはexe形式で配布され、各端末へのインストール、設定、アップデート対応が必要でした。もちろんサポートの負荷も、端末が増えれば増えるほど比例して増加します。そのため「接続する人数分の対価を支払う」という設計は、当時としては合理的でした。

しかしこれは同時に、利用者の利益や利便性と必ずしも一致しないライセンス体系でもありました。利用を広げたい場合でも追加ライセンスの購入や端末設定作業が障壁になり、端末の共有利用を検討することになります。また導入したい端末を見つけてもサービス事業者がサポート外になると言えば採用できません。業務設計の自由度が低い状況だったと言えます。

一方、ブラウザで動作するSaaSでは事情が大きく異なります。ソフトウェアのインストールは不要で、ユーザーはURLにアクセスするだけで利用できます。アップデートもサーバー側で一元管理されます。この構造では、端末ごとに個別メンテナンスコストをかける必要が薄れるため、従来型のCAL的発想は必然性を失っていきました。

サブスクリプションモデル(クラウド時代)

クラウドSaaSでは多くの場合、次のような費用感が一般的です:

  • サーバー購入不要
  • 利用人数など単位の柔軟な増減
  • 月額/年額課金

このモデルだと利用者の判断で端末やアカウントを追加できるようになり、1人1台以上の業務端末を配布することも現実的になります。端末の共有がやめられるとアカウントや業務の運用設計がシンプルにできるため、DX推進にも良い影響があります。

また会計上の柔軟性も利点のひとつです。5年分の前払いが不要になりキャッシュフローが改善することや、減価償却管理が不要になること、管理会計上で費用として処理しやすいことなどは、動きの早くなったビジネスにおいて重要でしょう。

まとめ

業務システムは次のように進化してきました:

  1. クラサバ型(拠点内前提)
  2. 三層Webアーキテクチャ
  3. データセンター運用代行 および クラウドリフト
  4. クラウドシフト(クラウドネイティブ化)
  5. マルチテナント

この進化は複数の技術革新と、ビジネスモデルの変化によって支えられています。システムの保守や運用ではなくアウトカムをこそ顧客に提供するという目的意識を最新技術が支えることで、高い情報投資効率を実現するという構造です。

カスタマイズができない、顧客が具体に関与できないという従来モデルとの違いはありますが、それを乗り越えるための方法もすでに色々と検討され実績があります。むしろカスタマイズという個社ごとの高価な最適化を離れ、アドオンという再利用しやすく安価な方法として業界としての知見やベストプラクティスを蓄積することによって、イノベーションを加速させた面もあるでしょう。

医療情報システムもクラウドネイティブに変化していく

さて医療情報システムを振り返れば、この領域でもクラウドネイティブ化が進んでいくことは弊社note記事でも述べたとおりです。レセプトコンピュータや電子カルテについては既にクラウドネイティブ化が進んでおり、今後は部門システムにおいても同様の方向性を国として目指していることが先月公開された「中小病院向け電子カルテ及びレセプトコンピュータ標準仕様書(基本要件)(案)」でも触れられています:

電子カルテは、マルチテナント方式のクラウド・ネイティブ型とし、併せて部門システムも可能な限りのクラウド化を果たすことにより、システムとの関わり方を「所有」から「共同利用」に切り替え、システムに要するコストを割安にする

その際に他業界の基幹業務システムから医療情報システムが学べることは多くあると思います。今回整理した経緯を眺めたり、また本記事を起点に色々と調べていただければと思います。

なおこれは他業界の基幹業務システムやSaaSを開発してきた開発者が、国の医療に貢献できる機会でもあります。クラウドネイティブ化の酸いも甘いも見てきた方、ご自身やご家族をきっかけに医療に向き合いたいという方、ぜひ弊社を知っていただければと思います。よろしくお願いいたします。

jobs.henry.jp

*1:https://japan.zdnet.com/article/20094181/

*2:https://www.career.works-hi.co.jp/corporate/data/

*3:https://www.publickey1.jp/blog/13/saperpcrmsap_hana_enterprise_cloud.html

*4:Google, "BeyondCorp: A New Approach to Enterprise Security" (USENIX ;login:, 2014) ほか関連論文群 https://research.google/pubs/pub43231/

*5:基幹業務システムではthree-tier landscapeと称して開発・検証用環境も各顧客に用意することがあります

*6:https://note.com/akihirohara/n/n88d2b8299c18

Claude Code Skillsのチーム展開で気づいたSkill管理の課題と対策

株式会社ヘンリーでソフトウェアエンジニアをしているwarabiです。

ヘンリーでは以前から開発にClaude Codeを用いていましたが、最近はSkillの活用などでClaude Codeの性能をもっと引き出そうとする動きが活発になっており、ブログでの発信も増えてきています。

Claude Code を活用した電子カルテの外部連携仕様書メンテナンス自動化の取り組み - 株式会社ヘンリー エンジニアブログ

今回は私が以前に作成したSkillをチームの共有物として管理・展開する際に気付いたSkill管理の課題と対策について話そうと思います。

以前作ったSkillの紹介

起票されたIssueの中身を確認・追加調査をしたうえで実装からPR作成までを全自動で行うOrchestrator型のSkillです。(以降 dev Skillと表現)

dev.henry.jp

このdev Skill作成は元々チームへの展開も前提として考えながら作成を進めていました。

試行錯誤を経て組み立て終わったdev Skill。続いてチーム展開について考えるステップへと進む予定でしたが、ここに1つ問題がありました。

チーム展開の引っかかり

チーム展開をした以降はSkillのメンテナンスも私個人ではなくチームで行う想定でしたが、いざチームへの展開について考ると「このSkill、自分以外の人がメンテするの?」という親心のような気持ちが私の中に生まれていました。

他の人からPRが来ることを想像すると少し抵抗を感じる。通常業務のコード修正とSkill修正で何が違うのか。

この感覚を整理・言語化しないままチームに展開をすると無秩序な管理状態になるかもしれません。そこでチーム展開の作業は一旦手を止め、Skill管理について課題や見落としが無いかを考え直すことにしました。

課題整理

課題1: 変更内容の評価が難しい

通常業務のコード修正であれば既存実装の設計や社内での知見があるため、ある程度正解と呼べるものが導きやすいです。そのため実装者とレビュアーの間で認識も揃えやすく、基本的にApproveまでは進めやすいと言えます。

しかしSkillはまだ設計と言えるほど成熟したパターンが確立できてなく、皆手探りという状況です。指示はどれだけ長い/短い方が良いかの1点だけでもXで日々議論が起きています。

そのためSkillやプロンプトについてはまだ正解といえるものが無く、変更内容への評価は主観に頼らざるを得ないと言えます。通常のコードとは違う部分でApproveのハードルが高い理由がここにあります。

課題2: 何をSkillに行わせたいかが利用者によって変わる

またSkillに何を行わせたいかが人によるという課題もあります。

Aさんが入れたい変更をPRで出したとしても、他の人にとっては入れてほしくない内容かもしれません。Skillに何を行わせるか、チームのSkillを使う人が増えるほど意見の衝突は起きやすくなると考えました。

かといってSkillのオーナーを設けたりSkillの書き方を厳密にしたりすると、Skillの更新が停滞するという別の問題も生まれてしまいます。 これはSkillを活用して働き方を変えようとする今の動きにとって足かせとなってしまいます。

課題3: スキルのポータビリティ

レビューとは別の文脈ですが、Skillを完全にチームの管理とする場合この問題が生まれます。

Skillを使った開発はとても便利で、導入して1ヶ月ですが既にこれなしでの開発は考えられない状態です。

このときSkillを完全にチームのものとして育てていくと、それまで積み立ててきた便利なSkillが環境の変化によって持ち出せなくなるという問題があります。例えば転職や組織異動の際に、日々の開発を支えてきたSkillが使えなくなる状況です。

活用しているSkillは、もはやその人自身の開発能力と言って良いと私は考えています。よく使うSkillの中身はほとんど汎用的なプロンプト設計のノウハウであり、特定の業務ロジックとは異なります。個人の作業効率を高めるための環境構築の一部という性質のものです。キャリアにおけるスキルのポータビリティという観点から、その人の開発能力であるSkillがリセットされる状況はできれば避けたいと考えました。

課題への対策

Skill管理の課題について整理を終えたので、続いてその対策を考えます。 今回は2つの方針を対策として採りました。

対策1: 個人SkillとチームSkill を別で管理する

そもそもSkillの本質は何かを考えると、その中身は汎用的なプロンプト設計のノウハウであり、特定の業務ロジックとは異なります。dotfilesやエディタ設定と同じく、個人の作業効率を高めるための環境構築の一部です。

この前提に立てば、Skillは個人の開発環境として扱うのが自然です。個人の環境を改善していくことが前提であり、そのうえで作られたSkillや知見をチームに還元するという流れです。

そこでチーム展開用のSkillとは別で、個人用のSkillリポジトリを用意する方針を取りました。より正確に表すと、元々個人用に作成したSkillをチームのリポジトリにも展開するというイメージになります。

対策2: チームSkillをStarter Kitと位置づける

Skillのチーム展開を最初に意識した時は、作成したSkillの導入について半ば義務化するような考えを持っていました。チームのSkillを使うことを当たり前にすれば、各自の開発力が高まり会社の生産性も高まると考えてのことです。

そのためSkillのレビューを厳密にするか、意見の衝突をどうするかという問題が生まれましたが、ここで重視したのはSkill作成が活性化する方向に倒すことです。

Skillの作成はヘンリー内でも新しい取り組みで、まだ知見が十分に溜まっていない段階です。この時期にレビューを厳密化してしまうと、Skill作成そのものが停滞しかねません。今は多少の性能低下を許容してでも、Skill作成・変更が活発に行われる状況を優先すべきと考えました。

そこでチームSkillは「Starter Kit」として位置づけることにしました。Skill環境をまだ用意できていない人が、これを入れればとりあえず開発速度を上げられる出発点です。使用は任意とし、変更のハードルも下げる方針を取りました。

そのまま使い続けても問題はありませんが、スキルのポータビリティの観点からも、ゆくゆくは自分のSkillsを育てていく方が望ましいです。管理はチームSkillを活用する人たちで基本的には行います。

ただし「個人Skillを使う自分はチームSkillは無関係」という考えは持つべきではありません。

個人Skillを使う人も、Skill作成の過程で得た学びをチームSkillに反映したり、勉強会で知見を共有したりと、チームへの還元を推奨としています。

個人で得た知見をチームに共有し、お互いの学びを循環させることで全体のAI活用力を底上げする。この「個人で試す → 効果を確認する → チームに還元する」というサイクルを回すことこそが、Starter Kitという位置づけの本質的な狙いです。

個人Skillのセキュリティについて

今回チームSkillsとは別で個人Skillsを持つ対応を取りましたが、このパターンにはセキュリティ上の課題が残ります。

個人リポジトリでSkillを管理する以上、会社の機密情報が外部に漏れないよう注意が必要です。Skillの内容次第では、リポジトリ構造やワークフローの詳細など、機密性の高い情報が含まれる可能性があります。

そのため個人Skillに含めるのは汎用的なプロンプト設計のノウハウに限定しています。「情報収集をしてIssueを更新する」「実装前にテスト方針を立てる」といった、どのプロジェクトでも通用する手順や思考パターンです。社内のAPI仕様、環境固有の設定、業務ロジックに関わる記述は個人Skillには含めず、それらはチームSkill側に閉じる運用としています。

この線引きを守る限り、個人Skillの機密性は一般的な個人の開発環境設定と同程度に収まると考えています。ただし、業務中に試行錯誤する中で境界が曖昧になるリスクはゼロではなく、この点については社内でも議論、整理を行ってきました。

実際に導入してみて

今回考えた課題と対策をもとに、実際にSkillをチームに展開してみました。

嬉しいことにチーム展開したdev Skillがかなり好評で、現状のSkillをそのまま活用してくれているようです。そのため、懸念していた意見の衝突やレビュー負荷といった問題はまだ顕在化していません。

一方で、個人Skillの運用を切り離したことによるメリットは早くも実感しています。

チーム展開後も私自身のSkill改善は止まっていません。個人Skillリポジトリがあることで、試したいアイデアをチームへの影響を気にせず自由に試行できています。もしSkillがチームの管理下にしかなかったら、「この変更、チーム全体にとって有用か?」という判断が毎回必要になり、個人の実験的な改善は確実に停滞していたと思います。

対策で狙っていた還元のサイクルも動き始めています。ただし現時点では、Skillの作成者である私自身が個人Skillの改善をチームSkillに取り込むケースが中心です。他のメンバーが同じサイクルを自然に回せるかはこれからの課題ですが、まずは1人でも実際に回っている事実は、この仕組みの可能性を示せていると考えています。

おわりに

今回Claude Code Skillsのチーム展開を考えるにあたり、Skill管理が持つ課題に向き合い、個人SkillsとチームSkillsを分けて管理する方針を採りました。

個人の実験と改善を止めず、そこで得た知見をチームに還元するサイクルを回すことが、この仕組みの狙いです。