🎃
2023年のwebアプリのbackend言語選定
2023 年、server side の言語選定はなにがいいのだろう?
python or go or typescript で考えたい
-
AI との親和性なら python
-
静的型付けなら go や typescript
- python でもやれなくはない
-
python は framework 単位でもみないとか
- 一旦 fastapi 決め打ちで
ポイント
型
- fastapi
- Pydrantic がある(機能 - FastAPI)
- go
- compile 時に厳密にチェックされる
- typescript
- compile 時にチェックされるが、間違っていても通ることもある
- 一度通ってしまうと js では型がないので、runtime でエラーがでることがある
結論
- △ python
- ◎ go
- ◯ typescript
Dependency Injection
- fastapi
- 強力な DI があるらしい(機能 - FastAPI)
API docs/コードの自動生成
-
fastapi
- コードファースト
- mock コードからでも自動生成される(FastAPI)
-
go
- スキーマファースト
- スキーマからコードを自動生成する package は色々とある
- OpenAPI から Go 言語のコードを自動生成してくれるツールを試してみた
-
typescript
- go に同じっぽいけど、こっちはクライアントなのかな?
- server side typescript のことがあまりわかってないので要調査
- Hello from OpenAPI Generator | OpenAPI Generator
- Protocol Buffers から TypeScript の型定義を作る
コードファースト or スキーマファースト
そういう考え方があるらしい
- コードファーストで OpenAPI を爆速で定義できる FastAPI を使おう!| Tak
- OpenAPI でコードを生成してスキーマ駆動で開発する:Go と TypeScript の場合| NAVITIME_Tech
コードファーストのほうが楽では?
- どちらも目指してる先は同じ。仕様と一致するスキーマを生成する。yaml で書くのか、コードで書くのかの違い。yaml 書くのはつらい
-
個人的にはあまりにスキーマ定義が便利に書けるので、たとえスキーマファーストであっても、スキーマ定義を書くエディタとして FastAPI を使ってもいいと思うほどです。
-
- fastapi のコード=実装ではない(mock 実装できる)。
- スキーマファーストだと細かいロジックの反映とかしにくいのでは?
Protobuf 使うのもコードファーストでは?
- PRC・gRPC・Protocol Buffers
- 今さら Protocol Buffers と、手に馴染む道具の話 - Qiita
- OpenAPI や Protocol Buffers のおかげで開発がかなり捗っている話 | MEDLEY Developer Portal
- そもそもソフトウェアエンジニアがメンテしにくい言語でスキーマファイルを触るのが NG(openapi なら yaml を生で触るとか)
GraphQL もスキーマファーストか
結論: スキーマはメンテしやすい言語でメンテすれば良さそう
- openapi: fastapi
- 非 openapi: protobuf, GraphQL
友人のコメントメモ: go + protobuf 一択
パフォーマンスのボトルネックを考慮したほうがいい
- 機械学習と相性がいいからといって API まで python にしなくていい
- 一緒にすると計算リソースが密結合してしまう。スケールしにくくなる。
- 機械学習は GPU やメモリがボトルネックになることが多い
- API は CPU、ネットワーク
- これはなるほど
- つまり
- 機械学習 project なら、機械学習モデルは python で簡易な REST API を組み、メインは go で作る
go は静的型付けが厳密, typescript は緩い
- なんでゆるいのかはよくわからなかった
- typescript の型の付け方の仕様まわりに何か問題がありそうだという話だった
typescript は簡単なこともあり、人材のチェックが難しいらしい
- 未経験の人材が大量にいるため
- 実績の文字面だとスキルがわかりにくいらしい
スキーマ言語は protobuf がいい。go 使うなら特に
- go も protobuf も google 製で相性良くメンテされているとのこと
GraphQL は仕様が複雑化するに従い、つらくなる
- これもなんでだったかな。protobuf ほど表現力がないから、とかだったかな
Discussion