前付けおよび後付け
訳者まえがき
数年前のこと、Go言語について調べていた訳者はとても懐かしい単語に出会いました。CSP(Communicating Sequential Processes)です。
今を去ること○十年前、訳者は修士論文に取り組んでいました。当時の専攻はソフトウェア工学。「(来たるべきマルチプロセッサ時代に対応した)書きやすく、わかりやすいプログラムを作るにはどのようなプログラミング言語がよいのか」を一所懸命考える日々を送っていました。SIMULA、CLU、コルーチン、オブジェクト指向……などといった単語の周辺をさまよって、最終的にCSPを修士論文のメイントピックに選んだのでした。
それ以来ほとんどお目にかかったことがなかったこの単語が、比較的新しい言語の並行処理機能のベースになっていることを知ってとてもビックリしたと同時に、ちょっぴり嬉しくもなりました。当時の自分の目の付けどころが「悪くはなかった」ような気がしたからです。とはいえ、修士論文自体は重箱の隅をつつくような内容で、とても満足できる内容ではありませんでしたが……。
その後、就職したソフトウェア会社で出会った機械翻訳の面白さに魅了され、それ以来プログラミング言語自体の研究とはお別れし、それから○十年間はC言語を手始めに、プログラミング言語をもっぱら使う側に回っていました*1 。途中からは、プログラミング言語などの本の人間翻訳をしたり、プログラミングの講座を開くようにもなりました。
自分の訳書を見直してみたら、言語自体の入門書(初版)だけでも次のようなものがありました。訳者の感想とともにリストしてみましょう。
- 『HTML入門』(プレンティスホール、1995年)——プログラミング言語ではありませんが、プログラミングの入り口として覚えてもらうのはよいように思います。HTML(+CSS)が使えなければ、プログラミングの道には進まないほうが無難かと思い、開講中のJavaScript講座では、HTML+CSSを「前提知識」にして受講生を募集しています
- 『Java言語入門』(プレンティスホール、1996年)——当初、実行速度が遅かったこともあって本格的に使う機会はありませんでした。Javaのコードは(特に横に)長くなるのがどうも好きになれません。それに比べるとGoのコードの1行は短く書ける!
- 『Perl入門』(プレンティスホール、1997年)——自然言語処理の辞書関連など、ちょっとしたテキスト処理をするのに、これまで一番よく使っていました。ただ、以前使っていたプログラムがOSのバージョンアップなどで動かなくなることが何度かあり閉口しました。Goは互換性を重視しているようなので期待したいところです。「こっちはプログラミング言語の研究しているわけじゃないんだ! なんで前に動いていたのが動かなくなっちゃうんだ!」。Perl 7が救世主になればよいのですが...
- 『初めてのJavaScript』(オライリー・ジャパン、2007年)——開発環境をインストールしなくてもブラウザさえあれば使えて、HTML+CSSと組み合わせれば結構見栄えのするものができるので、プログラミングの入門には最適の言語だと思い、この言語の講座を開講中です。現状ではウェブ関連のシステムを作ろうとするとこの言語を使わざるを得ませんし。ただ、(ほかの多くの言語にも当てはまると思いますが)「何%のプログラマーが理解できるの?」と感じてしまうような機能もけっこうあります。教える(覚える)のが大変ですし、言語の専門家が自分のアイデアの素晴らしさを実証するために組み込んだような最新の機能を使わなくても、素晴らしいシステムは作れると思うのです。Goにも「ちょっと難しいかも」という機能はありますが、もっと絞り込まれている印象です
- 『Python基礎&実践プログラミング』(インプレス、2020年)——日本では、ほんの少し後発のRubyのほうが優勢だったように思いますが、AIブームで両者の勢いは逆転してしまったようで、Python関連の本の翻訳のお話が増えています。英語に似た感じに書けて初心者が学ぶのによい言語だとは思います。一方、Rubyは縁がなくて翻訳の機会はありませんでした。息子にRubyを使ってプログラミングを教えたのが懐かしい思い出ですが、興味をもってくれませんでした。思い返してみると初心者にいきなりオブジェクト指向の世界はちょっと敷居が高かったかなと反省しています
- 『初めてのGo言語』(この本です)——高速に動作する上にインタプリタ言語のような使い方もできる、クロスコンパイルが容易、並行処理のモデルがわかりやすい(CSPをベースにしているので当然!)といった点が気に入って、訳者のメイン言語になりそうです
* * * * * * * *
原著とこの訳書の違いをお知らせしておきましょう。
皆さんのお役に立てればと思い、付録Aに、原著の内容をベースにしてGo言語のまとめを書いてみました。また、付録Bに少し長めのプログラム例を書きました。訳者自身、この付録Aと付録Bを見ながらコードを書くようにして、不足部分を追加していきましたので、読者の皆さんのお役にも立つのではないかと思います。原著の最初のほうの章には、まとまったコードが書かれていないので、先に付録Bに目を通しておいていただくと、Goの世界に馴染んで、本文の内容がわかりやすくなるのではないかと思います。
原著出版後、Go 1.18がリリースされ、Go言語に「ジェネリクス」が導入されました*2。 原著15章にはGo 1.18のドラフト版に基づくジェネリクスの説明があったのですが、実際にリリースされたバージョンとかなりの違いが生じてしまいました。翻訳作業の途中に原著の出版社から15章の修正版が届きましたので、それに基づいて15章全体を翻訳し直しました。また、1章から14章にあったジェネリクス関連の記述や、ジェネリクスが導入されたことにより変わってしまう部分については、修正・加筆してGo 1.19以降での利用に支障がないようにしました。
このほか、原著にはコードの一部だけがリストされて(きちんと)動作するバージョンが掲載(公開)されていない例がありましたが、全体のコードがあったほうが便利でしょうから、訳者ができる限り作ってみました。動作確認はしましたが、まだGo言語の経験が長くはないので、付録の内容も含め、お気づきの点はご指摘いただけば幸いです。
最後になりましたが、いつもお世話になっているオライリー・ジャパンの皆様に、深く感謝いたします。
「言語自体の本を訳すのはこれが最後かもしれないな〜」などと思いつつ(あっ、でもRustも面白そうかも)。
2022年8月
マーリンアームズ株式会社 武舎 広幸
[*1] 当時「C言語で翻訳ソフトを作っている」などというと「Lisp以外はありえないでしょ」というような反応をされることが多かったことを思い出します。当時は「AI関連ならLisp」というのが常識だったのです。
[*2] その後Go 1.19もリリースされましたが、このバージョンでは言語自体の変更はほとんどありませんでした。
賞賛の声
Goはユニークな言語で、経験豊富なプログラマーでさえ、いくつかのことを学び直し、ソフトウェアについて従来とは違った考え方をする必要がある。本書は、イディオム的なコード、落とし穴、デザインパターンを指摘しながら、この言語の特徴をうまく紹介している。
—— Aaron Schlesinger Microsoft、シニアエンジニア
Jonは長年にわたってGoコミュニティにおける主要な発言者のひとりであり、彼の講演や記事は我々にとっての重要な情報源であり続けてきた。本書はGoを学ぶためのプログラマーズガイドだ。他言語でよく理解されている概念を蒸し返すことなく知るべきことをほどよく解説するという、バランスの取れたすばらしい仕事を成し遂げてくれた。
—— Steve Francia Google、Go言語プロダクトリード。Hugo、Cobra、Viperの作者
JonはGo言語を知り尽くしている。明快で生き生きとした文章で、基本概念からリフレクションやCのコードの利用といった高度なトピックまで教えてくれる。また、Goのイディオム的なコードの書き方を、明快さと簡潔さを重視し、多くの例を通して示してくれている。さらには、ポインタのメモリレイアウトやガベージコレクションへの影響など、プログラムの動作に影響を与える基礎的な概念についてもていねいに説明してくれている。本書を読めば、Goの初心者は使いこなせるようになるだろうし、経験豊富なGoプログラマーでも、何かしら得るところがあるはずだ。
—— Jonathan Amsterdam Google、Go言語担当ソフトウェアエンジニア
本書はプログラミング言語Goの特徴、Goを強力なものにしてくれるデザインパターンや「イディオム」について紹介する必須の入門書だ。Jon Bodnerは、Go言語の基礎とその哲学をうまく結びつけて、読者を言語の開発者が意図したとおりのコードに導いてくれる。
—— Robert Liebowitz Morning Consult、ソフトウェアエンジニア
JonはGo言語の単なる参考書ではなく、この言語をイディオム的かつ実践的に理解するための本を書いてくれた。Jonのこの業界における経験が本書の原動力であり、この言語によって速攻で生産性を向上させたいと考えている人の助けになるだろう。
—— William Kennedy Ardan Labs、マネージングパートナー
原著者まえがき
最初に考えたこの本のタイトルは『Boring Go』でした。実のところGoのコードは退屈なのです。
退屈なトピックについて本を書くというのはちょっと奇妙なことでしょうから、説明が必要になります。Go言語の機能は、モダンなプログラミング言語に比べると「だいぶ少ない」と言えるでしょう。Goで書かれたプログラムは、ある意味「単刀直入」で、ときによっては繰り返しが多くなる傾向にあります。継承はありませんし、アスペクト指向プログラミングも、関数の多重定義もありません。ましてや演算子の多重定義なんて以ての外です*1。
パターンマッチングもありませんし、名前付き引数もありません、例外処理もないのです。一方、多くのプログラマーにとっては恐怖の的かもしれませんが、ポインタは含まれています。並行実行のモデルも他の言語とは違っています。1970年代のアイデアに基づいているのです(ちなみにガベージコレクションに使われているアイデアも同じく1970年代のものです)。簡単に言ってしまえばGo言語は「先祖返り」したような言語です。そして、これがこの言語の良さでもあるのです。
退屈だからといって価値がないわけではありません。Go言語をうまく使いこなすためには、さまざまな機能をどのように組み合わせればうまくいくのかを理解しておく必要があります。GoのコードをJavaやPythonと同じように書くこともできますが、その結果は満足できるものとはならないでしょう。「何でこんなことになるんだ」と首を傾げてしまうかもしれません。そこでこの本の登場です。Go言語の機能をひと通り紹介しながら、「イディオム的なコード」をどのように書けばよいのかを説明していきます。
長期間にわたって使われるものを作るときには、退屈さがプラスに働きます。まだテストされていない技術を使って建設された橋を渡る最初の人間になりたい人は誰もいないでしょう。たとえ技術者が「最高の技術を使っています」と言ったとしてもです。現代社会の橋への依存度とソフトウェアへの依存度を比べれば、ソフトウェアへの依存度のほうが大きいかもしれません。しかし多くのプログラミング言語は機能をどんどん追加していきます。その際に、コードの保守性への影響を考えていません。Go言語は長持ちするプログラムを作ることを意図して開発されました。何十年にも渡って、何十人もの開発者に修正されることが想定されているのです。
Goが退屈な言語であることは、ある意味すばらしいことなのです。この本が、ある意味退屈なコードを使って、世の中を驚かすようなすばらしいプロジェクトを構築する方法をお伝えするものになればと思っています。
[*1] 訳注:ジェネリクスはようやく2022年3月に導入されました。
対象読者
この本の対象読者は、2番目(あるいは5番目あたりかもしれませんが)にマスターするプログラミング言語を選ぼうとしているソフトウェア開発者です。Go言語を(あまり)使ったことがない人が主なターゲットです。Go言語について(そのマスコット以外)何も知らない人から、チュートリアルを読んだり、少しコードを書いてみたといった人までです。Go言語でのプログラムの書き方だけではありません。Go言語のプログラムを「イディオム的に」、つまりお勧めのスタイルに則って書く方法を紹介しています。ある程度の経験を積んだGo言語の開発者にとっても、新しい機能をうまく活用するための方法を見つけられることでしょう。読者の皆さんが、Go言語のコードをGo言語のコードらしく書けるようになることがこの本の目標です。
Gitなどのバージョン管理システム(VCS)やIDEなど、開発者向けのツールの経験を仮定しています。また、並行性や抽象化などコンピュータサイエンスの基本的な概念も仮定して、このような概念がGo言語でどのように処理されるかを説明します。例題のコードはGitHubからダウンロード可能ですし、多くの例はGo Playgroundを使って実行可能です。ネット接続は必須ではありませんが、例題によっては必要になる場合もあります。Go言語はHTTPサーバの構築に使われることが多いので、HTTP関連の基本的な知識は前提とします。
Go言語の機能の多くは他の言語がもっているものですが、扱い方が異なるケースが多いためプログラムの構造は異なる場合が多いのです。この本ではまず開発環境の準備について説明し、続いて変数、型、制御構造、関数といった事柄を説明します。こういった事柄はスキップして先に進みたくなるかもしれませんが、少し我慢して内容を確認してください。Go言語のコードをイディオム的に書くためのヒントが含まれています。ちょっと見「明白」と思うことでも、よく考えるとビックリするようなこともあります。
謝辞
本の執筆は孤独な作業だと思われがちですが、たくさんの方々の援助がなければできない仕事です。筆者はGopherCon 2019でCarmen Andoh氏に「Go言語に関する本を執筆したいのですが」とお伝えしたところ、O'ReillyのZan McQuade氏を紹介してくださりました。McQuade氏は企画の段階から私をガイドしてくださりこの本の執筆中もさまざまなアドバイスをくださいました。Michele Cronin氏は担当編集者として、さまざまなフィードバックをくださり、何度か訪れた困難な時期にも私の話にじっくりと耳を傾けてくださいました。Tonya Trybula氏およびBeth Kelly氏は編集・校正作業でこの本の品質を上げてくださいました。
執筆の途中で数多くの方からフィードバック(および激励のお言葉)をお寄せいただきました。Jonathan Altman、Jonathan Amsterdam、Johnny Ray Austin、Chris Fauerbach、Chris Hines、Bill Kennedy、Tony Nelson、Phil Pearl、Liz Rice、Aaron Schlesinger、Chris Stout、Kapil Thangavelu、Claire Trivisonno、Volker Uhrig、Jeff Wendling、Kris Zaragozaの各氏を始めとする方々です。特にRob Liebowitz氏からは詳細なコメントと素早いレスポンスをいただき、この本をよりよいものにしてくださいました。
家族は、私が皆と過ごすはずの時間をコンピュータの前で過ごすのを許してくれました。特に、妻のローラは私が午前1時頃寝床に入るときでも、目を覚まされなかったふりをしてくれました。
最後に、40年ほど前にこの道に進むことを決断させてくれた2人の名前をあげさせていただきたいと思います。1人目は友人の父親であるPaul Goldstein氏です。Goldstein氏は1982年にCommodore PETを見せてくれ、「PRINT 2 + 2
」と入力してEnterキーを押しました。画面に「4
」が表示されたとき、私はびっくりすると同時に、この機械に魅せられてしまったのです。Goldstein氏はプログラムの作り方を教えてくれただけでなく、この機械を2週間ほど貸してくれました。2人目は母です。私がプログラミングとコンピュータに興味をもったことに対して励ましてくれました。自分自身は、コンピュータが何であるのかまったく理解していなかったにもかかわらずです。Atari 2600用のBASICプログラミングのためのカートリッジを始め、VIC-20*2、続いてCommodore 64を買ってくれました。それにいつか自分のプログラムを書きたいと思っていた私にプログラミングの本も何冊か買ってくれました。
私の夢を実現するのを助けていただいたことに対して深く感謝します。
[*2] 訳注:日本での名称は「VIC-1001」。
●著者紹介
Jon Bodner (ジョン・ボドナー)
20年以上のソフトウェア開発の経験をもち、教育、ファイナンス、eコマース、ヘルスケア、法律、行政、インターネットインフラなど多岐にわたる分野のシステム開発に携わってきた。
現在、Capital Oneで上級エンジニアとして勤務しており、開発およびテスト用ワークフローの改善、ウェブ支払いページの検出法(特許取得)の開発、ソフトウェア開発関連の問題検出・管理用ツールの作成などを行ってきた。
Go言語のカンファレンスで頻繁に講演を行っているほか、Go言語やソフトウェア工学に関する記事をブログで公開し、30万回以上アクセスされている。データアクセスライブラリProteus(https://github.com/jonbodner/proteus)の開発者であり、LGTMの派生プロジェクトであるchecks-out(https://github.com/capitalone/checks-out)の開発者でもある。
●訳者紹介
武舎 広幸 (むしゃ ひろゆき)
国際基督教大学、山梨大学大学院、リソースシェアリング株式会社、オハイオ州立大学大学院、カーネギーメロン大学機械翻訳センター客員研究員等を経て、東京工業大学大学院博士後期課程修了。マーリンアームズ株式会社(https://www.marlin-arms.co.jp/)代表取締役。主に自然言語処理関連ソフトウェアの開発、コンピュータや自然科学関連の翻訳、プログラミング講座や辞書サイト(https://www.dictjuggler.net/)の運営などを手がける。訳書に『Symantec C++トレーニングブック』(翔泳社)、『HTML入門 第2版』『Java言語入門』『Perl入門 第2版』(以上プレンティスホール)、『Goプログラミング実践入門』『Python基礎&実践プログラミング』(以上インプレス)『初めてのJavaScript 第3版』『インタフェースデザインの心理学 第2版』『AIの心理学』(以上オライリー・ジャパン)など多数がある。https://www.musha.com/にウェブページ。