こんにちは、CTOの十川です。
NCDCのエンジニアチームは「新しい技術や、モダンな開発手法で、新しい事業やサービスのコンセプトを実現すること」をミッションとしています。
今回はNCDCが2021年2月時点でよく使用しているプログラミング言語や、フレームワークなどについて、なぜそれを選択したのかという理由と合わせて以下の4ジャンル分紹介したいと思います。
- Webフロントエンド
- モバイルアプリ
- バックエンド
- インフラとIaC(Infrastructure as Code)
NCDCでは上記以外にも機械学習や、IoTなども扱っているのですが、それはまた別記事で紹介したいと思います。
目次
はじめに
タイトルに「モダンな」と書いてありますが、これから紹介するものは割と2021年時点で王道な組み合わせかなと思っています。
前提として、NCDCでは多くのメンバーがJavaScriptを書けるので、Webフロントエンド、モバイルアプリ、バックエンドともJavaScriptのエコシステムを積極的に採用しています。また、全体的にTypeScriptを使用しています。
Webフロントエンドの開発環境
Webフロントエンドの開発では、SPA(Single Page Application)、特にReact(https://reactjs.org/)及びReduxの使用が第一の選択肢になっています。
比較的大きいアプリケーションを構築することがあるため、アプリケーション全体をサポートしてくれるフレームワークが必要になるというのがこの選択をした理由です。
一般的にReact以外の選択肢としては、Vue.jsだと思います。
Vue.jsは自社での開発で採用することはほぼ無いのですが、NCDCが支援しているお客様が自社でシステムの内製化に取り組まれるようなケースで、「React系だと重厚すぎて学習コストが大きい」と判断された場合はVue.jsをお勧めすることがあります。
この領域については非常に多くの経験を積めているかなと思います。
今後もしばらくはこの構成が続きそうな見込みです。
フロントエンドのCI/CDにも取り組んでいて、自分たちだけでやる場合、軽量に使用できるAWS AmplifyまたはGithub Actionsを良く使用しています。
一方、大規模なプロジェクトなど複雑なパイプラインが必要な場合では、AWS CodePipelineなどのCodeシリーズを使うこともよくあります。
モバイルアプリの開発環境
ReactNative
モバイルアプリの開発での第一の選択肢はReactNative(https://reactnative.dev/)を使ったハイブリッド開発です。
カメラやローカルファイルシステムへのアクセスなどハードの機能を使用する場合は、提供されているプラグインを使ったり、iOSであればSwift、AndroidであればKotlinを使って自分たちでプラグインを作ったりしています。
Swift,Kotlin
端末の機能を使用する割合が高い(SwiftやKotlinなどのネイティブで開発する割合が高い)場合、全体をSwiftやKotlinで開発しています。例えばカメラが主体のアプリケーションをつくる場合などです。
現在、1つのコードでiOS,Androidなどのマルチプラットフォームに対応するツールとしては、ReactNativeとFlutterの2つが人気です。どちらも魅力的なのですが、NCDCではReact、TypeScriptを書ける人が多いので、現在はReactNativeを採用しています。
以前はApache Cordova (https://cordova.apache.org/) を良く使用していました。
CordovaはWebViewベースのハイブリッドなアプリ開発ができるツールで、端末の機能を利用する場合は、同じくプラグインを使用してネイティブで提供される機能を利用できます。
WebViewベースのアプリはブラウザエンジン自体が高速化されていることもあって、Cordovaでもすごく遅いということはないのですが、ReactNativeの方が動作速度は早いことと、ReactNativeの方が現時点ではコミュニティが活発で新しい機能がどんどん追加されることを評価し、NCDCでは2019年から2020年にかけて、新規に開発するアプリはCordovaからReactNativeに移行しました。
Reactの周辺技術に慣れていることもあって、最初こそReactNativeのExpoの癖に苦労しましたが、現在はうまく行っているかなと思います。
バックエンドの開発環境
ここでバックエンドというのはほとんどのケースでAPIです。
JavaScript (TypeScript) + Node.js + Express
JavaScript (TypeScript)で書くのが第一の選択肢になりますが、フレームワークとしては採用するプラットフォームによって異なります。
プラットフォームとして、AWS ECSのようなコンテナ基盤を使用する場合、Node.jsとExpress(https://expressjs.com/)を使用してAPIの開発を行います。ExpressはAPIやWebアプリケーションを開発するためのフレームワークですが、比較的機能が少なく、自由度が高いため、プロジェクトによって作りが違うということが良くあります。
今後、他のフレームワークの検討や、Expressと組み合わせられるフレームワークの検討もしていきたい領域です。
AWS Lambdaのようなサーバレス環境で開発する場合は、Expressを使わないケースもあります。
Python + FastAPI
第2の選択肢としては、Pythonです。
Pythonの場合、フレームワークとしてはFast API (https://fastapi.tiangolo.com/) を採用することが多くなっています。PythonのWeb開発フレームワークというとDjangoが有名ですが、Fast APIは以下の点が優れていると考えています。
- 公式ドキュメントが充実しており、学習コストが低い
- コードがシンプルに書ける
- リクエスト、レスポンスの型定義ができ、これによりバリデーションが楽にできる
- OpenAPI準拠のAPIドキュメントを自動で生成できる
また、バックエンドをPythonで書くことのメリットとして、データの加工、集計などが得意なライブラリが豊富にあるため、IoTなどのデータを扱うようなアプリケーションではすごく有効かなと思います。
バックエンドのCI/CDはServerless Frameworkか、AWS Codeシリーズを使用することが多いです。
インフラとIaC(Infrastructure as Code)
NCDCには社内サーバーというものはなく、自分たちの検証環境や本番環境はすべてクラウドになっています。
AWSが最も多いですが、AzureやGCPも使用しています。
サーバーのメンテナンスは極力やりたくないので、サーバレスや、コンテナ、マネージドサービスを積極的に採用しています。
具体的なAWSのサービスでいうとAWS Lambda、Amazon ECSなどのアプリケーション実行環境や、認証サービスのAmazon Cognitoなどです。
インフラの構築をコードで定義するInfrastructure as Code(IaC)の領域は、まだどれが社内で第一優先になるのか決まっていません。現状では次のツールを使い分けています。
- AWS CloudFormation: AWSの新しい機能がサポートされるのが早い。当然だがAWS以外で使えない
- Terraform: 社内ではCloudFormationより書きやすいと評判なのと、AzureなどのAWS以外を使用する時に採用することが多い
- Serverless Framework: AWS Lambdaを採用する場合に、アプリのCI/CDも一緒にできるのでよく使用されています
開発環境選びで大切なのは将来性と自社能力との相性
WebフロントエンドでのVue.jsやモバイルアプリ開発のFlutterは世界的に人気も高く、ツールとしても優秀だと思います。NCDCがReact、ReactNativeを選択したのはNCDCのエンジニアのスキルにあっていると判断したためです。
技術の選択では、このように該当の技術の将来性(すぐ廃れない)と、組織のCapabilityとのフィット感が重要かなと考えています。
NCDCではフロントエンド、バックエンド、モバイル、機械学習、クラウドなどの領域でエンジニアを募集しています。
新しい技術や、モダンな開発手法での取り組みに興味を持った方は、まず話を聞いてみるだけでもかまいませんので、ぜひこちらの採用情報ページから応募するか、十川(sogo@ncdc.co.jp)までご連絡ください。