2025年12月25日木曜日

Go使いの求職者が少なくとも、プログラミング言語Goの採用をためらわなくてよい理由

IT系人材斡旋サービスの人が、プログラミング言語Goは小規模低トラヒックのサービスではアドバンテージがなくGoを採用しようとするエンジニアは独りよがりだと言い出した。オーバーエンジニアリングで技術負債になると言っているので、Goは難しく、扱える人材が乏しいという理解のようだ。しかし誤認である。

Goは、Python、PHP、Node.js(JavaScript)、Ruby、Perlなどと比較して処理が速く省リソースで、C/C++(そしてRust)と比較するとガーベッジコレクターがあるのでメモリー管理が容易で、また標準で仮想スレッドとノンブロッキングI/Oをサポートしており並行プログラミングが容易に利用できる。

1. 学習コストが低い

複雑さを排除した文法で学習コストが低いことも、Goの特徴だ。文法が簡単。初学者に混乱をもたらしがちの演算子オーバーライド*1とストリーミング処理*2が無い。クラス型オブジェクト指向言語ではないので、階層の深いクラスが山積みのAPIと言うことはない。C++テンプレート地獄もないし、Javaアノテーション地獄*3もない。安全のためにプログラマに苦労を強いているRustの所有権システムもない。ガーベッジコレクター搭載だ。

Go言語に難しいところがあるとすれば、ユーザーフレンドリーを謳うプログラミング言語で排除されているポインターがあることだ。しかし、PHPやPythonには参照渡しと値渡しを区別が陽にあるし、Javaでも陰に違いはある。怪しいポインター操作がされる可能性はあるのだが、業務アプリケーションのようなものであれば参照渡しのために使われる事がほとんどだし、ポインターまわりで起きがちなメモリーリークはガーベッジコレクターで概ね防がれる。

文法だけではなく、インストールや開発環境の整備も簡単であるし、学習教材もある。他のプログラミング言語の経験があれば、公式チュートリアル(のアプリケーション)を読むことで、遅くて一週間で仕事にかかれる。人材に関しては、技術転換してもらえば済む。Go使いの求職者が少なくとも、プログラミング言語Goの採用をためらわなくてよい。無責任に言うが「Goプログラマ募集!Go未経験でもPHPやJavaScriptなどの経験があれば歓迎!」で間に合う。

2. Goを採用すべきか?

もちろんGoを採用すべきかは、総合的に考える必要がある。ライブラリやフレームワーク、開発ツールの整備状況まで考えると、開発効率が利用者数が多い古い言語に届かないこともある*4。よほどパフォーマンスに困っていなければ、遅い言語の既存アプリケーションをGoで書き換えても便益は薄い*5。学習コストが低いとは言え、慣れの問題はやはりある。新規のSPAのバックエンドのマイクロサービス(Web APIのサーバー)やバッチ処理ぐらいから導入するのが良さそうだ。

*1不便にするために導入されているわけではなく、C++のEigenや、Rのdplyrのようにユーザーフレンドリなり用法もあるが、乱用されると処理を把握しづらくなる。

*2Rのapply関数群が初学者に難しいとよく言われる。慣れると処理をすっきり書けて便利だが。PythonのPandasパッケージでも採用しているし、Javaでも同様の機能のStream APIが8から導入された。

*3アノテーションと呼ばれるコンパイラや仮想マシンから読める情報をソースコードに埋め込めるようにして、XMLの設定ファイルを書かなくて済むようにしたが、アノテーションと(分量は減ったが)XMLの設定ファイルの両方を書く羽目になっている。

*4ウェブをPHPとそのフレームワークのLaravelで作ってきたところがGoに転換を試みて、実際に幾つかつくってPHPに戻したと言う話があった(PHPからgoへの移行で分かったこと - Speaker Deck)。プログラミング言語だけで生産性は決まらない。機械学習でGPUを利用することを考えると、Pythonのライブラリの方が強力だ。(同じ会社だが)リコメンドシステムをGoに移行しようとして、Pythonに戻したと言うのがあった。Visual Studio CodeでGoの編集は快調にできるが、EclipseとJavaの組み合わせの方が(JavaDoc参照やメソッド/プロパティー名の置換など)細かいところは強力だ。

*5TypeScriptのコンパイラー(トランスレーター)は7からTypeScriptからGoに転換しパフォーマンスが10倍になった(「TypeScript」がネイティブ移植で10倍の速さに - 窓の杜)そうだが、ウェブのバックエンドシステムをNode.jsからGoに変更してもそこまでのパフォーマンス向上は報告されていない。Node.js(JavaScript)からGoに移行してパフォーマンス倍と言うのがあった(Migrating from Node.js to Go: Real-world Results from Our E-commerce Analytics Pipeline - DEV Community)が、これで上の方では無いであろうか。遅い言語でもパフォーマンスが複雑な部分で共通して使われるところはC/C++でライブラリ化されているし、必要であればC/C++でライブラリ化することができる。

0 コメント:

コメントを投稿