【CTO of the year記念リレー】Full-Stack TypeScriptの選択
はじめに
アセンドでプロダクトエンジニアをしている宮沢(@westlagoon114)と申します!
先日行われた「Startup CTO of the year 2024」にて当社の丹羽(@niwa_takeru)がオーディエンス賞を受賞しました。
アセンドのメンバーの1人としてはもちろん、「物流」という黒子に光が当たった瞬間だった気がしてとても嬉しかったです!
応援してくださった皆様ありがとうございました。
この受賞をきっかけに、ピッチの中で時間の都合上深掘りできなかった部分について、リレー形式でお届けしていきます。
前回は増谷による開発生産性を支える仕組みと文化をお届けしました。
今回はStartup CTO of the year 記念リレー企画の第3弾としてFull-Stack TypeScriptを紹介していきます。
ぜひ最後まで読んでいただけると嬉しいです!
Full-Stack TypeScriptのススメ
アセンドでは、運送会社の全ての業務をデジタル化するため、広範囲な業務領域をカバーする必要があります。
特にVertical Saasではエンジニアがドメインに深く潜り、顧客の課題に向き合うことが重要となります。
フロントエンドとバックエンドを TypeScript に統一することで、開発言語切り替えに脳のリソースを奪われることなく、本質的な顧客価値に向き合うことが可能となります。
実はこの記事を書いている宮沢もFull-Stack TypeScriptの開発環境がアセンドの入社理由の一つでした。
高速で型安全な開発ができる点はもちろん、プロダクトエンジニアとしてフロントとバックエンドを越境した開発が求められるアセンドの開発スタイルと非常にマッチしていると思っています!
エンジニアリソースが足りなくて、開発生産性が求められる会社にはうってつけの開発環境です。
アセンドの開発環境について
アセンドの各領域の技術選定について詳しく解説します。
フロントエンド
React
CTO丹羽が2017年からReactを利用していたことや、初期プロダクトもReactであったことから継続して React を利用することとしました。
React はライブラリとしての書き方の矯正力が強く、複数人での開発や業務アプリなど複雑性の高いアプリケーションにおいては堅牢に開発がしやすいとも考えていました。
Next.js
ゼロコンフィグの恩恵を享受するために Next.jsを選択しました。特にスタートアップとしてwebpackの調整をする労力をかけたくないことからベストプラクティスに乗ることとしました。
バックエンド
Express.js
2021年当時はJSベースのサーバーサイドといえば Express.js が代表でした。機能性が薄くカスタマイズ性があることが逆によく、ドメイン駆動設計のレイヤードアーキテクチャを選択しています。
Express に強いこだわりはなく薄くしか利用していないため、将来的にはHonoなどのフレームワークへの移行を考えています。
InversifyJS
Dependency Injection を実現するために InversifyJS を利用しています。
インタフェース定義に基づいて責務を分け疎結合でキレイに層を分離することを強制するためにDIの仕組みを重視して入れています。
一時期 Nest.js への移行も検討しましたが、層の命名や切り方に Nest.js 側の思想が強くありすぎて考え方に合わない部分もある一方で旨みが少ないことから見送りました。
Prisma
ORMにはPrismaを利用しています。初期はMongoDBでmongooseを利用しており、Prismaの実用性が高くなったことから移行しています。特にスキーマ定義に基づいて、TypeScriptの方がついたClientを生成してくれることにありがたさを感じています。
Zod
ZodによるModelの軽量化と表現力の向上させることができます。
Zodによるスキーマをフロントとバックエンドで使い回すことにより効率的な開発が可能になります。
Infrastructure as Code / Tools
この章は簡単な紹介となります。
IaCにTypeScriptを利用したことでTerraformに比べてコードの補完が聞きやすく、また定義に関してライブラリ内に飛ぶことができるため初学者でもコードベースで全体像がわかりやすいというメリットがありました。
AWS Cloud Development Kit
cdk8s (Cloud Development Kit for Kubernetes)
またSlackのChatOpsでデプロイの自動化をしていますが、ChatBotをBoltで開発しています。
上記のように開発環境を全てTypeScriptで統一しています。
私自身、アセンド以前からFull-Stack TypeScriptによる開発環境の会社で働いていました。
フロントエンドとバックエンドをどちらも開発できることで開発スピードが上がりエンジニア1人で機能をつくり切れる点が魅力的で、この開発環境を個人的にも非常に気に入っています。
今後の展望
現在社内ではプロダクト開発を進めるとともにライブラリやフレームワークの見直し、関数型DDDへの移行を進めています。
下記のようなロードマップで改善を進め、より高速で安全なプロダクト開発を促進しようと考えています。
第一歩として現在はZodによるModelの軽量化と表現力の向上とclassからの脱却に取り組んでいます。
Zodで作成したスキーマをフロントとバックエンドで使い回すことで、型安全かつ高速な開発が可能となりました。
また、ZodはTypeScript Nativeなので表現力が高く、Zodで作成したスキーマからドメインモデルやupdate時の型などを生成することでコードの凝集度が高くなるなどのメリットもありました。
今後はフレームワークをHonoに置き換え、Result型の導入などを検討しています。
最後に
丹羽の発表にもありましたが、私もエンジニアは「社会を豊かにする存在」だと思っており、本当に追求すべきは顧客の課題解決だと思っています。
Full-Stack TypeScriptはそれを可能にする手段であり、私たちの武器としてこれから今以上に有効活用していきたいと考えています。
こんなにFull-Stack TypeScriptを激推ししているアセンドですが、現在社内にTypeScriptのスペシャリストはおらず、まだまだTypeScriptを活かしきれていない現状があります。
なので、TypeScriptが好きで少しでもアセンドに興味のある方はぜひ下記からカジュアル面談をお申し込みください!
一緒に社会を豊かにできる方を大募集しています。
ここまで読んでいただき、ありがとうございました。
次回の記事も楽しみにしていてください!