文系エンジニアが学んだ、挫折しない、技術を学ぶ技術

はじめまして。Livesense - 学 Advent Calendar 2017の12日目を担当する中村です。
私は今年の夏にリブセンスにjoinしてから、[転職会議](https://jobtalk.jp/)チームのエンジニアとして開発を行っています。
リブセンスに入社する以前は、文系卒の未経験エンジニアとして2年間いわゆるSI業界で働いていました。
独学でITというものを学んでいく過程で、時にその面白さに感動しつつ、時につまづきながらも、学習を継続するコツのようなものを会得してきました。
「技術を学ぶ技術」というと大げさですが、この記事では私がこれまでに試行錯誤して編み出したおすすめの学習法をご紹介します。

## 意識して軽めの題材から取り掛かる

世の中には名著と呼ばれている本がたくさんあります。
名著と呼ばれている本を評価しているのは、恐らく熟練の技術者なのではないかと思います。それゆえ、多くの場合初心者には難しすぎます。
あらゆる分野において、難解とされていて世間に評価されているものにチャレンジして、わからないなりにもこういうものなのか。と噛み砕こうとしてみることの価値は大きなものです。[^1]
とはいえこの記事のテーマは「挫折しない学習法」なので、上のように挫折リスクの高い方法はおすすめしません。
#### 「名著」に惹かれての失敗談
ある日、「名著」「難しい」という言葉に心をくすぐられてしまう悲しい性分からか、私は無謀にもこの本を買ってしまいます。
[Effective Java: A Programming Language Guide (Java Series)](https://www.amazon.co.jp/dp/B00B8V09HY/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
あろうことか、「日本語訳がわかりづらいので英語で読んだ方がいい」なんて話も小耳に挟んだので英語版です。
結果、1章も読み切れずに嫌になってしまい、お蔵入りすることになりました。
そこで先輩に「Effective Javaが難しすぎる」と嘆いてみたところ、下の本をオススメしてもらいました。
[オブジェクト指向のこころ (SOFTWARE PATTERNS SERIES)](https://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%81%AE%E3%81%93%E3%81%93%E3%82%8D-SOFTWARE-PATTERNS-%E3%82%A2%E3%83%A9%E3%83%B3%E3%83%BB%E3%82%B7%E3%83%A3%E3%83%AD%E3%82%A6%E3%82%A7%E3%82%A4/dp/4621066048)
この本は「このような問題があり、それを解決するためにこのデザインパターンでアプローチする」という内容になっており、初心者でも比較的流れがつかみやすい作りになっていました。
私は思いました。「あの時費やした膨大な時間を、もっと早くこの本を読むことに使っていれば・・・」と。
この経験から、**身の丈に合わない学習法は続かない**と身をもって学びました。
#### 物理的な軽さも大事
技術書って分厚くて重い本が多いですよね。
あまりに重いと持ち歩く頻度や開く頻度が減ってしまうのか、経験上kindleで買った本の方が読了率が高いです。
また、誰かに怒られるかもしれませんが、私は資格試験の問題集は章ごとにばらして持ち歩いていました。
（これは、大学にいた文学史の教科書を裁断して持ち歩く強者から着想を得ました。。）

## 事例を知る
巷に溢れる新技術について、「とりあえず知っておかなきゃな」という気持ちで調べてみる、という場面があります。
とはいえ、その思想や仕組みに触れただけでは「なるほど。こういうものがあるんだな」で終わってしまい今ひとつ面白みも感じられず理解が進みません。
例えばReact.js。転職会議でも使われていますが、私はなぜこの技術が使われているのか、また今ひとつ使いどころが理解できませんでした。
そこで、SlideShareなどを利用してそれらの技術の導入事例を調べてみます。
そうすると、**「どのような課題があり」「対抗としてこのような技術もあったが」「このようなサービス特性で」「このようなチームで」「このようなメリットがあるので」**React.jsを採用した、という情報を複数得ることができます。（自社のことは先輩に聞けばいいのですが）
**単に新しいからというわけではなく、その使われ方と意義を知ることで**、よりReactを学ぶことが楽しくなりました！

## 低レイヤから勉強する
低レイヤから勉強する意味は、**巨大なものへの恐怖心を克服する**ことにあります。
技術の世界には大小さまざま無数のブラックボックスが溢れています。
私は、「無線でインターネットができる」仕組みがわからなすぎて辛い気持ちになったことがあります。
一度大きな疑問を抱くと、それに関連してブラウザってなに？Wifiってなに？ネットワークってなにそれ？と無数の疑問が次々と湧いてきます。

#### 最終的なアウトプットを想定する
私が個人的にこれを読む前後で視座が変わったと感じたおすすめの本はこちらです。
[史上最強カラー図解 プロが教える通信のすべてがわかる本](https://www.amazon.co.jp/%E5%8F%B2%E4%B8%8A%E6%9C%80%E5%BC%B7%E3%82%AB%E3%83%A9%E3%83%BC%E5%9B%B3%E8%A7%A3-%E3%83%97%E3%83%AD%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B%E9%80%9A%E4%BF%A1%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8B%E6%9C%AC-%E4%B8%89%E6%9C%A8-%E5%93%B2%E4%B9%9F/dp/4816351108/ref=sr_1_8?s=books&ie=UTF8&qid=1512918963&sr=1-8&keywords=%E9%80%9A%E4%BF%A1%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF)
この本は情報の伝達が電磁波で行われているということにはじまり情報通信というものを物理層から学ぶ事ができます。
今開発しているアプリケーションコードも、機械語を経て最終的には0と1のデジタル信号になり、場合によってはアナログ信号になるということを改めて実感する事となります。

#### アプリケーションの基礎はカーネルにあり？
アプリケーション層に関しては、何よりOSのカーネルについて学ぶことが大事だと思います。
Linuxのカーネルコードを読めるようになる・・・というのは私の夢の一つでもあります。
カーネルについて学べば、例えばRDBって何？Redisって何？となったときにも
「いい感じに人にわかりやすくデータを構造化していい感じに効率よくプロセスを管理していい感じに効率よくメモリI/O→ディスクI/Oをする仕組み」なんだ！という発想ができるようになり、「じゃあ、どうやってそれを実現しているのかな？」と、自ずと興味が湧き、勘所を押さえやすくなるのではないかと思います。

## ハンズオン系の勉強会を利用する
アウトプットを伴う学習を挫折させる要因として、**「環境構築が面倒」「環境構築に失敗」「なぜかプログラムが動かない」**という状況があります。（そのような機会を減らすために低レイヤからの学習は役に立つと思います）
特に独学で勉強しているとどうしてもそのような機会があり、エラーの原因を調べようと思っても見る場所がわかならい。。なんてことも。
そんな状況を回避するためにはハンズオン系の勉強会の利用をおすすめします。
私も何回か参加したことがありますが、環境構築に専用の手順書が用意されていたり、つまづいた時は講師の方に質問することができるので、独学にありがちなこれらの問題を回避することができます。
勉強会で一度環境を作ってしまえば、後から自分で構築するときには良いお手本、うまくいかない時の比較対象としてとても役に立ちます。


## 諦めないマインドを持つ
上記のような小技のほかに、私が技術を学ぶ上で支えとになった２つの考えについて恐縮ながらご紹介できればと思います。。
「人が考えて作ったものなのだから、集中し、膨大な時間を使えば理解できないことはない」という気持ち。
「何かを始めるのに遅すぎるということはなく、やるならば今が一番早い」という気持ちです。
これらの試行錯誤のおかげか、右も左もわからなかった私も無事素敵な先輩方の在籍するWeb企業のエンジニアの端くれとして職を授かることができました。
来年の今頃はRailsエンジニアになっていたい、機械学習エンジニアになっていたい、そんな新人の皆様、今から実践すればその目標は実現できるはずです！

## 番外編・資格試験を受ける？
実力のあるエンジニアの方ほど、資格のようなものを重視しないイメージがありますよね。
しかし私は声を大にして、文系出身のエンジニアは[情報処理技術者試験](https://www.jitec.ipa.go.jp/)を受けるべき！！と言いたいです。
私は応用情報技術者を受けて初めて、2進数の計算、アルゴリズムとデータ構造、カーネルのメモリ管理、サブネットマスクのCIDR表記・・・のようなものに触れました。
このような分野が存在することを知り、個別に学んでいく事は大変ですが、試験の参考書にはこれらがざっくりと網羅されているため**広く深いITの世界への入り口**として持ってこいです。
また、**学習の成果が資格という形で残るため、モチベーションを保ちやすい**というメリットもあります。嬉しい気持ち大事！

## まとめ
こうして書いてみるとごく当たり前の内容となってしまいましたが、学習を継続するのに大切な「身の丈に合った教材」「モチベーションの維持」「全体像の把握」などのポイントを改めて振り返ることとなりました。
この記事が若手の文系エンジニアや、技術に興味があるけど何をすればいいのかわからない非エンジニアの方、最近学習のモチベーションが下がりがちな方・・・などの一助になれば幸いです。
末筆ですが、最後までお読みいただきありがとうございました。

[^1]: 次は桂さんの[学習を加速させるインデックス読書術](https://qiita.com/dkatsura/items/3364b293ed1451a66a8a)にトライしたいですね！