ノートの端の書き残し

UnityやらC#やら。設計が得意かもしれない。

プログラマとして勉強したこと雑に思い返す

自分は、未経験からプログラマとして、ゲームアプリ開発に携わり、数年仕事をしながらゲームプログラムのスキルを磨いてきました。
今ではある程度技術も身につけ(まだ全然知らないことの方が遙かに多いですが)、まぁ中堅として仕事はできてるのかなという状態に落ち着いていますが、こうなるまでにどういう勉強をしてきたのかというのを振り返ってみたいと思います。
自分は完全な未経験の状態からまだ数年しか経っていないので、これが、ゲーム開発初めてみたいけどできるのかわからん、何したらいいのかわからん、みたいな人の参考になればいいなと思います。
(書いてる時点で4年ちょうどくらいでした)

0年目

就職する前のスキルは、完全な初心者そのものです。関数、変数って何みたいな状態から、とりあえずわからんわからん言ってても始まらないので、ネットで検索したり古本屋で適当に本を選んで勉強しました。 読んだ本は、以下のようなものです。

最初は、ゲームって言ったらC++らしいぞ、なんか評判良さそうな本があるぞとDirectXで描画やらをやり、一通りやってみて、これでゲーム作れるかというと時間的に厳しすぎたので、ゲームエンジンに頼って、Unityに手を出した感じですね。
C++やってたのにUEじゃないのかとは思うんですが、検索して出てくる資料の数が遙かにUnityの方が多かったためにUnityを選びました。
そして、Unityで何か作ってみるためにまずC#の勉強をし、簡単なゲーム(確か、ペルソナのコードブレイカーを真似てパズルゲームを作った覚えがあります)を作るまででおよそ2ヶ月かかりました。

1年目

この時点では、C#の本当に基本的な文法はとりあえず頭に入っていますが、ジェネリックもよくわからんしインターフェースも何のためにあるのかわからん、みたいな状態でした。(設計に関する知識がゼロだったので、ポリモーフィズムの何が嬉しいのかピンと来なかったんですね。) この1年目で、自分があまりにも何も知らないことを痛感しながら、仕事をしつつ学ぶというのを続けていました。
ちょうど時期的に、Unity2018や、UniTaskというのが登場し始めまして、アーキテクチャを意識した方がいいのではないかという雰囲気がUnityエンジニア界隈に流れ始めたものこのあたりだったのではないかと思います。
その流れと、自分の基礎を学んでいた時期が合致した結果、設計に比較的強い関心を持った成長をしたのではないかなと思います。
また、「Gotanda.Unity」や、「完全に理解した」のような勉強会にも参加してみたりして、自分が何を知らないのかという情報を得ていったりもしていました。

2年目

1年目に、見境なく勉強し、特に設計面についての知識を深めた結果、参加しているプロジェクトの設計がヤバいということに気がつきました。
ここで設計についてのちゃんとした知識を身につけなければならないと思い、1年目はネットや勉強会といったものから情報を得ていたのですが、基礎固めとして書籍を読みました。

  • Adaptive Code ~ C#実践開発手法 第2版

これはアーキテクチャとは別レイヤの話で、例えば継承を気軽に使いまくらずに委譲せよとか、そういうテクニックの本なのですが、後から変更を加えやすいコードが求められていたので、適切な書籍だったと思います。 また、シェーダやパーティクルなど見た目の勉強もこの辺りで行っていました。
シェーダはUnity独自の要素は少ないので、一般的なHLSLの書籍で学んで、ちょっとUnity対応するという感じでしたね。
基本的には、業務でしなければならないことには余裕が出てきたので、関係ないところ、覚えたら関われる幅が広がりそうなところを勉強していた感じです。
また、SharpLabやBenchmarkDotNetなどを使って、C#への理解を深めていったのもこの頃です。

3年目

設計周りは先輩含め、チームメンバーみんなで勉強していった感じで、その結果自分は設計面に関してリーダー的なポジションになりました。 ただ、正直理解がまだまだ足りていなかったので、ネット上のクリーンアーキテクチャの話だけでなく、ちゃんと書籍で勉強しました。

  • Clean Architecture 達人に学ぶソフトウェアの構造と設計

これを読んで、基本的な考えは身に付いていたことが確認できたのですが、「詳細を後回しにする」など、何となくこうするといいよねくらいの理解だったものが、言語化できるようになりました。
言語化できるとさらに理解を深められるので、大事です。

偉そうなことを言わせてもらえば、最低限まともに仕事ができる基礎はできたかなと思っています。 (驚いたのですが、C# -> ILへのコンパイルや、利用しているライブラリの内部実装などちゃんと見ない人というのは非常に多く、そういう基礎をしっかり勉強しているだけで、中央値よりもかなりまともなコードが書けるようになっていると思います。)
なので、情報発信してみたり(Qiitaにも投稿始めてみたりしたけど、Zennも検討すればよかったかも)して、もっと広くスキルを磨いていけたらなと思ったりしています。