休日Gopherとしての1年半を振り返る

# はじめに

この記事は [Go Advent Calendar 2022](https://qiita.com/advent-calendar/2022/go) 20日目の記事です。

タイトルにある「休日Gopher」なんて言葉はこの世界にないと思います。
私が勝手に作りました。休日にしか`Go`を触る機会がないGopherのことをそう呼ぼうと思います。
転職をきっかけに脱休日Gopherとなりました。このタイミングをきっかけに
エンジニア歴2年半くらい、`Go`歴1年半くらいの @_otakakot_ が休日に`Go`を学びはじめ、`Go`を使いたいというモチベーションで転職するまでに至った活動を振り返りたいと思います。（2021年4月くらい ~ 2022年11月くらい）
学びの方法は合う合わないがあると思うので「こんな方法もあるんだなぁ」くらいの気持ちで読んでいただければと思います。
`Go`に興味がある方、Gopherを目指している方の取り組みの参考になれば嬉しいです。

# やってよかったこと

## 動画視聴による導入

コンテンツ：Udemy [【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)](https://www.udemy.com/course/golang-webgosql/)  
実施タイミング：2021年4月ごろ：`Go`歴0ヶ月（学びはじめ、`Go`ってなに状態）
実施形態：個人

最初に`Go`を知る方法として動画学習を利用しました。
`TypeScript`を学ぶときに身につけた方法なのですが、私は言語を学び始めるときに一切手は動かさず動画を倍速で見てとにかくインプットに徹します。
動画学習を取り入れたときは、動画を視聴しながらコーディングをしていたのですが動画を止めて手を動かすの繰り返しで少し効率が悪いように感じていました。
言語に関する情報をある程度全体的に把握してからコーディングを始めた方が手を動かし始めたときにスムーズになった気がしています。

## 「実用Go言語」本の輪読

コンテンツ：[実用Go言語](https://www.oreilly.co.jp/books/9784873119694/)（2022/04/20発売）
実施タイミング：2022年4月ごろ：`Go`歴1年くらい（なんとなく`Go`が書ける）
実施形態：輪読会（with 同期エンジニア）

**私が読んできた書籍の中で`Go`を学ぶ上でもっともおすすめしたい書籍です！**

同期のエンジニア1名と輪読形式で読み進めました。
方法としては**事前準備なし**で、毎週休日にMeetを接続して一緒に黙読（音読）していきます。
それぞれ気になった項目があると発言をし議論をしてみます。（こう書かれているけど、こういうことだよね？ etc ...）
（発言を文字起こしして記録したこともありますが、あまり精度がよろしくなく意味わからない発言のオンパレードになったため継続はできなかったです。）
また、マインドマップに記録していって関連を広げていくという作業も行いました。
ほとんどコードは書きませんでしたが、内容についてああだこうだ議論をしながら読み進めたことでインプットとアウトプットを繰り返せたのではないかと思います。

![マインドマップ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961759/c0515b5c-f63f-c265-8a0f-c416a7c2c773.png)


## TechTrainの演習

コンテンツ：[TechTrain](https://techtrain.dev/)の[go-stations](https://github.com/TechBowl-japan/go-stations)
実施タイミング：2022年7月ごろ：`Go`歴1年3ヶ月くらい（なんとなく`Go`が書ける）
実施形態：個人

演習内容はTODO ListのバックエンドAPIの作成です。
演習は実務経験がない休日Gopherにとって自分の理解度を確認する場になります。
個人開発という枠組みだとどうしても自分の作りたいものをおれおれで実装しがちですが、決められた枠組み/制約の中で実装する必要がある演習は自分の知識を振り返る良い機会になります。
なるべくググらないように実施しスムーズに演習をこなせたこともあって`Go`に関する基礎的なことは理解できているのだなと実感することができました！
（よくよく考えると演習ってそういう使い方ですよね。。。当たり前のことをさも新発見のように書いてしまいました。）

# 時期尚早だったと感じたこと

## Go言語による並行処理の読書

コンテンツ：[Go言語による並行処理](https://www.oreilly.co.jp/books/9784873118468/)（2018/10/25発売）
実施タイミング：2021年5月ごろ：`Go`歴1ヶ月くらい（学びはじめ。`Go`の概要はわかった！）
実施形態：個人

動画視聴の中で並行処理を知ったもののいまいちピンとこなかったので学びを深めるべく読みました。
しかし、読んでみたものの結局はよくわかりませんでした。
よくわからなかった理由としては結局並行処理ってどこでどうやって使うのかがイメージできなかったことだと思います。

「おい、休日Gopherじゃないじゃないか」とツッコミが入りそうですが、
のちに業務で負荷テストをサポートするツールを自作したときに並行処理を使ってみました。
（負荷テストで生み出されたゴミデータを並行処理でお掃除するスクリプトを書きました。）
このときになって始めて`Go`の並行処理の書き方を理解し並行処理の必要性を実感することができました。

## エキスパートたちのGo言語の読書

コンテンツ：[エキスパートたちのGo言語](https://gihyo.jp/book/2022/978-4-297-12519-6):（2022/01/12発売）
実施タイミング：2022年1月ごろ：`Go`歴9ヶ月くらい（なんとなく書ける）
実施形態：個人

コードチェックツールからIoT、k8s関連 etc...と`Go`ってこんなことできるのか！と感動できる1冊です。
ただ、基礎がまだ定着していなかった私にとっては応用力が高すぎて使いこなすイメージがまったく描けませんでした。　

## Go言語による分散サービスの輪読

コンテンツ：[Go言語による分散サービス](https://www.oreilly.co.jp/books/9784873119977/)（2022/08/01発売）
実施タイミング：2022年8月ごろ：`Go`歴1年4ヶ月くらい（なんとなく`Go`が書ける）
実施形態：輪読会・ペアプロ?（with 同期エンジニア）

発売前からタイトルでわくわくしていました。
あまりにもモチベーションが高かったので個人的に一度軽く読んでみました。（仕事の休憩時間に読んでいました。）
ただ、第Ⅰ部および第Ⅱ部はそれなりに読めましたが、第Ⅲ部からは急激にハードルが高くなった印象です。

こちらの輪読も事前準備はなしでハンズオン形式の内容だったので普段はあまりしない写経を実施しました。
こんな書き方もあるんだと手を動かしながら知れたのですがやはり内容が難しかったので最終章で挫折しました。
`Go`の知識というよりも分散合意アルゴリズム`Raft`が本当に難しいです。
また改めてチャレンジしたいです。

# その他やっていること

## 同期エンジニアとの個人開発

コンテンツ：個人開発
実施タイミング：2021年6月ごろ：`Go`歴2ヶ月 ~ 現在進行中
実施形態：ペアプロ?

振り返ってみると、`Go`を学び始めてからちょっとの期間で手を動かし始めていました。
クリーンアーキテクチャを意識してチャットサービスみたいなものを作ろうぜといっては飽き。
[beego](https://github.com/beego/beego)を使ってTwitterみたいなものを作ろうぜといっては飽き。
いろいろ手を動かしています。

レビューし合いながら開発をすることでコード品質を保つためにコーディングしたり
自分で学習しているだけでは知ることができない情報に出会えたりします。
[TableDrivenTests](https://github.com/golang/go/wiki/TableDrivenTests)は休日開発を通じて知りました。

現在はいろいろな記事をメモしておくアプリを開発しています。
私は気になった記事をSlackに投げておく習性があったのですが、フリープランの制限が「過去90日間のメッセージ履歴」に変わった影響により欲しくなりました。
自分が実際に使う想定があるためモチベーション高く開発できています。

## 積読リスト

`Go`は読みたい本がたくさんあるので困ります。
ただ、手を動かしすぎていてインプットが疎かになっています。
開発めっちゃ楽しいです。読みたい本がたくさんあるのにとにかく手を動かしたくてたまらない状態です。

- [Go言語によるWebアプリケーション開発](https://www.oreilly.co.jp/books/9784873117522/):2016/01/21発売
- [Goプログラミング実践入門 標準ライブラリでゼロからWebアプリを作る](https://book.impress.co.jp/books/1115101145):2017/03/17発売
- [Go言語でつくるインタプリタ](https://www.oreilly.co.jp/books/9784873118222/):2018/06/18発売
- [Goならわかるシステムプログラミング 第2版](https://www.lambdanote.com/products/go-2):2022/03/23発売
- [詳解Go言語Webアプリケーション開発](https://book.mynavi.jp/manatee/books/detail/id=131170):2022/07/20発売
- [APIを作りながら進むGo中級者への道](https://techbookfest.org/product/jXDAEU1dR53kbZkgtDm9zx?productVariantID=dvjtgpjw8VDTXNqKaanTVi):2022/09/10発売(技術書典13)
- [初めてのGo言語](https://www.oreilly.co.jp/books/9784814400041/):2022/09/22発売

# おわりに

`Go`を学んだ1年半を振り返ってみました。
記事を書いてみて気づいたのですが、実施タイミング（個人の技術レベル感）や実施形態をまとめる（共有する）のは結構良いのではないかと感じました。（みなさんがどうやって学んでいるのか気になります！）

また、「仲間」の存在はめちゃくちゃ大きいです。私信キャッチしてくれると信じてこの場で感謝を伝えます。本当にありがとうございます。これからもどうぞよろしくお願いします。

「[Goに入ってはGoに従え](http://ukai-go-talks.appspot.com/2014/gocon.slide#1)」
このような言葉が生まれるのも`Go`っぽいのかなと思います。
いろいろな学習をここまでしてきて思うことは`Go`を知るためには[Go](https://github.com/golang/go)のコードを読むしかないのではと思っています。

まだまだ`Go`歴は短いですが転職してからは毎日のように`Go`に触れることができる最高の環境に身を置けています。
これからも`Go`の魅力を知り、社内外問わず一流のGopherとなれるように精進します！！