My External Storage

Jun 20, 2019 - 9 minute read - Comments - go presentation

[発表資料] 今改めて読み直したい Go基礎情報 その1 #golangtokyo

golang.tokyo #25で過去の優良情報を振り返る発表を行なった。
この記事は発表で使った資料と口頭で話したことの要約をまとめておく。

イベント名 golang.tokyo #25 - Go の郷に入る
URL https://golangtokyo.connpass.com/event/133581/
会場 ウォンテッドリー株式会社 東京都港区白金台5-12-7 MG白金台ビル4F
日時 2019/06/18(火) 19:30 〜 22:00
ハッシュタグ #golangtokyo

当日利用したスライドは以下になる。

Goの郷に入る前に

今回はgolang.tokyoメンバーがオススメする3年以上前に公開された記事・発売された書籍の優良情報をまとめた。
発表では各々の記事・書籍を紹介する前に、まず今回の発表の背景・Goの言語哲学について触れた。

Goらしいとは

Goらしいとは一言で言うとSimplicity(簡潔性)だ。後述するRob Pike氏の「Simplicity is Complecated」と言う発表タイトルが一言で表している。 より詳細な解説については、私の言葉より@songmuさんの次の記事を読むといいだろう。

また、このSimplicityが何を目的としているかはBrand bookのGoが達成したいMissionやValueを確認することでわかる。

開発とサービスのスケーラビリティを両立するための解として、Goの言語設計者らはSimplicityを答えとしたしそれをGoで実現しようとしている。 このSimplicityの概念を理解すればより「Goらしいコード」を書けそうだ。

Go1.Xの言語仕様について

Go1.Xは1.0の頃から言語仕様はほとんど変わっていない。Go1.X系の間機能仕様を変えない方針は以下のドキュメントで言及されている。

It is intended that programs written to the Go 1 specification will continue to compile and run correctly, unchanged, over the lifetime of that specification. At some indefinite point, a Go 2 specification may arise, but until that time, Go programs that work today should continue to work even as future “point” releases of Go 1 arise (Go 1.1, Go 1.2, etc.).

Release Noteを確認すれば、ほとんど毎回言語仕様は変更されていないことがわかる。

言語仕様が更新された際でもほぼ微調整レベルの変更で、予約語もずっと25個のままだ。
(どちらが良いかは別として、)他の言語では新しいプログラミングパラダイムをサポートして、古い情報は「○○仕様が増えたから今はアンチパターン」となることが多い。
が、Goの場合はGo1.X系の間はほぼ問題ないだろう(context.Contextが増えた並行処理やパッケージ管理はやや注意が必要)。

言語仕様に破壊的な変更が入るのはGo2からだが、Go2は4年後(Go 1.20)と言われている()。
よって、(標準パッケージはこれからも拡張されるだろうが、)言語仕様に絞れば言語思想を理解し、今の仕様を読み込むだけで今後数年は通用する。

このような背景があり、検索に埋もれがちになった過去の情報から、「Goらしく書くため」の情報を探ってみようという運びになった。

言語思想

まず、Goの言語思想を学ぶ上で有用な情報を紹介した。

Go at Google: Language Design in the Service of Software Engineering

このスライドと記事にはGoogleが開発の中で何を問題視していたのか、何をGoで解決しようとしたのかが書かれている。 Goをなぜ作ろうとしたのかを知ることでGoのゴールや言語思想を知ることができる。

プログラミング言語Go(書籍)

プログラミング言語GoはGoチームで静的解析機能部分を多数開発したAlan Donovan氏とK&RのKであり、プログラミング作法などのBrian Kernighan氏が共著をし、 Goの中心メンバーであるRus Cox氏やRob Pike氏がレビューをし、Effective Javaなどを翻訳した柴田芳樹さんが翻訳したGoを一番体系的に学べる日本語書籍だ(柴田さんはレビューもしている)。
言語仕様や標準パッケージの使い方を学ぶのに最適なのはもちろんのこと、この書籍は「なぜこのような仕様なのか」という点や「この言語仕様をどのように扱うべきか」という点も言及している。
以下は書籍で触れられている内容の一例だ。

  • なぜインターフェースは小さく作るべきか
  • Goのカプセル化へのアプローチ
  • なぜtesting pkgにはsetup/teardownassertがないのか
  • なぜ例外を持たないのか

Simplicity is Complicated

Rob Pike氏が発表した上記のスライドでは、次の3点を知ることができる。

  • Go言語の哲学とも言える単純さ
  • Goの単純さ・シンプルな言語イメージはどのように作られているのか?
  • 裏にある複雑さを隠し,利用する人に単純さを提供する意義

例えばGoにおける並行処理はgoroutinechannelで一通りの実装が可能だ。pthreadなどを使ったことがあるともっと複雑な操作をしたくなるかもしれない。 あえて言語機能の中に複雑さを隠蔽することにより、実際に書かれるコードはシンプルなコードになっている。

より詳しい内容は@tenntennさんが書いた当時のレポートで知ることができる。

Toward Go 2

この記事ではGo2の仕様を策定するまでのロードマップとして、Goがどのように仕様を策定するかを知ることが出来る。

  • Go2へのロードマップ
  • Goの仕様がどう策定されるのか
  • ステップには意見の公募も含まれている

ロードマップの中ではプロポーザルの提案や意見の募集も含まれている。

直近ではtry関数なども提案されていて、TwitterやSlackなどで議論を呼んでいる。 ユーザーからの意見も取り入れられるし、英語が苦手な人もSlackの日本語チャンネル(#japan in Gopher Slack)などで議論することもできる。

The Go Gopher

言語思想(?)ではないかもしれないが、Gopherくんの生い立ち。
Go’s New Brandを見るとGopherくんは結構仕様(?)が厳格で、「モノをもたせるときは指を描かない」「耳の形は…」などがしっかり明記されている。

Practical Go

Dave Cheney氏のブログ記事のオススメリンク集。Dave氏はpkg/errorsを開発したり、世界中で登壇もされている方。
Functional optionsパターンやT型メソッドと*T型メソッドの使いわけなどの基本的なGoの書き方を丁寧に解説してくれている。
開発でGoを書くと一度は悩むロギングやエラーハンドリングの記事もあり、ひとつひとつしっかり読んでおきたい。

Go Proverbs

Rob Pike氏の格言集。Gopher Slackのロード時にも見れたりする。その格言が出た発表のYouTubeへのリンクもされている。
ひとつひとつが、「そういうことね!」という一言にまとめられているので、うまく咀嚼できない格言は「つまりどういうことなんだろう?」と調べてみると言語思想への理解が深まりそうだ(Don't Panicなんて直球もあるが)。
ちなみに私はMake the zero value useful.Clear is better than clever.などがGoらしくて好きだ。

Go Wayな設計・実装

言語思想の他には具体的な「Goらしいコードを書く」ための情報も紹介した。

Effective Go

他の言語でもある「Effective」系の情報。Goの特徴的な言語仕様の効果的な使い方がまとめられている。

CodeReviewComments

Effective Goに更に加えてベターコーディングが記載されている。
誰かにGoを教わるときはEffective Goと合わせて最初にリンクを教えてもらうことが多いのではないだろうか? こちらは日本語版もある。

Goに入ってはGoに従え

GoogleでGoのコードをレビューしていた鵜飼さんがまとめたGoらしいコードの書き方。
deferで呼びたい関数のerror戻り値のハンドリング方法や、Mutexを使わずにgoroutine`で解決する方法など、実際にどうGoを駆使すればシンプルで簡潔なコードが書けるのかを解説してくれている。

この発表も@tenntennさんが書いた当時のレポートがあるので、そちらを参考にするとより理解が深まる。

Go言語によるWebアプリケーション開発

本篇はAPIやMongoDBを使ったアプリ開発で、そちらの内容も非常に勉強になるのだが、日本語版は監訳者の鵜飼さんの「Goらしいコードの書き方」が付録についている。
付録では本文中のコードをよりGoらしく書き直している。 Twitter APIやDB操作といった外部操作を含んだボリュームがある関数をリファクタリングする例が載っており、より実践的なリファクタリングアプローチを知ることができる。 Go1.17以前の書籍だが、Contextを使ったリファクタリング例もある。

みんなのGo言語[現場で使える実践テクニック]

まずGoを書いてみるか!というときに最適な書籍。日本でバリバリGoを書いているみなさんが各章担当している。
以下のような「まずなにか作ってみたい!」という時に必要な情報が一冊にまとまっている。

  • エディタなどの環境構築
  • CLIツールの作り方
  • テストの書き方

そのため、「ひとまず一冊本買って始めてみるか」というときに最適だし、中級者以上でも「これは知らなかった」となることが書いてある。
ちなみに8月に改訂版が出版されるらしく、Go Modulesの対応なども含まれるとのこと。

終わりに

私はGoを始めて書いたのが2016年ごろだったので、今回他の運営メンバーにいろいろな記事を教えてもらいよりGoの言語思想の背景を知ることができた。
なかなか言語設計や言語思想まで調べようと思うことはないかもしれない。が、背景を知ることで設計アプローチや種々の実装の判断もよりスマートなコードが書けるようになると思う。
今回少し時間がなく、ひとつひとつの情報を読み込んだり、関連リンクまではきちんと追えていないので、あとで改めて読み直したい。

なお、より実装や個別の機能についての優良情報は@izumin5210さんがまとめてくれている。

参考文献

関連記事