動的言語だけやってた僕が、38日間Go言語を書いて学んだこと


Go言語を始めて38日たったので、これからGo言語を始めるプログラマにちょっとでもヒントになるように、どのようにGo言語を始めて、どのような手順で学んできたかまとめておきます。

筆者のバックグランド

  • PHP歴、JavaScript歴10年~
  • Python 3ヶ月くらい
  • Ruby 1日
  • 静的言語経験ほぼ皆無(Java 3日くらい、Scala 3日くらい、Objective-C 1週間くらい、Cそもそも挫折、C# 1日)

静的言語というと、「コンパイルの一手間が面倒」だとか「環境を作るのが面倒」だとか先入観があり、ほぼ食わず嫌い状態でした。

Go言語とは?

Go言語は2009年にGoogleによって作られたオープンソースの静的言語で、Linux・Mac・WindowsやAndroidで動作します。最近ではGoogle App Engineで使うこともできます。

golang.jpの解説によると次のような特徴があります。

  • シンプルな言語である。
  • コンパイル・実行速度が早い。
  • 安全性が高い。
  • 同期処理が容易に行える。
  • なにより楽しい。
  • オープンソースである。

なぜGo言語を学んだか?

ひとことで言うと並行処理を簡単に書きたかったからです。Go言語にはGoルーチンというシンプルな並行処理の仕組みがあります。たまたま業務で、同時に複数台のHTTPサーバーにリクエストを出して大量の命令と大量のデータを並行処理するプログラムを実装する必要が出てきて、得意なPHPでは難しいのでGo言語を学ぶことにしました。言語にはそれぞれ特徴があって、適材適所だと思っています。

読んだ本

Go言語を始める前に、『はじめての「Go言語」』をパラパラと読みました。じっくり読むというよりは最低限必要なこと、例えば、基本的なifforなどの構文の書き方、私のやったことある言語にないGoルーチン(並行処理ができる)の概念などを読んで学びました。

参考にしたドキュメント

ドキュメント英語版: http://golang.org/doc/
ドキュメント日本語版: http://golang.jp/go_spec

Go関連情報のググり方

「go」だけで検索するとGo言語の情報がヒットしにくい問題があります。英語の情報を探すときは「golang」、日本語の情報を探すときは「Go言語」といったキーワードで探すと情報を見つけやすくなります。

どのようなことを学んだか?

ここからは、38日間にどのようなことを学んできたか、Qiitaに投稿した記事を振り返りながら、概ね時系列でご紹介します。

Go言語の実行環境を作る入門以前の段階

  • MacにGoをどうやってインストールするのか?
  • そもそもどうやって実行するのか?
  • コンパイルはどうするのか?
  • Macで作った実行形式がLinuxで使えるのか?

このような疑問を解決するために調べた内容をまとめた最初の記事です。

2013-12-04 PHPerだが今日初めてGo言語に手を出してみる試み

ひとつのファイルにガリガリ書くだけの段階

さすがに1ファイルに収まらない量になってきたので、複数のファイルにコードを分けることについて学ぶ。

2013-12-05 Go言語のpackageの作り方: 長くなったコードを別ファイルに切り出す方法

試行錯誤の段階

学んでいく過程でstackoverflowやQiitaに出てくるスニペットを試してみたくなりました。そこで、スニペットをさくっと実行できる環境を構築することにしました。

2013-12-05 ワンクリックでGoのスニペットを試せる環境を作る!: CodeRunnerの設定方法

言語仕様の理解を深める段階

Go言語を使うモチベーションが並行処理にあったので、真っ先にGoルーチンについて学びました。また、オブジェクト指向プログラミングを実践するにあたって、オブジェクトの作り方といった基礎的な言語仕様について学びました。

2013-12-05 Goルーチンで並列化する方法: 6秒かかる処理を3秒にしよう
2013-12-10 Go言語でオブジェクトを作ってみる: オブジェクト・メソッド・コンストラクタなど

実際にアプリを開発する段階

アプリの開発に着手した段階です。ライブラリ・モジュールの具体的な使い方について調べていました。

2013-12-07 こんなに簡単! Goで作るRESTサーバー
2013-12-10 Go言語でファイル操作: ディレクトリの作り方
2013-12-10 Go言語でファイル操作: ファイルを作って書き込む
2013-12-10 Go言語でコマンドが実行可能かチェックする

この頃、PHPerでGo言語はじめたての僕が「型の宣言めんどくさい」とか「ポインタなんてなんで用意したし」とか不満を言っていたら、僕より先にGoを始めてた同僚に「Goに入ればGoに従えと言うじゃないですか」と言われる(笑)

2013-12-11 Go言語のクロスコンパイル設定値 $GOOS, $GOARCH 一覧リスト
2013-12-11 Go言語: ディレクトリ内の全ファイルをフォーマットする方法 (コードスタイルがぐちゃぐちゃになって気持ち悪くなってきた頃)
2013-12-11 Go言語でRESTful APIクライアント: Qiita APIを叩いてみよう!
2013-12-11 Go言語でPHPのvar_dumpやJavaScriptのconsole.log的なもの (そろそろデバッグを覚えたいと思った頃)
2013-12-12 Go言語でランダムな文字列を生成する
2013-12-12 Go言語でPHPのarray_chunkのようなことをする
2013-12-12 Go言語でCSVを書き出す!エクセル用のSJIS版も!
2013-12-18 Go言語:SJISのCSVファイルを読み込む!
2013-12-18 Go言語: SJISのCSVを読み込みながら1行毎に処理を実行する
2013-12-18 Go言語: PHPのarray_combine()のような処理をする関数
2014-01-06 [教えて]Go言語:なぜインターフェイスはポインタにできない? (このあたりからやっとポインタを意識し始める)
2014-01-07 Go言語:変数が関数かどうかを返す関数
2014-01-07 Go言語:メソッドの引数の型を調べる方法
2014-01-10 Go言語:Riakに書き込む

「そろそろテストを書かなきゃ」と思い始めた段階

モジュール化やオブジェクト指向プログラミングをGo言語でできるようになってきて、一ファイルの一枚岩コードから脱却していました。テストも書きやすい状態になっていたので、単体テストのやり方について学びました。また、切り出したコードをオープンソースとして公開したり、継続的インテグレーションのやり方について学びました。

2013-12-27 Go言語: 単体テストの始め方!Gospelを使ってBDDをやってみよう
2014-01-06 Go言語:単体テストを複数のパッケージに対して実行する
2014-01-08 Go言語:自分のライブラリをGitHubで公開する方法+drone.ioで継続的インテグレーション

マスコット Gopher

このかわいいマスコットは、Go言語のマスコットです。Gopherと言います。日本語ではホリネズミというそうです。

Gopherのフィギュア


使ってみて気づいたGo言語の魅力

Goを始めて3日目たったころにGoの魅力を感じ始めました。下記はそのときに書いた感想です。

  • クロスコンパイルが超カンタン。Macで開発しててもLinux、Windows用のバイナリが作れる
  • コンパイル時にポカミスが洗い出される。動的言語にはない安心感
  • まるでスクリプト言語を書いてる感覚。いつコンパイルしてるの? 型推論すごすぎ!
  • 並行処理たったそれだけでできるの!?
  • ビルドすると一つの実行形式バイナリファイルになる! このポータビリティは気持ちいい
  • パッケージ管理システムがビルトインなので、"import github.com/user/project" って書くだけでパッケージがすぐ使える! 神!
  • defer。finallyがない言語はやってらんないと思ってたけど、deferのほうがいいじゃん!
  • どんな汚いコードを書いてもGoが整頓(format)してくれる。コーディング規約じゃなくて、自動フォーマットでコードの個人差を吸収するほうが健全な気がしてきた
  • ドキュメントがしっかりしてる。
  • タブインデントがデフォ! 俺得

Go言語はこれからどこで役立つ?

DevOpsやImmutable Infrastructureなどインフラ構築では今後欠かせなくなりそうな DockerPackerSerfといったオープンソースはGoで書かれています。これらのプロダクトは既に注目されていますが、今後ますます標準的なものになっていくだろうと予想します。そうした中でDevOpsを中心にGoで書かれるプロダクトも増えていくのではないでしょうか。

Go言語のトレンド Google Trands より


Go言語を学んで変わったこと

僕は15歳から22歳までずっと趣味のアマチュアプログラマでした。当時は好きなコードを好きなように書いていて、ストレスフリーでコーディングそのものが楽しいと感じていました。

趣味のコーディングと業務のコーディングの決定的な違いは、「品質に責任を負うかどうか」という点だと思います。品質を担保するために、ドメイン駆動設計やDevOps、テスト駆動開発、リーンソフトウェア開発、オブジェクト指向、アジャイル、デザインパターン、継続的デリバリーといった言語を超えた上位レイヤにばかり注目していて、コーディングは単なる作業になっていました。

Goは「プログラミングは楽しくあるべき」という考えから生まれた言語らしいです。その思想はいろんなかたちで現れてて、書けるようになればなるほど楽しくなる言語だと思います。ひさしぶりにコーディングそのものの「楽しさ」を思い出すことができました。


最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローお願いしますTwitter@suin