きっかけ
仕事でGo言語を使うことになりました。それまでは別の言語での開発が中心でしたが、プロジェクトの要件上、Goを使ったサーバーサイド開発に携わることになりました。
正直なところ、最初はかなり戸惑いました。Goは他の言語と比べてシンプルな構文を持つ一方で、型の扱い方やエラーハンドリングのスタイルが独特で、「なぜこう書かなければならないのか」と思う場面が多々ありました。コンパイルエラーが出るたびに調べ、試して、また失敗して……という繰り返しが続き、最初の数週間はかなり苦労しました。
しかし、そこで助けになったのが一緒に実装を進めてくれる経験豊富なメンバーの存在です。詰まったときに的確なアドバイスをもらいながら少しずつ理解が深まり、気がつけばある程度スムーズにコードが書けるようになっていました。今振り返ると、最初の壁を乗り越えられたのはチームの力が大きかったと感じています。
現在の開発環境
現在のローカル開発環境は以下の構成で進めています。
- 言語: Go(Golang)
- DB: MySQL(Dockerコンテナで起動)
- ORM: GORM
- エディタ: Visual Studio Code
- コンテナ: Docker / Docker Compose
Visual Studio Codeは拡張機能が充実しており、Go用の拡張(golang.go)を入れるだけで補完・フォーマット・デバッグ・テスト実行がほぼすべてエディタ上から行えます。以前はターミナルを行き来することも多かったのですが、今はVSCodeのサイドバーやコマンドパレットから大半の操作が完結するので、開発体験が大きく向上したと感じています。
DockerでMySQLを立ち上げているため、ローカル環境の構築もdocker-compose up一発で完了します。環境の再現性が高く、チームメンバーとの環境差異もほとんど出ないのは大きなメリットです。
今取り組んでいること
現在メインで取り組んでいるのは以下の3点です。
① GORMを使ったDB操作 GORMはGoのORMライブラリで、SQLを直接書かずにGoの構造体を通じてDBを操作できます。マイグレーション、クエリ、リレーションの扱いなど、最初は複雑に感じましたが、慣れてくると非常に直感的に書けるようになりました。
② 単体テスト
Goは標準ライブラリにtestingパッケージが含まれており、外部ライブラリなしに単体テストが書けます。VSCodeから直接テストを実行できるため、コードを書いてすぐに検証できる点が気に入っています。モックの使い方やテーブル駆動テストのパターンなど、まだ学ぶことは多いですが、テストを書く習慣が身についてきました。
③ デバッグ VSCodeのデバッグ機能(Delve)を使って、ブレークポイントを設定しながらGoのコードを追えるようになりました。実行時の変数の状態を確認しながら原因を特定できるので、バグ修正の効率が格段に上がりました。
今後の学習・展望
現時点では「動くコードが書けるようになった」段階ですが、今後はより深くGoを理解していきたいと考えています。具体的に取り組んでいきたいテーマは以下の通りです。
Goらしい書き方を身につける
Goにはいわゆる「イディオム」があります。インターフェースの使い方、goroutineとchannelを使った並行処理、エラーハンドリングのベストプラクティスなど、「動くコード」と「Goらしいコード」の間にはまだ大きな差があります。コードレビューを通じてフィードバックをもらいながら、少しずつGoのスタイルを吸収していきたいと思っています。
並行処理(goroutine / channel)を理解する
GoはもともとC言語の設計者が開発した言語であり、並行処理が得意な言語として知られています。goroutineとchannelを使えば、シンプルな構文で非同期処理を記述できますが、適切に扱わないとレースコンディションやデッドロックといった問題が発生します。この辺りはまだ理解が浅いため、実際にコードを書きながら理解を深めていく予定です。
パフォーマンスを意識した実装
サーバーサイド開発ではレスポンスタイムやリソース効率も重要です。Goはpprof(プロファイリングツール)が標準で使えるため、ボトルネックの特定や最適化に活用できます。まずは基本的な使い方を学び、実際のコードに適用してみたいと考えています。
テストの品質を上げる
単体テストは書けるようになってきましたが、テストカバレッジの向上、モックの活用、統合テストへの取り組みなど、まだまだ改善の余地があります。テストコードの品質がプロダクトの品質に直結するという意識を持ちながら、継続的に改善していきたいと思っています。
書籍や公式ドキュメントを活用する
業務を通じた実践的な学習は非常に有効ですが、体系的な知識を身につけるためには書籍も有効だと感じています。現在候補として考えているのは以下のような書籍です。
- 『プログラミング言語Go』(Alan A. A. Donovan, Brian W. Kernighan著):通称「The Go Programming Language」。Goの仕様や設計思想を深く理解したい方に向いている定番書。
- 『Go言語による並行処理』(Katherine Cox-Buday著):goroutineやchannelを体系的に学べる一冊。並行処理の理解を深めたい段階で読む予定。
公式ドキュメント(https://golang.org/)も非常に充実しているため、まずは公式のチュートリアルやEffective Goを読み込むことも計画しています。
まとめ
Go言語は最初のハードルこそありましたが、慣れてくると書いていて気持ちのいい言語だと感じています。型が明確で、コードが読みやすく、ツールチェーンが整っている点が特に気に入っています。
まだ実装スピードは決して速くありませんし、わからないことも山積みですが、一つひとつ着実に習得していくつもりです。このブログでは今後、業務でハマったポイントや学んだことをメモとして残していく予定ですので、同じようにGoを学んでいる方の参考に少しでもなれれば幸いです。
引き続きよろしくお願いします。