🗂

色んな言語で同じWebアプリケーションを実装する時の注意点

2021/05/16に公開

ISUCON作問みたいな、色んな言語で同じWebアプリケーションを実装する場合に気をつけた方が良いと自分が気付いたことを書いておきます。

HTMLのテンプレートエンジン

テンプレートエンジンは言語によって記法も違いますし、layout周りやエスケープ周りや関数呼び出しなど、ライブラリによってかなり違いがあります。

RubyのERBのように柔軟なテンプレートエンジンに慣れていると忘れがちですが、他の言語のテンプレートエンジンは必ずしも機能が豊富とは限らないので使うにしても単純な機能以外使わない方が良いでしょう。そもそもテンプレートエンジンは使わずにJSONとかを返すだけにした方が良いです。最近のISUCONの問題がHTMLをほとんど返さないのはかっこいいからではなく、他言語への移植を簡単にするためです。

時刻

例えば 2013-02-03 00:00:00 +0000 UTC みたいな文字列を返したり、Parseすることは避けるべきです。この辺りはISOで標準化されていたりするので大丈夫だろうと思ってしまうかもしれないですが、マイクロ秒の扱いだったり、タイムゾーンの扱いだったり、Zの有無だったりと、言語毎の微妙な違いに悩まされることになります。

例えばISUCON9予選ではMySQLではdatetime型で保存していましたが、JSONで渡す時はUNIXタイムに統一していました。ブラウザ上の表示はJavaScriptでうまいことやりましょう。こうしないとベンチマーカーでParseできるようにするために特定の言語で色々工夫するみたいなつらいことになります。ちなみにUNIXタイムには2038年問題があるので、型がある言語ではintではなくint64で扱ってください。

エラー処理

RubyやPHPのような言語だと、エラー処理を曖昧にしていても何とかなりますが、Goだとエラー処理を毎回行う必要があります。なのでGoに移植されることを想定して書かないと、元の実装に未定義なエラー処理をGo実装の時だけ書かざるを得なくなります。Go以外の言語で書く場合は常にGoのような言語に移植されることを想定しながらエラー処理をちゃんと丁寧に行うようにしてください。

ハッシュマップのキーを自由に増やさない

RubyやPHPだとハッシュマップが便利なので、雑にキーを追加したくなりますが、Goだと基本的に毎回構造体を定義する必要があるので、あまりにも自由にやりすぎるとGoに移植するのが大変になります。Goのmapを使うという手もありますが、Rubyとかに比べたら使いやすくないので気をつけてください。

最後に

他にも言語毎に色々ありますが、意外と見過ごしがちな物だけを書きました。ISUCON作問みたいな特殊ケースでしか役に立たない気がしますが、そういうケースでは頭に入れておきましょう。

Discussion