みんからきりまで

きりみんです。

プログラミングを学ぶにあたって詰まったことと、その後どうなったか

mizchi.hatenablog.com

みんなも何に詰まったか、書いてみてください

とのことなのでぼくも書いてみたいと思います。

プログラミング歴

  • 13~15歳:RPGツクールをやり込む
  • 15歳:はじめてのCプログラミングという本を買って少し遊ぶ
  • 19~20歳:情報系専門学校に入り基本情報を取得したりJavaを学んだりする
  • 21歳:1社目、Androidアプリを一人で作らされる
  • 22歳:2社目、Unityでフラッシュゲーのスマホ移植みたいな仕事
  • 23歳~:フリーランスAndroidエンジニアとしてひたすらAndroidアプリ開発

学習過程で詰まったこと

プログラミング言語を学ぶことが何に繋がるのかが分からなかった

たしかこの本。当時はゲームクリエイターに憧れていてプログラミングに興味を持ったけど、素人向けの技術書が今のように豊富じゃなかったし田舎だったので本屋で見つけられたプログラミングに関する本がこれだけだった。

内容はC言語の基本文法についての解説と、付属のCDにコンパイラが付いていてコマンドプロンプト上で実行出来るようになっていた。
変数の概念や四則演算などはなんとなく理解できたけど、コマンドプロンプト上で足し算をすることがどうゲームクリエイターに繋がるのかが全く分からずすぐに飽きてしまった。

その後どうなったか

この時の疑問は本質的には専門学校に行っていた頃も残っていて、ようやくちゃんと理解できたのは学校の後期にWebアプリを作り始めたり、就職してAndroidアプリを作ったりし始めてからだった。
多分今はプログラミングを実用的に使う方法を解説した本や記事が大量にあるので同じような経験をする人は少ないかもしれない。

条件判定やループなどが直感的に書けなかった

専門学校でプログラミングの授業をやって最初に躓いたのは、自分が条件判定などを上手く書くのがむずかしいという事だった。
学校では簡単なアルゴリズム問題みたいなのを大量に課題として解かされたんだけど、ぼくは条件が>なのか>=なのか<なのかというのがすぐに混乱してしまって苦戦した。
for文もi < nなのかi <= nなのかがなかなか覚えられなかった。
while文が終了条件なのか継続条件なのかもすぐに忘れ、自分は根本的にプログラミングの才能がないのではと悩んだ。

その後どうなったか

今でも競技プログラミングなどをやっていると自分はこれが苦手だなぁと感じるけど、普通の業務で書くようなコードであればほとんど"型"が決まっているので、数え切れないほど似たようなコードを書いているうちに慣れて迷わなくなった。
今ではそれが特にエンジニアとして仕事をする上で問題だと思うことはない。

予約語や関数名などが覚えられない

同じく専門学校でプログラミングをやり始めて思い悩んだのは、とにかく予約語や関数名などが覚えられないということだ。
特に当時の自分は英語がとても苦手だったということもあり、関数名は全て謎のヨコモジというようにしか見えなかったし、特にJava予約語も多くimplementedだのpublic static voidだのという文字列を覚えることに苦戦した。
なお当時学校では最初の1年はあえてIDEを使わずテキストエディタでコードを書かされていた。

その後どうなったか

これもよく使うものは意外に自然と覚えていった。
Androidを始めた頃もたくさんのボイラーテンプレート構文をとても覚えられる気がしなかったが、2年もやっている頃には素で書けるようになっていた。
まあそれよりもそもそも初心者は全てを暗記しないと行けないと思いがちだが、別に関数名や予約語なんてなんとなく憶えていれば十分である。
現代のプログラミング環境にはコード補完があり予約語や関数はサジェストしてくれるし、ど忘れしたらググればすぐに出てくる。
「そういう機能がある」という概念さえ理解できていれば十分である。

余談だが英語を学習するとこの辺はだいぶ楽になる。

オブジェクト指向が分からなかった

突然Javaの授業が始まりクラスは「たこ焼き器の型でインスタンスはできたたこ焼き」だの「AnimalクラスがあってCatクラスとDogクラスはどちらもbow()を実装しているが実行結果は違う」だの説明されたが何も分からなかった。
コードを書いていてもnewというのが何をやっているのかがいまいちよく分からず混乱していたし、根本的にオブジェクト指向が何の役に立つのかも分からなかった。

その後どうなったか

今でも何もわからない
文法面で言えばこれもやはりたくさんコードを書くことで自然に理解出来るようになっていった気がする。
オブジェクト指向の活用方法のようなものはAndroid開発を始めてだいたい分かるようになった。

正しいコーディングスタイルや設計が分からなかった

新卒で入った会社では自分よりもプログラミングが出来る人間が誰もいなかったため、ひたすらネットでググりながら見様見真似でAndroidアプリの開発をしていた。
当時はモバイルの設計論の情報などはほとんどなく、多くのサンプルコードがスタイルが統一されておらずC言語のようなコーディングスタイルで書かれていたりしたので、何が正しいのか全然分からなかった。

その後どうなったか

ちょうどその頃にリーダブルコードという本に出会い、初めてコードの良し悪しという概念を理解した。
ただその影響で必要以上に強引なコードの共通化をしようとしたり無邪気にリファクタリングをしたりしてバグを出して怒られたりした。
趣味でも小さいアプリをいくつも作ったりして同じような失敗を繰り返し、次第に「短いコード」や「共通化」といった良しとされているものが必ずしも優れているとは限らないということを学んだ。

その後より良いコードの書き方やコード設計などに興味が強くなり、その関連のブログエントリを書いたり発表をしたりするようになっていった。

伝えたいこと

生存バイアスというコメントが付くのが目に浮かぶようだが、正直自分はもともとプログラミングの素養がある方だとは思っていない。
学校の筆記試験で何も分からず0点を取ったこともある。
専門学校時代は自分よりも地頭がよく成績がよく課題を早く進めるクラスメイトはたくさんいた。

でもそんな同級生達の多くがSIerに就職していき、今でもプログラミングを続けているのかは分からない。
ぼくはとにかくどんなに苦戦してもプログラミングが嫌いではなかった。
だから就職してからも勉強を続けたしもっと強くなりたいとずっと思い続けてきた。

今のぼくはフリーランスのエンジニアとしてそれなりに高給を得て上手く仕事が出来ているし、競技プログラミングをやったりもしている。
プログラミングを始めたばかりの頃は地頭の良さやそれまでの人生で培ってきたこと(数学力や英語力)の影響が大きく出るし、簡単にマスターしてしまう他人と比べ自分は向いていないと感じることも多いかもしれない。
でも多くの「分からない」は学習と反復によって補っていけるし、もしあなたがプログラミングが嫌いではないのであれば、ぜひ"才能"を理由に諦めずに続けてみて欲しいと思う。
全く出来なかったのが何か小さなきっかけでスッと理解出来るようなことも世の中にはたくさんあるので。