技術判断は事例と実践
2004年に入社してから、様々なプロジェクトに関わってきました。8~9割のプロジェクトが新規立ち上げで、1年以内で次のプロジェクトに移っています。最近では音楽配信アプリ「AWA」の立ち上げに携わりました。
「AWA」では最初、サイバーエージェントでこれまで実績のあったJavaとNode.jsを検討していました。
同時期に海外ではDockerやTerraformなど、インフラ周りのツールにGo言語が使われる事例が増えており、Go言語に注目をしていました。「AWA」の開発を担当している若いエンジニアの意欲も高かったことから、サーバサイドでGo言語を採用することに決めました。
この段階では実際に作ってみてダメだった場合、他の言語を採用することも視野に入れていました。ただ、海外の事例や「AWA」のアーキテクチャを考えた場合、Go言語で問題なく実装できる自信はありました。
環境に依存しない
実際に触れてみて、Go言語には様々な優れている点がありました。まず、Go言語が実行環境への依存が非常に少ない点です。
アプリケーションを運用する上で大変なことの1つは、実行する環境を構築することです。Java, Node.js, Ruby や Python などは実行に必要な大量のライブラリや、OSの環境を整えるプロビジョニング作業の手間が大きく、実行環境とテスト環境の小さな差異が障害につながることもあります。Goであれば、Linuxが動くという最低限の環境でも動作するポータブルなバイナリが生成されるので、プロビジョニングの手間がほとんどなく、動作も環境にほとんど依存しません。
コンテナとの相性が良いですし、運用がしやすいのも特徴です。「AWA」では、アプリケーションのデプロイをするフローでメリットがありました。GitHub等の外部コードを簡単に取り込む機能が言語に備わっているので、外部ライブラリが使いやすいというのもGo言語の良さです。
「AWA」開発時に感じたGo言語の「硬派」さ
「AWA」を開発していて、Go言語は言語設計が「硬派」だなと感じました。例えば、Node.jsで使うJavaScriptは言語としてカジュアルな印象があります。自由でルールも緩いので、自分流に開発したい人や、フレキシブルな設計を望む人が好む印象を持っています。
逆にGo言語は、小さい頃からコンピュータ使っている人とか、C++が好きな人とか、プログラミング言語自体が好きな人など、硬派よりのエンジニアに好かれる言語という印象があります。
フォーマットやコードの書き方、パッケージの作り方、テストファイルの置き方や書き方など、かなり細かいところまで言語としてのルールが決まっているので、チームで新規プロジェクトを開発する時に非常に効果的です。Goの標準に則って開発をしましょうと最初に決めてしまえば、コーディング規約やテストなどのルールを決める必要がなく、チーム開発での悩みや手間を減らすことができます。
また、Go言語の場合、プログラマの個性が出てしまうような範囲をあえて狭め、多様性が出ないような配慮があり、それがコードの可読性にもつながっています。
アサートはプログラマの怠慢だから採用しないといったところや、オブジェクト指向にあるような継承を用いてないところなども、Go言語の特徴です。言語仕様を一貫してシンプルにし、開発者ごとの思想に依存しないように徹底されているのがわかります。
「AWA」の品質向上に貢献したGo言語
Go言語での開発と運用を通して、品質の高いプログラムを作るためかかる労力が、他の言語と比べて少ないと感じています。
Go言語ではテストコードのルールが最初から整備されており、コードカバレッジなども簡単に集計できるので、テストファーストな開発をしやすいです。そのため、品質の高いコードを維持することができます。実際にAWAでは、コードを起因とした不具合が起こることは稀です。
また、実行するコードは、消費メモリも少なく、独自の並列処理機構によって、CPU効率も非常に良いです。サーバの負荷が高い時や、同時接続数の増加が起きた時なども、Go自体がボトルネックとなって処理が滞るような事は起きていません。
ライブラリの試行錯誤
Go言語を採用して苦労した点を挙げるとすれば、Go言語の書き方などの試行錯誤や、Go言語特有の仕組みへの対応方法です。
Go言語は外部のライブラリに簡単にアクセスできる仕組みが用意されています。しかし、Go言語には外部のライブラリのバージョン管理をするという概念がありません。その結果、外部のライブラリが更新されると新しいバージョンを使ってコンパイルします。
新しいライブラリに仕様変更があった場合、アプリケーションが動作しなくなる場合があるため、一般的にはバージョンロックをしますが、Go言語自体にはそのような仕組みが用意されていません。Goのバージョンロックに関しては、様々なツールが乱立しているので、どれにするか最初はとても迷いました。また、Webのフレームワークも乱立している状態で、標準のもので行くか、いずれかのフレームワークを採用するか、試行錯誤しながら開発を進めていきました。
今後期待している点
Goは、ちょっとしたプログラムをさくっと作ることもできますし、型制約があるので大規模なチーム開発もスムーズに進めることも可能です。開発を始める際に他の言語に比べて、設計にかける労力を抑えることができます。
今後、個人的にGo言語に期待しているのは、スマートフォンへの対応です。Go 1.4からAndroidをサポートするようになりました。今後AndroidアプリでGo言語を活用できるようになると、Go言語の可能性がさらに広がると思います。また、Go1.5 では、iOS もサポートされたので、そのあたりも期待しています。
今後もAPIサーバやコマンドラインツールなど、幅広い分野でGo言語を採用し、開発をしていくと思います。
今のところGo言語だから開発ができないという問題にはぶつかっていません。「AWA」を開発した当時に比べると、ライブラリの数も増えてきていますので、実現できることの幅が広がっていると思います。
現状Pythonで充実している機械学習系のライブラリや、Javaが強いビックデータ解析基盤などを今後Go言語が置き換えるポテンシャルがあると感じています。
Go言語は処理も早いですし、メモリ消費も少ないのでビッグデータ解析にも向いているのではないでしょうか。