
Androidアプリエンジニアからフルスタックエンジニアになった話 【後編】
この記事は 「Atrae Engineers Advent Calendar 2024」の12/7(土)担当の記事になります。
※思いの外、筆が乗ってしまったため前編と後編に分けた後編です。
前編はこちら
6日目は、 @_mooriii による「リアルタイム共同編集を実現できるライブラリLoroを試してみる」でした
※Amazon等のリンクが存在しますが、アフィリエイトは利用していません
ISUCONが転機になった
バックエンド開発を行うようになり、半年ほどが過ぎた頃、ノリでISUCON
に申し込みました。
ISUCONとは、「いい感じにスピードアップコンテスト」のことを指します。
参加チームそれぞれに対してWebサービスが動く環境が渡されます。
制限時間(10~18時)内に、一番そのWebサービスを速くできたチームの勝ちとなります。
元々、先輩から話は聞いていたものの「アプリエンジニアだしいいや」と思っていたのですが、せっかくバックエンドをやり始めたのだから、やらない理由はないと思い、社内の同期たちと申し込みました。
正直あまり準備をせず、軽く当日どんなことをやるのか、どういう競技なのかを簡単に調べただけで臨みました。
ISUCONに臨む際、こちらのサイトは非常に勉強になりました。
実際出てみたISUCONですが、結果としてあまり改善することができず惨敗でした。しかし、僕はISUCONにとても面白みを感じました。
正直、それまではRails, Goそれぞれのプログラムの効率化を少しはするものの、メインはプロダクトの機能開発のためでした。
DB設計も同様にプロダクト開発の仕様を満たせるような勉強のみを行なっており、「バックエンドの学習もこんなものか。」と思ってしまっていました。
本当に軽んじてますね。過去の自分にアホだなと言ってやりたいです。
ISUCONでは、データベースにインデックスを貼ったりやプログラムでN+1を解消することはもちろんやるものの、それは一部です。
こちらの解説を読んでいただければわかりますが、数多くのことが変数となります。
ISUCONでは、渡されるWebサービスはただサーバが立っていてそこで動いているのみです。
そのサーバ内にsshで入り(sshで入らずにやる人もいます)、Gitを導入しソースコードをリモートのGit管理ツールへPushする。
DBがスロークエリログを吐き出せるようにする。
nginxのアクセスログを計測できるようにする。
アプリケーションのコード内に計測ツールを入れる。
普通の会社勤めであればすでに会社の誰かが導入してくれているものを自分たちで用意する必要があります。
自社サービスを0からつくる経験や個人開発によっても同じような経験が獲得できることも十分あると思います。
ただ、ISUCONでは全チームが同じWebサービスのチューニングを行われ、競技後には出題者からの問題やチューニングのポイントなどの解説されます。
そして、参加チームのいくつかはそれぞれがどのように問題に対して取り組んだかをブログやXにて投稿してくれています。
この出題者からの解説や、参加チームのアウトプットが非常に学びになります。
競技なので、その時間はもちろん全力で問題に取り組むのですが、なかなか思うようにスコアが伸ばせず悔しい経験などもします。
その悔しい気持ちから、解説を聞いたり他のチームのアウトプットを見ると「うわ、こんな観点から推測したのか…」や「この概念全然知らなかった…」など、発見が数多くあります。
自分に今まで見えてこなかった部分が見えるようになり、Webサービスを運営する上で、そしてバックエンドを開発する上で、変数がどんどん増えるのを実感できました。
本当に多少アプリケーションのコードを書いたり、DBのテーブル設計をしただけで「こんなものか。」と思ってしまった自分をぶん殴りたい。というか、とても恥ずかしい気持ちになりました。
ちなみに明日はISUCON14当日です。
今年は去年よりもISUCONについて調べ、素振りなども行なったので良い結果が残せるように頑張ろうと思います🔥
インフラ領域の勉強なども始めてみる
ISUCONを通して、自分にとって「今まで知らないだけで定数だと思ってしまっていた部分が変数に感じる」ようになりました。
そして、インフラ領域などにも興味領域が広がりました。
まず、そもそもISUCON以前については、すでに出来上がったプロジェクトのソースコードだけを変えている状態だったため、より多くのことを知りたいと思い、とりあえずこちらの本から入門しました。
この本を選んだ理由として、所属しているアトラエでAWSを利用しているためです。
こちらを通して、AWS上でEC2インスタンスを立ててその中にMySQLサーバやWordPressをインストールし、ネットワークを構築し、外部からアクセスできるようにします。
本の通りにやっただけなのですが、自分のブラウザからAWS上に立てたEC2内のサービスにアクセスできたときは、Androidアプリを始めて自分の端末で動かすことができたときに似た高揚感と感動がありました。
それからは少しずつではありますが、インフラ領域なども勉強しています。
以下は一部ではありますが、読んで面白かった本です。
この勉強をしながら、ちょうどAIを活用する施策を担当することになりました。
AIを活用することになったのですが、同期処理をすると待機状態が生じてしまうこと、そしてQuotaの上限が低いことが問題にあがりました。
ここで、PythonのCeleryという非同期処理を行うライブラリの導入を行いました。このCeleryを導入する際に、ワーカーとは何か、キューやタスクとは何か、それらをどのようにKubernetesで他のContainerと通信できるようにするかなどを学びました。
※こちらについては、またいつか記事にするかもしれません。
あれ、バックエンドだけ…?
ここまで読んでいただくと、バックエンドの学習しかしていないように感じますよね。
実際のところ、今年の初めくらいまではほぼほぼバックエンドの開発がメインでした。
しかしながら、今年に入ってから以前お蔵入りになってしまっていたNext.js製のソースコードを掘り起こして、先輩に協力していただきながら、本番で運用するところまで持っていくであったり、アプリ内で何かしら施策を実装する際は今も自分で実装を行うことがあります。
そのため、技術スタックでいうと、アプリ、フロントエンド、バックエンド(ちょこっとML)を活用しながら働いています。
また、施策を実装する際のプロジェクトマネジメントも行なっています。
今後に向けて考えていること
これまではフルスタック、もといバックエンドの学習などをどのように進めてきたかについて書いてきました。
ここからは少し方向性を変えて今後に向けて考えていることについて自分なりの考えをアウトプットしようと思います。
上述のようにバックエンドの開発やその他幅広く開発をしてきました。
その際、「プロダクトや事業を前に進めよう」という想いを強く持っていました。
「自分自身の領域を広げること」と「プロダクトや事業を前に進めよう」という意識のもと、よく「ボールを拾う」と表現される動きをしていたように感じます。
また、拾ってパスするだけでなく、あらゆるシチュエーションで自分がボールを前に進め如何にゴールに近づけられるか、そのために幅を広げようという意識を持ってあらゆる仕事に取り組んでいました。
しかしながら、僕だけがフルスタックのように幅広い問題解決ができるようになったからといって、大きく事業が進化するわけじゃない、ゴールに近づくわけじゃないということがわかり、とても学びになりました。
もちろん解決できることもありますが、自分一人が実装のスピードを上げるにしても限界がありますし、キャッチアップを進めるにしてもなかなかあらゆる領域について深くなることはなかなか難しいなと感じています。
子供が生まれたことで、自分だけに使える時間が減ったこともそう思う要因かもしれません。
ではどうするのが良さそうか。
それは、やはりチームをいかに強くするか、そして機能できるようにするかが大事かなと感じています。
自分自身が今以上に解決できる問題を多くする、その強度を高めることは最低限やることとし、後輩や先輩など関係なく、今以上に大きなことを成し遂げようとすると、人に本領を発揮してもらい、進化し続けてもらう必要があると感じています。
そして、チームがいかに強い状態になっても、機能しづらい状態であれば本領発揮できません。
先ほども言ったようにGreenでは積み重ねられた試行錯誤により、すぐには理解が難しいコードが存在したり、意図しない部分に影響が出てしまうケースなどが今もあります。
こういったことはチームが強くなるだけでなく、機能しやすくなるようにシステム側、そしてチーム構成なども変えていく必要があると思います。
最近、Findyさんが開催されたアーキテクチャConferenceというものに参加したり、スタッフエンジニア、エレガントパズルなどの本を読み、ただ個人として技術力をつけることによって解決できる問題を増やすだけでなく、今後は1人のエンジニアとしての貢献を超えて、システム全体やチームや組織をより強くするということに取り組んでいく必要があるように感じています。
現時点では、このように考えていますが、誤りがあるかもしれませんし、もっと他にいい方向があるかもしれないです。
ぜひこういった議題についてお話しさせていただきたいので、興味を持っていただけましたらXを通してご連絡いただけますと幸いです。