はじめに
こんにちは、テックリードのかどたみです。 とても暑いですね、仕事終わりのビールが美味い!弊社はビールが無料で飲めるのでビールをたくさん飲みたいエンジニアは最後まで記事を読んで頂いて、採用ページからご応募ください!
では本題です。
昨年Rustでマイクロサービス開発を始める記事を書き、ありがたいことに多くの反響をいただきましたが、今回はRustに次ぐ2つ目の言語としてTypeScript、フレームワークとしてNestJSを採用したので経緯と使用感を書いていきたいと思います。
なぜRust以外の言語を採用したのか?
今後力を入れていくとして昨年記事まで書いたのにRustだけで開発をしないのか。以前の記事にも書いたとおりまだRustでのバックエンド開発のエコシステムが完全では無いという点もあるのですが、今後マイクロサービスを構築していくGCP(特に今後我々のプロダクトの要になるBigQuery)のライブラリに公式のものがないという点が大きいです。
我々自身でGCPのAPIを実行するプログラムを書いてもいいのですが、それらに対する保守や公式ライブラリが公開されたときの移行コストを考えると現状の開発チームの規模ではあまりやるべきではないと判断しました。なので、GCPのサービスに依存せず、実行速度が求められる機能をRustで開発し、GCPのサービスに依存する機能を別の言語で開発することにしました。
なぜTypeScriptなのか?
以前の記事ではRust以外にTypeScript, Go, Scalaが候補に上がっていました。しかし、scalaもBigQueryの公式クライアントが無いのでこの時点でGoかTypeScriptかの二択になりました。
この二択の中でRustを選んだときも重要視した他の領域のエンジニアが学習しやすいか、を採用観点にしました。弊社では与えられた業務をこなすこともそうですが、チャレンジすることが評価の対象となっています。現状維持だけでなくチャレンジしやすい環境の構築もチームづくりには大事だと考えているので、今回はフロントエンドエンジニアがバックエンドの開発に参入しやすいようにTypeScriptの採用を決めました。
実際に言語選定前にもフロントエンド以外の領域もやってみたいという声もいくつかもらっていたので、それならバックエンドの知識習得のみに集中できるようにしたいという想いです。
なぜNestJSなのか?
フロントエンドエンジニアの参入ということを考えると弊社の場合、他の選択肢がほぼ有りませんでした。なぜならNestJSはAngularにインスパイアされてるフレームワークだからです。弊社はフロントエンドの開発をAngularに一本化したのでNestJSの学習コストも低いのではないかと考えました。また、バックエンドがNestJSを採用する前からフロントエンド開発に利用するモックサーバーとしてNestJSを使っていたのでこれも大きな決め手になりました。
実際Angularを勉強した身からするとDIやアノテーションなどの考え方がそのまま利用されているので理解がしやすく、Angularの理解が進めばNestJSの理解も進み、NestJSの理解が進めばAngularの理解が進むということもありました。これはかなり採用して良かった点ですね。弊社とは逆にNestJSを利用している組織でAngularを採用してみるのも面白いかもしれません。
初期設定ではExpressをベースに動作するNestJSですが、Fastifyを利用することもできます(参考)。パフォーマンスが気になる場合はこちらも検討してみたいと思います。
使ってみてどうか?
テストの仕組みだったり、構造化ログの定義、APMへの連携など、本番運用において考慮しなくてはならない最低限のことがすべて揃っていてドキュメント通りにすぐに構築できた点はやはり流石だなと思います。Rustを書いている感じで凝った設定のミドルウェアや便利メソッドを書こうとするとだいたい車輪の再発明になります。ただ、ライブラリも多く、それぞれ使い方に癖がある場合もあるのでサードパーティライブラリの選定には注意が必要かもしれないですね。
言語としてはRustほど型に安心感は有りませんし、実行できてもJavaScriptの仕様的に予期せぬnullやundefinedが返ってくることがあるので、びっくりすることはありますが、TypeScriptやJavaScriptの特性を理解すれば記述する上では結構コンパイラが仕事してくれます。そこは言語の習熟でカバーしていくしか無いかなと思っています。
おわりに
いかがでしたでしょうか?
今回はマイクロサービス開発に新たにTypeScript、NestJSを選定した理由をお話させていただきました。Rustに続くマイクロサービスの2つ目の言語、フレームワークとしてこれらの技術でも発信を頑張っていきたいと思います。
Emotion Techでは顧客体験、従業員体験の改善をサポートし、世の中の体験を変えるプロダクトを開発しています。プロダクトに興味のある方、領域にとらわれないTypeScriptでのアプリケーション開発に興味のある方、ぜひ採用ページからご応募をお願いいたします。