エンジニア体験会での初心者への教え方(Java,Eclipse)

先日、自社で行っているプログラミング体験会で、未経験者に「プログラミングとは」を話す機会を頂いたので、次の機会の為に良かったことや改善していきたいことを自分用にまとめておきます。

## --はじめに--
【体験会に来る人の経歴】
体験会には様々な経歴の人が来ます。
・大学の時にJava学んでました～
・接客業をしていてパソコンはあまり触ったことないです～
・転職を考えている中でIT業界に興味を持ちました～
など、他業種や未経験の人が多かったです。

【体験会に来る人が求めていること(体験会後の交流会で多かった質問など)】
・完全未経験
→　プログラミングってなんか難しそう・・・
→　どうやって作るの？
・業務未経験だけどちょっと触ったことある(大学とか)
→　この会社で大丈夫か？(普通に企業説明会的な感じ)
→　エンジニアの仕事ってどんな感じ？

レベルもまちまちなのでその人たち全てに同じようなレベル感で教えることはできない。

今回は完全未経験向けに教える方法をメモしていきたいと思います。
この会社で大丈夫かどうかは体験会が終わった後にでも答えてあげましょう。

##プログラムとは何か
まず初めにプログラム、プログラミング、プログラミング言語についてのイメージを話します。

初心者の多くはプログラムがどんなものか知らないことが多く、プログラミング言語って何？状態も珍しくないです。

そんな中話すわけなので、なるべくイメージをしてもらうことが大事だと思います。

そして、できるだけ**難しい言葉**は使わないようにします。
なんでもそうですが、苦手意識を持ってしまうとなかなか吸収しづらくなるため、わかりやすく説明します。
もちろん使わなければならない場面もあるので全く使わないのは無理ですが、使った場合にはその言葉の意味も伝えるようにすれば~~たぶん~~大丈夫です。

>例)書いたプログラムはコンパイルしなければ実行できません。
　→プログラムを実行するには、書いたコードをコンピュータ語に翻訳する「コンパイル」という処理をしなければなりません。

というように、なるべくかみ砕いて教えていく方がよいと思います。
できるだけなじみの深い言葉で話すことによって、苦手意識を持たせないことが重要です。

## --講義の流れ--

### 1.プログラムとは
　- プログラムが何をするものなのかをざっくりと(言語の種類などもここで)
### 2.プログラミング基礎知識
　- プログラムの流れ(どういう流れで動いているか)
　- 変数
　- 簡単な構文をちょろっと(ifやfor)
### 3.実践
　- Eclipseで簡単なコードを書いて実行してもらう

## --講義内容--
### 1.プログラムとは

プログラムとはコンピュータに向けた指示のことです。

普段私たちが人に何か指示をするとき、通常は言語を使いますよね。
日本人なら日本語、アメリカ人なら英語、中国人なら中国語といった言語を用いて指示するのですが、コンピュータに何かを支持するときも同様に言語を使用します。
それがプログラミング言語なのです。
プログラミング言語を用いて書かれた指示のことを「プログラム」といい、「プログラムを書く」ことを「プログラミング」というのです。

「プログラミング」というと難しく感じる人も多いかもしれませんが、使用するのはプログラミング「言語」というくらいなのでルールがあります。ルールを覚えてしまえば、日本語のように読み書きが出来るので難しく考える必要はありません。

ところで、プログラミング言語は何種類くらい存在するのかご存じですか？

この記事でも紹介するJavaを含め、マイナーな言語も含めると約200種類以上と言われています。
しかし、これらすべてを日々の業務で使うかというとそんなことはありません。
言語によって実現しやすい機能や、実現しにくい機能があります。
詳しいことは調べてみてください。
ここではJavaの基礎を説明します。

### 2.プログラミング基礎知識

#### 2-1.プログラムの流れ
プログラミングが、【プログラムというコンピュータに指示を出すための指示】を書くことだと言うことが理解できたところで、プログラムを書いてから実行されるまでの流れを見ていきましょう。
プログラムはコンパイルしてから実行します。
(しかし、初心者にはコンパイルも実行もよく分からないと思います。日常で使わない言葉だし・・・
そこで、イメージしやすくするために
入力(プログラミング)→加工(コンパイル)→出力(実行)
という言葉で考えるとわかりやすいかもしれません。)

mainメソッド内にコードを入力してコンパイル(コンピュータが分かる言葉に加工)、そしてコンソールに出力。
書いたものがどのように出力されるかの流れを言いながら実行すると良いでしょう。
コンソールの場所の説明も忘れずに(ここに表示されますよ～的なこと)

```java:Sample.java
package sample;
public class Sample {
    public static void main(String[] args) {
        System.out.println("Hello World!!");
    }
}
```

```:出力内容
Hello World!!
```
#### ※実際に実践してもらうときに注意すること
「Hello World!!」が出力できたら、自分の名前をコンソールに出力するプログラムを書いてもらいましょう。
その際に結構多いのが、System.out.println内の「Hello World!!」を書き変えるのではなく、packageから全部消してすべて書き直す人が多いのでSystem.out.println内だけを変えてもらうように注意しましょう。
また、全角のまま書いてエラーになっちゃう人が結構多いので教えてあげてください。
"とか{の出し方知らない人とかもいるので優しくしてあげてください。

### 2-2.変数
(初心者が一番引っかかりやすいのが変数なのではないでしょうか)
変数は一言で言うと【値を入れておく(格納しておく)箱】のことです。
Javaにおいては変数に型が決まっており、決められた型の値しか格納することができません。
ここでは数値と文字列について簡単に説明します。
intとStringという型についてです。
この型というのはデータ型といい、値がどんな型なのかがわかるようになっています。
intが数値、Stringが文字列を表します。

#### ・int
ここでいう数値とは整数のことで、小数は含みません。
【1】や【10】や【100000】などです。
(小数は小数でほかのデータ型が存在しますがここでは割愛します。
また数値の中でも格納できる桁数によって使用するデータ型が決まっているのですがややこしくなるのでここでは割愛します。)
int型には数値のみを格納することができ、数値同士は計算することができます。

#### ・String
Stringには文字列を格納できます。
文字列とは【"あ"】や【"あいうえお"】【"こんにちは"】などの数値以外の文字のことです。
ですが実は数値も格納できます。【"1"】や【"10"】など。
しかしStringの中に数値をしまってしまうと、intのように計算ができなくなります。→文字列としての数値。(つかいかたで説明)

#### ・つかいかた

```:つかいかた
【使用するデータ型】 【変数名】 = 【格納する値】;
```
```java:intでの計算
int num1 = 10;
int num2 = 15;

// 式通りに計算される
num1 + num2 = 25
```
```java:Stringでの計算
String num1 = "10";
String num2 = "15"

// 文字同士がつながって表示される
num1 + num2 = "1015"
```

### 2-3.簡単な構文(ifやforなど)
変数が理解できたら、簡単な構文について説明しましょう。
イメージが大事なので身の回りにあるものを例にして説明してあげると良いでしょう。
例えば条件分岐なら
コンビニでお酒やたばこを購入するときの年齢確認の「20歳以上ですか？はいorいいえ」などを説明の例にして実際に書いてもらう、など。

#### if (条件分岐)
基本的な書き方
・if (もし○○なら△△する)

> if (条件1(○○)) {
    条件1(○○)が満たされていたら実行する処理(△△)
 }

・else (もし○○なら△△、それ以外なら□□する)

> if (条件1(○○)) {
     条件1(○○)が満たされていたら実行する処理(△△)
 } else {
     条件1が満たされなかったら実行する処理(□□)
 }

・else if (もし○○なら△△、●●なら▲▲、それ以外なら□□する)

>if (条件1(○○)) {
    条件1(○○)が満たされていたら実行する処理(△△)
} else if (条件2(●●)) {
    条件1(○○)は満たされていないが
    条件2(●●)は満たしていたら実行する処理(▲▲)
} else {
    条件1(○○)と条件2(●●)が満たされなかったら実行する処理(□□)
}

※条件には算術演算子・比較演算子・条件演算子が使用できることを説明しましょう。
等しいか比較するときは「==」を使用する、など

```java:if練習問題
※まずは簡単なプログラムを書いてもらい、動かす感覚を試してもらうことが大事だと思います。
　変数ageの中身も各自で変更してもらい、100以外だとコンソールに出力されないことを確認してもらうと条件式の意味が分かりやすい。

// if
// 年齢が100歳の場合、「1世紀生きています」と出力する。
// 変数 int age を使用すること

// 解答
int age = 100;
if (age == 100) {
    System.out.println("1世紀生きています。");
}

// else
// 年齢が20歳以上の場合「お酒が飲めます」、そうでない場合「お酒が飲めません」と出力する
// 変数int age を使用すること

int age = 20;
if (age >= 20) {
    System.out.println("お酒が飲めます");
} else {
    System.out.println("お酒が飲めません");
}
// ※ここもageの中身をいくつか変えて、出力内容の変化を試してもらう。

// else if
// テストの点数が80点以上の人は「優」60点以上の人は「可」60点未満の人は不可と出力してください
// 変数int score を使用すること(scoreは0~100のみが入ることとする)

int score = 80;
if (score >= 80) {
    System.out.println("優");
} else if (score >= 60) {
    System.out.println("可");
} else {
    System.out.println("不可");
}
// ※ここもageの中身をいくつか変えて、出力内容の変化を試してもらう。
```

#### for (繰り返し処理)
繰り返し処理の場合
「自分の名前をコンソールに5回出力するときはどのように書けばいいでしょうか？」
などと問いかけるとだいたいの方は

```java:5回出力
System.out.println("自分の名前");
System.out.println("自分の名前");
System.out.println("自分の名前");
System.out.println("自分の名前");
System.out.println("自分の名前");
```

と実装してくれます。
5回くらいなら楽に書けますが、100回出力してくださいとかになるとさすがにめんどくさいですよね。。。このような場合に繰り返し処理が利用できます。
という感じで進めます。

・for構文
> for (【初期値】;【繰り返し条件式】;【継続処理】;) {
    // 繰り返し条件式が「true」の場合に行う処理内容
}


```java:練習問題
// 自分の名前を5回出力してみましょう
for (int i = 1; i<=5; i++) {
    System.out.println("山田太郎");
}
```
forの中は「i」が「5」以下の場合に処理が実行されます。
「i」は1回の処理が終わるごとに「++」。すなわち1ずつ増加します。
わかりやすく処理を追ってみると

```java:1回目
// iは1なので「山田太郎」が出力される。
for (1 <= 5) {
   System.out.println("山田太郎");
}
// 出力結果：山田太郎
```

```java:2回目
// i++でiは2なので「山田太郎」が出力される。
for (2 <= 5) {
   System.out.println("山田太郎");
}
// 出力結果：山田太郎
```

```java:3回目
// i++でiは3なので「山田太郎」が出力される。
for (3 <= 5) {
   System.out.println("山田太郎");
}
// 出力結果：山田太郎
```

```java:4回目
// i++でiは4なので「山田太郎」が出力される。
for (4 <= 5) {
   System.out.println("山田太郎");
}
// 出力結果：山田太郎
```

```java:5回目
// i++でiは5なので「山田太郎」が出力される。
for (5 <= 5) {
   System.out.println("山田太郎");
}
// 出力結果：山田太郎
```

```java:6回目
// i++でiは6なので「自分の名前」は出力されない。
for (6 <= 5) {
   System.out.println("山田太郎");
}
// 出力結果：出力なし
```

ざっくりこんな感じで説明して、プログラミングって思ったより簡単で楽しい！から入ることが出れば吸収しやすくなると思います。

最後にロジックの練習問題をパズル感覚でやってあげるととっかかりやすくなると思うので、有名な問題だけ書いておきます。

```java:fizzbuzz
// 1~100まで順番に出力しながら
// 3で割り切れる場合は「fizz」を
// 5で割り切れる場合は「buzz」を
// 3と5両方で割り切れる場合は「fizzbuzz」と出力してください
// 例) 1,2,fizz,4,buzz,fizz,...,14,fizzbuzz,16,......,98,fizz,buzz

// 解答
public class Sample {
    public static void main(String[] args) {
        for (int i = 1; i<=100; i++) {
            if (i % 3 == 0 && i % 5 == 0) {
                System.out.println("fizzbuzz");
            } else if (i % 3 == 0) {
                System.out.println("fizz");
            } else if (i % 5 == 0) {
                System.out.println("buzz");
            } else {
                System.out.println(i);
            }
        }
    }
}
```
## さいごに
### 苦手意識を持たせないように優しく教えてあげましょう！
読んでいただいてありがとうございました＾＾
**ここ変だよ**とか**こんな風に教えるとより良いよ！**などあれば教えてください！
マークダウンの書き方とかでのアドバイスもうれしいです！