こんにちは、 @kz_morita です。
Twitter の TL で以下のような、プログラミングを学ぶ上でつまづいたことが書かれたブログを見かけたのですが、個人的にこういった他の人のつまづいたことみれるのとても良いなぁと思います。
読んでいて感化されたので自分のつまづいたこととか、どんなふうに理解してきたのかとか、いろいろ書いてみようと思います。 (需要があるかは置いておいて・・・)
プログラミング自体は大学 1 年の後期から授業があって、そのころから始めたような気がするので、現在 10 年間くらいです。頑張って思い出しながら書いてみます。
プログラミング歴
ざっくりと現在までの略歴的なものを。
- 大学 1 年で授業の C 言語
- 大学 2 年くらいで Java, 個人でゲームとか作りはじめる
- 大学 3 年くらいのときに大学の仲間内で、PHP で 大学生向け SNS つくる
- 大学 4 年の時にインターンで PHP で EC サイト作る
- 1 社目でソシャゲの開発。C#, ASP.net, SQL Server とか
- 2 社目で Cocos2d-x, C++ でスマホゲームを作る
- 今は iOS / Swift、 Kotlin / Java でサーバーサイドやったりする何でも屋
つまづいたこととか
初めてのプログラミング C 言語
18 歳ころは、授業で C 言語やってました。多くの人が最初はつまづくであろうポインタですが、自分もご多分にもれず全くわかりませんでした。なんとなくわかり始めてきたのが、授業の課題で LinkedList (双方向リストだったような気がする)を実装している時だったと思います。
ポインタのポインタとかでてきて、全然よくわからんぞってなって、free()
しぎて怒られて、そのバグがずっと直せなくて苦労してたのですが、
実行のステップごとに、どうなってるかっていうのを紙に全部状態を図で書いたりしてようやくなんとなくポインタっぽいなにかがわかったような気がします。
Java と オブジェクト指向プログラミング
同じく大学の授業でオブジェクト指向プログラミングに始めて触れました。ペイントソフトのようなものを作った気がしてよくある、Shape
クラスを継承した Rectangle
クラス、Triangle
クラスみたいなことをやってました。
オブジェクト指向は、よくある継承関係にあるクラスがあって MethodA
がオーバーライドされてて、MethodA
を実行したら画面に何が表示されるでしょう?みたいな問題が全くわからなかったです。友達を捕まえて、「これ、どうしてこうなるの?」って質問責めしてたような気がします。今思えばわからなかったのは、クラスとインスタンスがごっちゃになってて、
class A {}
class B extends A {}
class C extends B {}
B obj = new C();
みたいな時に混乱してたような気がします。 クラスとインスタンスの概念が明確違うものだって理解できた時に、すっとふに落ちました。
また、Java を使ってゲームをつくりはじめたのもこの時期だったと思います。
最初に、Java Applet (懐かしい) で ブロック崩しみたいなものを作って、友達にやらせたりして遊んでました。
その後、横スクロールのマリオみたいなやつをつくりました。 0 とか 1 が書かれたテキストファイルを読み込むとステージが生成されて、 キー操作したらマリオ的な何かが動いて、ブロックの上に乗っかれて、土管で下方向キーを入力したらワープできて、みたいな基本的なロジックをつくったのですが、そこで飽きちゃって開発をやめました。
ゲームループとか、入出力とか、ダブルバッファリングとかの概念をしったのはこの時期でした。
PHP で SNS 制作
大学 3 年のときに、仲間内で何か作ろうってなって SNS を作り始めました。 バージョン管理とかデプロイの方式とかそういった知識が全くなかったので、FTP でサーバーにデプロイしてました。「いまこのファイルいじってるから触らないでー」みたいな会話をしてたような気がします。
また、フレームワークなんて概念はしらなかったので、グローバルに関数がたくさん実装されていて、同じような関数がいっぱいあったり、一箇所修正したらほかのところがばぐったり、login.php が 3000 行あったりしました。
こういった問題がありながらも、全く解決策がわからずただただ実装するというった作業をしてました。
インターンで開発現場を知る
インターンでは、Zend Framework つかって、PHP を書きました。そもそも今までやってきたプログラミングと世界が違いすぎてかなり衝撃を受けました。
フレームワークとか MVC っていう単語を知ったのがこの時期で、正直なんでこんなに回りくどいことするんだろう、login.php 3000 行でいいやん。とか思ったりしたのですが、徐々に仕事になれてバグ修正などをしているときに、画面の修正だから View を直せば良いのか、とか、Controller でこの修正はすればよさそう。みたいな感覚が掴めてきて、感動した記憶があります。
また、csv をダウンロードする管理画面みたいなものを作った時に、HTTP ヘッダとかの存在を知って、プログラミング言語以外にさまざまなことを知らないといけないんだなと気づいたのがこのときです。
Web のプログラミングについて、いろいろ学べたのがこのインターンの時期で、この時お世話になった方々には本当に頭が上がらない思いです。
ソーシャルゲーム開発と OOP
オブジェクト指向や、その当時ちょっと流行り始めていた DDD について、実務のコードで意識して書けるようになってきたのがこのころです。
最初はモデリングが苦手で、名詞をクラスにするっていわれても・・・という状態でした。そんなとき、会社の先輩からこれ読んでみたら?といっておすすめされた「アジャイルソフトウェア開発の奥義」でこれが自分の中でのブレイクスルーを引き起こしました。
いままでなんとなく知った気で使っていた、デザインパターンなどの知識がどういう原則のもとしようされてきたのかがわかる本なのですが、かなり衝撃を受けました。SOLID の原則をしり、今までオブジェクト指向のあやふやだった知識達が一斉に繋がり出し、すこしはまともな設計ができるようになりました。
また、このとき新卒ということで色々な技術研修があったのですが、Microsoft の MVP の方達から SQL Server だったり、Hyper-V だったりの研修をしていただく機会があり、今思うととても貴重な経験だったと思います。
余談ですが、Visual Studio + Resharper の組み合わせと、C# とくに LINQ の開発体験は今思い返しても本当によかったなと思います。最近触ることが少なくなってしまいましたが、C# 好きです。
3D と Cocos2d-x と C++
趣味でやってた Cocos2d-x でゲーム作りが功を奏して、ご縁があり 3D のスマホゲーム開発が仕事になりました。
ここで挫折したのが、C++の難しさと 3D の難しさです。3D ゲームを作っていたので、3D 空間上にオブジェクトを配置したり、カメラを操作したりするのですが、これが初めは全然イメージできかったです。Unity のような GUI でのゲーム開発ではなく、obj->setPosition3D({ x, y, z });
みたいなコードでポジションを指定するのですが、3D 空間を頭でイメージしつつポジションを指定するといった作業はとても難しかったです。
それでもひたすらやり続けたらだいたい頭の中で座標が決められるようになってて、これは職人芸だなぁと自分でも思います。
フレームワークの上で想定通りオブジェクトを配置みたいなことは割とすぐできるようになったのですが、z-fighting
(オブジェクト同士が重なってちらちらするバグ) を筆頭とした 3D ならではのバグの修正や、3D オブジェクトを動かすのに処理の効率を意識してコーディングしたりすることは色々な知識が必要とされるレベルが高めのプログラミングだったなぁと思います。
業務を通して経験した今でも、3D 関係の深い知識が身についたとは到底思えず、いまになって学び直そうとしている状態です。
なんでもやる系エンジニア
現在の職場では、最初 iOS エンジニアとしてジョインして、そのあと Nuxt.js で Web フロントを書いたり、動画の暗号化について調べたり、サーバーサイドエンジニアとして、Kotlin や Java を書いたりしています。
まだ入社して、1 年ちょっとですが色々な経験ができたのはとても良いことだなぁと思います。その反面自分の強みがどこなのか?何を得意として深い知識を獲得するかといったことが明確に定まっておらず、そこは現状の課題です。
よかったこととか
こうやって振り返ってみると、ひたすらいろいろな人に教えてもらいながら知識を獲得してきていて、人に恵まれていたなぁと改めて実感します。あとはとりあえずググりまくってなんとか形にして、環境が変わった時に、振り返って自分のコードに絶望するみたいな経験をひたすら繰り返してきたなーと思います。 まさに失敗の連続でした。
また、よく言われることかもしれませんが、自分でプロダクトをひとつ持っておくとプロダクト作りに必要な様々な経験が得られるということも強く実感しています。
なにかサービスを Web で公開しようとした時に、VPS サーバー借りて、インフラとかセキュリティの設定を行って、ドメインをとって、アプリケーションの言語選定をして、ソースコードを管理して、デザインをして、コーディングして。。。
多くの知識と実践を体験できるので、大学生の時にこの経験を下手くそながらも体験できたの今のエンジニア人生の糧になっているなぁと時間しています。
さいごに
つらつらと書きましたが、振り返ってみて自分がどんなことをやってきた整理するいい機会になりました。
こんな記事でももし誰かの役に立てたのなら、とてもうれしいです。