文系出身・初心者エンジニアのプログラミングを始めて3ヶ月の振り返りメモ

文系出身・初心者エンジニアがプログラミングを始めて３ヶ月のタイミングで行った振り返りメモです。自分のために行った振り返りですが、僕と同じような初心者エンジニアの方々の参考になればいいなと思い書きました。

#概要
 - 記事作成の目的
 - 振り返りで得た教訓
 - 3ヶ月やってきたこと
 - 自分の置かれている・いた状況
 - 結び


#記事作成の目的
 - 自分がエンジニアとして成長するための振り返り。
 - 他の初心者エンジニア方々の参考に（なればいいな）。

#振り返りで得た教訓
以下、振り返りで認識した教訓です。

##一回で完璧に理解しようとしない（世界史でいうオリエント時代から抜けられない病に注意）
DjangoというPythonで作られたフレームワークのtutorialを行った際に感じたことです。僕は最初から全てを理解しようとしてtutorialのpart1（part7くらいまであります）から抜け出すのに時間をかけすぎました。その上、かけた時間に見合った記憶の定着・理解の促進が起きていませんでした。一回で完全に理解するのではなく、何回か繰り返す中で理解していったほうが全体としてかかる時間が少ないです。これは完全に理解していなくも一度通しでやっておくと、どう動くか見た上で再度学習できるのでコードの中身の理解の深まりが早いというのと、繰り返すことで記憶が定着する（[エビングハウスの忘却曲線](http://free-academy.jp/junior/index.php?%E3%82%A8%E3%83%93%E3%83%B3%E3%82%B0%E3%83%8F%E3%82%A6%E3%82%B9%E3%81%AE%E5%BF%98%E5%8D%B4%E6%9B%B2%E7%B7%9A)が有名ですね）によるものと思われます。
初めて世界史の勉強をした際に完璧さを求めてオリエント時代（世界史を勉強していると一番初めに出てくる重たい章）から抜け出せず世界史全体の理解が中々進まない現象を思い出しました。（世界史を勉強したことがある人はわかるかも？）

##自分の手で動かしてみないと身につかない（アウトプットの重要性）
職場で開発環境のセッティングをしている時、そしてPythonの勉強をしている時に感じたことです。
当たり前といえば当たり前なのですが人から話を聞いたり書籍を読んだだけでは自分でコードが書けるようにはなりません。数学で定理だけ覚えても問題が解けるようにならないのと同じですね。個人的には書籍での勉強に結構時間を費やしてしまったのでもっと早くから手を動かしておけばよかったというのが反省点です。（書籍での勉強を否定しているのではなく、書籍から得たインプットを出すアウトプットの時間を増やさないといけないということです。）
最近は、自分の手で開発環境のセットアップをし直したり、[PyQ](https://pyq.jp/)という自分の手で書きながらPythonを学べる教材を使うなどして手を動かしながら勉強しているので理解が深まってきていい感じだなと思っています。

##何かをネット調べる時はできるだけ公式ドキュメントにあたる(stack overflow,Qiitaとかよりも前に)。
Django（というPythonで実装されたWebアプリケーションのフレームワーク）の勉強をしていて感じました。結局、公式ドキュメントに書いてあることが正しいですし、わかりやすかったりします。
色々な人のうまくいったパターン、いかなかったパターンを載っているのでstack overflowやQiitaもありがたいのですが、自分とは置かれている状況が異なり適用不可なことやそもそも内容が間違っていることがあるので、まずは公式ドキュメントを見るのが重要だと思います。

##英語から逃げない
上記の「公式ドキュメント」にあたるに関係するのですが、公式ドキュメントは英語のことが多いので英語の勉強（最低でも読み）は苦なくできるように勉強したほうが良いと思いました。また英語の方が良い学習教材があったり、最新の情報は英語であることが多いことも英語から逃げないで勉強しよう感じた理由です。英語を読むのを避けて日本語文献の中でなんとかしようと時間が余計かかってしまうことが多かったので反省です。

##いきなり作業を開始しない（分解の重要性）
調べごとをしていたり、何か機能を実装する時に感じたことです。作業を始める前にきちんと分解してから始めることが重要だと思います。以下の「何がわかっていて何がわかっていないのかをきちんとわける」にも通ずるのですが、分解できていない＝問題の特定ができていないということなので、調べごとをするにも何か機能を実装するにもその時間は徒労に終わることが多くなります。（ググり続けて前進がなく1時間とか。）

##何がわかっていて何がわかっていないのかをきちんとわける。（ググるときも、人に聞くときも共通）
ググりまくったが何も前進がない、詰まってしまったという経験を振り返ると、何がわかっていて何がわかっていないのかをはっきりわけて、今何を調べているのかはっきりさせることが重要だと感じました。何を考え・何を調べて・何を試し・何がわかったのかをきちんと把握しておくと、重複・見当違いのことを調べるといった無駄な作業、調べ忘れが減ります。上記の「いきなり作業を開始しない」でも書いたが分解作業をきちんとすることが前提として重要です。

##自分で説明できないコードは書かない（書くとあとで大抵悲惨な思いをする）
Qiita等から理解していないコードをコピペして書くと、動かなくなった時に自分で直せず悲惨なことになります。動かなくなった時に自分で直せないのはもちろんのこと、他の人に動かない原因の究明を頼む際にも、どうしてそのように書いたか説明できないので解決に時間がかかってしまいます。
とりあえずコピペしたりして動いてくれ！という欲求に負けないようにしましょう。

##手打ちをやめる
スペルミスなど単純なコーディングミスによるエラーで時間を書けるのはもったいないです。ちゃんとctrl+rとかctrl+p,nとかを使いましょう。

##30分くらい自分で調べて糸口が見つからなかったら先輩や同僚へさっさと聞く
個人的には一番の反省点です。自分でなんとか解決したいという思い、忙しいだろうし人に聞くのはばかられるという遠慮が質問をすることを邪魔してしまいがちです。一人で悩み続けるのは時間のムダでその時間が多すぎました。
職場の先輩に目安として30分くらい調べて解決の糸口がつかめないなら聞いてしまったほうが良いというアドバイスをもらったので意識していきたいです。

##師匠を見つけると良い
ミスのパターン・詰まるパターンはたいてい決まっていて、その知見が先輩エンジニアの方々には溜まっているので特にプログラミング初心者の方はそういった師匠的な方を見つけられると良いと思います。職場の先輩方には感謝しかないです。



#この３ヶ月間でやったこと
以下はこの３ヶ月間でやったことのメモです。

①学習用言語でテトリスを作りました。
参考書籍：[「プログラムはこうして作られる」](http://amzn.asia/e8Upfaw)
テトリスを創ることを通じてプログラマーが何かを作る時の思考過程くどいほど文章に落とし込まれているのでその思考過程が学べます。学習用の言語を使っているので実用的な言語が扱えるようになるわけではありませんが、とても勉強になりました。また機会を見て復習したいです。

②Linuxの基本コマンドについての勉強
参考書籍：[「6日間で楽しく学ぶLinuxコマンドライン入門 コマンドの基本操作を身につけよう」](http://amzn.asia/3rCtF3H)
Linuxの基本的なコマンドをさらうことができます。

③Pythonの基礎の基礎
参考書籍：[「確かな力が身につくPython「超」入門」](http://amzn.asia/fwED58h)
Pythonの本当に初歩の初歩が勉強できます。

④gitの勉強
参考書籍：[エンジニアのためのGITの教科書](http://amzn.asia/hSKg2R5)
gitについての基本的なことが学べます。まだ2/3くらいしかやっていません。そしてやったのがだいぶ前なので内容を忘れています…

⑤[Django tutorial](https://docs.djangoproject.com/en/1.11/intro/tutorial01/)
Djangoのtutorialです。簡単なWebアプリの作成を作りながらDjangoの使い方が学べます。


#自分の置かれている・いた状況
自分の置かれている・いた状況について書きます。

 - 勉強開始時点の状況
   - 中学校・高校で数I,IIを経験するも忘れている。
   - 法律専攻（文系）で情報系の知識が皆無。
    - ブラインドタッチはできた。（←とあるスタートアップ企業でビジネスサイドとして1年半ほどインターンとして働いていたので。）
    - プログラミングは全くの未経験。
 - 勉強している内容
    - 言語：Python3
    - フレームワーク:Django
 - 使っているマシーン
    - Mac Book Pro
 - 現在の状況
    - エンジニアインターンとして、とある企業に置いてもらっています。
    - 最近はPyQというPythonやDjangoをcodingしながら勉強できる教材で勉強をしています。

#結び
3ヶ月の振り返りはこのような感じです。偉そうに長々と書いてしまいましたが上記の教訓を胸にこれからもプログラミングに励んでいきたいと思います。また、この記事が他の初心者エンジニアの方々に少しでも役立てば幸いです。