忘れないうちに残しておく、初めてプログラムコードを読んだ日の気持ちとその日から

先日、try!Swiftに参加して、そこで知り合った方が「今年から新人教育を担当するが、新人の気持ちが分からなくて不安だ」という話をされていました。
それなら私の体験談が誰かの役に経てばいいなと思い、投稿しました。

#自己紹介
この春で社会人3年目になりました。
社会人歴≒エンジニア歴、研修期間を考えるとエンジニアとしては2年たたないくらいです。
ずっとiOSエンジニアしています。初めてみたプログラム言語はJava、普段書いている言語はSwiftです。

# この記事は、以下のような人向けです
* これから新人を育成するエンジニア
* もしくは、初めてプログラムコードを読んで心が折れてしまった超ド級のプログラム初心者
    * 自分だけじゃないんだと心の慰めにでもしていただけると良いかなと思います
* あるある〜！を楽しみたいエンジニア
* 初心なんて思い出したくても思い出せないというベテランエンジニア

ではさっそくどうぞ。

# 1.はじめまして、プログラム言語
### アルファベットでしょ？英語と同じ感覚でなんとなく読めないかな？
入社前の内定者期間、基本情報技術者試験の勉強をしていました。
が、私は、前半の項目である二進数の計算やネットワークの単語暗記に早々に飽きてしまったんです。
(というか、よく分かんないからやる気をなくしたんですね)
>「結局、プログラムコードが分かればいいんでしょ？ベースは英語やろし、なんとなく意味わかんちゃう？」

という、今考えると恐ろしい考えを持ってました。（ちなみに私の英語力はTOEIC350くらいです多分）

もしかしたら、プログラマーの人には「べつに、英語と同じでしょ。間違ってないよ」と思う方もいらっしゃるかもしれませんが、
今まで「I have a pen.」みたいな英語の文章を読んでいた人間が、「int a = 10;」というプログラムコードの意味がわかるわけありませんよね。

しかも、その時の私は＝が代入という意味すら知らず、1+1=2に出てくるような、"同等"の意味しか知らなかったんです。
つまり、

``` Java
int a = 10;
int b = 20;
int c = a + b;
```
「え、これってaは10で、bは20とする、a足すbやからcは30やーん。なんや簡単やーん！(intってなんなんやろ、、、文末に;付くのがルールなんかなぁ、まあいいけど)」なんて考えたその直後、

``` Java
a = a + b;
```
とか出てきた瞬間、「は？aはさっき10っていうたやん、意味わからん、矛盾してる」とか思っちゃうわけです。
無謀で、**知らないことを知らない**、これが最初でした。
今考えると信じられないほど無謀です。

# 2.プログラム言語、お前は何者だ
### Publicとmainしか意味がわからん
あっま〜い考えを持って初めて見たコードは、こんな感じの初心者用Javaのコードだったと思います。

``` Java
public class SampleJava {
  public static void main(String[] args) {
    System.out.println(args[0]);
  }
}
```
これ以上ないくらいプログラムとしては簡単なコードですが、当時の私、
> 「Publicは英語で”公共の”って意味でしょ、mainは”主な”よね、staticって単語よう知らんな、まあええか、で次はえっと、void、、、何？？？」

なんて、本気で考えてました。
> 「なんで単語と単語の間に記号が入るんだろう」

とか。
Javaを使ったことがある人がSwiftやRubyを読むのとは、わけが違う。
もちろんオブジェクト指向なんて理解してません。

>オブジェクト（目的語）？メソッド（方法）？クラス（学級）？print...じゃなくてln？
>プログラミングって何を語ってるわけ？
>どれが主語でどれが述語なん？てかそもそも……主語とか述語の概念ある？ないとかある？

この時、**無知の知**にやっと至ったわけです。
プログラミングの世界と今まで生きてきた世界との壁の分厚さに、もう泣いたらいいやら笑ったらいいやらの気持ちでした。
これからその壁を越えないとご飯食べていけないなんて、なんて世界にきてしまったんだ、私は。
それをワクワクできる人もいるかもしれませんね。（羨ましい）
私は、途方の無さにゾッとしてました。
当時22歳でしたけど、10年ぶりくらいにお先真っ暗な気持ちになりました。

# 3.プログラムコードは私と仲良くなってくれない
### 調べたら説明が分からなくてまた調べて説明が分からんの繰り返し、これほんま笑い事じゃない
そうはいっても、他の内定は辞退してしまったし、やるしかない。
割と絶望的な気持ちでしたけど、社員の方の「入社して半年もすれば、経験者も未経験者もなくなるよ」と言っていたので、その言葉を信じるしかありません。

とりあえず難しい英文を読む時は、単語の意味を調べるのが高校生の勉強法ですよね。
中学高校大学と10年間あまり英語を一応勉強してきたはずですなのに、たった数行のコードの中の単語でも見たことないものが多すぎる！
なので調べました、めちゃくちゃよく出てくる"Int"って単語。
>整数型とは、プログラミング言語などで用いられるデータ型の一つで、整数の値を格納できるもの。
http://e-words.jp/w/%E6%95%B4%E6%95%B0%E5%9E%8B.html

……。うーん。
>「……型って何？歯型とかそういうやつ？」

型について調べる。
お察しだと思いますが、解説、何度読んでも、他のサイトを見てもやっぱりわからない。
以下、ループ。
同じ内定者や理系の友達の、エンジニア歴の長い子に「調べても調べるものが増えるだけなんやけど…」と相談したら「あるあるやな〜」とみんな大笑い。いや笑い事ちゃうねん。
笑えないし、情けないし、正直、自分にイライラしてました。

ちなみに、私は未だにそのループの抜け出し方を後輩に教えられる気がしません。
同じ「知らんこと調べる」でも、今なら、「聞いたことあるな〜」とか「たぶん普段使ってるもののこれに近い意味やな〜」とか、
全て白紙からの初心者が持ってない感覚を、いつのまにか身につけてしまったからです。
他の方もそうではないでしょうか。

# 4.オブジェクト指向、私を一番苦しめた奴
### 鈴木オブsuzukiてなんやねん
intですらつまづいた私ですから、プログラムコードというかオブジェクト指向というか、とりあえずJavaの勉強は独学では、無理だと諦めました。
そして入社して社内研修を受けました。
最初はもちろん初級クラス。のはずが、なぜか中級クラスに入れられたんですね。これは今でも謎です。
> Personクラスがあり、suzukiというオブジェクトを生成したい、定義された変数nameに"鈴木"をイニシャライザの引数に渡す。

そんな課題だったと思います。よくある感じのやつです。
積極的に授業を受けるあまり目立ち過ぎてうっかり寝てるとすぐばれて呼び出されるくらい、授業は食い気味に頑張っていたんです。
しかしどうも、クラスの誰よりも文系脳だったようで、クラスで一番の劣等生でした。
同期が言っている「すずきのすずき」は、
「suzuki's name is "鈴木"」（suzukiインスタンスの変数nameに入っている値は鈴木）なのですが、
私は「鈴木オブ鈴木？鈴木中の鈴木…最強の鈴木…」とか考えてるくらい、オブジェクト指向から遠く離れたところにおりました。
周りから聞こえてくる言葉のほとんどは分からないし、クラスの同期みんながどんどんナルホドネ〜みたいな顔になっていくのがすごい不安でした。
> 私って、もしかして、ずば抜けて頭悪いんだろうか？クビになるのか？

って。
今なら言ってあげましょう、「確かにずば抜けて頭は良いわけじゃないけど、まあ仕事はできるようになるよ」と。

# そんなこんなで
愚痴ばっかりになってしまいましたが、
みんなより3日遅れで半分泣きながら研修の課題をやっていた私は、なんとかその数ヶ月後、オブジェクト指向を理解して、プログラムを書けるようになりました。
それまでにやったことを以下でお話しします。

# どうやってエンジニアになるか・させるか

### いろんな人に聞いてみよう
同期がたくさんいたので、色んな同期にたくさん聞きました。
講師もたくさんいたので、講師の方に聞くこともあったり、TAの人に張り付いてる時もありました。
「アルゴリズムはこの人が自分にとって1番わかりやすい説明をしてくれる、でもこの人のネットワークの説明はよくわからんかったな、じゃあ他の人にも同じこと聞いてみよう、あ、この人はネットワークに関してはわかりやすいな……」と、いう感じに。
同じことを色んな人に聞いてみると、なぜかみんな違う解説をしてくれます。
そしたら、**どれかがストンと腑に落ちる**時があります。
なので、 **教わる側も教える側も、「頭が悪いからできないんだ」「教え方が悪いからできないんだ」と思う必要はないんじゃないかな** 、と思います。
私も「私って頭悪いんだ。文系脳なんだ。エンジニアなんて向いてないんだ。」そう考えては落ち込むこともありました。
でも、今は、そうやって自分の道を閉してしまう前に、納得するまで色んな人から教わってみてよかったなと思っています。
初心者の人は諦めずに、自分が納得できる答えを探してください。
(特に私のように、素直に「こういうものだ」って受け止められればいいのに、「こういうものって何。私わかんないんですけど💢」って人は。)

### 自分なりの勉強方法をみつけよう
「なんでそこまでして（ここまで教えて）わかんないの？」と言ってくる人のことは、無視しましょう。
特に、"教えることに疲れた人"は言っちゃいますよね。あとは天才型の人とか。
全力で無視して、他の勉強法を探しましょう。
本をたくさん読むことで勉強できる人もいれば、一冊の本をじっくり読めば勉強できる人もいるでしょう。
写経がわかりやすい人もいるでしょうし、一回自分でアプリを作ってみたりする人もいるでしょう。
私は、本に書いてあることと全く同じことを、他の人が言ってくれるだけで、本を読むよりはるかに吸収できるタイプでした。
あとは、プログラムコードを印刷された紙に、手書きで解説をどんどん書き込んでいくのもやりました。
年数を重ねたエンジニアにとっては、信じられないやり方かもしれませんし、私も今ならその方法はとりませんが、
そんなことは置いておいて、 **今の自分にとって一番わかりやすい勉強法を見つけることが大事** だと思います。
自分の勉強法を知っておくのも、新人期間にとても役に立つ経験だと思います。
育成担当にとっては遠回りに見えても、多少は目をつむって放って置いてあげるのも必要かもしれません。

### 教えてくれる人からたくさん言葉をもらうより、教わる側がたくさん話してみよう
アウトプット出来るほども分かってない……と思う方もいるかもしれませんが、そんなに難しいことを話せという訳ではありません。
たとえば、私がオブジェクト指向がよくわからなかった時は、
>「つまりこのクラスはたい焼きの鋳型で、たい焼き一つ一つがインスタンス、あんこやカスタードが変数ってことで合ってる？変数名は中身」

みたいなことを同期に聞いたりしてました。
どうでしょう？知能レベルもハードルも高くない発言です。
でも、これを言うことで、教える側の人は「合ってる」「部分的に合ってる」「部分的に違う」「違う」とか、回答してくれます。(アキネーターかな？)
 **分かってる人って、もう分かってるからどこがわからないのか分からなかったり、説明の言葉が出てこなかったりします。**
分からない側が、分からないなりに発言することで、教わる側と教える側のコミュニケーションは少し楽になるのではないでしょうか。
もちろん、そんなバカな私に付き合ってくれる人が周りにいたから出来たことなので、新人さんの[心理的安全性](https://rework.withgoogle.com/jp/guides/understanding-team-effectiveness/steps/foster-psychological-safety/)は、とても重要だと思います。

# 余談（読まなくても大丈夫です）
こんな話をすると、毎回言われる言葉があります。
>「なぜそんな状態でIT入ろうと思ったの」
「よく辞めなかったね」

嫌味ではなく心底不思議そうに言われますので、この記事を読んでくださった方も少なからず不思議に思う方がいらっしゃると思います。
理由は「ものを作るのが好きだから」です。
システムエンジニアは、クリエイティブ職だと思っています。
完成までの過程にとてもしんどい時があるのは、きっと料理や工作と同じだから。
いつか自分の作ったものが役に立つ喜びがあるのは、プログラミングも一緒のはずなんだと思って乗り越えてきました。
2年前はあんなだった私も、iOSのアプリ開発という、 **今、誰かに必要とされているものを作る喜び** がある仕事をさせてもらっています。

ここにくるまで先輩にも何回か見捨てられそうになることもあり、同期に泣きついたり、やっぱり心が折れかけたことも、本当に色々ありましたが
先輩も同期も、みんなに心から感謝しています。
その恩返しとしてでも、どうか、この記事が、これからエンジニアになる人とエンジニアを育てる人の役に立てば嬉しいです。
***
最近Twitterはじめました。
Twitter: @totokit4
今日少しバズったので良かったら見てください