エンジニア未経験者から初級者になる為の学習方法

# はじめに
散々擦られたテーマで、本やブログなど既に沢山情報はありますが、今現在の自分の考えについて一旦まとめてみます。

未経験者の方はかなりの確率で何をどうやって学習すればいいのかわからないと悩んでいる人が多いと思います。少なからず自分もそうでした。

まず一番最初に突き当たる壁として「未経験者から初級者への壁」がありますが、自分の場合どうやって未経験者から脱却したのかを、初心に帰って思い出してみました。

# 何を学習するかについて
一言にITエンジニアといっても様々な技術があります。

もし既にIT企業に入社しているなら、何を学習すればいいのか上司や先輩に聞くのが一番です。
会社や案件によって使用する言語やツールが違うので、業務に沿って学習できるのは効率がいいです。

もしくは周りにエンジニアの知り合いがいるならその人に相談するのもいいでしょう。
既に興味のある技術ややりたい事があるなら、それを選ぶのもひとつです。

## 未経験者におすすめの言語
もしまったくの未経験で、やりたい事もまだわからない、エンジニアの知り合いもいない、という状態なら自分だったら以下をお勧めします。

* ExcelVBAもしくはJavaScript
* SQL

選んだ理由ですが、ExcelVBAとJavaScriptに関しては、未経験者が最初に挫折するであろう「プログラムを動かすための環境構築」が、ほとんど必要ないという点です。
SQLはデータベースを操作する為の言語で、プログラミング言語とは性質が異なります。実務では、プログラミング言語とデータベースはセットである事が多いので、最低限理解しておいて損はないです。

最初にこれらの学習をし、そのあとは自分がどんな事をしたいかによって、他の言語の学習を進めていけばいいでしょう。

## 主な言語について
いくつか主な言語と、その特徴について挙げていきます。

### プログラミング言語
コンピュータプログラムを記述するための形式言語です。
ざっくりですが、上の方に比較的簡単に記述できる言語を、下の方に厳密に記述する必要のある言語をまとめました。
ウィキペディア [プログラミング言語一覧](https://ja.wikipedia.org/wiki/プログラミング言語一覧) から抜粋しました。

* VBA
    * Officeシリーズに搭載されている言語。手軽にプログラミングが始められる
* JavaScript
    * Webページに動きをつけるために用いられる言語。Webページの表示（フロントエンド[^1]）だけでなく、内部的な処理（サーバサイド[^2]）の開発にも利用できる
* PHP
    * サーバーサイドで動的なWebページを作成するための機能を多く備えている言語
* Ruby
    * まつもとゆきひろ（通称： Matz）により開発された言語
* Python
    * 機械学習やAI開発で使用される事の多い言語
* Swift/Objective-C
    * Apple製OS上で動作するアプリケーションの開発に用いられる言語
* C#
    * Microsoftによって開発された言語。Javaと文法が似ている
* C
    * 歴史が長い言語で汎用性が高いが、初心者には難解。ハードウェアを直接扱うのに向いている
* C++
    * C言語から派生した言語。C言語の特徴であるハードウェアを開発するための言語としても、複雑なアプリケーションソフトウェアを開発するための言語としても使用可能
* Java
    * Webアプリケーションで使用される事の多い言語

[^1]: フロントエンドというのは、ユーザが直接やりとりする部分です。Webページでいうと、ブラウザ上に画面デザインを表示させる役割を担っています。

[^2]: サーバサイドというのは、ユーザからは直接見えない部分です。フロントエンドに情報を送ったり受取ったりする役割を担っています。

### マークアップ言語
視覚表現や文章構造などを記述するための形式言語です。

* HTML
    * Webページを表現するために用いられる言語
* CSS
    * HTMLなどの要素を修飾するための言語

### データベース言語
データベースを扱うためのコンピュータ言語の事です。

* SQL
    * データベースを扱う為の言語。データベース製品によって少し書き方が異なる

# 学習方法について
次に、実際に自分が行った方法を中心に、いくつか学習方法を挙げます。

## eラーニングサービスを使って学習する
eラーニングサービスとは、パソコンやスマートフォンなどの電子機器からインターネットを利用して学習する形態の事です。
動画の講座や、ゲーム感覚で学べるものもあります。
まずはこういったサービスを利用して、取っ掛かりをつかむのがお勧めです。
自分の場合は、[ドットインストール](https://dotinstall.com)というプログラミング学習サービスで無料のJavaScript入門の講座を受講しました。
ドットインストールは、プログラムを動かすための環境構築から動画で説明してくれるので、なにも分からない状態から学習する時に役立ちました。

## 1つの言語を一通り学習する
どれか1つの言語をある程度習得すると、他の言語でも置き換えて考える事ができます。
自分の場合は、先輩に勧められてJavaScriptである程度取っ掛かりをつかんでから、Javaを学習しました。

プログラムの構文やオブジェクト指向についてなど、基本はこの本で学習しました。
[スッキリわかるJava入門](https://book.impress.co.jp/books/1119101083)

Javaを使ったWebアプリケーション[^3]についてはこちらの本で学習しました。が、こちらは途中までしか読みませんでした。
[スッキリわかるサーブレット＆JSP入門](https://book.impress.co.jp/books/1112101008)

[^3]: Webアプリケーションというのは、インターネット（ウェブ）などのネットワークから利用するアプリケーションの事です。主にブラウザ上で利用できるアプリケーションの事を指します。Java単体ではWebアプリケーションとして動かす事ができず、サーブレット/JSPというものを使ってWebページを生成します。

## 実際に何か作ってみる
ある程度学習が進めば、どんな簡単な物でもいいので、自分で実際に何かつくってみる事をお勧めします。
自分の場合は、ExcelVBAで作業を自動化してみたり、JavaScriptでブラウザに文字を表示してみるところから始めました。
そのあとJavaを学習して、Javaを使ってデータベースにデータを登録＆参照するシステムを作りました。

知識をインプットするだけでなく、自分で課題を考えて手を動かしてアウトプットする事が重要です。

### 課題の例 JavaScript
ループを使って、ブラウザ上に1～10まで1つずつ■マークを増やして表示する。

![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/cc6fb87a-765c-acfa-fe5c-eb78fed4c604.jpeg)

### 課題の例 Java
CDの情報を登録・検索するWebシステムを作る。

![002.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/aed02c0f-ddd1-29b8-630f-fe266e2d8b54.jpeg)

![003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/230850/a7911864-d82b-9892-e15d-3a2f2c3ccc14.jpeg)

## 2通りの学習方法
個人的に、学習方法は、大きく2通りあるのではと考えています。
自分が勝手に呼んでいるだけなのですが、「逆引き学習」と「体系的学習」の2通りです。

* 逆引き学習 … やりたい事を実現する為に、知識を身につける
    * 自分がやりたい事を実現するために、本やネット調べる事によって、結果知識が身につく
* 体系的学習 … 技術書などで、体系立てた知識を身につける
    * 技術書を読んだり、試験勉強をする事によって、体系的に知識を身につける

この2つの学習方法をバランスよく取り入れて学習できればよりいいのですが、何もわからないうちから技術書を読んで1から学習するのはハードルが高いと感じる人が多いでしょう。

まずは、とにかく手を動かして実際にやってみることが重要です。どんな小さな簡単な事でもいいので、自分で課題を考えて、それを実現するために手を沢山動かすのが一番です。
ある程度理解出来てきたら、改めて1から基礎を学ぶとより理解が深まります。

# 自分が行った学習について
参考になるかわかりませんが、自分がいままでどのように何を学習をしていたのかを時系列でまとめてみました。
時系列の後半は「未経験者から初級者になる」という本題からは外れていますが、折角なので直近までまとめています。

1. HTML/CSS/JavaScript
    * 趣味でHPを運営していた。見よう見まねのコピペだったので、ちゃんと理解はしていなかった。
2. ExcelVBA
    * 事務の仕事でExcelの単純作業に嫌気がさし、知り合いのエンジニアに教えてもらい処理を自動化するプログラムを作成した。
3. JavaScript
    * 本格的にIT企業へ転職を考え始めた時期。インターン先の先輩の勧めで、まずはJavaScriptの学習をした。
    * 学習に使用したツール
        * [ドットインストール](https://dotinstall.com)
4. Java/JSP/サーブレット/SQL
    * 何か1つプログラミング言語をしっかり学習したほうがいいとの事で、先輩の勧めでJavaを学習した。本を読み、自分でWebアプリケーションを作成した。
    * 学習に使用した本
        * [スッキリわかるJava入門](https://book.impress.co.jp/books/1119101083)
        * [スッキリわかるサーブレット＆JSP入門](https://book.impress.co.jp/books/1112101008)
        * [スッキリわかるSQL入門](https://book.impress.co.jp/books/1118101071)
5. SQL/Access
    * AccessやSQL Serverを使用したデータ分析の現場に参画した。
    * 学習に使用した本
        * Accessの本は先輩から借りたのですが何を借りていたか忘れてしまいました…
        * [SQLポケットリファレンス](https://gihyo.jp/book/2017/978-4-7741-8732-7)
6. bat/VBScript
    * 業務効率化の為にbatなどを作成した。
    * 学習に使用した本
        * [Windowsコマンドプロンプトポケットリファレンス](https://gihyo.jp/book/2016/978-4-7741-8001-4)
7. PHP
    * 趣味で運営しているHPを動的に作り変えたり、Twitterのbotを作成した。
    * 学習に使用した本
        * [独習PHP](https://www.shoeisha.co.jp/book/detail/9784798168494)
8. 基本情報技術者試験
    * 基本的なITの知識を身につける為、学習した。
    * 学習に使用した本
        * [かんたん合格 基本情報技術者過去問題集](https://book.impress.co.jp/books/1120101159)
        * [キタミ式イラストIT塾 基本情報技術者](https://gihyo.jp/book/2020/978-4-297-11781-8)
9. データベーススペシャリスト試験
    * データベースに関係する固有技術を身につける為、学習した。（まだ受かってないです…）
    * 学習に使用した本
        * [情報処理教科書 データベーススペシャリスト](https://www.shoeisha.co.jp/book/detail/9784798167770)
        * [キタミ式イラストIT塾　応用情報技術者](https://gihyo.jp/book/2020/978-4-297-11783-2)
10. SQL Server
    * SQL Serverの内部動作を理解する為、学習中。
        * [絵で見てわかるSQL Serverの仕組み](https://www.shoeisha.co.jp/book/detail/9784798158723)

# おわりに
色々と書きましたが、もし興味を持っている技術があるのなら、その学習をするのが一番です。
つらい、やりたくない学習をやっていても効率が悪く身に付きにくいです。
まずは楽しいと感じることから始めて、取っ掛かりをつかみましょう。