/note/tech

Goが15年でバックエンドの標準になるまで。偉大なる“退屈さ”が世界の開発文化を変えた理由

要約:

■ 1. Goとの出会いと初期評価の変遷

  • 松木氏がGoを意識し始めたのはGo 1.0リリース直後の2012年頃
  • きっかけは面白法人カヤック在籍時に同僚のtypester氏(村瀬大輔氏)が「次はGoが来る」と推薦したこと
  • 当時カヤックではPerlからの移行先言語を模索していた
  • 最初の印象は「かったるい言語」であり動的型付け言語に慣れた身には型定義や制約が面倒に感じた
  • 評価が一変したのははてな転職後のサーバー監視サービス「Mackerel」開発への参加
  • Mackerelのエージェントはメモリ消費を最小限に抑える必要があり数メガバイト程度で動作するGoが採用された
  • コンパイルでシングルバイナリが出力されるため依存ライブラリを気にせずユーザー環境への配布が容易
  • この「用途に対する圧倒的な適合性」を目の当たりにしてGoへの評価が一変した

■ 2. Goの開発者体験と静的型付け言語としての強み

  • 言語標準でフォーマッターや依存管理などツールチェーンが整備されており環境構築に時間を割かず開発に集中できる
  • 開発規模が大きくなるほど型の存在が安心感につながる
  • 「ビルドが通ればある程度正しく動く」という信頼感が長期運用において重要
  • JavaやScalaと比較した最大の強みはビルド速度とランタイムの軽量さ
  • JVMベースの言語はコンテナ技術やマイクロサービス化の流れで起動フットプリントが問題になる
  • Goは静的型付け言語でありながらビルドが一瞬で終わり「書いては動かす」サイクルを高速に回せる
  • このリズムはスクリプト言語に近く動的言語出身のエンジニアがストレスなく移行できる要因となった

■ 3. インフラ領域からWebバックエンドへの普及拡大

  • 初期のGoは並行処理を活かしたマイクロサービスやシステム記述言語用途で採用されインフラ領域から浸透した
  • HashiCorpがRubyからGoへシフトしConsulやTerraformといった重要インフラツールをGoで開発した
  • DockerとKubernetesがGoで開発されたことがエンジニアコミュニティに決定的なインパクトを与えた
  • Webアプリケーションバックエンド開発のメインストリームへの普及は松木氏本人にとっても意外だった
  • 当初は「コアとなる複雑なシステムは表現力の高い言語で構築しGoは周辺ツールに使う」構成が最適と考えていた
  • 現在はバックエンドのすべてをGoで開発する企業も珍しくなくこの適用範囲の広がりは想定以上

■ 4. Go普及の背景にある言語設計の優位性

  • 10年前はGoとScalaが新進気鋭のサーバーサイド言語として二強の時代があった
  • Scalaは表現力が高い一方で高度な抽象化が難解さにもつながりチーム全体での保守が多くの組織にとって予想以上に困難だった
  • 2010年代前半のWeb業界には静的型付け言語への回帰を求める渇望があった
  • 求められていたのは「文法がシンプルでコンパイルが速く安全に書ける型付き言語」であった
  • Goは機能が少ない分誰が書いても似たようなコードになりやすく学習コストが低い
  • この乗り換えやすさと実用的な型安全性のバランスがWeb開発現場の課題にフィットした

■ 5. 「Less is More」の設計哲学

  • Goの設計思想の根底には「一つの目的を達成する方法は一つ(または少数)に限定されるべき」という考え方がある
  • 複数の構文やライブラリが存在するとコードスタイルがバラバラになり読み手の負担が増す
  • ライブラリ設計においても機能のオーバーラップを避け単一責任の原則が徹底されている
  • 「全部入りの巨大フレームワーク」よりも小さな道具を組み合わせる文化
  • これはUNIX哲学そのものであり設計者のKen ThompsonやRob Pikeが培ってきた「シンプルさを保つ規律」が反映されている

■ 6. エラーハンドリングの設計

  • Goは例外処理機構を持たず戻り値としてエラーを返す仕様
  • 最も画期的な点は関数が多値(複数の値)を返せる設計
  • C言語では関数は一つの値しか返せず処理結果とエラー情報を扱うためにポインタ渡しが必要だった
  • Goでは「戻り値の最後にエラー型を置く」というシンプルなルールで解決した
  • Result型やパターンマッチといった関数型言語的エッセンスの導入には慎重な判断が下された
  • それらの導入は表現力を上げる一方で言語仕様の複雑化・コンパイル時間の肥大化・学習コスト増大のリスクがある
  • 誰が書いても「退屈でつまらないコード」になるよう強制することでチーム開発の可読性と高速ビルドを守っている

■ 7. 長期運用における優位性とAI時代との親和性

  • Goの最大の利点は「ゆっくりと着実に進化している」点
  • 標準ライブラリや言語機能への追加は厳選されており非互換変更によるコード書き直しが発生しない
  • 5年間Goに触れていなかったエンジニアでも現在のGoコードを違和感なく読み書きできる
  • Googleという巨大企業が自社開発でGoを使い続けていることがOSSとしての持続可能性を保証する
  • Goは「生成AI時代に最も親和性が高い言語」の一つと松木氏は考えている
  • gofmtによるコードフォーマットの統一を初期から強制した結果AIが出力するGoコードは品質が安定しブレが少ない
  • Goが大切にしてきた可読性はAIが書いたコードを人間がレビューする際にも役立つ
  • 学習コストと運用負担の低さおよびAIとの高い親和性からエンジニアの道具箱に入れる価値がある言語である