最近の学習計画

なんやかんやあって、ずっとやっていたWebサービス開発から、オンラインゲーム開発に仕事を変えた。
最近は、なんとか呼吸できるくらいには慣れてきたかなって思って気がついたら2年くらい経っていた気がする。
結局ソフトウェア開発だから、そこだけ聞くと、そんなに変わらないやん、と感じる人もいると思うけど、やるべきことや学習していくべきこと、方法論がけっこう違うと自分としては考えている。

今いる会社では、スマートフォン向けのオンラインゲーム開発を主な事業としている。
今やスマートフォンというのは、3Dの絵をリアルタイムに描くことができ、多少はリアルタイムにライティングをしたりとか色々な表現をするようなゲームが動く。びっくりである。
プロジェクトにもよるけど、自分の会社でもグラフィックに力を入れているプロジェクトは、なんというか、グラフィックに力を入れており、手描き風の品の良い絵にハッチング(線を重ねたような影?)の表現を取り入れた絵をリアルタイムにスマートフォン上で動かし、しかも多人数でオンライン同時プレイできるようなタイトルを出してる。
こうなってくると、昔ほど、携帯ゲームとコンシューマゲームで必要になる技術がまったく別物というわけでもなく、技術的には距離が縮まっていると言ってもよさそうである。実際、子どもの頃から名前を知っているようなゲーム会社が前職だった人というのもちらほらいる。

Webサービス開発をやっていた頃は、技術というのはコモディティ化するものだった。つまり、ある特定の製品でしかもっていない技術、というものが、全体でみるとそれほど重要ではないというか、目立たないというか、かなりのスピードで周辺の界隈が同じことを再現できるように同質化してしまう。そんな力が働いていた。
Webサービス開発において、有名なソフトウェアというのは、そのソフトウェアでないとつくれないものがつくれる、といった類のものじゃなくて、皆がつくっているものを圧倒的に効率化するアイデアや思想が含まれているもの、あるいは、パフォーマンスや開発コストを改善するもの、だったような気がする。
そもそもWebというものが、誰に対しても開かれていて、そこで開発をするということは、そこで特定の何かを利用するということは、それにbetする、ということであって、利用するだけではなく、発展させるような行動を取ることが基本戦略になっていたのかな。

そんななかで暮らす一兵卒エンジニアとしては「学習する」ということは、つまり、Web開発に参加する世界中の人、Googlefacebook,Appleをはじめとする界隈の巨人がリードし整備する周辺ツールや環境を知ること、最新情報を追うこと、ソフトウェアの使い方を知ること、とほぼイコールだった。誰かがつくったものや説明理解するのが学習っていうかんじ。(自分のレベルではね)
また、自分で何か応用してものをつくるということよりも、既存のソフトウェアを発展させるような行動を取ることが「偉い」とされるバイアスがあったようななかったような。まあそれは、すごくわかりやすい物差しだったから色々と利用されていた、というだけかもしれないけど。

まあ、それはいいんだけど、自分がゲーム開発はすこし違うと感じているのがこの点である。
まず、ことゲーム開発においては、エンジニアは「ツールやライブラリの最新情報を追っている、つかいかたを知っている」というレベルでは、つくりたいものをつくるのは難しいのではないかと感ずる。
そのゲームごとに、画面に出したい絵や、プログラマブルに実現したいこと、するべきことはそれなりに違っていると思うし、ハードウェアの制約によって省かなければいけなくなることも違ってくる。そういうとき、必要になってくるのは、ブラックボックスの中身とかアルゴリズムとか既存のテクニックの知識と、もっと大事なこととして、それをどう応用するかにかかっているという気がする。
そういう仕事にあこがれているのが、自分が仕事を変えてみた理由だった。

今のところ、つくりたいものがつくれるレベルにはまったく達していないし、学習のペースもむちゃ遅いんだけど、自分は基礎をすっとばしてきたので、もうちょい基礎をやりたいなあというかんじが現状。
とにもかくにも、吸う空気を変えたりした結果、学習すべきことがわかってきたといえるくらいにはなってきた気がする。
まず、もっとも大事なことは、良質な情報を読解する能力だと考えてる。これを上げていくと、全体的な学習する速度が上がるのでいろいろな能力が伸びるのが速くなる。また、世の中では、設計については広く解説が広まっていくけど、実装については、皆が皆紹介してくれるわけではないので、良質な情報をみる力がないとなんも読むものがなかったりする。

良質な情報を読解する力をつけるための基礎の基礎として、まず英語で、この分野はやっぱり英語じゃないとくわしい説明がないかんじがする。あと数学。数学は、大事なのかなとおもって細々と練習しているのだけど、意外となにをどう勉強すればいいのかわからなくなるのがはやかった。いろいろ読んでみて、最近はもうちょい解析という分野をやると、アルゴリズムとかグラフィック関連の内容を読解する能力が上がるわ。ということにようやく気がついた。「そんなの最初からわかるやろあほか」と思われるかもしれないけど、まあそういうのもわからない、そういう情報を得ることさえできてないレベルだったのがちょっと進歩してきたというかんじなのである。
ちなみに、Web屋に従事していた頃は、設計パターンや思想をすごく熱心に文学だとおもっていろいろ読んでいて、それは今でも役にたっているけど、設計よりも「実装」の知識が必要になる機会はやっぱ多いといっても良い気がする。サーバサイドの仕事もしてるけど、Socket のhalf connection 問題とか、c#ランタイムの中身とか、ヒープアロケートが発生する箇所とか、マルチスレッドでありがちな誤ちとか、Web開発をしていたことはそういうのは使ってるミドルウェアの仕事で、考える必要がそんなになかったような気がする。そして今挙げたトピックは、設計の問題というより実装の問題で、誰もが広く解説できるわけではないので、まともなドキュメントをがんばって読むのが一番はやい。
そんなかんじで、転職してからこれまでは、基礎をやるのとかインプットするのとかをしてきた。
あとは空気を吸ってるだけであっという間に時間が経ってしまって、「これつくった」て言えるものがいまだにとくにないんだけど、自分のなかの計画としてはまあそんなもんなかなと思っている。 勉強するやりかたがわかってきただけでも儲けものとおもってる。その程度の奴だしね。
でも、この後は、もっと得た情報を元に応用していかないといけないので、読んで理解するだけでは不十分で、知識を応用して分解して再構築して遊んでみないといけないことはたしかであるから、そろそろなにかつくって公開とかしていきたい、できたら良いなとおもってる。

ここになんか書いたりはそろそろしてみようかなとおもってる。