こんにちは。この記事はfreee Developers Advent Calendar 2023の20日目になります。
認証認可基盤チームのアプリケーションエンジニアを担当しているハトンです。 一番好きな言語はGoです!
学生時代はコンピューターサイエンスとは無縁で、メモリとストレージの違いもわかっていない数学科の学生として過ごしてきました。そして、社会人になってからプログラミングを始めたなんちゃってエンジニアに近しい存在です。
今回はそんな私がどうやってGoをキャッチアップしてきたのか書かせていただきます。
Goのどんなところがすきなの?
Goは言語機能が少なくそれゆえ言語の仕様を覚えるのが楽だと思っています。 これは数学の公式を覚えずに証明方法だけを理解していれば、いつでも必要な公式を導き出して使えるようになる感覚に似ています。 私は多くのことを覚えるのは苦手なのでGoのような言語はとても好きです。
標準packageの中もsystem callまでは基本はGoで書かれており、やる気さえ用意さえすれば特別な設定をしなくても読めるのが素敵だと思います。
言語設計の面でもio packageを例にするとio.Reader, io.Writerインターフェースを通して、ネットワークからファイルI/Oまで一貫したインターフェースで扱えるという点が美しくて好きです。
Goとの出会い
Goとの出会いはGoaというWebフレームワークを使用することが決定しているプロジェクトのメンバーになったことがきっかけでした。その時に使用していたv3は出たばかりでドキュメントはまだ少なく、怪しい挙動も少なからずありました。
日本人のコミッターもいたので質問できなくもなかったのですが、当時の私はコミュニティに対して初心者が質問するのは失礼かもしれないと思い込んでいたので、自分でなんとか解決する策をとってしまいました。 何もわからないので困っている処理周辺のコードを理解するべく、vscodeのデバッグ実行を使ってGoaの中身までコードジャンプしていきひたすら読んでいました。
この時はよくわかっていなかったのですが、コードジャンプしていくうちにGoの標準packageまでみていることが多くありました。最適化されている標準packageの処理までは教養がなく1割ほどしか理解できませんでした。
しかし、挙動を観察することは初心者でもできるんだと小さいけれども成功体験のようなものを得て、だんだんとGo読むことに抵抗感がなくなっていきました。
困ったらすぐデバッグ実行する習慣がつく
Goを触ってから2年目くらいの頃も有識者に聞くという行為が恐れ多いものだと思っていました。 ですから、ライブラリの挙動で困ったらまずはデバッグ実行をして中身を読み解き、使い方が間違っているのかそれともバグなのかを判断することを繰り返していました。
この一連の流れを繰り返すうちにissueやdocumentにやりたいことが書かれていなかったらすぐにデバッグ実行するという習慣がついていきました。 単純ですが読んだ分だけコードレベルで挙動を知ることができるので、チーム内で有識者としてGo関連の質問をされるようになります。人から頼りにされるのは嬉しいですし自分の知識を増やすモチベーションにもなっていました。
色々なアプリケーションアーキテクチャをプロジェクトで試してみた
Goを使い始めてから3年目くらいになると、アプリケーションアーキテクチャを考える機会を多くもらいました。 MVC・クリーンアーキテクチャ・軽量DDDなど様々なアーキテクチャをプロジェクトで試してみました。 理解が浅いままアーキテクチャを試していたので沢山の後悔と反省と辛い経験を積みました。
この経験からなるべくGo標準に近しい構成やコードを意識し、ライブラリやアーキテクチャは必要になったら取り入れていくという考えを持つようになってきました。初期実装はPOCで処理全貌をチームに共有することが重要だと思っているので、アーキテクチャをあまり意識せずにコードの見通しが良くなることを心掛けることが多いです。
今のところ小さいチームではこの考え方が合っていると思っています。
OSSにもちょっと貢献
技術的な面でリードする機会が増えこの頃の私は少し自信をつけてきていました。誰もが一度は考える「OSSに貢献したい」という野望が燃えたぎっていたのです。
初めは自作ライブラリを作ってみたりしましたが飽きっぽいので続きませんでした。 日常的に使っているライブラリなら何かしら貢献できることあるかもと修正するつもりでライブラリのソースを読み漁っていました。 主にやったことは以下の3つで、積極的にOSS活動していた方ではなかったです。
sqlxのissueにこのPRがマージされるとこのissueが解決されるよってコメントをする
gocsvにささやかな修正PRを出しマージまでしてもらうことができた
- testify関連のrepositoryに既存影響が漏れているPRを出しクローズ
OSS活動をやっていく中でコミュニティの方は新参者だろうが親切に返信してくれるんだなと思いました。 今後も貢献できる機会があれば気軽に貢献してみたいなとOSSへの心理的ハードルが下がるきっかけになりました。
freee社内では
直近ではアプリケーションアーキテクチャの叩き台を作らせてもらったり楽しくやれています。
社内には私よりもGoに詳しい方が多いので今までちゃんとできていなかった有識者から聞くということを自然にできるように心掛けていきたいと思います。
おわりに
社会人になってからエンジニアになると体系的知識が足りなく辛い部分も少なくありません。 私はその部分をコードを沢山読んでいくことでカバーしてきたよという話でした。
Goはデバッグ実行による挙動の観察がしやすい言語だと思いますので、みなさんもガンガンデバッグ実行してみてください!
明日のAdvent Calendaは21日目のoguguさんです!お楽しみに!