iOSアプリの講師👨‍🏫をすることになって、工夫したこと、学び直したこと、学習方法を考えたこと✏️

# はじめに🐤
[G's ACADEMY TOKYO](https://gsacademy.tokyo/) (以降、ジーズ)で iOSアプリ の講師をしている[やまたつ](https://twitter.com/yamatatsu109_ja)です！
人生の初のアドベントカレンダーです！！！頑張って書きすぎて長くなりましたが読んでもらえると嬉しいです🙇‍♂️
(本記事は 12/14に書いており、まだ授業をしておりません。授業後の12/18に加筆しております。)



2019/12/15 からジーズで講師をさせていただいております！
講師をするためにどのようなことを行ったかや、工夫したこと、学び直したことなどを書いていこうと思います！

普段はフリーランスとして企業で iOSアプリ開発に従事しております👨‍💻
現場で学んできたことをできるだけ咀嚼して、学びやすく、
わかりやすく教えることができるようにしていきたいと思っています。

まだまだ新米の講師ですので、
他に良い方法があれば先輩方の皆様のアドバイスをいただきたいです🙇‍♂️
よろしくお願いいたします！

## 目標🚀
受講生の方が自走できるようにすることと、
プログラミングを楽しく学んでくれることを目標にしています！

Udemy などで学んでいると海外の講師の方は本当に楽しそうにプログラミングをしていると感じます。 
ラベルの文字が変わると、「Great !!!!!!」と「Goooooooooooood!!!!」とたくさん言います笑
そのくらい自分も楽しみながら講師ができたら良いなと思っております。
講師の自分が楽しめると、受講生の方も楽しんでくれると信じています☺️

## 前提
ジーズの受講生は、`プログラミング未経験の方` がほとんどです。 
PCの扱いも不慣れな方もいらっしゃいます。
講師が専門用語を使わずにどれだけ説明できるか、
そして、受講生の方が**プログラミングに苦手意識をもたない**ようにできるかが重要です。
そのため、挫折をできるだけ防ぐような仕組みづくりを考えています。



# インプットしたこと🐣
講師をするために必要そうなことを考えて、インプットしました。

## 学び直したこと
- Swift の基礎的なところ
    - フワッと理解してきたところを言語化（delegate や クロージャ）
- 最初に躓きやすいところの洗い出し
    - 遷移方法、メソッドの作成、View のライフサイクル
- iOS13 と iOS12以前のこと
    - ダークモードとハーフモーダルの簡単な対応方法
- Xcode11 と Xcode10 のこと
    - 画面の構成が変わったこと
    - 便利な使い方について
    - よく使うショートカットキー
        - すーさんのこの記事がおすすめです
            - [Xcodeの開発の効率を上げるためにしていること](https://techblog.timers-inc.com/entry/2016/12/15/090000)


## 新しく学習したこと
- 「教える」ために必要なことを本からインプット
    - 「[教える技術](https://www.amazon.co.jp/dp/4761270578/ref=cm_sw_r_tw_dp_U_x_.jn2Db5BCSVQA )」
        - 失敗（エラー）を怖がらせない → 授業で人よりも遅れていても許容できるようにする
        - 具体的な形にして説明する
            - 🙅‍♂️「Todoアプリを作ります」
            - 🙆‍♂️「Todoアプリを作るために、タスクを追加、読み込みの機能を作ります」
        - ゴールを提示して、イメージできるようにする
            - 🙅‍♂️「授業始めます。まずは追加機能から作成しましょう〜」
            - 🙆‍♂️「授業始めます。今回の完成図はこれです（アプリを動かす）では、追加機能から作成しましょう〜」
        - 教えるだけでなく、理解度を図る
            - なぜエラーが出ているかを言語化してもらう。言語化のアシスタントをする。
    - 「[教える技術2](https://www.amazon.co.jp/dp/4761271329/ref=cm_sw_r_tw_dp_U_x_ckn2Db0Z3AVJT)」
        - 最初はみんなできないことを伝える
            - 自分の失敗談を話す
            - バグを生みまくった話する
        - まずは聞く
            - エラーが出たときに説明してもらってから解説する
        - 話やすい雰囲気づくりを心がける
            - エラーが出ても言えない空気にしない
            - 自分が積極的にエラーを出したり、質問を投げかける
            - 自分の時は講師が呆れるくらい、質問をしていたことを話す
- 教えるときに心がけることを動画や記事からインプット
    - リアクション
        - Udemy や Youtube を見てオーバーリアクションを学びました笑
        - 好きな Youtuber は [LGTAさん(Lets Build That App)] (https://www.youtube.com/channel/UCuP2vJ6kRutQBfRmdcI92mA)です！
    - 具体例を話す方法
        - Udemy や 記事で例えを用いられているところを洗い出す
        - 例：class → 車、鯛焼き機
    - できるだけコードに対してコメントを残す
        - コメントを残すことで復習ができる
        - 処理の内容が日本語でわかるので、一気に覚えずに済む
- 昔のプログラミングができなかった頃の自分を思い出す
    - 昔のプロジェクトを開いてクソコードを眺める（虚無になる）
    - 参考になるブログを読む
        - まりーなさんの記事が最高でした。共感しかない。
        - [iOS開発初心者は何がわからないのか  わからないを言語化するヒント](https://note.mu/marina1017/n/n618f0198f622)

以下、参考にさせていただいた資料です！
他にもたくさんありました。全て最高でした。ありがとうございます🙇‍♂️

- [プログラミングを教えるときの10のポイント (という論文の紹介)](https://medium.com/@ukkaripon/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E6%95%99%E3%81%88%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE10%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88-%E3%81%A8%E3%81%84%E3%81%86%E8%AB%96%E6%96%87%E3%81%AE%E7%B4%B9%E4%BB%8B-f3ba6ac40f37)
- [新入社員が来てメンターになれって言われたけど、どうすればいいのかという対話テクニック](https://qiita.com/hirokidaichi/items/2e8e731acfd7b6c7e02f)
- [初心者をメンターするときに覚えておきたい「忘れかけた初心者の頃の気持ち」と教訓12選](https://qiita.com/ynii/items/3233073ba18c438899e2)
- [新卒のトレーナーをするときの個人的まとめ](https://qiita.com/mad_khaki/items/eba0450c66fc59de2d1d)
- [未経験者にプログラミングを教えるとき](https://qiita.com/masatsugumatsus/items/ac7d94345bc21b4f8100)
- [初心者がオリジナルのiOSアプリを開発できるようになるまで](https://qiita.com/justin999/items/986fe025331f077e453e)

## 自走するための教材情報
教材といっても自分が作成しているわけではないです😇
今自分がSwiftを**全く知らない状態から学んだとき**に、どのように学習したら効率的に学べるかを考えて教材を選びました。
もちろん、自分が使ったことのないものをお勧めすることはできないので、新しくUdemyで初心者向けの動画を買ったり、プログラミングの本を買ったりしています笑（メルカリで売るか〜）

本よりも動画の方が学びやすいと考えているので、動画をお勧めしています。

#### Udemy
1. [【iOS13対応】未経験者がiPhoneアプリ開発者になるための全て iOS Boot Camp](https://www.udemy.com/course/ios13_swift5_iphone_ios_boot_camp/)
2. [みんなのiOS講座 ゼロからSwiftで学ぶiPhoneアプリ開発の基礎](https://www.udemy.com/course/ios-apps/)

英語ができる方ならこちら↓↓↓↓↓
[iOS 13 & Swift 5 - The Complete iOS App Development Bootcamp](https://www.udemy.com/course/ios-13-app-development-bootcamp/)

自分が最初に学ぶ時は、日本企業の動画教材を使っていたのですが、残念ながらアップデートが全くないのでお勧めできなくなってしまいました😭
**Swift に関して** は Udemy の講座の質が良いと感じております（主観）

#### どうしても本が読みたいなら

動画見たいけどギガがないよって人はこっちですかね😶
本当に挫折できないくらいわかりやすかったです。

- [絶対に挫折しないiPhoneアプリ開発「超」入門 第7版 【Xcode 10 & iOS 12】](https://www.amazon.co.jp/dp/4797398558/ref=cm_sw_r_tw_dp_U_x_AHn2Db8GC9YD3)


# 受講生のPCのセットアップ🐥

ここは重要かと思います！！！
エンジニアなら誰でもやっている設定かもしれませんが👨‍💻
初心者の方向けです！

### 1. キーリピートと、認識時間を最大にする

バックスペースの長押しの時間が長い時ありませんか？
自分は最初、「長い。。。一気に消したい」と思って設定しました!!!
結構重要です。


![スクリーンショット 2019-11-23 午前9.28.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/758054df-9c5d-c100-5878-e91bea720a54.png)


### 2. 検索には GoogleChrome を使って、検索結果を1年以内にする

ここがSwiftを学ぶ上で一番重要なことかもしれません。（他の言語もそうかも）
Swiftは2014年に出た新しい言語で、毎年バージョンアップを繰り返しており、1年以上前の情報が役に立たないこともあります👀

そのため、**書いてあることが古くて動かなかったり、冗長なコードを含んで**いたりします。
自分が初心者の時は Swift2 や Swift3 （3~4年前）のコードを検索して使っていたので、時間を無駄にしていたな〜と思いました。
検索結果を1年以内にすることで、無駄な検索時間を大幅に減らすことができると考えています！


[自分はこの拡張機能を使っています！名前のセンスも良い笑→ ato-ichinen](https://www.softantenna.com/wp/review/ato-ichinen-chrome-extension/)

### 3. 2回クリックしたら単語選択、3回クリックしたら行選択ができることを教える

セットアップとは関係ないですがこれはPCを使う上で必要不可欠かと👨‍💻
また、基本的なショートカットキーも！
最初はコピペだけでも大丈夫！(Mac: cmd + c, cmd + v)

### 4. Finder のサイドバーに作業スペース(workspace)を確保

デスクトップにファイルがたくさん置かれていると作業効率がとても悪いです。
今まで教えてきた中で、どこになんのファイルがあるか分からなくなる人がたくさんいました😇
サイドバーからアクセスできることでファイルを探す手間がなくなります！

![スクリーンショット 2019-12-13 11.49.47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/95b1eec6-8ac4-baf9-dc00-714821e4b748.jpeg)


### 5. キャッシュ削除コマンドを使えるようにする

Xcode で `No such module` だったり、 `/Library/Developer/Xcode/DerivedData/` にデータが残ってるよ！
みたいなエラーがよく出てきませんか？その時によくやるコマンドを alias で定義させます。


以下の記事の引用です！

-----引用始まり

[iOSアプリ開発でのキャッシュ削除方法まとめ](https://qiita.com/shtnkgm/items/c96a58579ec406194fa8)

```bash
rm -rf ~/Library/Developer/Xcode/DerivedData/
```

**Tip:** 個人的に開発中にもっとも使うことの多いコマンドです。
~/.bashrcファイルにエイリアスを定義して`clean`だけで簡単に実行できるようにしています。

```bash:~/.bashrc
alias clean='rm -rf ~/Library/Developer/Xcode/DerivedData'
```

--------引用終わり

# 授業で工夫していること🐔
### ポインタを大きくする
どこをクリックしたかどうかがわかりやすくなります。

![スクリーンショット 2019-11-23 午前10.13.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/b77977d6-f565-ef89-d169-1f712d22f501.png)

### ズーム機能をつけて拡大可能
コードを強調したいときに便利です。

![スクリーンショット 2019-11-23 午前9.27.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/2fb42f57-9be7-59e8-1d94-3d00db60ba65.png)

こんな感じで拡大できます！

![zoom_swift_teacher.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/13bccba5-d79f-db30-9294-bba06a470219.gif)



### Xcode、ターミナル の文字を拡大

授業中は遠くの席に座る方もいるので、支障がない程度に拡大しています。
iTerm 使ってたら ブラウザみたいにトラックパッドで文字が拡大することを初めて知りました。


### よくあるエラー集を用意して、前で実演する

-  削除するときは絶対に「Move to Trash」 、 「Remove Reference」はダメ！絶対！
    - 同じファイル名を再作成ができない。ファイルが残ってるから。
- 参照(接続)が残っているとき
  - 右クリックして接続が残ってるかを確認する
- エラーが出たら、コンソールで「reason」を打ち込む
  - 最初のうちはどこにエラーの原因が書いてあるかわからないから、「reason」で検索するようにします。
- 謎のエラーが出たらこちら → [Xcodeでデバッグ実行中にクラッシュした時に捗るブレークポイント設定](https://qiita.com/mono0926/items/bf70c7ef15db046ee163)
- かぶるモジュール名はダメ！絶対！例：SwiftUI をアプリ名にしちゃう

### エラーが出た時に、知識で解決するのではなく、「エラー見る → ググる → 解決」の手順を見せる

前述したとおり、「自走できるようにする」が目標です！
そのため、自分でエラーが解決できるようになることは最低条件です。

1. エラーを見る。
2. Google翻訳にぶっ込む（筆者は英語が苦手なこともあり最初はぶっ込みまくってました。今はなんとなく読めますよ笑）←できる人は飛ばして良い
3. 内容を理解する
3. ぐぐる
4. それっぽい記事を見つける
5. 試す
6. 解決！解決できなかったら4に戻る。

上記の手順を授業中に行うようにしています。


### 今、必要のない知識を話さない。盛り込まない。

受講生側は、**覚えることに必死です**。
より多くの知識を話してしまうと、「そんなことも覚えなきゃいけないのか。。。😭」となりかねません。

例えば、
UILabel を扱う場合, 最初は、.text のプロパティさえ分かれば開発できます。
`nameLabel.text = "やまたつ"` ですね。
それなのに、「attributedText というプロパティもあって、こっちは〜」と言ってしまうのはよくないということです。
今は必要ではない知識を与えると混乱してしまいます。
できるだけ複雑化させないように努力しています👨‍💻

プログラミング学習では**遅延評価勉強法**が良いと思っています。
漠然と勉強するのではなく、**必要な時に必要なものを勉強する**ことが重要です。
> [勉強が苦手な人向けの「遅延評価勉強法」](http://blog.livedoor.jp/kensuu/archives/50555054.html)

前述の UILabel の話では、最初は .text プロパティだけ知ってるだけで十分です。
実装する時に、「色を変えたいな〜。フォントを変えたいな〜。アンダーラインひきたいな〜」と思った時に、 .textColor や、 .font 、.attributedText を勉強して使えるようになればいいです。
必要になるまでは最低限の知識だけを教えるようにしています。 


# 遷移の方法を限定する

以下のようなコードで遷移できるようにするために、
Storyboard ではなく xib を使っています（Storyboard が xib の上位互換だということは承知しています）


```Swift:FirstViewController.swift
let vc = SecondViewController()
present(vc, animated: true)
```

ここは賛否両論あると思いますが、できるだけスムーズに画面遷移ができるようにしたいと思っています。
Xib だと 「Cocoa Touch Class」からデザインファイルとコードファイルが同時に作成できるのも良い点です。

Storyboard の遷移はハマるポイントが多いため教えるのを辞めました。
（segue の id, storyboard の id, Is Initial View Controller のチェックのし忘れとか）
いろいろな現場を見てきましたが、一つの Storyboard で開発しているところはほぼありませんでした。
設定画面の**簡単な遷移**のところだけセグエを用いるというのはありましたが、ほとんどが 1Storyboard1ViewCotroller でした。
セグエでの遷移は紹介だけに留めておきました。

絶対に辞めた方がいい！！！と思う方はこっそり教えてください🙇‍♂️


### イメージしやすいようにする

以下は Oshidori というアプリの `View Hierarchy` です。
どのように描写されているかをイメージするためにこの画像を見せています。
例えば、`present` の処理で上に `ViewController` が重なっていることを見せたり、
`NavigationController` があるから横に遷移できたりすることを教えるために使っています。 

|階層|斜めから見た図|
|---|---|
|![貼り付けた画像_2019_12_18_午後11_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/213301cd-bde1-7728-4248-2e6daf59f7d0.png)|![貼り付けた画像_2019_12_18_午後11_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/b7f23551-3cf8-7614-56b8-d2d241c948cf.png)|

めちゃ勉強になります↓↓↓
[デバッグのためにView階層を把握する](https://qiita.com/akatsuki174/items/45d4bd7cb150defbf116)


# Slack で情報交換する
チャンネルは2つ作成し、`dev15xlab8`, `dev15xlab8_reference` を作成しています。
Slack はフロー型の情報交換ツールなので、フロー型とストック型のチャンネルを一つずつ用意しています。

Slack を使用することで、授業中に書いたコードや、参考になるサイトを簡単に提供できたり、質問もすぐに受けることができます。

また、Slack のスタンプ文化がとても好きなので絵文字を200個ほど新しく追加しました。笑
コミュニケーションが容易になり、フレンドリーになる効果もあると思います😆

[Slackの絵文字(emoji)を一括エクスポート＆インポートする](https://qiita.com/ne-peer/items/cbdef4f02b1bb6103e51)


# 参考にさせていただいた資料まとめ

- [ato-ichinen](https://www.softantenna.com/wp/review/ato-ichinen-chrome-extension/)
- [iOS開発初心者は何がわからないのか  わからないを言語化するヒント](https://note.mu/marina1017/n/n618f0198f622)
- [初心者がオリジナルのiOSアプリを開発できるようになるまで](https://qiita.com/justin999/items/986fe025331f077e453e)
- [Slackの絵文字(emoji)を一括エクスポート＆インポートする](https://qiita.com/ne-peer/items/cbdef4f02b1bb6103e51)
- [プログラミングを教えるときの10のポイント (という論文の紹介)](https://medium.com/@ukkaripon/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E6%95%99%E3%81%88%E3%82%8B%E3%81%A8%E3%81%8D%E3%81%AE10%E3%81%AE%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88-%E3%81%A8%E3%81%84%E3%81%86%E8%AB%96%E6%96%87%E3%81%AE%E7%B4%B9%E4%BB%8B-f3ba6ac40f37)
- [新入社員が来てメンターになれって言われたけど、どうすればいいのかという対話テクニック](https://qiita.com/hirokidaichi/items/2e8e731acfd7b6c7e02f)
- [初心者をメンターするときに覚えておきたい「忘れかけた初心者の頃の気持ち」と教訓12選](https://qiita.com/ynii/items/3233073ba18c438899e2)
- [新卒のトレーナーをするときの個人的まとめ](https://qiita.com/mad_khaki/items/eba0450c66fc59de2d1d)
- [未経験者にプログラミングを教えるとき](https://qiita.com/masatsugumatsus/items/ac7d94345bc21b4f8100)
- [初心者がオリジナルのiOSアプリを開発できるようになるまで](https://qiita.com/justin999/items/986fe025331f077e453e)
- [デバッグのためにView階層を把握する](https://qiita.com/akatsuki174/items/45d4bd7cb150defbf116)



# 第一回授業を終えて（2019/12/18加筆）

最初の方はとてもスムーズに話せたり、受講生も理解してくれて手を動かすことができて良かったです！
めちゃくちゃ準備したので嬉しかったです☺️

しかし、「遷移の方法を限定する」を教えていた時に受講生の顔が全員、はてな？に変わりました。。。
「`UINavigationCotroller` を持っているから、横に遷移できて、左上の「戻る」で戻れるんですよ！！！」
「`present` で次の画面がニョキって出てきます。」
（本当はもっと詳しく、View Hierarchy を使って説明した）

でも全然納得してくれる顔をしてくれず、怖すぎました。。。
みんながわかっていない顔をするとこっちも怖いもんなんですね。。。つらかった。。。心のダメージえぐかったです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">今日からiOSの講師をやらせてもらってるんだけど、教えるのがとても難しい。。。<br><br>相手がポカーンとしてた時の、心のダメージえぐい😇<br>伝わらないときに、噛み砕いて、たくさん例を見せれるようにしよう。<br><br>アプリを作れるようになってもらいたいので、わかりやすく伝えれるように頑張ろう。</p>&mdash; やまたつ(26)@Oshidori開発者_Swiftエンジニア (@ta__ta01) <a href="https://twitter.com/ta__ta01/status/1205785058038018049?ref_src=twsrc%5Etfw">December 14, 2019</a></blockquote>


## 受講生にフィードバックしてもらった👨‍🎓

全力で教えたいので、不満があるところは教えてもらって、次の授業に生かそうと思ってやりました。
匿名制度にしているので誰が書いたか分からないので素直な意見を書いてもらえます。
Google Form とても便利です。すぐにアンケート作れて、回答ももらえます！
「分かりやすい」と言ってもらえるのはとても嬉しい反面、受講生の「はてな？？？」の顔が脳裏に焼きついています😇
このフィードバックをもとに次の授業に取り組みます。

![スクリーンショット 2019-12-18 午後11.54.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/9b6a6a7d-5105-7136-3cac-0f6b2d257896.png)
![スクリーンショット 2019-12-18 午後11.54.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326574/4e633250-f302-4a52-3b93-2014aafb62c7.png)

## 次回の目標🚀
フィードバックを糧にして、コードの見やすさや、資料作成をもっと分かりやすくできるようにしていきます。
画面を大きくしたり、コードを見やすいようにしたりなどは自分ではできていると思っていましたが、受講生目線で見るとできていないんだなと痛感しました😭
まだまだ講師としての経験値も足りないので、どんどんフィードバックをもらってスキルアップしていこうと思います！！！
受講生の方が「自走できる」ようになることを目標に取り組んでいきます！


# 最後に
とても長い投稿になってしまいました！最後まで読んでいただきありがとうございました🙇‍♂️
講師の方や、後輩にプログラミングを教える方の参考になっていただければ幸いです！

ジーズでは講師やチューターを外部から雇っておらず、卒業生や関係者の方で行っております！！！
そのため、本気で教えるし、本気で考えて授業に取り組んでいます。
受講生も何か変わろうとして入校してくる方が多く、本気で授業に取り組み、質問も積極的にします。
受講生同士で切磋琢磨しています！

私も受講生の方から学ぶこともたくさんあり、お互いにWin-Winの関係で成長できていければと思っております！
気になった方は是非[ジーズ](https://gsacademy.tokyo/)に遊びに来てみてください😆

講師をするチャンスを与えてくれたジーズ運営にも感謝しています🙇‍♂️
ありがとうございました！！！