簡単で早いGoのパワーに目覚める
――『スターティングGo言語』はすでにJavaやPHP、Cを使い慣れている方のために書かれた入門書ですが、松尾さんご自身はどのようなプログラミング遍歴があってGoを使い始めたのでしょうか。
松尾:私はこれまでさまざまなプログラミング言語に触れてきました。最初は、長崎・佐世保市に住んでいた小学生の頃で、MSX2+というパソコンをたまたま手に入れたのですが、周りに使い方を教えてくれる人はおらず、本や雑誌で知識を吸収して、一人で遊んでいました。それがプログラミングの原体験です。それ以降もプログラミングは趣味でやっていました。大学を辞めたあと、福岡のとあるSI企業に勤めることになりました。当時はJavaの黎明期で、Java Applet、Servletといった新技術が採用され始めた時期で、さまざまなことを試していた記憶があります。
24歳の頃に東京に異動しました。その後、いま勤めている株式会社ラクーンに転職したものの、30歳の頃に退職して3年ほどフリーランスとして仕事をしていました。この時期に幅広い開発案件に携わっていたため、開発に関する視野がかなり広がったと思います。
そのあと、縁があって株式会社ラクーンでもう一度働いてみることになり、これまで6年ほど勤めています。運営しているサービスの大部分はJava、PHPで構成されていますが、いまはテクニカルディレクターという立場から、新しいサービスではRuby on RailsやAWSといった技術を取り入れるなど、技術的な道具立ては何がベストなのかを常に考えながら仕事をしています。
Goを選択したきっかけはある意味で消去法です。速度が重要な、非常に小さいプログラムが必要になったとき、JavaやPHPでは要件を満たせなかったので、Goを試してみました。すると思っていた以上にいい結果が出ました。当時はGoの言語仕様についての知識はほとんどありませんでしたが、ベースになるライブラリを参考にしつつ短時間試行錯誤しただけで、すぐに目的のプログラムを完成させることができたことが印象的でした。簡単で速度も速くて、ネイティブのバイナリも出力できる。これは凄いことだなと、Goのパワーに目覚めました。
近年はGoでWebのマイクロサービスを開発するのが盛り上がり始めています。CodeZineでもGoでWebアプリをつくる記事を書かせていただきました。見た目が地味で、機能が不足しているといった批判をされることも多いのですが、その一方でどんどん実用的なプロダクトがGoによって作られています。こんな力強い展開を見せるプログラミング言語は見たことがありません。書籍を執筆するお話をいただいたときは自分の知識で書けるのかどうかに不安を感じましたが、Goを隅から隅まで知り尽くすいい機会だと思って書かせていただきました。
Goは開発者に無駄なことをさせない
――本書を執筆されたということは、より多くの方にGoを使ってみてもらいたいという気持ちがあるのでしょうか。
松尾:もちろんあります。私自身はいろんなプログラミング言語が好きなんですよ。小学生のときはBASIC、それで物足りなくなってZ80アセンブラを。中学生の頃にC言語をやりたかったんですが、本を買って文法は覚えられても、コンパイラが高価で手に入れられなかった記憶があります(笑)。フリーランスとして働いていた頃はC#、Visual Basic .NETなどのWindowsベースの開発環境も必要でしたし、必要に応じていくつかのプログラミング言語を使ってきました。
20代の頃に出会ったPerlは衝撃的で、そのPerlのいいところを取り込んだRubyも便利で大好きです。プログラミング言語にはそれぞれ得意な領域がありますよね。手元でテキスト処理を書きたいときはPerlやRubyが便利です。また、2000年代以降であれば、JavaやC#といった巨大なランタイム上で動くプログラミング言語がサーバーサイドでは活躍しました。
こういったプログラミング言語の中でGoは機能的には地味でどちらかといえば保守的です。しかし、いざ使ってみると生産性が非常に高いことに気づきます。とにかく開発者に無駄なことをさせません。ツールにはちょっと癖があるものの、使い方さえ覚えれば、開発者に余計な手間をかけさせないように作ってあることが理解できると思います。実用的なプログラムを最小限の手間ですぐに作ることができます。プログラミングを職業にしているのであれば、覚えていて損のないプログラミング言語だと思います。
――Goの得意な領域はどういうところなのでしょうか。
松尾:全面的にJavaや.NET Frameworkだけで構成されたWebシステムは無数にあると思いますが、Goで同じことをするのは正解ではないように思います。Goを使ってフロントエンドからバックエンドまでひっくるめた全体を無理して作る必要はないでしょう。
GoはWebシステムのバックエンドやインフラ関連の領域で注目されているようです。有名なDockerはGoで作られていますし、AWSのSDKもGoに対応しました。ネイティブコードのプログラム単体で動きますから、Linuxのコンテナ技術などとも相性がいいのではないでしょうか。大がかりな環境設定を行なわなくてもワンバイナリで一つのサービスが稼働するので、小さく分散されたサービスを作るのに向いていると思います。
また、ゴルーチンという仕組みを使えば、I/Oをベースに効率的な並行処理が可能です。言語自体にhttpサーバーのかなり効率的な実装が入っているので、httpサーバを用意しなくても、Goだけで効率的に動作するWebサービスを作ることができます。こういったことを簡単に実現できるのがGoのすばらしいところです。
GoはGoogleの内部課題を解決するために生まれた?
――Goが生まれた背景についてうかがいますが、Googleはどういう意図があってGoをリリースしたのでしょうか。
松尾:Goはもともと2006年頃に始まったGoogleの内部プロジェクトで、2009年にリリースされました。優秀なエンジニアを擁していて、C++、Java、Pythonといった複数のプログラミング言語をコアに据えているGoogleから、このような新しいプログラミング言語が出てきたというのは驚きがありました。
Googleは内部的に何かしらの課題を抱えていて、それを解消したかったのかもしれません。Goの開発者が語るように、Cの速度とPythonの生産性を両立したいという意図が大きいのでしょう。Goは開発時の生産性にフォーカスした言語だからです。
また、Goの開発者には、UNIXを再定義しようという流れで誕生したPlan 9というOSの開発者が多く参加している影響なのかもしれませんが、いたるところにUNIX的な思想が受け継がれている印象があります。
Goにはgo getというコマンドがあります。これは外部のGoパッケージをWeb経由でダウンロードしてくれる便利なものなのですが、コマンドの実行に成功したとしても特に画面に何も表示されないので、おそらく初めて触った人は戸惑ってしまうんじゃないかと思ってしまいます(笑)。このような動きは、よくよく考えてみると、UNIXの思想に含まれる「沈黙の原則」だなと気づきました。
――そういえば、Plan 9のマスコットキャラ(Glenda)をデザインされたRenee FrenchさんがGoのマスコットキャラ(Gopher[1])もデザインされているそうですね。
――松尾さんの感覚で結構ですので教えていただきたいのですが、Goはいま、どれくらい普及し始めているのでしょうか。
松尾:少しずつ使われ始めている段階なのではないかと思います。Javaや.NET環境に染まった現場から見るとあまり魅力的に見えないかもしれません。そのような環境であれば、わざわざGoを新しく採用するメリットは大きくないでしょう。
しかし、ベンチャー的なサービスを展開している開発現場では採用が早いという印象があります。PHP、Ruby、Javascriptといったスクリプト言語を使えば、大部分のWebサービスはほとんど問題なく構築できるとは思いますが、CPU負荷が非常に高いある種の処理にはスクリプト言語が適さない場合もあります。このようなボトルネックになり得る処理をGoで置き換えていくのは、非常に合理的な選択ではないかと思います。バックエンドの重い処理を、小さなGoのサービスに置き換えていくといった導入のされ方が多いようですね。また、Goエンジニアの求人も増えてきたように見えます。
注
[1]: Go言語のマスコット名につきまして、本記事で当初記載していた「Gordon」という名称は過去、一部の方の間で使われていたことがありましたが、現在は単に「Gopher」と呼ぶのが正式でした(cf. The Go Blog「The Go Gopher」)。訂正してお詫びするとともに、Twitter上などで誤りをご指摘いただいた方にお礼申し上げます。(編集部)
これまでのプログラミング言語とは違う発想のGoを味わってほしい
――本書はより多くの方にGoを知ってもらうことが大きな目的ですが、そもそもどういったお考えで執筆されたのでしょうか。
松尾:私自身、ここ十何年か開発者として仕事をしていて感じることがあります。たとえば、企業システムの多くではJavaや、.NET Frameworkなどが長らく支配的でした。ベンチャーのようなWebサービスの現場では比較的新しい技術が積極的に取り入れられているので心配していませんが、これがエンタープライズシステムの現場であったりすると、十数年に渡って使う言語はJavaや.NET Framework、開発ツールはEclipseやVisual Studioで、非常に固定化されているイメージがあります。
最近はこのような状況に転換点が来ているのではないかと思っています。これからは、一つのベンダーが提供する言語と環境だけに依存してサービスを構築するというやり方では立ちゆかなくなっていくのではないでしょうか。最近、Microsoftによって発表されたWindows 10にLinux Subsystemを組み込むという話も象徴的だなと感じています。これまでに存在しなかったさまざまなサービスや仕組みが模索されている背後では、同じようにさまざまな技術やアーキテクチャの模索が続けられています。Goもまた、その成果の一つでしょう。
これまではプログラミング言語とそれをサポートするツールは分離していることが多かったと思います。Goは、その本体のみでビルドやテスト、ドキュメント化といったさまざまな要素をサポートしていますし、コマンドライン上のツールだけを使って軽快に開発を行なうことができるようになっています。このような、シンプルで使いやすいプログラミング環境が出てきたことを、広く開発者に知ってもらいたいと強く思っています。
Goは従来のプログラミング言語とは発想が異なるので、戸惑うことが多いかもしれません。ですが、Goのアプローチは新鮮だと思うんです。Goはツール自体もシンプルなので複雑なことを覚えずに気持ちよくビルドできますし、いろんな設定が終わってからプログラミングにとりかかるというイメージが一変するでしょう。本体とエディタだけで書けて、ツールを入れればもっと簡単になるわけです。
Goを使うことで、開発者としての新しい発想やアーキテクチャを学ぶことができるのではないかと思っています。これまでにない、発想が根本から異なる、手軽で高速なツールが出てきたという感覚で使ってみてほしいですね。
――では、本書で特に注力して解説したのはどういうところでしょうか。
松尾:迷いつつですが、たとえば序盤のほうでGoの型や演算子の挙動について、かなり細かく書いてみました。PHPやRubyといったスクリプト言語を主に使っている若い方だと、このあたりの知識が抜け落ちていると経験的に感じたからです。せっかく新しい言語を学ぶのですから、型や演算子についてのプログラミングの基礎を復習してもらいたいと思います。
もう一つは、Goに付属している各種ツールの使い方についてです。網羅的な紹介にはせず、必ず必要になるツールを、どのような動きをするかという出力例も含めて詳細に解説しています。Goのツールは使いやすいのですが、内部の動作に見えづらいところがあるんですよ。ファイル構造やディレクトリ構造がどうなっているのか、ツールが内部ではどのように動いているのかをしっかり把握できれば、Goのツールは難しくありません。本書で解説した知識を身につければ、一般的なビルド作業で困ることはないと思います。
あと、Goに特徴的なチャネルとゴルーチンについても詳しく書きました。内容的に少し難しいところもあるかもしれませんが、手軽かつ安全に並行処理を書くための仕組みですので、ぜひとも遊んでみてほしい機能です。なによりも、Goの並行処理の枠組みが、それほど怖いものではないということを知ってもらいたいですね。
新人やいまの言語に飽きてきた方に触れてみてほしい
――本書はGoが初めてという方が対象ですが、具体的にはどういう方におすすめなのでしょうか。
松尾:お仕事で使っている言語に飽きてきた方でしょうか(笑)。開発者であればいろいろな言語を使ってみたいと思うものですが、仕事の環境などが理由で思いどおりにならないことも多いかもしれません。たとえば、Javaを中心に据えた環境でRuby on Railsを使いたいとなると、設備面から大きく変わってしまうので移行が難しい。しかし、Goのプログラムは単体のバイナリで、かつマルチプラットフォームで動作しますので、小さな機能から少しずつ置き換えていくこともできるのではないでしょうか。
――松尾さんご自身は、これからはGoを使えないとダメだと考えていらっしゃるのでしょうか。
松尾:できれば言いきりたいところですが……(笑)。いまは言語を始めとした各種技術要素の戦国時代で、次世代へ向けてのアプローチが数多く登場しています。このような中で、GoはDockerのような重要なプロダクトに採用されたりして、目覚ましい成長を遂げています。将来的に重要な技術要素の一つとしては期待してもいいかと考えています。
Goは言語仕様が小さく学習のための負荷が非常に低いというメリットがあります。いま会社に入ってきた新人がJavaをいちから身につけようとすると、恐ろしいほどの歴史的・技術的蓄積を相手にしなければなりません。おそらく開発ツールのセットアップだけでも一仕事になるのではないでしょうか。これがGoであれば、覚えることが少ないのですぐに使い始めることができます。ほかの言語と比べて、数分の一くらいの学習量で実用的なものを書けるのではないでしょうか。もちろん、いまのところはという条件つきですが。
また、スクリプト言語をメインに使っている開発者にも使ってほしいですね。たとえば、本格的な画像処理のように、スクリプト言語のみではどうしても解決できない課題もあります。C++やJavaを使う選択肢もありますが、環境の構築だけでもたいへんでしょう。私自身の経験でもあるのですが、Goはこのような速度が必要なプログラムを最低限の手間で作るような局面にも非常にマッチしています。
まずコマンドラインとエディタだけで書いてみる
――これからGoを学ぶ方に向けてアドバイスをお願いします。
松尾:じっくり勉強してからではなく、まずはコピペでもいいのでプログラムを作ってみてください。どれだけ手軽に作れるかを実感することから始めてほしいですね。利便性を実感することがGoのパワーを身につける最短経路です。なぜ言語の機能が少ないのか、言語仕様的に一貫性のないところがあるのかなど、一般によく言われる不満点にも理由があることが分かってくるでしょう。Goは合理的でありさえすれば、一貫性にはさほどこだわらないところがあります。とにかく、実用性と生産性に徹底的にフォーカスしているということを実感してほしいですね。
そして、初めてGoを書くときはコマンドラインと好きなエディタだけで始めてほしいですね。なにより、Goの手軽さを味わってみてほしいんですよ。さらに、よりGoを使い込んでいくのであれば、組み込み型のWebサーバー機能や、並行処理を活かした処理を書いてみるのがいいと思います。これによって、Goが現代的な課題を解決する際にとても役立つ能力を持っていることを理解してもらえるでしょう。
――最後に教えてください。かなりの数の言語を扱ってこられた松尾さんにとって、Goはどれくらい好きな言語なのでしょうか。
松尾:スクリプト言語であれば、長年手元で使ってきたRubyが一番好きなんですが、実行環境の制限や速度といった面で悩ましいことも多々ありました。最近は、速度が必要であればGo、といった感じで使い分けています。ということから、コンパイル型の言語の中で最も好きなのがGoですね。今後もいろいろな領域でGoのパワーを活かしていきたいです。
スターティングGo言語
著者:松尾愛賀
発売日:2016年4月14日(木) 価格:3,218円(税込)
目次
Chapter 1:開発環境 ~Windows・OS X・LinuxへのGoのインストール
Chapter 2:プログラムの構成と実行 ~Goプログラムの書き方とビルド・実行・パッケージ作成
Chapter 3:言語の基本 ~変数・型・演算子・関数・定数・スコープ・制御構文・ゴルーチン
Chapter 4:参照型 ~スライス・マップ・チャネル
Chapter 5:構造体とインターフェース ~ポインタ・構造体・メソッド・タグ・インターフェース
Chapter 6:Goのツール ~さまざまなGoコマンド
Chapter 7:Goのパッケージ ~よく使われるパッケージとコーディング例