コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

クライアントサイドとサーバーサイドの言語統一に関して考える

フロントエンドとバックエンドで言語を統一する、ということのメリットに関して頭で現在思い描いていたことを改めて書き出してみる。

言語統一をすると良くなるケース

開発メンバーの認知負荷を軽減したい

主にWebアプリケーション開発で見られることだが、いわゆるクライアントサイドのWebブラウザ向けの開発をし、サーバーサイドを他の言語で開発することがある。この際にクライアントサイドもサーバーサイドも同じ人もしくは同じメンバーで担当する場合がある。そうなると機能を作り上げる過程である日はクライアントサイド、あくる日はサーバーサイドの実装をすることになることになり実装する場所に応じてコーディングする言語が異なることになる。

このクライアント/サーバーで言語が異なる場合に、言語の切り替えの度に言語の記述方法に関しても頭の中で切り替えなければいけない。この際に切り替えることによる余分な時間(いわゆるコンテキストスイッチ)が発生し、結果認知負荷が増大する。

これがクライアント/サーバーで取り扱う言語が同一になると言語ごとに切り替える負担が減り、増大してしまった認知負荷を減らすことができ、本懐の実装に関してパワーをつかうことができる

ロジックを共有・流用をしたい

クライアントサイド向けに作ったロジックが、実はサーバーサイドに必要になる場面がある。例えばバリデーションのロジックなどはサーバーを介さずにクライアントサイドだけでチェックをかけて、サーバーに送られた際に改めて送られてきた値に不正がないか同じ意図のバリデーションチェックをかけることがある。このような場合にクライント/サーバーで言語が異なる場合それぞれで同じ意味を持つバリデーションを実装する必要が出てくる。

ただしこれが同一の言語の場合はモジュールとして扱ってしまえばクライアントでもサーバーでも同一のソースコードで実装ができるため、純粋に手間の削減につながる。また、部分的に流用したい場合もモジュールがきれいに分割されていればお互いの移動や共有が勘弁になる。

言語統一しても切り離せないもの

実装の考え方

サーバーサイドの実装とクライアントサイドの実装では、考える勘所が変わってくる。

  • サーバーサイドはデータベースとの接続や多重リクエストをどうさばいて行くかなども関心として出てくる場面が多い。
  • クライアントサイドはイベントをどう取り扱うかなど、UIに連動したイベント処理に関してどうやって制御するかなどに関心を寄せる場面が多い。

このようにサーバーサイドとクライアントサイドでは考え方の切り口が変わる場面が多いので、クライアントサイドでは良しとされるような処理がサーバーサイドではしっくりこないというようなものが出てくる場面もあり得る。そのためサーバー/クライントの実装を行き来する場合、それらのコンテキストスイッチは必要になると考えられる。

適用可能な場面/言語と事例

事例があるものを紹介する。

Webアプリケーション with TypeScript(JavaScript)

一番身近で考えやすいのがこのアプローチ。ただしTS/JSに関してはフロントもサーバーサイドもフレームワークの移り変わりが激しいので、その選定が難しく賞味期限が早いと考えられる。そのためサーバーサイドを他の言語にしたほうが安定して運用ができる可能性もあり、採用する際はそれらも加味してプロジェクトを進める必要が出てくると思われる。

事例

ゲームアプリ with C#

スマートフォンゲームなどでUnityを使う場合はC#を使うが、C#はサーバーサイドにおいても利用することができる。この点を応用して、クライアントもサーバーもC#で記述するという戦略をすることができる。ただしサーバーサイドC#Windowsサーバーとの親和性のほうが高いのが現状なので、サーバライセンスなどの観点でUnix/Linux系OSでのやり方と違いが出てくるのが難点。

事例

ネイティブアプリ with Dart

Flutter+DartWebサーバーも前述のC#と似たようなやり方で実装をすることができる。ただこちらは事例を見る限り、DartのWebサーバ用のライブラリの充実がまだまだという形なので、その点を作っていく必要があるのではないかと思われる。

事例

関連サイト

余談

  • Xamarin + C#サーバーもあるんじゃないかと思いきやなかったのと、すべてJavaJavaをなんかしらしてHTML+JS生成)もありそうでなかった
  • BFFとしてのKotlinという事例もあるが、あれはちょっと色合いが違いそうなので今回は割愛しました。
  • 基本的にはクライアントサイドの言語に引っ張られるので、クライアントサイドの実装言語でサーバーサイドを実現するというアプローチになる