スタートアップに転職してから4年たった

2022年1月1日に今の会社(株式会社HERP)に入社してから、この6月で4年半経っていました。

reimaru.hatenablog.com

YOUTRUSTの自分のプロフィールで、新卒で入った会社よりも長い期間在籍していることになっていて新鮮です。

alt="職歴・学歴のタイムライン。株式会社HERPに正社員として4年5か月、それ以前は株式会社サーバーワークスに正社員として3年7か月在籍し、それ以前には青山学院大学を卒業している。"
YOUTRUST プロフィールの職歴・学歴欄

実は7月から11月末まで育児休暇を取得することになりました。 せっかくなので育児に忙殺されて記憶が薄れる前に、この4年半を振り返り、立場と視点の変化を書いてみました。

バックエンドTypeScriptを書いてRailsの良さに気づいた

転職する時の軸の一つが「静的型付け言語で開発できること」でした。 実際に入社してからは TypeScriptでがっつり開発をしてきましたし、fp-ts なども使って関数型的なスタイルにもそれなりに浸かってきました。 fp-tsは関数型指向をTypeScriptに持ち込むライブラリなのですが、これをがっつり使っているコードベースで開発することで代数的データ型への理解も深まり、同時に型を合わせるのが結構大変なので型パズルへの理解も深まったというメリットがありました。1
一方で、ここ数年は「(前職で使っていた)Ruby on Railsって良かったな」と思う瞬間も定期的にあります。型の話ではないですが、Rails のような強い思想を持ったフレームワークとは違って、TypeScriptでは軽量なフレームワークが主流なため、アプリケーションアーキテクチャを自分たちで検討・議論して決める必要がある場面が多いです。 これはこれで面白いのですが、事業としてお客様に価値を届けることとは別のところで時間がかかってしまっている側面もあるな、と感じるようになりました。
加えて、基本的なジョブキューや定期実行、オンデマンド実行する運用用タスクなどもRailsなら定番で実績のある仕組みでサクッと作れるところ、TypeScriptの場合自分で組み立てるか、ライブラリを使うにしても慎重に選定する必要があります。 より根底から理解する必要があるという意味で技術的な成長にはつながっている気がしますが、自分の時間を事業成果に変換できる効率で考えると、Rails のエコシステムの偉大さをより感じます。
前職でRuby on Rails で開発しまくっていた時は逆にクリーンアーキテクチャに憧れていて、インターネットでたまにみかけた「Ruby on Railsを採用すること自体が技術的負債である」のような過激な主張に影響を受けていた側面もちょっとあったのですが、その頃から比べると他の言語やフレームワークからの視点も内面化できたという意味では成長できたのかもしれません。

負債を生んで、開発の型が身についた

技術力以上に成長したと感じるのは、もっと一般的な「機能を開発する」という営みそのものを進めていく能力です。

前職はどちらかというとすでに一定成熟したプロダクトだったのに対して、HERPで関わった HERP Hireは事業としていわゆる 10 → 100 のフェーズで、ちょっとしたアップデートを含めると本当に数えきれないほどの機能開発に関わることができました。

その中で、開発前の要求がふわっとした状態から、仕様・実装両面の論点を手前からひとつひとつ詰めていって実装し、最終的にお客様に価値が届く状態まで持っていく、という一連の流れの型のようなものを、自分なりに体得できた気がしています。

その型を身につけるきっかけになったのが、入社してわりと早い時期(2022年夏頃)にやった応募フォームの開発でした。

当時はそこまで重く受け止めていなかったのですが、いま振り返ると当時の私にとってめちゃくちゃチャレンジしていて、そしてめちゃくちゃ失敗していました。中にはリカバリーしきれなかった失敗もあって、技術的にも仕様的にも負債を残してしまったと思っています。
例えば、当時の要件には明確には含まれていなかったけれど、ドメインを熟知していれば「これは後から絶対に欲しくなるよね」とわかるはずの要望(たとえば、機能に関するデータの集計・分析、など)を、設計のタイミングで考慮しきれなかったということがありました。2その結果、あとから機能追加する難易度が上がってしまいました。
他にも既存機能の新しい方式(いわゆる v2 のようなもの)をリリースするにあたって、旧バージョンとの統合・移行を十分に計画できていなかったということがありました。その結果将来に渡ってv1とv2が統合されるまでに時間がかかる状態になってしまいました。

他にも、技術的負債解消の文脈でも変な意思決定をしてしまって負債がより重くなった(主観)りもしています。

reimaru.hatenablog.com

これらの判断によって少なからず事業成果やユーザー価値に悪影響を及ぼしてしまっている自覚があり、責任を感じています。

とはいえ、こうした失敗があったからこそ、その後もエンジニアとしてやっていく上での確実な糧になったとも思っています。 一定のユーザー数があり成長し続けるプロダクトだからこそ、このような気づきにつながる適切なFBが得られていると思うので、そんな環境に身を置けたことに嬉しく思っています。

マネージャーになって、上司の気持ちがわかった

もう一つの大きな変化は、マネージャーになったことです。 自分は技術的にものすごく尖った専門性があるタイプではないので、いつかは(いわゆるICではなく)マネージャーのような役割になるのかな、と漠然と考えてはいました。 特にめっちゃなりたいという気持ちがあったわけではなかったのですが、2024年9月に機会に恵まれて正式にマネージャーになりました。

とはいえ、HERP という会社として「マネージャー」という役割をきちんと設置し始めたのもちょうどその頃だったので、会社としても自分としても、わりと探り探りでマネージャーになっていった、というのが正直なところです。

note.herp.co.jp

それ以前も一応チームをリードするような立場ではあったのですが、当初は「チームとして成果を出すには、まず自分が一番頑張らないと」という感じで今思えばかなりナイーブな考え方をしていました。 それが、「チームとして成果を出すためには、こういう成長をする必要がある」「そのためはどういう採用・育成・組織作りができるだろう」というようなマネージャーなりの手札の切り方の感覚が(つい最近)わかってきた気がします。

そして、自分がマネージャーという立場になったことで、過去の自分の上司の気持ちもわかったような気がします。 今になって転職前の自分のスキルレベルや成果について振り返ると、「あの頃の自分は、精神的にも能力的にもめちゃくちゃ幼かったな」と素直に感じます。同時に、当時の上司がどんなに広い心で自分と接してくれていたのかもわかる気がします。
当時すごくネガティブな気持ちがあったというわけではないのですが、人並みに評価制度などについての不満というか疑問はもっていました。でもマネージャーになって初めて、かつての自分の上司の気持ちがなんとなくわかったような気がしました。3. こう書くと、なんだかめちゃくちゃ経験を積んだ立派なマネージャーになったみたいに捉えられてしまうかもしれませんが、実態はむしろ逆で、マネジメントについてはできていないところの方が圧倒的に多く、まだまだ全然ダメダメだなと思っています。ただ、だからこそこれからもチャレンジしていきたいと思っています。

ハイアリングオーナーになって、採用する側の気持ちがわかった

入社時に書いたブログで「人事採用ドメインのプロダクトを開発していること」をHERP に決めた理由として書いていますが、望み通り人事採用ドメインについては4年前と比べると相当詳しくなれたと思います。
採用という業務を自分自身がやっていくことで、HERP Hire が扱っている採用ドメインそのものへの理解を、身をもって深められたのはとても良かったです。
特にマネージャーになってハイアリングオーナーという立場になってからは、1メンバーとして選考に参加していたころと比べて、アトラクトまで気にすることも増え、最終的に候補者の方に選んでもらうことの難しさを心から理解できました。
面接が難しいと思っていた時代を超えて、「あれ、カジュアル面談って実は一番重要だし難しいのでは?」と気づいた時の新鮮さが印象に残っています。
そういった経験を通して自分のプロダクトのユーザーが向き合っている課題を当事者として体験できた気がしています。

今後

開発者としてもマネージャーとしても、たくさんチャレンジしてたくさん失敗した4年半でした。 一方で当時の入社エントリを読み返すと、HERPに入社する時に期待していたものはおおよそ手に入れられたのかなと思います。

これから育休に入るのでしばらくは「親」という初体験の立場を経験してきます。職場に復帰する時に自分がどう変わっているのか不安でもあり楽しみでもあります。

もしHERPという会社に興味を持ってくださったら、気軽にお話ししましょう!

herp.careers

もし私個人に興味を持ってくださった方がいたら、X(旧Twitter)でも気軽に話しかけてください!

https://x.com/rei_maruyama_

この記事は私の勤務先である株式会社HERPでの勤務時間中に作成されていて、HERP Tech hubにも掲載されます。


  1. とはいえ大変すぎたため、fp-tsは現在のHERPでは非推奨のライブラリとなっています。
  2. POの「最初のリリースではなくても大丈夫」という発言を受けて、あとから追加しやすい設計になるようにできるとベストだった。少なくともその設計にできなさそうだったり工数がかかりそうな場合、相談できると尚良かったなと振り返ってます。
  3. 気持ちがわかるといっているだけで、肯定しているわけではないです。むしろそういう不満とか疑問の持ち方は健全だったなとも思います。

【TSKaigi 2026参加レポート】初TSKaigi参加でAI活用のモチベが上がった

2026年5月22~23日の2日間、ベルサール羽田空港で開催された TSKaigi 2026 に人生で初めて参加してきました。

この記事では参加しなかった方には現場の熱気を、参加した方には共感を届けられるように個人的な学びや感想を書いていこうと思います。

 

実は私はTypeScript歴自体は5年ほどになります。そんな私が、なぜいまさらTSKaigi 2026に現地参加したのかというと、弊社(株式会社 HERP)の同僚が登壇者として参加したからです。

 

個人的に面白かった発表

身内の贔屓目や共感も込みですが、同僚2名による以下の登壇は、今回のカンファレンスの中でも本当に面白く、クオリティが高かったと感じました。

2026.tskaigi.org

おーみーさんの発表は、関数型プログラミングの概念を明快に分解したセッションで、私の席の近くで見ていた参加者の方からも「資料をみたい」という声が上がっているところを見かけるほど、非常に好評でした。

 

2026.tskaigi.org

 

asa1984さんの発表も、単にEffect-TSの紹介に終わることなく選定の考え方にも言及している良い発表でした。同じ会社でfp-tsの時代を知っている私としては共感しつつ勉強になりつつという感じで情報量が多い内容でした。  

 

後の懇親会では同僚が上記2つの発表をしたというと「ああ、あの!!」という反応をもらえることが多かったので、カンファレンス内視聴率は良かったのではないかと思います。  

どちらも上のリンクから発表資料が公開されているので、ぜひご覧ください!

 

 

その他のセッションでは特に普段の業務への刺激や参考になる知見をもらえたのが次の2つでした。

2026.tskaigi.org


立ち上げ期のプロダクトにおいて、非エンジニア(PMやデザイナー、ビジネスチーム)がAIエージェント(Devin)を活用して400近いPRを作ってマージした、という事例が紹介されていました。  

それらの不具合の検出や権限制御の強制のためにESLint/Oxlintへ徹底的に投資して強力なガードレールを敷いていく仕組みはESLintを使っているところならそのまま今の業務でも参考にできそうです。 

「うちのプロダクトでもこれくらいAI活用を頑張らねば」と、モチベーションが上がる内容でした。  

 

 

さらに、こちらの発表も近年自分が触れた課題と近いところを扱っており興味深かったです。

2026.tskaigi.org


エンタープライズ向けSaaSにおける、複雑な権限ポリシーをFE/BE/DB一気通貫で統一的に管理するためにTypeScriptの型やPostgreSQLの機能を活用していくという内容です。  

私たちが開発している「HERP Hire」でも、権限実装が複雑になりがちという同様の課題を抱えていたため、かなりタイムリーで参考になりました。    

 

「Ask the Speaker」してみた

権限チェックの一貫性を型で守る TypeScript による多層防御(北川 直昭) の発表の後、「Ask the Speaker」を利用してみました。

Ask The Speakerは発表後の休憩スペースで登壇者に直接質問できる仕組みです。

現地には私の他に2名の参加者の方がいて、登壇者の北川さんを交えた4人で、発表では触れられていなかった詳細部分や実装意図、プロジェクトの背景などざっくばらんにお聞きすることができました。  

正直、こういう発表は短い時間に濃い内容が詰め込まれがちなので(この発表に限らず)、その場ではなんとなく理解しているつもりでも、深いところまで理解できたかというと微妙なことも多いと思います。個人的には、このAsk the Speakerによってかなり内容についての解像度が上がり、学びも深まったので本当によかったです。  

ちなみに、Ask the Speakerを利用するには登壇者の方の顔と名前は少なくとも覚えていた方が良いのですが(当たり前)、発表会場がすごく広いため、メガネをして視力1.2くらいの自分だと、常に前から5列以内に座っていないと厳しいくらいでした。  

そもそも会場に投影される資料についても、コードブロックが画面に映るとそれくらいの距離にいないとちゃんと読めないことが多かったので、気になる発表についてはかなり前目の席に座っておくことをおすすめします。  

 

セッション全体を通しての感想

個人的には(初参加なのでにわかですが)TSコミュニティがかなり成熟しつつある雰囲気を感じました。  

例えば、Branded Typeについての発表が複数あり、その中でも「より良い」Branded Typeは、みたいな議論が複数回見られていました。  

Branded Typeという概念自体は以前からあったものと思いますが、この数年でコミュニティに普及してさらに深い議論がされるようになったのかなと感じました。

また、私自身は最近直接コードを書く機会が減っていたので、新しいインプットのタネとなるキーワードをたくさん仕入れることができたのも大きな収穫でした。

特にタイトルに含まれているわけではなく、発表内容にしれっと出てくるようなキーワードは「あれ、もしかして知らないの私だけ!?」という気分になって危機感ベースでモチベが上がるのでありがたいです。(個人的にはorvalなどがそれでした。)

 

 

OST(オープン・スペース・テクノロジー)

参加者がその場で自由にアジェンダを提案して議論を深めるOSTにも参加しました。

全体でトピックごとに5~6人くらいのグループに分かれて、1ラウンド25分で議論するセッションを2回行いました。  

トピックは自分で選べて、「AIに仕事をなくさせてもらうにはどうしたら良いか」と「技術キャッチアップってどうしている?」に参加しました。*1

ちなみに、このトピックは結構広範目な話題ですが、他にも「」

ラウンド1: AIに仕事をなくさせてもらうにはどうしたら良いか

「そろそろAIに仕事を取られそう」「でもここはまだ難しいんじゃないか」など参加者全員のリアルな感覚の共有から始まり、最終的に将来のビジネスモデルなどの話に発展しました。
プログラミングそのものは本質的な価値ではなくなり、「最終的に責任を引き受ける主体」としての人間や組織の仕事が残るのではないか、話からSaaSを提供する会社は保険のような業態になるのではないか、というアイデアに広がっていったのが印象に残っています。


ラウンド2: 技術キャッチアップってどうしている?

このトピックは結構抽象的だったので参加している5人がそれぞれ抱えているインプットやキャッチアップに関するお悩み相談のような形で進行しました。  
特に印象に残っているのが、ブログなどのアウトプットの話。 

従来よくあった「学んだことまとめ」形式のブログはAI時代書くモチベがなくなっているのではという話から、むしろ「わからなかった」などの人間味のある情報の方が今は価値があるのでは、と発言したら、グループの方に刺さったようで、後々X(旧Twitter)で褒められて嬉しかったです。  

 

 

 

なお、今回のイベントでは入場時にNFCカード(プレーリーカード)が配られており、このOSTの後に円滑にSNSのアカウント共有(Twitter等の交換)を行うことができました。この体験は非常に良かったです。  

 

個人的に好きなノベルティ

今回のTSKaigiでは「いろんな企業やプロダクトを知ろう!」ということも個人的なミッションとして参加していたため、休憩時間にはブースもいくつか回りました。*2

個人的に株式会社ビットキーさんのブースで配られていた、消毒用の携帯アルコールスプレーが好きでした。
パッケージのデザインが「TypeScriptネタ」になっており、never や Omit<Bacteria, Hand>といったバリエーションが用意されていました。  

こういうグッズだと、TSKaigiならでは感がありますし、あとからTSKaigiのときのグッズだと思い出せそうで良いですね。  

また、会場が空港近くということもあり結構混んでいたので普通に消毒用途としても重宝しました。

ボトルにExclude<Bacteria,Hand>と書かれた消毒用アルコール



おわりに

TSKaigiのような大きなイベントに初めて参加してみて、集中的に技術のキャッチアップができたのと同時に、会場で色々なエンジニアの方とお話ししてモチベも上がりました。  

運営の皆様、そして当日お話ししてくださった皆様、本当にありがとうございました。  

 

 

最後に、HERPでは、このように複雑なドメインに向き合いながら、AI活用や技術的負債の解消を組織的に進めていくエンジニアを募集しています!

発表内容にもあったような、関数型プログラミングが好きなエンジニアも多く在籍しています。

興味を持っていただけた方がいましたら、まずはカジュアルにお話ししましょう!

herp.careers

*1:トピックについてはうろ覚えなので厳密にはちょっと違うものだったかもしれません

*2:それでもブーススタンプラリーは達成できていないので、コンプリートしている人は本当にすごいと思う

エンジニアの数を超えて増えたマイクロサービスとの格闘と反省

株式会社HERP に入社してからずっと採用管理システムであるHERP Hireの開発に関わっています。
HERP Hireでは近年に増え過ぎてしまったシステム・コンポーネント群のことをいわゆる"技術的負債"と位置付けており、解消のために格闘しています。
この記事では、なぜ増え過ぎてしまったのか、どうやって減らしていったのか、どうすれば良かったのかなどに関する考察をHERPにおける経緯とともに紹介します。

キャッチーさのためにタイトルではマイクロサービスとしましたが、原義(Microservices)の趣旨とは異なるような、非同期処理を行うワーカーや共通基盤的な存在も含めてカウントしています。そこでこの記事ではこの後「(システム・)コンポーネント」と記述します。

1. 増殖期(2021–2023):なぜ増えたのか

私が2022年1月に入社した時点で、HERP Hireはすでに複数のコンポーネントに分割されて開発が進められていました。
例えば企業と候補者の日程調整機能のためのサービス、分析レポートのためのサービス、汎用的なタグ管理のためのサービス、汎用的な権限・ポリシー管理のためのサービス などなどなど......、という感じです。

改めて数えてみると 19 個のシステムコンポーネントがありました。一方、当時の正社員エンジニアは 15 人でした。
つまり、1人あたり1コンポーネント以上の世界です。しかも、ここからしばらくの間、コンポーネントは増え続けました。
あとで詳しく書くのですが、この圧倒的なシステム・コンポーネントの物量によって開発運用時に困ることが後々たくさん出てきました。

HERP Hireのアーキテクチャイメージ。 TypeScript, Haskell, OCaml, PureScriptなどの複数のシステム・コンポーネントが複雑に絡み合っている
HERP Hireのアーキテクチャイメージ

なぜこんなに増えたのか

当時メインのモノリスだった TypeScript バックエンドサービスは、コード品質の維持が難しくなり、新メンバーが安全に変更する難易度が上がっていたようです。 加えて、当時の社内ではTypeScript が第一選択肢になるような言語ではなく、むしろHaskell / OCaml などの関数型言語で開発したいメンバーの方が多数派でした。 結果として「既存モノリスに手を入れるより、新規機能はマイクロサービスとして切り出して、既存モノリスとは異なる技術スタックで作る」という共通認識が生まれていました。

とはいえ、マイクロサービス化するという明確な強い意思決定があったわけではなく、上記のような共通認識をもとになんとなくシステム・コンポーネントを増やす動きが進んでいったということが大きなポイントであると考えています。

実際にこの後、日程調整、メール送信、分析、権限管理などが別々のチームで独立したコンポーネントで実装されることになりました。

2. 幻滅期(2023–2024):何が困ったのか

2023年、事業上の大きな変化としてHERP はマルチプロダクト化を進めるようになりました。
これによってHERP Hire以外のプロダクトや開発プラットフォーム自体にもエンジニアのリソースを割く必要性が発生し、HERP Hireはこれまでの複数チーム体制から大きく2チームで開発していく体制に変化していきました。

note.com

結果として2チームで大量のシステム・コンポーネントを開発・運用する状態になり、マイクロサービスのメリット(チームの自律・独立デプロイ)が薄れていきます。
さらに、特定のコンポーネントの有識者が別プロダクトに異動したことでチーム内で開発・運用していくことが困難になっていったりもしました。

ある機能を変更するのにたくさんのコンポーネントを変更する必要がある

具体的にどういう困りがあるかというと、ちょっとした機能変更をするだけでも、圧倒的にたくさんの変更量が必要になりました。
例えば日程調整機能でAというオプションを追加するとなった時には、

  • メインのバックエンドコンポーネントとフロントエンドコンポーネント間の通信用スキーマ(OpenAPI)の変更

これが必要なのは一般的なスキーマ駆動開発ではよくあることだと思いますが、ここからさらに...

  • メインのバックエンドコンポーネントと日程調整バックエンドサービスとの通信用スキーマ(protobuf)の変更
  • 日程調整バックエンドサービスと日程調整フロントエンドサービス間の通信用スキーマ(protobuf)変更

が必要になっていました。当然各コンポーネントごとに実装が必要になります。
当初の日程調整チームが完全に分離するような世界観ではこれでもいいかもしれませんが、せいぜい2チームで1プロダクトを開発するような世界観ではこの作業がオーバーヘッドとなり開発スピードに悪影響が出てしまいました。

ある機能の全体像を理解するための認知負荷が大きすぎる

もちろん開発時に困るだけでなく運用時にも同様の問題があり、障害発生時の調査が難しくなる要因となりました。
例えばアプリケーション上で発生したイベントをユーザーにSlackで通知する機能があるのですが、これに3つのDBを持つバックエンドサーバーと二つの非同期ジョブワーカーが関係しており、おまけに言語もバラバラ(TypeScript, Haskell, PureScript)という状態でした。
ある通知が正常にユーザーに届いているかどうかを確認するだけでもたくさんのコンポーネントの相互作用の全体像を理解する必要があり、3つの言語を解して調査する必要があり、機能自体の複雑性以上にアーキテクチャの複雑性によって運用の難易度が上がっていました。

個人レベルのリアーキテクチャプロジェクトが動き始めるが完遂できない

この時期になると各エンジニアにシステム・コンポーネントを減らしたいという気持ちが出てきているため、個人レベルでリアーキテクチャを進めるような動きも出てきていました。
ただし、リアーキテクチャプロジェクトは旧システムからの移行なども含めてどうしても長期的なコミットが求められるため、個人レベルの取り組みではなかなか完遂まで到達できないものも多かったです。

私自身もこの時期に日程調整サービスのリアーキテクチャを試みているのですが、中途半端なところで止まっていました。
新しく実装する日程調整の方式をメインのコンポーネントだけで実装し、後から日程調整サービスをメインのコンポーネントに統合するという計画を立てたのですが、結局今日時点でまだ統合は実現しておらず1、「メインのコンポーネントだけで実装されている方式Aと日程調整コンポーネントを利用する方式Bがある」というような余計に認知負荷がかかる状況を作ってしまい反省しています。

他にも困ったことはたくさんあり、社内でも一定課題感が共有されている状態になっていました。

  • 機能開発するのにたくさんの言語やアーキテクチャのキャッチアップが必要
  • デプロイ・インフラ・CI・ライブラリアップデートなどのメンテがシステム・コンポーネントごとに必要
  • 各システム・コンポーネントごとのデプロイ頻度が高いわけではなく、マイクロサービス構成であるメリットが活かせていない
  • 「マイクロサービス」の認識が統一されておらず、ドメインが漏洩するような設計が見つかる

3. 解決期(2024末〜):何が効いたのか

ここまでのマイクロサービスが増えていったことと、それを個人レベルのアクションで解消しきれなかったことは同じ問題が根っこにあると考えています。
それは技術領域の問題解決について、エンジニアが組織的に動けていなかったことです。
当時のHERPはかなりフラットな組織を意識しており、マネジメントに関する制度なども未発達だったこともあり、組織として長期的な方針やアクションを決めるということが十分できていませんでした。
この問題が2024年9月ごろにマネジメント制度や技術組織の立ち上げなどによって解消されていったと感じています。

これまではフラットに議論することだけが重視されていて、それが習慣になっていました。これからは議論の先に結論を出せる文化に変えていく必要があると考えています。

note.herp.co.jp

HERP Hire開発チームとしてはこのタイミングで「課題マップ」というチームの課題とその因果関係を付箋にして整理するワークショップを行い、改めて色々な課題の中心にシステム・コンポーネントが多すぎる問題があるという共通認識を作ることができました。

青色の付箋に「マイクロサービスに見せかけた分散モノリス」とかかれていて、そこに上下左右から複数の矢印が繋がっている
いろいろな課題の中心に"分散モノリス"問題が位置している図

ちなみに社内ではこの状況を分散モノリスとか、分散泥団子と呼んでいたのですが、最近読んだ本にも登場していました。

チームは、マイクロサービスのコードベースを 100 行以下に制限することに決めた※5。「マイクロ」なコードベースは理解しやすく、したがって変更や進化が容易になるだろうと考えたからだ。このアプローチは、マイクロサービスの局所的複雑性を最小限に抑える。しかし、一方で大域的複雑性を完全に見落としている(図 3.4)。このような分解戦略を使用することは、多くの場合、「分散した巨大な泥団子」(最高レベルの大域的複雑性)につながる。

book.impress.co.jp

分散モノリス問題を優先して解決すべきであるという認識が共有できてからは具体的な組織の目標として動き出しました。
もちろん、たくさんあるコンポーネントを一気に整理することはできないので、少しずつ分割してQごとの目標やスプリントゴールに乗せることで解決していきました。 具体的には以下のような施策を進めました。

  • 当時唯一存在していたOCamlを利用するマイクロサービスを一つTypeScriptで書き直してメインのモノリスに統合して廃止する
  • メリットが少なかったFEのBFFをバックエンドのサーバーに統合して廃止する

このようなアクションを新機能の開発と同列に開発組織の目標として組み入れたことで、完了まで少しスケジュールがずれてしまっても最後まで長期的にリソースを投下し、やり切ることができました。

note.com

個人のボランティア活動ではなく、組織的に計画した正当なミッションとしてリソースを投下し、やり切ることができたのは個人的に大きな転換点であったと感じました。

その後、既存機能のリプレイスなども含めてさらに3つのコンポーネントを統合・廃止できています。

現在も開発生産性や運用容易性などの観点から優先順位をつけて少しずつ日々の開発と並行し統合・廃止のための施策を打っています。


4. どうすべきだったか

長々書いてきましたが、最後にもし今後同じような状況になったらどうすると良さそうか考えてみます。

アーキテクチャ全体の責任を持つ役割を設置する

問題の解決の流れでも組織だって動けるようになったことがポイントだと書きましたが、問題の発生についても会社全体のアーキテクチャ設計を責任もって決めるポジションが存在していなかったということが大きな問題だと感じています。

事業や組織の展望も考慮してアーキテクチャを検討する

HERP HireはATS(採用管理システム)というジャンルのプロダクトで、開発当初からいくつか競合となるプロダクトも存在していました。
そのような状況のプロダクトでは、身も蓋も無い話ですが既存プロダクトの市場規模などから将来どのくらいの売り上げを出すことになり、どのくらいの数のエンジニアでメンテしていくことになるか、一定程度推量できそうです。
この辺りを考えるとシステム・コンポーネントを増やすよりもむしろモノリス構成で十分という結論になることが多いかもしれません。

また、仮に予測が難しい性質のプロダクトだったとして事前にユーザー数が確定しているなど極端な状況を除けば、ほとんどの場合はモノリス構成で作り始めて、後から拡張していくやり方で問題なさそうです。

スタートアップ企業の段階で、数十億のユーザーと数億ドルの収益を得たときに必要となるアーキテクチャを構築しようとしてはいけない。数十億のユーザーと数億ドルの収益を得られるようになったときには、システムを何度も書き換えるくらいの資金ができているはずだ。成功したシステムのほとんどは、何度も書き換えられている。

book.impress.co.jp

まずはドメイン・ユースケースに密着した課題を解決する

2022年ごろ、HERPではやたら共通基盤的なコンポーネントをいきなり作って問題を解決しようとしていた時期がありました。
私自身応募フォームに機能追加をする時にいきなりフォームを管理する共通基盤を作ろうとしていたことがあります。2

抽象的・汎用的な形で問題を捉えるのはエンジニアとしては基本的な考え方の一部でもあると思いますし、楽しい仕事の一つでもあると思います。
とはいえ、共通基盤を作るというレベルになると、かかってくる運用コストも全然違いますし、より戦略的・組織的に大きなリソースを投資するという判断になってきます。
今から振り返ると当時のHERPの事業状況ではまだ目の前のドメインに密着した課題を解決するフェーズだったなと思いますし、スタートアップにいるエンジニアとしてはそういうポジショニングをあえてとった開発をやっていったほうがプロダクトへの価値貢献という面でも良かったなと感じました。
さらに、将来的に共通基盤的なものに分離するとなった場合でも、まずはモジュールとして分けるとか、他のコンポーネントから利用したいとなった場合でもライブラリとして分離するなど、中間の選択肢を検討できると良さそうです。


最後に、HERPではこのように技術的負債と折り合いをつけつつ、複雑なドメインに向き合いつつ、顧客に価値を届けるエンジニアを募集しています!

herp.careers

別に転職は考えていないんだよな、という方もマイクロサービスアーキテクチャや技術的負債についてぜひお話ししましょう!

youtrust.jp

この記事は私の勤務先である株式会社HERPでの勤務時間中に一部作成されていて、HERP Tech hubにも掲載されます。


  1. 背景として、のちに私がマイクロサービスの統合を進める時に言語をTypeScriptに集約するような優先順位で統合を進めているということがあります。つまりOCamlやHaskellのような言語をTypeScriptのコンポーネントに統合することは優先的に進めているのですが、日程調整サービスはTypeScriptで書かれているため後回しになってしまっているという状況です。
  2. 結局、まだ共通基盤を設計するには時期が早いのでやめておくという判断をしました。もし作っていたら統合するべきコンポーネントが一つ増えていたかもしれません。

Webアプリケーション上でMicrosoft Officeファイルをプレビュー表示したい

業務で行なっているSaaS開発でユーザーがアップロードしたMicrosoft Office ファイル(Word、Excel、Power Pointの3種類)をブラウザで表示する方法について調べたところ、かなり多様な知見が得られたので整理してみます。
適当にインターネットで「オフィスファイル ブラウザ」などで検索するといろいろな制約条件(データの公開範囲・有料無料・コードを書く必要があるない、など)における無数のソリューションが大量に出てきてしまい困ったので、似たような機能の実装を検討しているWebエンジニアの方の参考になれば幸いです。

要約

  • インターネットに公開してもいいファイルなら
    • Office Web Viewer
  • 社内の業務自動化用途なら
    • OneDriveのAPIでPDF変換
  • プロダクトに実装するなら
    • OSSの変換ライブラリを利用する(低コスト優先)
    • サードパーティの変換サービスを利用する(高品質優先)

PDFに変換する方法

結論としては、ブラウザで表示するには基本的にオフィスファイルをPDFに変換するプロセスを踏むことになります。
とはいえ、Microsoft Officeの公式の機能を使っても完璧な変換はできない上、有料サードパーティーサービスであっても完全なPDFへの変換はできず、どこかで妥協することにはなります。
コメントやマクロのような機能は当然ながら、Excelの小さいセルに複数行の文字列が折りたたんで入力されているケースなどでも文章が表示しきれないケースが多発します。
他にもレイアウトのずれ、文字の重なり、フォントの対応具合などさまざまな課題があります。これがかなりの沼で、利用する方法によって変換のクオリティの方向性が異なるので、事前に本番環境で利用するファイルに近いサンプルファイルを何点か準備しておき、変換を試してみることをおすすめします。

Microsoft 公式の機能を使う

Officeの機能をプログラムから利用する

まず真っ先に思いつくのがこの方法です。
調べた限りではCLIのような簡単にプログラムからOfficeの機能を利用してPDFに変換するインターフェースは存在せず、何らかのプログラムを使ってオフィスソフトを操作する必要があるようです。

learn.microsoft.com ただし、このようなプログラムを使った自動化は公式には非推奨となっています。 support.microsoft.com また、ライセンス的にもかなり怪しい使い方になります。

ちなみに別のアイデアとしてOfficeソフト自体の機能ではなく Windows 10に標準でインストールされているソフト Microsoft Print to PDF をなんらかのRPAやヘッドレス的な形式で実行するという手段も思いつきましたが、こちらもライセンスの観点などは未調査です。
どちらにせよこれらの手段を使うためには専用のWindows Serverを構築することになりそうなため、ハードルが高く選択肢から外してしまいました。

OneDriveを使う

OneDriveには Download a file in another format というAPIがあり、一度アップロードしてからこのAPIを使うことでPDFへの変換が実現できます。
learn.microsoft.com しかし、SaaSをバックエンドサービスとして扱うのはリスクや懸念点も多く、特にDelveというAIを使った機能はファイルの中身を読み取ることがあるため、セキュリティ観点やテナント分離観点などからプロダクトのサプライチェーンに加えるのは不安がありました。*1 *2 個人的には、社内でだけで利用される簡単な業務効率化アプリやワークフローなどであれば、一番良い選択肢になり得ると思います。

もしAzureにエンタープライズ向けの類似サービスがあれば第一選択肢になりそうなのですが、今回調べた限りでは発見できませんでした。

ちなみに、pdf-toolsというサードパーティのサービスはOneDriveやOfficeソフトをラップしてCLIREST APIから利用できるインターフェースを提供しているようです。
紹介したような懸念点がクリアできた上で、実装を楽したい、またはpdf-toolsの他の機能も使いたいという場合には選択肢に入るかもしれません。 www.pdf-tools.com

OSSのライブラリを利用する

LibreOffice にはオフィス形式のファイルをPDFに変換するコマンドがあります。 OpenOfficeでもほぼ同等のことができるようです。
qiita.com 変換の質は高いとは言い難いレベルで、特に日本の履歴書や職務経歴書はWordの機能(罫線や表など)をフル活用して作られていることが多いため、かなりの確率で文字のずれ・重なりやレイアウトの大幅なズレが生じてしまいました。

例えば、Wordで表を駆使して書かれた職務経歴書のサンプルはこのように表がページを跨いでしまいました。

表のコンテンツが複数ページを跨いで分断される様子を示したスクリーンショット
表のコンテンツが複数ページを跨いで分断される
とはいえシンプルな文書なら一定不便なく閲覧できそうなので、扱うコンテンツの傾向によっては採用も考えられそうです。

サードパーティの変換サービスを利用する

LibreOfficeよりも高品質で変換ができる有料のライブラリやサービスは無数に存在しています。

これらはそれぞれ料金形態や利用可能言語、利用形式(ライブラリ・その他)が異なるので、既存の技術スタックなどとの相性やコスト面から選択すると良さそうです。
また、それぞれのHPのデモや試用版で変換品質も確認できます。
全ては確認できていませんが、やはり文字が被ったりフォントの問題で記号がうまく表示できていないものがあることを確認しています。

ブラウザ上で変換できるライブラリ

さらに、ブラウザ上でPDFに変換できるサービスもあります。
変換するサービスを利用する場合はバックエンド側で事前に変換・保存しておく必要がありますが、これらはフロントエンドのライブラリで、ファイルのURLを渡すだけでブラウザ上で表示できるので、プロダクトに組み込むための実装工数はかなり抑えることができます。

どちらのサービスも仕組みは似ているので、料金面や変換品質、UIのユーザー体験面で比較することになりそうです。
デモもオンラインで利用可能です。

PDFに変換しない方法

インターネットに公開されている・あるいはしてもよいファイルの場合、より簡単なソリューションもあります。
SaaS開発で利用することはあまりなさそうですが、個人的には開発用のサンプルファイルの確認には便利に使えました。

Office Web Viewer

https://view.officeapps.live.com/op/view.aspx?src=<ファイルのURL> でブラウザ上で開けます。
正式なドキュメントはかなり古いものしか見つけられなかったのですが、Microsoftのサービスのようです。
例えば https://go.microsoft.com/fwlink/?LinkID=521962Microsoftがインターネットに公開しているExcelファイルですが、 https://view.officeapps.live.com/op/view.aspx?src=https://go.microsoft.com/fwlink/?LinkID=521962 にアクセスすればダウンロードすらする必要なく、閲覧できます。

今回調査した内容は以上ですが最後に個人的な感想を

  • Libre Office、Office 2003以前のバイナリ形式のファイルにも対応しているのすごい
  • PDF変換、難しいし価値あるけどこんなにサードパーティサービス乱立するほどなのかな
  • MicrosoftはAzure 上で公式のソリューションをシンプルなAPIで公開して欲しい

この記事は私の勤務先である株式会社HERPでの勤務時間中に一部作成されていて、HERP Tech hubにも掲載されます。

*1:厳密にはDelve自体は設定で無効にできるが、そのような機能がいつでもリリースされうるのはリスクが高いという判断

*2:この調査については、社内のセキュリティ担当の方にも協力していただきました

株式会社HERPに入社しました


2022年1月1日に株式会社HERPに入社しました。
今回は、私が株式会社HERPに入社するまでの経緯や考えたことついて書いてみます。

転職を考えるようになったきっかけ

前職では、Ruby on Rails などを使ってCloudAutomatorというAWSの運用自動化サービスの開発をしていました。 cloudautomator.com

2018年に新卒で入社してから4年目だったのですが、2021年に入ってからなんとなく行き詰まり感を感じるようになったことが転職を考え始めた直接の要因です。

これはあるあるだと思いますが、行き詰まり感の原因として次のようなことが挙げられると思います。

  • 数年間同じ技術を使っていたため、技術力の成長曲線が緩やかになったように感じた
  • あと5~10年会社に所属していた場合の将来像が明確になり良くも悪くもドキドキワクワクしなくなってきた
  • 少人数チームかつフルリモートだったため人間関係も安定してしまい変化がなかった

また、そもそも新卒で就職活動する時点から転職は3~4年目あたりでするのが良いのかな~とぼんやりと考えていたということもあります。 世の中の流れ的に自分が人生で一度も転職しない可能性はほとんどないだろうなと考えていたので、どうせ転職するなら体力的にも精神的にも若いうちに最初の転職をやっておいた方が良いだろうという考えです。

実際に、前職で働くうちに上述のような行き詰まり感を感じ始めたのが新卒入社してから4年目だったこともあり、ある程度自分の中では会社の成果に貢献できていた感覚もあったので、転職について考え始めました。*1

理想の企業の条件

そこでまず、自分にとっての理想の企業の条件を考えてみました。 前職では未経験からITエンジニアになったので、開発体制や技術スタック含めて真剣に考えるのは今回が初めてです。 その結果次の3つの条件に絞ったのですが、私が調べた範囲では株式会社HERPしかヒットしなかったためHERPの選考を受けてみることにしました。

  • 型のある言語を利用していること
  • スクラム開発を導入していること
  • 人事採用ドメインのプロダクトを開発していること

型のある言語を利用していること

前職ではRubyをメインで利用していたので、静的型付け言語の経験はあまりありませんでした。 一般論としてITエンジニアの成長の指標として色々な種類の言語を経験しておくことは重要だと思います。 さらに、昨今のTypeScriptブームを受けて静的型付けや関数型的な考え方を身につけておくことは自分のキャリアにとって重要なのではないかと考えるようになってきました。

株式会社HERPではTypeScriptおよびHaskellをプロダクト開発に利用しており、技術スタックに関しては自分にとって十分すぎる会社だと判断しました。 特にHaskellをプロダクト開発している会社は日本でも珍しく、関数型文化を吸収できそうだと考えたこともHERPが良いと思った理由の一つです。

スクラム開発を導入していること

前職では自己流のアジャイル風の開発を行っていました(こういう企業は割と多いと思います)。 自分なりにいろんなインプットをして出来るだけ気持ちよく効率的に働くための改善をしてみるものの、なかなかやり方としてしっくりくることがなく、また改善のスコープ自体も拡げていく元気がありませんでした。 たとえば新機能の開発内容や期間について決める最終的な権限は自分にはなかったため、そのあたりを含めた改善を行うためには上長や上長の上長まで巻き込んで働きかける必要があったのですが、そこまでのコミュニケーションスキルが自分にありませんでした。 そこで、すでにスクラムなどのある程度型が決まっている普遍的な手法が導入されている企業で働いてみて、型を身につけたいと思うようになりました。

株式会社HERPではすでにスクラム開発が導入されています。また、内定後にMTGなどを見学してみてエンジニアチームがボトムアップで意見を出して開発している雰囲気を感じ、ここならスコープが大きい課題があっても自分から改善していけそうだと感じました。

人事採用ドメインのプロダクトを開発していること

数年前からDDD(ドメイン駆動設計)に興味があり、実際に業務で実践しようとしてもいました。 ただし、前職は「AWSの運用自動化サービス」という技術的かつ専門的なドメインを扱ったプロダクトを開発していたため、より一般的で現実世界に存在する業務ドメインのコードを書きたいと思うようになりました。

そこで、現実世界に存在する業務ドメインで、かつ自分の興味があるドメインを考えたところ「人事採用ドメイン」に辿り着きました。 大学の卒業論文でも就職活動について研究を行ったことがあり、前職でも新卒採用の面接官などに関わっていて興味があったためです。

加えて、自分が今後5~10年先の未来で仮にITエンジニア以外の職種につくとした場合、人事採用または研修・教育などの分野が第一候補として考えられるので、今後のキャリアの可能性を広げておく意味でもHR関連のプロダクトを開発している企業がいいなと思いました。

HERPに決めた理由

実は転職活動らしい転職活動はHERPのみしか行っておらず、他の会社との比較などは特にしていません。 似たような条件の企業はなかなかないだろうと思っていたので、他の企業を受ける気持ちはあまりなく、もし落選してしまったら前職社内での配置転換など含めてまた考えようと気楽に考えていました。

そんな状況でありがたく内定をいただいたので、自分の中ではすぐに内定を承諾しようと決めました。 もちろん、新卒で前職に入社してから初めての転職ということもあり不安な気持ちもありましたが、事前にSlackに入らせてもらったり、MTGをいくつか見学したりして、自分の期待しているような環境であるということが確信できたのでそこまで不安はありませんでした。

入社してみて

そろそろ入社してみて1ヶ月が経ちますが、おおよそ入社前に期待していたような環境だったと思っています。 強いて言えば想像していたよりもベンチャーっぽいカオス感がなく、前職よりもいろいろな仕組みがうまく回っているように感じるところが主にギャップに感じているところです。 これはおそらく既存のメンバーがスピード感を持って改善してきてたどりついた(そしてこれからも変わっていく)結果なのだと思います。

また、入社前はエンジニアとして技術やスクラムなどに注目していましたが、コミュニケーションの文化も特徴的で、個人的にはすごく良いと感じているポイントです。 HERPには「愛をもつ」というバリューがあり、単に仕事上のやり取りだけではなく人間同士の愛があるコミュニケーションをすることを重視しています。 こういう表現をすると、元々ひねくれたコミュ障エンジニアの自分としてはブラック企業っぽい「アットホームな職場」と勘違いされてしまわれないか不安なのですが、そういう方向性の愛とはまた別で適切な距離感で気持ちよく仕事をできる快適な雰囲気です。

私は元々そういうコミュニケーションにあまり慣れてなく、前職ではどちらかというと淡々と仕事を進めていくタイプでした。ところがHERPに入ってから確実に「愛をもつ」コミュニケーションスタイルの恩恵を受けていて、以前よりも素を出してコミュニケーションできている感覚があります。 これは単に居心地が良いという以上に仕事を進める上でも大きなメリットがあり、自分が考えていることをアウトプットするハードルが下がったり、気楽にフィードバックを求められるようになったりしました。

一方で、まだまだ社内に課題や伸びしろがたくさんありそうだなということもよくわかってきたので、自分にできるところから価値を出せるようにやっていきたいと思います。

ちなみに、このブログにはこの記事1件しかないのですが、実はHERPでの活動のアウトプット用に作成したブログです。 HERPにはいわゆる会社のテックブログというものはなく、その代わりにエンジニアの個人ブログをキュレーションするHERP TECH HUBという仕組みがあります。 tech-hub.herp.co.jp

前職ではアウトプットは基本会社のテックブログに書いていたので、HERP入社を機にエンジニアとしての個人ブログを始めて作ってみたという経緯です。
今後もHERPでの活動含めた技術的なトピックについて発信していく予定ですので、ぜひチェックいただけたら嬉しいです。

最後に

そんな株式会社HERPは現在も積極採用中です。

herp.careers

culture.herp.co.jp

興味がある方はぜひサイトを覗いてみてください。 また、TwitterなどでDMを送っていただいても構いません。

それでは、これからもよろしくお願いします。

*1:とはいえ、個人的に前職に対してそれほどネガティブな思い出があるわけではなく、むしろ私の社会人としてのマインドセットを形成する機会となった良い会社だと思っている、ということは付記しておきます。今でも良い会社だと思っています。