EVENT REPORTイベントレポート
ヒカラボレポートとは、開催されたヒカラボにおいて、登壇者が伝えたい講演内容を記事としてまとめたものです。ご参加された方はもちろん、ヒカラボに興味があるという方も是非ご覧ください。
ヒカラボレポートとは、開催されたヒカラボにおいて、登壇者が伝えたい講演内容を記事としてまとめたものです。ご参加された方はもちろん、ヒカラボに興味があるという方も是非ご覧ください。
ここ数年で導入企業が増え続けているGo言語。
しかし、まだまだ他の言語に比べると情報は少なく、「名前は良く聞くようにはなったけど、実際にはどういう特徴があるのかわからない」といった方が多いのではないでしょうか?
今回はそういった方々のためにインテリジェンス社とトークノート社の2社をお迎えして初心者向けGo言語勉強会を実施いたしました。 Go言語の歴史からメリット・デメリット、また各社が導入することになった背景まで幅広くお話いただきました。
理解しやすい初心者向けの内容となっておりますので、Go言語に興味がある方は必見です!
講演者プロフィール
最近注目されているGo言語。採用実績も増えてきています。今日はそんなGo言語について、お話していきたいと思います。
Go言語は処理速度が速いため、APIのバックエンドやバッチ処理など「パフォーマンスがネックとなる部分」に採用されることが多いです。実際のベンチマークを例にとりましょう。
1から1億までを加算したときにかかった時間を比較します。
PHPは3.47秒だったのに対し、Goは0.05秒で処理が終わりました。圧倒的にGoが早かったです。
ケース1 1から1,000万までを文字列として連結し、ファイルに出力する場合
文字列を初期化し、PHPで1から1,000万回文字列として連結後、ファイルに出力するという処理を行いました。すると、PHPだと1.47秒で済んだのが、Goだと単純に文字列をつなげるだけで10分以上かかってしまいました。
ここで1回1回文字列をつなげていくのではなく、bufferにどんどん入れていって最後に文字列で返すというやり方を採用したところ、Goでの処理速度は0.95秒に。PHPで処理するよりも早く終わらせることができました。
ケース2 配列に100万件以上のデータを追加する場合
PHPだと0.21秒かかるこの処理。Goではどうだったかというと、あらかじめ100万件のデータを配列に追加しておくことで、0.03秒で終わらせることができました。
また、キャパシティ指定スライスという拡張型の配列を用いると、0.05秒で処理を終わらせることができました。キャパシティ未指定スライス使用時には0.18秒かかっていたので、かなり時間短縮ができています。
ケース3 100万レコードのTSVを読み込み、MySQLに1レコードずつ登録する場合。
PHPでは118秒かかり、Goだと134秒かかりました。どちらも時間がかかっています。
「Goのパフォーマンスは早い」と言われています。でも、「正しく使わないと本来のパフォーマンスを発揮できないという落とし穴もあるな」という印象を持ちました。我々も今、Goで開発していますが、「どうすればGo本来のパフォーマンスを発揮できるか」ということを意識しながら開発に努めたいと思います。
バッチメインで活用しているGo。その他、サービス管理用ツールの作成やHackの実行ファイルの作成も
弊社では、転職サイトの開発で初めてGoを採用。データ連携/集計、アラートなどバッチメインで使っています。また、サービス管理用のツールをRevelを使って作ったりもしています。
あとは「Goで実行ファイルを作り、それをHackから読んで使う」といったこともしています。なぜこんなことをするのかと言うと、HackがPHPの標準ライブラリで使えないケースが多いためです。
バッチが多く、かつ処理が複雑な転職サイトにGoは欠かせない
次に、「どうしてGoを選んだか?」ということについてですが、一番の理由は「Goが並列処理の仕組みを持っているから」です。転職サイトという性質上、バッチが多く、かつ処理が複雑になりそうだったので、並列処理を得意とするGoを選ぶことにしました。最終的には、パフォーマンスの高さが決め手となりましたね。
その他の採用理由としては、「コンパイル言語だとコード修正時の影響が分かりやすい」「今後、メジャーになっていく言語だという確信があった」「新しい言語を使うことでチームのチャレンジ意識を高めたかった」といったものがありました。
「goroutine」「channel」「select」の理解があれば、すんなりと実装することができます。特にクラウドサービスを利用している関係上、コア数を状況に応じで変更することがあります。そういった時に並列実行数を自動的に変える仕組みのあるGoは便利です。
またGoは、初期リリース時に最低限のテストコードのみを書き、あとで機能追加していくという弊社の開発スタイルにも合っていると思います。修正したときに「どこに影響があるか」ってことがコンパイル言語だと分かりやすいですし、リファクタリングもしやすいですからね。
「WebもGoにしちゃえばいいじゃん」って考えたこともありました。でも、タイトなスケジュールの中で全員がGoを習得するのは難しいというのがあって…。また、Webでの採用実績が少なく、リスクも気になりました。なので、Webの方はHackにしています。
メンバーもだいぶGoに慣れ、楽しみながら開発を行えるようになってきました。自分自身も、Goに出会ったおかげでプログラミングがとても楽しくなりました。
Goに興味のある方と共に、これからもGoを盛り上げていければと思います。
Goが注目されるようになった裏側には、PHPが抱えるさまざまな問題がありました。まずは、PHPの課題点について話をしていきたいと思います。
PHPで一番苦しいのは「並列処理」
PHPで「一番苦しいな」と思ったのは、並列処理です。無理をすればPHPでも並列処理で書くことはできます。「ノンブロッキングI/Oで非同期処理をやる」という手がありますが、それでも並列処理は難しいという印象があります。
「カジュアルに書ける」というメリットが、実はバグを増やす要因に…
PHPってカジュアルに書ける反面、堅牢なプログラミングがしづらい。堅牢なプログラミングができないということは、「バグを生み出しやすい」ということにつながってきます。もちろん、バグを失くす為にテストを充実させたり、リファクタリングを行うなどの対策をしましたが、それでもバグはなくならない。この現実は、なかなか苦しいものがあります。
PHPの課題をカバーする言語として、目をつけたのがGoです。Goは、「並列処理」や「コンパイル時の厳格なエラーチェック」を特徴とするため、PHPの課題をしっかりと補うことができるためです。また、「習得が比較的容易」「処理が高速」といったメリットがあることも、Goが注目されるようになった理由の一つですね。
ただ、Goにはデメリットもあります。それは「イマドキの言語と比べると、言語仕様が見劣りしてしまう」ということ。例えば、ジェネリクスがないとか、関数型のフレーバーがないとか…。
なので実は、Goという言語はそれほどイマドキの「イケてる言語」ではなく、「質実剛健」といった部分が、Goの魅力です。
弊社でGoを採用した理由はいくつかありますが、やはり「並列処理ができる」ということが大きいです。
で、並列処理は「goroutine」というタスク間の通信方式を用いて実現しています。このgoroutine、関数の前にgoをつけるだけでコールできる優れもの。これにより、関数を非同期に実行しています。
あと、クロージャーをgoroutine化して非同期に実行することも可能です。
弊社の主力サービス「トークノート」の一部は、Goを使って作りました。メールでの投稿機能を実現するマイクロサービス(Web API)を、Goで書いたという感じですね。マイクロサービス化することで、コードベースを小さく分割し、スケーラブルにできる点が良いと思います。
以上です。
本日はGoのメリットやデメリット、Goの採用理由などを中心に本日はお話させていただきました。最後になりますが、弊社では技術大好きエンジニアを絶賛募集中です。ご興味のある方はぜひ!
いかがでしたか?
Go言語のメリット・デメリットなど参考になる情報が多かったのではないでしょうか。注目度が高いGo言語なのでヒカ☆ラボでも定期的に勉強会を開催していきたいと考えています。その際はぜひともヒカ☆ラボにご参加いただき、今以上、知識を深めてもらえたら嬉しいです!