Go言語に乗り換えた私たちが最初に魅了された理由
ソフトウェア開発の現場って、道具箱から何かを選ぶみたいに言語を選ばなきゃいけないことがよくある。どの言語も「速いですよ」「シンプルです」「スケールします」って、まあ色んな顔を見せてくるけど、実際は落とし穴も隠れてたりする。Go(ゴー言語)に手を出した理由も、それっぽい評判につられた感じだったかな。
うちのチームでは昔からPythonでAPI作ってた。Flaskだったと思う。でもだんだんアクセス増えてきて、サーバーもなんかじわじわ増やしてるし、応答速度もちょっとずつ遅くなってきてた気がする。それで「そろそろ別の方法ないかな」みたいな空気になったのが始まりだった。経験豊富な人もいたし、新しく入ったばかりのメンバーも混ざってたっけ。
何に期待したかというと、高速動作とか、配布簡単とか、その辺り。GoはGoogle製ってこともあってここ数年で注目されていて、「近いレベルまで速い」とか「デプロイが楽」とか耳に入る話は多かった気がする。特にコンパイルして一個のバイナリになるから依存関係で悩む時間減るかもしれないね、と誰かが言ってたような……。
あとGoだとゴルーチン?軽量スレッドみたいなのが使えるらしくて、大量同時アクセスにも比較的強そうと思われていた部分もある。ただ、この辺りは本当に全部上手く行くとは限らなくて、導入後に予想外の困難や手戻りなんかにも直面した記憶が残っている。
コミュニティについては、有名企業(クラウド系とか配車サービスとか)がちらほら採用している事例を見聞きして、それだけでも何となく安心感持った人はいたみたい。ただ実際には使いながら「あれ?」となる細部や工夫すべき点なんかもあった。
結局、「これさえあれば大丈夫!」みたいな決定打じゃなくて、色んな要素を天秤にかけつつ試行錯誤していた印象。Go自体には確かに良さそうなところが複数あるものの、それぞれ条件次第で違う結果になることもしばしば……そんな感じだったと思う。
うちのチームでは昔からPythonでAPI作ってた。Flaskだったと思う。でもだんだんアクセス増えてきて、サーバーもなんかじわじわ増やしてるし、応答速度もちょっとずつ遅くなってきてた気がする。それで「そろそろ別の方法ないかな」みたいな空気になったのが始まりだった。経験豊富な人もいたし、新しく入ったばかりのメンバーも混ざってたっけ。
何に期待したかというと、高速動作とか、配布簡単とか、その辺り。GoはGoogle製ってこともあってここ数年で注目されていて、「近いレベルまで速い」とか「デプロイが楽」とか耳に入る話は多かった気がする。特にコンパイルして一個のバイナリになるから依存関係で悩む時間減るかもしれないね、と誰かが言ってたような……。
あとGoだとゴルーチン?軽量スレッドみたいなのが使えるらしくて、大量同時アクセスにも比較的強そうと思われていた部分もある。ただ、この辺りは本当に全部上手く行くとは限らなくて、導入後に予想外の困難や手戻りなんかにも直面した記憶が残っている。
コミュニティについては、有名企業(クラウド系とか配車サービスとか)がちらほら採用している事例を見聞きして、それだけでも何となく安心感持った人はいたみたい。ただ実際には使いながら「あれ?」となる細部や工夫すべき点なんかもあった。
結局、「これさえあれば大丈夫!」みたいな決定打じゃなくて、色んな要素を天秤にかけつつ試行錯誤していた印象。Go自体には確かに良さそうなところが複数あるものの、それぞれ条件次第で違う結果になることもしばしば……そんな感じだったと思う。
Python APIが抱えていたパフォーマンスの問題点
決断は、まあ、それなりに考えた上で出したものだったと思う。Node.jsも検討リストにはあったけど、速さはあるものの、JavaScriptっていう言語自体がみんなに好かれていたわけじゃなくて。Javaは安定性があるといえばそうなんだけど、やたら長くて複雑になりがちでね。Rustも触れたことはある人が何人かいたみたいだけど、使いこなすには結構しっかり勉強しないと難しい感じ。その点Goは、一見したところ難しくなくて、パフォーマンスもまあまあ良さそうだし、大きめの規模にも対応できそうという印象だった。Pythonメインでやってきたようなチームだと、このくらいの新しい言語なら入りやすいんじゃないか…そんな空気だった気がする。
それで、新しいAPIをスマートに作れるんじゃない?と少し期待混じりでGoを選ぶことになった。サービスを書き直してスケーリングの課題も解決できるかな、と淡い希望を抱いて、本格的に手をつけ始める。
最初の頃はいろいろ新鮮で楽しかったという記憶がある。Goの標準ライブラリ(net/http)とか人気らしいgorilla/muxっていうルーターも割と簡単にセットアップできてしまう。最初の週くらいでもう基本的なAPIエンドポイントからJSON返す仕組みまで動いていたような気がする。複雑なフレームワークに悩まされることもなくて、Pythonでありがちな依存関係地獄とも無縁。それぞれコード量はそこまで多くならず、「こういう書き方もアリなんだ」と思わせるところがあった。
並行処理も、自分たちには目新しかった部分だ。一昔前までPython製APIでは同時アクセスへの対応に苦労していた記憶があって──GunicornとかNginx使ってどうにかしていたような…。Goの場合、goroutineを立ち上げることで自然に並列処理できるので、不思議なくらいサーバー1台でも多めのリクエスト(数千件までは行ってないけど、それ相応には)をこなせている実感があった。遅延も減った感じだったし、その違いには少し驚いたものだ。ただ、全体として見れば一部状況限定かもしれない。この時期は「おっ」と思える変化ばかり目についた、と今振り返ればそんな印象になるかな…。
それで、新しいAPIをスマートに作れるんじゃない?と少し期待混じりでGoを選ぶことになった。サービスを書き直してスケーリングの課題も解決できるかな、と淡い希望を抱いて、本格的に手をつけ始める。
最初の頃はいろいろ新鮮で楽しかったという記憶がある。Goの標準ライブラリ(net/http)とか人気らしいgorilla/muxっていうルーターも割と簡単にセットアップできてしまう。最初の週くらいでもう基本的なAPIエンドポイントからJSON返す仕組みまで動いていたような気がする。複雑なフレームワークに悩まされることもなくて、Pythonでありがちな依存関係地獄とも無縁。それぞれコード量はそこまで多くならず、「こういう書き方もアリなんだ」と思わせるところがあった。
並行処理も、自分たちには目新しかった部分だ。一昔前までPython製APIでは同時アクセスへの対応に苦労していた記憶があって──GunicornとかNginx使ってどうにかしていたような…。Goの場合、goroutineを立ち上げることで自然に並列処理できるので、不思議なくらいサーバー1台でも多めのリクエスト(数千件までは行ってないけど、それ相応には)をこなせている実感があった。遅延も減った感じだったし、その違いには少し驚いたものだ。ただ、全体として見れば一部状況限定かもしれない。この時期は「おっ」と思える変化ばかり目についた、と今振り返ればそんな印象になるかな…。
Comparison Table:
要素 | 詳細 |
---|---|
言語特性 | Goは静的型付けであり、シンプルな構文を持つ。並行処理が得意で、ゴルーチンを利用することでスケーラブルなアプリケーションを構築可能。 |
エラー処理 | 独自型と補助関数の組み合わせにより、エラー処理が明確になり、スタックトレースも活用できる。 |
ライブラリ状況 | 標準パッケージに依存する傾向が強いが、一部では外部ライブラリ(例:GORMやsqlx)が選ばれることもある。 |
学習コスト | 新しい概念(ポインタやゴルーチン)への理解には時間がかかるが、それでも多くのチームはGoを選択し続けている。 |
導入戦略 | 小規模なプロトタイプから始め、具体的な要件と期待値を確認した上で本格導入することがおすすめ。 |

Goの並行処理モデルがもたらした革命的な変化
Goでプロトタイプを作ったとき、PythonのAPIよりも速さが明らかに違うなぁと感じたことがあった。体感で言うと、返答速度は二倍とか三倍近く短くなって、メモリの消費もおおよそ半分程度まで減った気がする。チーム内でも「何か特別な力を得たんじゃないか?」みたいな雰囲気になったこともある。
デプロイメントでも意外なメリットが見えてきた。GoのAPIはコンパイル後に一つのバイナリになるから、Linuxサーバーならどこに持っていってもほぼそのまま動いてしまう。Pythonみたいにインタープリターや仮想環境を入れる必要もなくて、DevOps担当者はちょっと嬉しそうだった。「また『自分のマシンでは動いた』問題か…」という悩みから少し解放されたようだった。
Dockerにも手を出してみたりしたけれど、このバイナリひとつ方式のおかげでイメージ自体もかなり小さめになって、起動なんかもちょっと速くなる印象だったかな。
標準ライブラリについて触れておくと、Goは結構充実している方だと思った。Pythonだと`requests`や`Flask`みたいな外部パッケージに頼る場面が多かったけれど、Goの場合HTTP通信やJSON処理、それからログ出力なんかも標準機能だけで済むことが多い。それで依存関係は最小限になりやすいし、セキュリティ上の不安(例えばサプライチェーン攻撃とか)もちょっと和らぐ気がした。コードベース自体も割とスッキリしていた。
正直、その時点では「これは選択として正しかったんじゃないかな」と思わされる空気感が社内には流れていた。ただ、その盛り上がりも長く続いたとは言えない部分がある。
開発を進めてAPI全体の複雑さが増していくにつれて、「シンプルさ」が逆に制約として感じられるようになってきた。Goという言語自体のミニマルさ――それは確かに美点だけれど、その代償として想定外の苦労にも直面した。一例を挙げればエラー処理だろうか。Goではエラーを値として扱う考え方だから、一つひとつ手作業で対応することになる。その結果、どうしても冗長な記述(ボイラープレート)が増えやすい。
デプロイメントでも意外なメリットが見えてきた。GoのAPIはコンパイル後に一つのバイナリになるから、Linuxサーバーならどこに持っていってもほぼそのまま動いてしまう。Pythonみたいにインタープリターや仮想環境を入れる必要もなくて、DevOps担当者はちょっと嬉しそうだった。「また『自分のマシンでは動いた』問題か…」という悩みから少し解放されたようだった。
Dockerにも手を出してみたりしたけれど、このバイナリひとつ方式のおかげでイメージ自体もかなり小さめになって、起動なんかもちょっと速くなる印象だったかな。
標準ライブラリについて触れておくと、Goは結構充実している方だと思った。Pythonだと`requests`や`Flask`みたいな外部パッケージに頼る場面が多かったけれど、Goの場合HTTP通信やJSON処理、それからログ出力なんかも標準機能だけで済むことが多い。それで依存関係は最小限になりやすいし、セキュリティ上の不安(例えばサプライチェーン攻撃とか)もちょっと和らぐ気がした。コードベース自体も割とスッキリしていた。
正直、その時点では「これは選択として正しかったんじゃないかな」と思わされる空気感が社内には流れていた。ただ、その盛り上がりも長く続いたとは言えない部分がある。
開発を進めてAPI全体の複雑さが増していくにつれて、「シンプルさ」が逆に制約として感じられるようになってきた。Goという言語自体のミニマルさ――それは確かに美点だけれど、その代償として想定外の苦労にも直面した。一例を挙げればエラー処理だろうか。Goではエラーを値として扱う考え方だから、一つひとつ手作業で対応することになる。その結果、どうしても冗長な記述(ボイラープレート)が増えやすい。
単一バイナリ展開という夢のようなデプロイ体験
最初は、それなりに納得できるやり方だった気がする。Pythonのtry-except構文に慣れていた人たちにとって、Goの「if err != nil { return err }」みたいなエラー処理は分かりやすいと思ったこともある。でも、コード量がいつの間にか増えてくると、同じようなエラーチェックばかり繰り返している自分たちに気づいて、なんだか面倒になってきた。例えば、ごく普通のデータベース操作を書く時、こんな感じになってしまう。
こういうパターン、本当にあちこちで見かける。データベース呼び出しでもHTTPリクエストでもファイル操作でも、大体似ている。「最初はちゃんとしたエラー処理」と思って続けていたものが、結局は「if err != nil」に囲まれた冗長なコードだらけになってしまい…見通しが悪くなるし、可読性も下がったような印象を受けることもあった。Pythonみたいに例外でまとめて扱える方が便利だった、と感じ始めた開発者も少なくなかった。Go初心者には、この単純作業みたいなのが特に退屈らしく、新機能を作るペースにも影響した気さえする。「errors」パッケージなどでエラーに追加情報をつけたり、ヘルパー関数でごまかそうともしたけど、そのぶん余計ややこしくなる面もあった。結局、「Goのエラー処理は基本的には筋が通っているものの、それだけでコード量がずいぶん増えることになる」と思わざるを得ない。
それからもう一つ。標準ライブラリ自体は意外と充実している反面、その周辺となるとPythonほど広大ではない感じだったかな…。PythonならSQLAlchemyとかPydanticとかCeleryみたいな道具をよく使う人も多いと思うけど、Go界隈では同じレベル・同じ感覚のものを探すのは難しかったようだ。ORM(オブジェクト関係マッピング)について言えば、一応GORMという有名どころを試してみたものの、SQLAlchemyほど直感的には使えず苦戦した記憶がある。GORMの自動マイグレーション機能もうまく動かない場面もあり、そのクエリビルダーも期待より表現力控えめだった気がする。そのせいで、生SQL文を書く羽目になることもしばしば——まあ動きはするけど、「前より手間増えた?」と首をひねったメンバーもちらほら居たようだよ。
func getUser(id int) (*User, error) {
row, err := db.Query("SELECT * FROM users WHERE id = ?", id)
if err != nil {
return nil, err
}
defer row.Close()
var user User
if err := row.Scan(&user.ID, &user.Name); err != nil {
return nil, err
}
return &user, nil
}
こういうパターン、本当にあちこちで見かける。データベース呼び出しでもHTTPリクエストでもファイル操作でも、大体似ている。「最初はちゃんとしたエラー処理」と思って続けていたものが、結局は「if err != nil」に囲まれた冗長なコードだらけになってしまい…見通しが悪くなるし、可読性も下がったような印象を受けることもあった。Pythonみたいに例外でまとめて扱える方が便利だった、と感じ始めた開発者も少なくなかった。Go初心者には、この単純作業みたいなのが特に退屈らしく、新機能を作るペースにも影響した気さえする。「errors」パッケージなどでエラーに追加情報をつけたり、ヘルパー関数でごまかそうともしたけど、そのぶん余計ややこしくなる面もあった。結局、「Goのエラー処理は基本的には筋が通っているものの、それだけでコード量がずいぶん増えることになる」と思わざるを得ない。
それからもう一つ。標準ライブラリ自体は意外と充実している反面、その周辺となるとPythonほど広大ではない感じだったかな…。PythonならSQLAlchemyとかPydanticとかCeleryみたいな道具をよく使う人も多いと思うけど、Go界隈では同じレベル・同じ感覚のものを探すのは難しかったようだ。ORM(オブジェクト関係マッピング)について言えば、一応GORMという有名どころを試してみたものの、SQLAlchemyほど直感的には使えず苦戦した記憶がある。GORMの自動マイグレーション機能もうまく動かない場面もあり、そのクエリビルダーも期待より表現力控えめだった気がする。そのせいで、生SQL文を書く羽目になることもしばしば——まあ動きはするけど、「前より手間増えた?」と首をひねったメンバーもちらほら居たようだよ。

標準ライブラリの充実度に驚いた日々
データ検証については、何となく気が進まなかった記憶がある。PythonでPydanticを使っていた頃、JSONの中身チェックなんてサクッと済んでしまった。Goに移った時はvalidatorというものを取り入れてみたけど、手作業でタグを書かないといけないし、どうも感覚的じゃなかったようだ。
それからCeleryみたいなタスクキューのライブラリも探したことがあったけど、asynqとかmachineryとか、そのあたりは名前だけ知ってる程度だったし、なんとなくドキュメントも物足りなくて…まだ発展途上な感じだったかな。
パッケージやツールの選択肢が多いPythonに慣れていたからかもしれないが、自分たちで機能をこしらえる場面が増えてきて、そのせいで開発スピードが落ちたり保守の負担も大きくなった印象だ。振り返れば、Pythonの豊富なライブラリエコシステムに気付かぬうちに頼っていた部分が結構あったと言えるかもしれない。
あとね、ジェネリクス(汎用型)が無かった時代のGo――二年ほど前だったと思う――そこではコードを共通化したくても簡単じゃなかったんだよね。例えば構造体のスライスをフィルターする関数ひとつ作るにも、型ごとに同じような処理を書き直す羽目になってしまうわけだ。当時は「またこれか」と思いながら同じようなロジックを書くことになって、それもちょっと地味に堪えた気がする。それでも最近は状況変わっているらしい、と風の噂で聞いたことがあるけれど…当時としては結構面倒だったんじゃないかな。
それからCeleryみたいなタスクキューのライブラリも探したことがあったけど、asynqとかmachineryとか、そのあたりは名前だけ知ってる程度だったし、なんとなくドキュメントも物足りなくて…まだ発展途上な感じだったかな。
パッケージやツールの選択肢が多いPythonに慣れていたからかもしれないが、自分たちで機能をこしらえる場面が増えてきて、そのせいで開発スピードが落ちたり保守の負担も大きくなった印象だ。振り返れば、Pythonの豊富なライブラリエコシステムに気付かぬうちに頼っていた部分が結構あったと言えるかもしれない。
あとね、ジェネリクス(汎用型)が無かった時代のGo――二年ほど前だったと思う――そこではコードを共通化したくても簡単じゃなかったんだよね。例えば構造体のスライスをフィルターする関数ひとつ作るにも、型ごとに同じような処理を書き直す羽目になってしまうわけだ。当時は「またこれか」と思いながら同じようなロジックを書くことになって、それもちょっと地味に堪えた気がする。それでも最近は状況変わっているらしい、と風の噂で聞いたことがあるけれど…当時としては結構面倒だったんじゃないかな。
エラーハンドリングの地獄が開発速度を鈍らせる
Goでよく見かける、こんなコードがあった。ユーザーや注文のリストを絞り込む関数なんだけど、型ごとに同じような実装を何回も書かされていた。あれは本当に面倒だったし、うっかり間違えやすいところもあった気がする。ジェネリクスがない時代には、interface{

Pythonと比べて物足りないと感じたエコシステム
Goの構造体をポインタで扱う話とか、並列処理が便利な半面、気付かぬうちにデータ競合が生じるようなケース、そういうのはわりと前から指摘されてた気がする。何度もコードレビューしたし、チーム内でもトレーニング的なことを地道に続けていた記憶がある。それでも最初の頃は慣れるまで時間がかかった。学習コストは想像より高めだったかな。
ただ、それだけでGoをやめるほどではなくて。速度面とか同時実行処理のメリットはやっぱり捨て難いし、中途半端な段階で引き返す決断にはならなかった。結局、弱点とうまく付き合う感じになったというか。それぞれ工夫して折り合いをつけながら使い続けている人も多いみたい。
たとえばエラー処理についてだけど、一つの方法として独自型と補助関数を組み合わせる例を見たことがある。
こんな感じで書くことで、定型文的な繰り返しや曖昧さが多少減って分かりやすくなることもあったかなと思う。また、「github.com/pkg/errors」みたいな外部ライブラリを追加してスタックトレースも残せたりしたので、不具合調査の際にも少し助かった経験があったようだ。
周辺ライブラリ事情について言えば、多くの場合Go標準パッケージ中心に使われる傾向だった印象。ただ、どうしても足りない部分には第三者製品もちょこちょこ選ばれていた。「GORM」より「sqlx」が選ばれる場面とか、要件によって違いが出てきたりするんだろう。「validator」に薄いラッパーを書いてPydanticっぽい宣言的バリデーション風に近づけようとした事例も聞いたことある。でも市販ライブラリ自体まだ発展途上っぽい印象で、その場合は無理せず自作ロジックで補完する方針になる場合も結構ありそうだ。
全体として一律じゃなく細部ごとに手探りで調整…そんな雰囲気だった記憶。
ただ、それだけでGoをやめるほどではなくて。速度面とか同時実行処理のメリットはやっぱり捨て難いし、中途半端な段階で引き返す決断にはならなかった。結局、弱点とうまく付き合う感じになったというか。それぞれ工夫して折り合いをつけながら使い続けている人も多いみたい。
たとえばエラー処理についてだけど、一つの方法として独自型と補助関数を組み合わせる例を見たことがある。
type APIError struct {
Code int
Message string
Err error
}
func wrapError(err error, code int, msg string) *APIError {
return &APIError{Code: code, Message: msg, Err: err}
}
func getUser(id int) (*User, error) {
row, err := db.Query("SELECT * FROM users WHERE id = ?", id)
if err != nil {
return nil, wrapError(err, 500, "failed to query user")
}
// ... その他略
}
こんな感じで書くことで、定型文的な繰り返しや曖昧さが多少減って分かりやすくなることもあったかなと思う。また、「github.com/pkg/errors」みたいな外部ライブラリを追加してスタックトレースも残せたりしたので、不具合調査の際にも少し助かった経験があったようだ。
周辺ライブラリ事情について言えば、多くの場合Go標準パッケージ中心に使われる傾向だった印象。ただ、どうしても足りない部分には第三者製品もちょこちょこ選ばれていた。「GORM」より「sqlx」が選ばれる場面とか、要件によって違いが出てきたりするんだろう。「validator」に薄いラッパーを書いてPydanticっぽい宣言的バリデーション風に近づけようとした事例も聞いたことある。でも市販ライブラリ自体まだ発展途上っぽい印象で、その場合は無理せず自作ロジックで補完する方針になる場合も結構ありそうだ。
全体として一律じゃなく細部ごとに手探りで調整…そんな雰囲気だった記憶。
ジェネリクス不在時代のコード重複という悪夢
Go 1.18が安定してきた頃、ジェネリクスを使うようになったチームもあったみたい。確かにコードの重複は減るし、filterみたいな関数がかなりスッキリしたらしい。ただ、それで全部解決ってわけでもなかったような気がする。
道具や学習にも手を抜かなかった、と誰かが言っていた。delveとかpprofもCI/CDパイプラインに組み込んだ例があるそうだし、「Effective Go」やKatherine Cox-Budayさんの「Concurrency in Go」といった教材で勉強会やペアプロもやったと聞いたことがある。レビューもそこそこ厳しくして、並行処理のバグを早めに見つける工夫をした人たちもいるっぽい。
でも全部Goだけじゃなくて、一部ではPythonも残していたらしい。なんというか、業務ロジックがちょっと複雑だったり、新機能を素早く試すにはPython側でマイクロサービス化してgRPC経由でGo APIと連携したとか。Pythonのエコシステムならではの便利さも活用できる一方、パフォーマンス重視の部分は結局Go任せになることが多かったっぽい。
それでもGoにはやっぱり得意分野があって、前よりずっと多いトラフィックにも平然と対応できていたという話が出てた。同じハードウェアなのに反応時間は五十ミリ秒くらいで収まるケースがほとんどだったとか(もちろん環境次第だけど)。ゴルーチンのおかげで同時アクセス何千件単位でも特別苦労しない場面も見受けられた。ただ、それぞれ課題は残り続けていて、万能とは限らない印象だった気もする。
道具や学習にも手を抜かなかった、と誰かが言っていた。delveとかpprofもCI/CDパイプラインに組み込んだ例があるそうだし、「Effective Go」やKatherine Cox-Budayさんの「Concurrency in Go」といった教材で勉強会やペアプロもやったと聞いたことがある。レビューもそこそこ厳しくして、並行処理のバグを早めに見つける工夫をした人たちもいるっぽい。
でも全部Goだけじゃなくて、一部ではPythonも残していたらしい。なんというか、業務ロジックがちょっと複雑だったり、新機能を素早く試すにはPython側でマイクロサービス化してgRPC経由でGo APIと連携したとか。Pythonのエコシステムならではの便利さも活用できる一方、パフォーマンス重視の部分は結局Go任せになることが多かったっぽい。
それでもGoにはやっぱり得意分野があって、前よりずっと多いトラフィックにも平然と対応できていたという話が出てた。同じハードウェアなのに反応時間は五十ミリ秒くらいで収まるケースがほとんどだったとか(もちろん環境次第だけど)。ゴルーチンのおかげで同時アクセス何千件単位でも特別苦労しない場面も見受けられた。ただ、それぞれ課題は残り続けていて、万能とは限らない印象だった気もする。

デバッグツールの違いに戸惑ったチームメンバーたち
Goに切り替えたことで、単一バイナリでのデプロイがすごく簡単になったという声もあるらしい。デプロイ作業のミスが、まあ体感だとほとんど見かけなくなったとか。でもPythonみたいに静的型付けじゃない言語だと、どうしてもビルド時に気づきにくいバグが混じることもあった気がする。Goはそういう点でちょっと助かったかな。
ただ、コミュニティについてはPythonほど大規模って感じではないけれど、それでも意外と活発という印象を持つ人もいるみたい。ライブラリも、この数年で結構使えるものが増えてきたっぽい。ただし、やっぱり選択肢としてはPythonほど豊富とは言い難いかもしれない。
実際のところ、この言語移行は良かったのか?と問われれば…一概には言えない面も残る。パフォーマンスやスケーラビリティについては、大勢のユーザー対応なんかで大きな助けになったという話を耳にした覚えがある。その分コスト面でも無駄な増加を抑えられたとか。でも、一方でエラー処理がちょっと冗長だったり、新しい技術習得の壁なんかで開発メンバーの負担感が強まったとも聞いたことがある。新機能追加や開発速度では、多少遅れを感じる場面もあったようだ。
また、「魔法」みたいな裏技コードを書きにくくなる反面、シンプルさや明瞭さを保てる設計思想には好意的な評価も少なくない。一部では「読みやすさ重視派」に合うとも囁かれている。
これからGoを選ぶなら…性能とか並列処理、それから構造の分かりやすさなどを重視したいチーム向けかなとは思う。ただし、学習コストとか既存ライブラリへの依存度によっては他の選択肢―例えばNode.jsやPythonなんか―を考えてみても悪くない、とぼんやり思う人も多いらしい。
全体として見ると、「またGoを使う?」と聞かれた場合、多分迷わず手を挙げる人もいるんだろうけど、その時は前よりもう少し慎重になると思うよ。完璧じゃなくても、自分たちに合う部分だけ拾って使えばいいんじゃないかな、と個人的には感じている。
ただ、コミュニティについてはPythonほど大規模って感じではないけれど、それでも意外と活発という印象を持つ人もいるみたい。ライブラリも、この数年で結構使えるものが増えてきたっぽい。ただし、やっぱり選択肢としてはPythonほど豊富とは言い難いかもしれない。
実際のところ、この言語移行は良かったのか?と問われれば…一概には言えない面も残る。パフォーマンスやスケーラビリティについては、大勢のユーザー対応なんかで大きな助けになったという話を耳にした覚えがある。その分コスト面でも無駄な増加を抑えられたとか。でも、一方でエラー処理がちょっと冗長だったり、新しい技術習得の壁なんかで開発メンバーの負担感が強まったとも聞いたことがある。新機能追加や開発速度では、多少遅れを感じる場面もあったようだ。
また、「魔法」みたいな裏技コードを書きにくくなる反面、シンプルさや明瞭さを保てる設計思想には好意的な評価も少なくない。一部では「読みやすさ重視派」に合うとも囁かれている。
これからGoを選ぶなら…性能とか並列処理、それから構造の分かりやすさなどを重視したいチーム向けかなとは思う。ただし、学習コストとか既存ライブラリへの依存度によっては他の選択肢―例えばNode.jsやPythonなんか―を考えてみても悪くない、とぼんやり思う人も多いらしい。
全体として見ると、「またGoを使う?」と聞かれた場合、多分迷わず手を挙げる人もいるんだろうけど、その時は前よりもう少し慎重になると思うよ。完璧じゃなくても、自分たちに合う部分だけ拾って使えばいいんじゃないかな、と個人的には感じている。
Go導入の決断は最終的に正しかったのか
GoをAPI開発に取り入れるかどうか迷っているチームには、ちょっとしたヒントがある。何というか、最初はプロジェクトの方向性とか、重視したい点…例えば並行処理や速度への期待値がどれくらいかをざっくり見ておくといいみたいだ。エコシステムの豊富さとか、とにかく早く形にしたいなら、他の選択肢も頭の片隅に置いても悪くなさそう。
小さな試作品を先に作ってみる人も多いらしい。細かなライブラリ不足やエラー処理のクセなんかは、本格導入前に気づけることもあるので、手間だけど損とは言えないだろうね。それから、Go独特の考え方――ポインタやゴルーチン周り、とても直感的とは言えない部分もありそうだから、学ぶ時間をちゃんと確保しておいた方が後々楽になる場面が多いみたい。
標準ライブラリで済む範囲は意外と広め。「net/http」とか「database/sql」など、大体基本的なパッケージで何とかなるケースがそこそこ見受けられる。ただし複雑な機能になってくると、自分たちで作ったり、一部別技術と組み合わせたりする覚悟も要りそう。全部Go一本では収まりきらないことも珍しくない。
あとは、新しいバージョンをこまめに使う人が増えているようだ。最近だとジェネリクスやツール系の強化なんかもちょこちょこ話題になってるし、それ目当てでアップデートしている例もちょっと耳にした。
全体としては…まあ簡単じゃない道だったという感想が残っているチームもいた。途中で予想外の問題に悩まされることもしばしば。でも、その分API自体は前より速く動いたとか、拡張性には一定満足できたという声も聞こえてきた。ただし、「これだけやれば完璧」みたいなものじゃなくて、工夫や調整次第なのかなと思う。
結局、人によって評価はいろいろだけど、自分たちなりの課題や目的を持ちつつ進めれば、それぞれ納得できる落とし所には近づけそうだ。「失敗から学んだ」と感じているチームも少なくない印象なので、新しく始める場合でも余裕を持って構えるほうが良さそう。また別の誰かにも役立つ場面があるかもしれないね。この辺で一旦区切ろうかな…。
小さな試作品を先に作ってみる人も多いらしい。細かなライブラリ不足やエラー処理のクセなんかは、本格導入前に気づけることもあるので、手間だけど損とは言えないだろうね。それから、Go独特の考え方――ポインタやゴルーチン周り、とても直感的とは言えない部分もありそうだから、学ぶ時間をちゃんと確保しておいた方が後々楽になる場面が多いみたい。
標準ライブラリで済む範囲は意外と広め。「net/http」とか「database/sql」など、大体基本的なパッケージで何とかなるケースがそこそこ見受けられる。ただし複雑な機能になってくると、自分たちで作ったり、一部別技術と組み合わせたりする覚悟も要りそう。全部Go一本では収まりきらないことも珍しくない。
あとは、新しいバージョンをこまめに使う人が増えているようだ。最近だとジェネリクスやツール系の強化なんかもちょこちょこ話題になってるし、それ目当てでアップデートしている例もちょっと耳にした。
全体としては…まあ簡単じゃない道だったという感想が残っているチームもいた。途中で予想外の問題に悩まされることもしばしば。でも、その分API自体は前より速く動いたとか、拡張性には一定満足できたという声も聞こえてきた。ただし、「これだけやれば完璧」みたいなものじゃなくて、工夫や調整次第なのかなと思う。
結局、人によって評価はいろいろだけど、自分たちなりの課題や目的を持ちつつ進めれば、それぞれ納得できる落とし所には近づけそうだ。「失敗から学んだ」と感じているチームも少なくない印象なので、新しく始める場合でも余裕を持って構えるほうが良さそう。また別の誰かにも役立つ場面があるかもしれないね。この辺で一旦区切ろうかな…。