The Gopher character is based on the Go mascot designed by Renée French
はじめに
TIG真野です。
フューチャーでは2021年の2月に公開されたGo 1.16から、Goのリリースノートを読んで気になったところをブログにまとめるというブログリレーを続けています。
- Go 1.16連載が始まります
- Go 1.17連載が始まります: コンパイラとgo mod
- Go 1.18集中連載 ジェネリクス
- Go 1.19リリース連載始まります GoDoc/ツール周りのアップデート
- Go 1.20リリース連載が始まります&メモリアリーナの紹介&落ち穂拾い
- Go 1.21連載始まります&slogをどう使うべきか
- Go 1.22リリース連載始まります & ループの変化とTinyGo 0.31
単なる翻訳ではなく自分たちならではの付加価値を提供するための執筆のフローや秘訣を、初心者向けにまとめます。社内外あるいはGoだけのとどまらず、次の新しいソフトウェアや技術のリリース時に技術ブログが増えると良いなと思っています。
時期
Release Historyを見るとわかりやすいですが、Goは年2回のペースでメジャーアップデートを繰り返しています。だいたい、2月と8月です。
その1, 2ヶ月ほど前になるとRelease Candidate(RC)版が公開され、先立って機能を試すことができます。RC版は、 Go1.x.rc1
, Go1.x.rc2
などというサフィックスで公開され、rc1
とか rc2
が出るともうそろそろメジャーリリースが出そうだなと個人的にはワイワイな気持ちになります。
フューチャーでは、この RC
版が公開されてから、実際にメジャーリリースされる期間(1ヶ月程度)の間に触ってみてブログを公開していくという流れを取ることが多いです。
リリース状況は以下のXのアカウントをフォローしておくと便利だなと思います。
お題の選定
リリースノートはRC版が公開されるころにはDraft版が公開されていますので、ざっと見て、各人の興味がある部分を選定します。テーマ選定が個人的に一番悩ましいポイントです。
Go 1.22を例にします。「私見」ですがリリースノートは大きく6つのブロックに分割できます。
それぞれ、ブログに取り上げるテーマとして「私見」を述べます。
- 言語レベルの変更
- Go 1.18だとジェネリクス、Go 1.22だとforループの変数についての変更など、メジャーリリース目玉と言っても良い項目です。注目度も高いゆえ多くの人によって発信されることが比較的多いです
- コマンド系の更新
go test
のようなコマンドのアップデート系です- もし利用頻度が高いコマンドにアップデートがあれば、テーマに取り上げると差別化が図りやすいです
- お勧めです
- ビルド,実行時の改善系
- 新パッケージの追加
- 新しい標準パッケージを使ってみるのはGoではGoDocやExampleがある程度整備されていることが多く、動かしやすいためお勧めです
- ライブラリによっては人を選ぶものがあり(例えば、Go 1.20ではcrypto/ecdh という鍵交換の暗号周りに利用するパッケージが追加されました)、前提知識からキャッチアップが必要な内容もしばしばあります
net/http
など利用頻度が高いメジャーなパッケージの変更は、役立つことが多いので調べると多くの人にとっても学びになります- お勧めです
- マイナーアップデート
- すでに存在するパッケージに、APIが追加されたという内容です(Goの互換性ポリシーでは関数の削除や、シグネチャの変更はありません)
- お勧めです
- OS/プロセッサのサポート
- 例えば、RISC-VやOpenBSDのサポートの更新についての紹介です
- 上級者向けです
「お勧め」と書いた部分も、メジャーバージョンごとに差異が大きく、実際にテーマ選定時には当然リリースノートを確認する必要があります。面白そうなアップデートだと思ったけど、Windows OS特有の修正で、検証が難しくて途中で諦めたケースなどが過去の連載でもありました。
※改めて強調しますが、全て個人の意見です。初心者だろうがベテランだろうが、気になったところを興味が赴くままに触ってみることが大事だと思っています。一方で、ピンと来る内容が無いことも初心者だと多いと思います。その時に、あえて絞り込むならという視点で書いています。
アドバイスを出す/貰う
初心者の場合は、どのテーマを深掘りすべきか決め手にかけるということも多いと思います。
その場合は、有識者に「書きやすそうなネタリスト」を出してもらって、そこから選ぶというのも良い進め方だと思います。
過去、わたしも社内で執筆メンバーを募集したときは以下のネタが書きやすいのでは? という内容をリストアップして告知しました。
改めて見ると、このリストアップもどうなんだ…とも思いますが、これを見てテーマを決めたという人もいました。
難易度を判定できる人に教えてもらう、というのは最初の取っ掛かりとして悪くないため、周囲に頼れる人がいれば頼り、テックリード的な人は補助線を引いて上げると良いかなと思います。
環境を構築する
お手軽な手法として、 go install
を使う方法があります。例えば go 1.22rc2
をインストールする場合はこのページからバージョンをたどり、次のコマンドが用意されています。
go install golang.org/dl/go1.22rc2@latest |
これで go
コマンドのように go1.22rc2
コマンドを利用できます。 go1.22rc2 run main.go
といった形でいち早く新バージョンを動かせ、かつ既存のGoのバージョンを変えなくても済むので便利です。
GoLandを使っている人はさらに楽ができます。
設定>Go>GOROOT>+記号>ダウンロードで、GoLand側でバージョンリストを出してくれ、指定したいバージョンをクリックするとダウンロードからIDE内でPATHまで諸々設定してくれます。GoLandのターミナルで実行する go
コマンドまで指定のバージョンを利用してくれるため便利です。
プロポーサル(Issue)を探す
リリースノートからブログを書くと言いましたが、リリースノートの内容は簡略化した内容ですので、加えてGoDocやプロポーサルを確認して、背景や議論のやり取りを確認すると内容が深まります。
プロポーサル(Issue)の探し方ですが、一番簡単なのは、ページのHTMLを開き(Chromeであれば ctrl + U)、そこにコメントされているURLを取得する方法です。おそらくこの手法が最速です。
次のように range overが議論されていたIssueが見つかります。
それを開くとGitHub Issueに飛べると思います。
時には長い議論になっていることも多いですので、サマリにまとめるだけでも良いとっかかりな記事にしやすいと思います。
社内メンバーは次のようなポイントを拾うことが多いです。
- 背景(なぜそれが必要なのか、従来の課題は何か)
- それがなかった場合、従来はどう対応していたか
- 受け入れられなかった別案にはどういったものがあったか
- レビュアーが懸念していることにどんなことがあるか
辻さんのHTTP ResponseController記事では、互換性の立場からこっちのメソッドを拡張できずといった説明があります。ある断面だけだと不自然に思えることも、歴史的経緯を知ると理解しやすくなりますよね。
IssueからはコードレビューのURLがリンクされていることが多いので、どのようなファイルの修正があったかも確認できます。コードの修正内容まで踏み込めるとオリジナリティ溢れること間違いないです。
触ってみる
実際にサンプルコードを書いて動かすと理解が深まります。
もし、標準パッケージの追加/更新であればテストコードが存在するため、GoDocだけみて動かし方がわからない場合も、標準パッケージのテストコードを参考にするとよいです。それらをデバッグ実行してみて、どのような実装になっているか内部のコードを見ても面白いですね。
棚井さんは encoding/base32
をテーマに、Base32そのものの変換処理の流れを解説する記事を書いていました。こうした派生は面白いですね。
Bug Fix系であれば、新バージョンと旧バージョンで比較して動作検証してみても良いかもしれません。
また、性能が気になればベンチマークを取ってみるというのも、知見を増やしやすいポイントです。例えば、武田さんの記事では、標準のnet/httpとサードパーティ製ライブラリでベンチマークを取っていて、使えそうかそうじゃないかの1つの材料を提供しています。
私もnet/httpの記事では、CPUプロファイルや、strace
を用いて、システムコールの発行具合を調査した記事を書きました。Goは標準に様々なツールがあり分析できるので、引き出しを増やすという意味でも学びになります。
触ってみて得た知見や疑問点も、記事に書いたり周囲のGopherな人に雑談で話すと、ネタが広がることも多いので、記事を書く前にもどんどん発信してフィードバックをもらいましょう。
コードリーディングのお供に
コードリーディングのサポートとしてGitHub Copilotをうまく活用しているよというメンバーもいます。
途中で難易度の高い処理にぶつかっても、エディタ上でCopilotに質問すれば、処理内容を解説して頂けます。
VSCodeプラグインもあります。
https://marketplace.visualstudio.com/items?itemName=GitHub.copilot
まとめ
自分のレベルと興味にあったテーマの選定が最も難しく、決まればプロポーサルはリリースノートからすぐにたどり着けますので、あとはテストコードやデバッグ、ベンチマーク、プロファイルなどのツールを駆使していろいろ触ってみて得た知見を記事にしましょう、という内容でした。
リリースを記念に祝う目的でブログを書くと、良い感じの緩さ加減な期日感もあり機会としてはちょうどいいですし、適度に学びになります。
もっと良い方法があればXでぜひ教えてください。