🦔

フロントエンドエンジニアが3ヶ月で Go を覚えてバックエンド開発に参画するまで

2023/02/16に公開

Magic Moment@aqlwah です。

2021年10月に入社してから1年ほどの間は、フロントエンドエンジニアとして React や Redux を用いた SPA の開発に主に従事していました。
それが昨年10月に行われたチーム体制再編をきっかけとして、バックエンドの開発にも参画するようになりました。
この記事では、フルスタックエンジニア見習いとなった私が Go をキャッチアップしてバックエンド開発を始めるまでに取り組んだ学習の経緯(ほぼ書評)をご紹介します。

余談ですが、この記事は先日にチーム内で開催した LT 会での発表をブログ向けの文章として書き起こしたものです。
私たち Tech チームでは、不定期で自由参加の LT 会を実施しており、業務内外で得た様々な知見を共有しています。
LT 会についての詳細もいずれこのブログでご紹介できればと思っています。ご期待ください。

Go 入門

私たちが開発している Magic Moment Playbook では、バックエンドに Go 言語によるマイクロサービスアーキテクチャを採用しています。
フロントエンドを開発しているときもちょっとした調べ物などでバックエンドのコードを読むことはありました。なので雰囲気で処理の流れを追うことはできる(文法がシンプルで読みやすく、他言語経験者であればリーディングにほぼ困らないのは Go の特長ですね)のですが、いざバックエンドを開発しようとなるとちゃんとした読み書きができるようになる必要があります。
そこで、襟を正して Go に入門するため以下の学習に取り組みました。

A Tour of Go

tour of go

A Tour of Go は、有名な Go 言語入門サイトです。
Tech チームでは、新たに Join するメンバーに向けた参考教材のリストを作成していますが、その Go 言語の節でもトップに挙げられている定番の教材です。
やってみた感想としては以下の通りです。

  • 構成がよくまとまっていて、取っ付きやすさは最高
  • Go の文法を知るには良いものの、ひとつひとつのトピックがあっさりめ
  • 文法の説明に終始しており、Go の思想を深く理解することや、「Go を使った開発」ができるまでには至らない
  • Go が初めてのプログラミング言語という人にはおすすめ
  • 他のプログラミング言語の経験がある人はもうちょっと上のレベルの教材を薦めたい
  • Gopher くんはかわいい

初めての Go 言語

初めてのGo言語

画像引用:O'Reilly Japan - 初めてのGo言語

A Tour of Go よりも Deep Dive したくなったところで手に取りました。
技術書を選ぶときには、目次を一通り見て「この書籍では自分の知りたいトピックがカバーされているか」を重視して決めますが、網羅的によくまとまっていると感じました。
O'Reilly サイトで公開されている目次を引用します。
ポインタ、並行処理、コンテキスト、リフレクション、ジェネリクスなど、初心者が頭を悩ませるようなトピックがほぼ網羅されています。
とても素晴らしい構成だと思いませんか?私は思います。

1章 Go環境のセットアップ
2章 基本型と宣言
3章 合成型
4章 ブロック、シャドーイング、制御構造
5章 関数
6章 ポインタ
7章 型、メソッド、インタフェース
8章 エラー処理
9章 モジュールとパッケージ
10章 並行処理
11章 標準ライブラリ
12章 コンテキスト
13章 テスト
14章 リフレクション、unsafe、cgo
15章 ジェネリクス

引用:O'Reilly Japan - 初めてのGo言語

以下感想です。

  • A Tour of Go より Deep Dive してくれており、個人的に求めていたレベル感に近い
  • 「Go らしい書き方はなにか」という思想(慣例、イディオム)の解説も豊富(副題が「他言語プログラマーのためのイディオマティック Go 実践ガイド」というのも良い)
  • これを通読すればとりあえず「Go が書ける」と言っても笑われない(と思う)
  • ホリネズミはかわいい

Go で開発ができるようになる

上述の教材で Go の世界観を掴むことはできます。
しかしながら、私たちはただ Go を書くだけでなく、すでに存在しているバックエンド開発現場に飛び込んでいく必要があります。
ネクストステップとして、より現場を意識した実践的なものに取り組むこととしました。

実用 Go 言語

実用Go言語

画像引用:O'Reilly Japan - 実用Go言語

タイトルに「実用」と入っている通り、アプリケーション開発という現場に即した観点から Go を解説している書籍です。
こちらも O'Reilly サイトから目次を引用します。

1章 「Goらしさ」に触れる
2章 定義型
3章 構造体
4章 インタフェース
5章 エラーハンドリング
6章 パッケージ、モジュール
7章 Goプログラミングの環境を整備する
8章 さまざまなデータフォーマット
9章 Goとリレーショナルデータベース
10章 HTTPサーバー
11章 HTTPクライアント
12章 ログとオブザーバビリティ
13章 テスト
14章 クラウドとGo
15章 クラウドのストレージ
16章 エンタープライズなGoアプリケーションと並行処理

引用:O'Reilly Japan - 実用Go言語

以下感想です。

  • 事業としてアプリケーション開発する立場から見た、押さえておくべき「実用的」な知識がまとまっている
  • エディタと IDE、Makefile、データファイルなどの読み書き、デザインパターンなど、言語だけでなく「Go で開発するため」の周辺トピックが豊富
  • これを通読したことで、Magic Moment Playbook のバックエンドリポジトリにある様々なモジュールの意味がわかった(このあたりから「バックエンド開発やれそう感」を感じ始めた)
  • ニホンイタチはかわいい

プロダクトコードを読む、書く

前述の通り、Magic Moment Playbook のバックエンドでは Go 言語によるマイクロサービスアーキテクチャを採用していますが、各マイクロサービスはヘキサゴナルアーキテクチャをベースとした adapter, usecase, domain のレイヤー構造によって成り立っています。
Tech チーム内では「バックエンドは難しい」とまことしやかに囁かれていますが、これはつまるところ「アーキテクチャの勘所を掴まなければ、謎のおまじないの集合にしか見えなくてつらい」ということだと思っています。
私たちのプロダクトの知識がどこかの書籍に書いてあるわけもなく、結局はプロダクトコードとドキュメントに正面から取り組んで揉まれていくのが唯一にして確実な方法でしょう。
ベーシックな REST API の処理の流れ全体を通して(HTTP サーバーの立ち上げから DB の CRUD まで)コードを読んでみる・書いてみるのがキャッチアップとして手っ取り早く、応用も効きます。

個人的にエンジニア生活の指針としている、Eric S. Raymond 氏のエッセイ「How To Become A Hacker」でもそう言われています。

プログラミングを学ぶということは、自然言語でよい文章の書きかたを学ぶようなものです。いちばんいいのは、その分野の熟練者が書いたものを読んで、自分で何か書いてみて、もっとたくさん読んで、もうちょっと書いて、もっとたくさん読んで、もうちょっと書いて……そして自分の書くものが、お手本のもつ力強さと簡潔さをもつようになるまでこれを繰り返すことです。

引用:ハッカーになろう (How To Become A Hacker)

今読んでるやつ・これから読む予定のやつ

今ここ。
というわけで、フロントエンドエンジニアが昨年11月から Go を書き始めて、概ね3ヶ月でバックエンド開発ができるようになりました。
(今年に入ってからはほぼ「バックエンドの人」のように立ち回っており、React や TypeScript を忘れてしまわないかとヒヤヒヤしております)

ここからは、今取り組んでいる書籍・これから取り組む書籍についてご紹介していきます。

Go 言語による分散サービス

Go言語による分散サービス

画像引用:O'Reilly Japan - Go言語による分散サービス

今まで取り組んできた内容では、Go の言語知識や開発知識はよくカバーしていたものの、マイクロサービスプロダクトを作るための知識は得るには至りませんでした。
こちらの書籍では、Protocol Buffers, gRPC, kubernetes など Magic Moment Playbook でも採用している技術を使ってハンズオン形式でマイクロサービスを作っていくことができます。
それまでは Protocol Buffers と gRPC の理解が浅く、なんとなく一緒くたに認識していましたが、取り組んでいくうちに整理がつくようになりました。
まだデプロイまでできていないので、引き続き進めていきます。

第I部 さあ始めましょう
1章 レッツGo
2章 プロトコルバッファによる構造化データ
3章 ログパッケージの作成
第II部 ネットワーク
4章 gRPCによるリクエスト処理
5章 安全なサービスの構築
6章 システムの観測
第III部 分散化
7章 サーバ間のサービスディスカバリ
8章 合意形成によるサービス連携
9章 サーバディスカバリとクライアント側ロードバランス
第IV部 デプロイ
10章 Kubernetesでローカルにアプリケーションをデプロイ
11章 アプリケーションをKubernetesでクラウドにデプロイ

引用:O'Reilly Japan - Go言語による分散サービス

Go 言語による並行処理

Go言語による並行処理

画像引用:O'Reilly Japan - Go言語による並行処理

Go でパフォーマンスを追求し始めたら並行処理は避けられないだろうと思い、積読しています。
5年ほど前のやや古い書籍ですが、技術記事や SNS などで時折見かけるので、かなり評判が良いもの(いわゆる定番)だと思っています。
Tech チーム内でも最近パフォーマンスや大量データ処理の機運が高まってきているので、しっかりとキャッチアップしていきたい気持ちがあります。

1章 並行処理入門
2章 並行性をどうモデル化するか:CSPとは何か
3章 Goにおける並行処理の構成要素
4章 Goでの並行処理パターン
5章 大規模開発での並行処理
6章 ゴルーチンとGoランタイム

引用:O'Reilly Japan - Go言語による並行処理

まとめ

フロントエンジニアを出自に持つ私が、3ヶ月でどのように Go をキャッチアップしてきたか、その学習遍歴(ほぼ書評)を振り返ってきました。

  • A Tour of Goは良いものだけど、他言語の経験がある現職のエンジニアなら飛ばしてもいい(もっと難しい教材に取り組んでもいい)と思う
  • おすすめは、初めての Go 言語 & 実用 Go 言語を両方読むこと
  • とはいえ本を読むばかりじゃなく、プロダクトのコードを読み書きするのも大切(インプットとアウトプットは両輪)
  • バックエンドはこわくない

最後に、「How To Become A Hacker」からもうひとつ引用します。

自分の学習能力に対する信頼も育てましょう。たとえ今の段階では大きな問題を解決するのに必要なすべてを知らなくても、その問題のほんの一部から取りかかって、そこから新しい事を学び取れば、次の部分の解決に十分なだけ学べて、そして次へ次へと進めば、いずれ大きな問題全体が解決できると信じましょう

引用:ハッカーになろう (How To Become A Hacker)

新しいスキルを習得するときも同じで、できることから少しずつステップを上っていくことで、いずれは大きな目標も達成できるのだと思っています。

最後に

弊社 Magic Moment では、フロントエンド・バックエンドにかかわらず全方位的にエンジニアを募集中です!Magic Momentに少しでも興味を持っていただけたら是非エントリーください!

8/30にはFindy様主催のイベントにMagic Momentから石田さんが登壇されます!
よろしければぜひご視聴ください!

さらに、こちらのイベントも8/29開催予定です!こちらはオンラインイベントです。Magic Momentの開発がどんなものか興味を持っていただいた方は是非ご参加ください!

Discussion