JavaScript勉強会

JavaScriptの学習日記

Webアプリの作成でPHPとGoの使い分け方

Webアプリを作るとき、PHPよりもGo言語の方が動作が高速です。

 

jsstudy.hatenablog.com

 

しかし、Go言語はPHPと比べてコードを書くのが少し面倒です。

Go言語の使い方について、参考になる意見がありました。

 

f:id:jsstudy:20190203005157p:plain

 

www.yunabe.jp

 

なぜGoは”悪い”言語なのか

Goに対する批判は数多く存在します。それのどれにもきちんとした理由はあると思います。主な批判は大きく

  • Generics (template) がない
  • 継承がない
  • 例外がない。まるで1970年代に設計されたかのようである。
  • 非知的なプログラマのためにデザインされている。

に集約されるように思います。

 

Errors as values (例外が推奨されない)

Go言語のFAQにあるように、Goには例外がありません。

panic, recoverで例外と同じようなことはできますが、Javaの例外のように気軽に使ってはなりません。

個人的にはこのFAQにかかれていることには概ね同意します。

例外で返されたエラーを try {...} catch (Exception e) {...} みたいに処理しないといけないのは無意味に複雑なように思います。

それだけならよいですが、例外が発生するとコードが想定外の順序で実行されて困ったり、何故かこのコードが実行されないなと思ったら、その前に例外で大域脱出していて、しかもその例外が予想外のところでcatchされ握りつぶされていたり、と例外を大規模なプロジェクトの中で正しく扱うのは中々に困難だと思います。

Goの例外は極力使わず、エラーを値として扱うポリシーはよいもの(特に大規模なプロジェクトで、エラーハンドリングが大切なプロジェクトでは)だと思います。

 

ただ一方で、ちょっとした使い捨ての便利ツールを書く場合や、とりあえずプロトタイプで正常系だけ書きたい時、 あるいは異常が発生したらプログラムを停止してしまって良いような起動時の初期化処理を書く時には、正直Goのエラーハンドリングはかなり面倒くさいです。

 

エラーが発生した場合はエラーメッセージを出力して処理を中断してしまって問題ない 

  • 使い捨てあるいは内部ツールで開発者・利用者の数が数人でエラーハンドリングがあまり重要ではない時
  • 正常系だけとりあえずプロトタイプしたい時

には例外の方が便利であり、正直Go言語ではあまり効率的にコードが書けないような気がします。

個人的にはそういう用途にはPythonなどを使うのが正しい解決策のように思えます。

何でもGoで書く必要はないのですから。

型の存在すら簡単なプロトタイピングをするのには少し鬱陶しいですしどんな言語も適材適所だと思います。

 

  1. プロトタイプは、PHPPythonなどの動的型付けのスクリプト言語で作る。
  2. 仕様が確定した後、速度を求めてリファクタリングするときは、Go言語でカッチリと書く。

 

blog.yusuke.be

 

どこからGolang化していくか?

さて、Goのパフォーマンス性能を活かせて、かつ、現行で走っているサービスに影響がなければ、Golang化したいところ。ただ、移行のコストとかも考えると全てをGoにするのは大変だし、Perlの方が得意なところもあるのでその辺は見極めなくてはいけません。ボケてではMicroservicesという言葉が流行る以前から、ある程度サービスをHTTPレイヤーで切ったコンポーネント化を進めておりました。そこで、大きな部分を一気に変更する、のではなく、小さな一部分だけを違う実装に変えるということが容易です。そこで、目をつけたのがスタンプサーバです。

 

  1. マイクロサービス・アーキテクチャーのように、機能を部品化しておく。
  2. 一度に全部の機能をPHPからGo言語へ移植するのではなく、パフォーマンスの改善に資するところから徐々に切り替えていく。

 

そんな使い分け方でもいいかな?

 

プロトタイプは思いつきで書き殴ったコードが多いから、本番投入後はどっちみち1度はリファクタリングしないといけないでしょう。そのときにGo言語でリプレースしていけばOKと。

 

Go言語の文法自体はシンプルなので覚えやすいですが、イディオムに慣れないとコードをサクサクと書けるようにはならないと思いました。

 

イディオム (プログラミング言語) - Wikipedia

ソフトウェア工学に於けるイディオム(英: Idiom )は、アルゴリズムプログラミングのノウハウ、チップを集めたものである。

これがより大規模になったものをデザインパターン、さらに大規模なものはアーキテクチャパターンと呼ぶ。

 

今まで作ったWebアプリを練習がてらちょっとずつGo言語で置き換えてみたいと思います。 

 

 

みんなのGo言語【現場で使える実践テクニック】

みんなのGo言語【現場で使える実践テクニック】