プログラミング学習で「何が分からないか分からない」ときに試してきた7つのこと

# はじめに
[Life is Tech ! Kanto Advent Calendar 2022](https://qiita.com/advent-calendar/2022/life-is-tech-kanto) の1日目を担当します、 Android メンターのどぎーです！

Life is Tech ! では、 Android アプリ開発を中心に中高生のメンターをしています。
また、カリキュラムの作成やメンターの研修の講師などもやっています。

大学2年生からメンターとして活動を始め、今年で4年目となりました。
4年間のメンター活動の中で、**プログラミング学習で最も大変なことの一つは、「何が分からないか分からない」という状況を乗り越えること**だと感じました。

![何が分からないか分からない.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933349/637c1125-2954-8024-ad8b-ced9485a11a0.png)

そこで今回は私自身の振り返りも兼ねて、**プログラミングを学び始めている方を対象**に「何が分からないか分からない」を解消するために試してきた7つのことをまとめていきます。

「プログラミング」という広く抽象的なワードを使用していますが、**一般的に適用できないこともあるかもしれません**。
また、**あくまで個人の経験に基づいた話**なので、「こういう考え方もあるんだ〜」と気楽に読んでもらえたらと思います。

この記事が少しでも、皆さんの「何が分からないか分からない」を解消するヒントになれば嬉しいです😌

それではよろしくお願いします🙌

# 紹介する7つのこと
今回紹介するのは以下の7つです。

1. 真似して動かす
1. とりあえず壊す
1. エラーを読んでみる
1. 検索してみる
1. 1次情報（公式ドキュメントなど）を読んでみる
1. 文法書を読んでみる
1. コードを読んでみる

「プログラミングを初めて学ぶ人」や「パソコンに慣れ親しんでいない人」を想定して、私なりに難易度や試してみる順序を考えて並べてみました。

各項目について、以下で詳しく整理していきます💪

# 1. 真似して動かす
当たり前かもしれませんが、やはり手を動かして学ぶことが大切だと考えています。
手を動かすと言っても何をすれば良いか迷ってしまうので、まずは真似して作って動かしてみるのが手軽で楽しいです😍

真似する対象をざっと挙げてみるとこんな感じでしょうか😚

- 公式のチュートリアル
- 作って学べる系の技術書
- Qiita などのネット上の記事
- YouTube などの動画教材

例えば、 Android アプリ開発だと [Android Basics in Kotlin](https://developer.android.com/courses/android-basics-kotlin/course) や [Android Basics with Compose](https://developer.android.com/courses/android-basics-compose/course) などの Pathway や Codelab が Google 公式からチュートリアルとして提供されています。

公式のチュートリアルは英語しか対応していなかったり、専門用語（そのプログラミングの分野では一般的に使われるワード）が出てきたりして難しい場合もあります。
そういった場合は、作って学べる系の技術書を試してみるのもオススメです。

真似して動かす上で大切なことは、

- 最初から理解しようとしない
- たくさん作る
- 「なんとなく分かるかも」くらいの理解度を目指す

ということです。

例えば以下のようなコードがあったとします。
これは Android アプリ開発におけるカウントアプリのコードの一部です。

![カウントアプリの一部.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933349/5efedb77-f55b-36f7-0ab3-cc923ace8372.png)

学習を始めたばかりの段階では「何が分からないのか分からない」のは当たり前です。
それにもかかわらず、コード1行1行を理解しようとして手が止まりがちです。
これでは学ぶことが苦しいし、長く続きません😩

そこで、よりラフにコードを眺めると、（多少の無理はありますが）以下のように抽象化できるはずです。
![詳細を一旦無視する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/933349/0f2b9db9-b0a8-9144-1367-7ca55e953341.png)

こう見てみると、まさに「なんとなく分かるかも」と思いませんか？

**学習を続ける上で大切なことは、プログラミングに無理なく触れ続け、楽しくのめり込むこと**だと考えます。
なので最初は無理に理解しようとせず、なんとなく分かるようになることに努めるのが良さそうです。
その過程で、**プログラミングの輪郭をぼんやりと掴めればまずは十分**だと思います。

# 2. とりあえず壊す
次に、真似して作ったものを壊してみましょう😎
壊すというのは、**少しだけコードを書き換えてみる**ということです。

先ほどのカウントアプリのコードを再掲します。

```kotlin
// 整数型の変数を宣言し、0で初期化する
var count: Int = 0

// ボタンを押した時の処理
binding.button.setOnClickListener {
    // 変数の中身を1増やす
    count += 1
    // 変数の中身を TextView に表示する
    binding.textView.text = count.toString()
}
```

たった5行のコードですが、コードを書き換えようとするとさまざまな疑問が浮かんできます。
例えば、

- 変数名を変えても同じ挙動をするでしょうか？
- 初期値を0を消してみたらどうなるでしょうか？
- `toString()` というメソッドを消してみたらどうなるでしょうか？
- そもそも変数とはなんでしょうか？
- 初期値とはなんでしょうか？
- メソッドとはなんでしょうか？

…などです。

お手本のコードを壊すのは怖かったり面倒に感じたりすることもあるかと思います。
ただ、その**お手本のレールを少し外れて初めて気づくこと・疑問に思うことばかり**なので、余裕があれば壊していきたいましょう👊
ただし、完全に壊れてしまうこともあるので、

- 少しずつ（まずは1行ずつ）変更する
- バックアップをとっておく

…などをしておくと安心です😆

# 3. エラーを読んでみる
コードを壊してみると、エラーが発生します。
学習を始めたばかりの頃は、エラーが怖いと感じるはずです。
しかしながら、**エラーは自分の書いたコードが動かないということを明確に示してくれる存在**です。

例えば先ほどのカウントアプリのコードを以下のように壊してみます。

```kotlin
// 整数型の変数を宣言し、0で初期化する
var count: Int = 0

// ボタンを押した時の処理
binding.button.setOnClickListener {
    // 変数の中身を1増やす
    count += 1
    // 変数の中身を TextView に表示する
    binding.textView.text = count // 💡: toString() を削除
}
```

すると以下のようなエラーが発生します。

```plaintext
Type mismatch.
Required: CharSequence!
Found: Int
```

とりあえず何を言っているのか分からないので翻訳してみます。

```plaintext
タイプの不一致です。
必須です。CharSequence!
見つかった。Int
```

どうやら、タイプとやらが不一致だそうです😇[^1]

[^1]: Kotlin には型という概念があります。
今回のエラーは、 `TextView` の `text` というプロパティに Int 型の値をセットしようとしたため、「型が一致していないよ」と指摘してくれています。

「これで何が分かるんだ！」という声が聞こえてきそうですが、とりあえず `toString()` を消すとエラーが起こるということは分かりました。
つまり、**エラーが発生してくれることでどうしたら動かなくなるのかが分かる**のです。

ここで言いたいことは、「エラーを理解して解決しよう！」ということではありません。
コードを壊して「エラーを起こしてみよう！」ということです。
エラーを起こしても何も失うものはないので、恐れることはありません🔥

これらを踏まえて大切なことは、

- エラーが起きたらとりあえずググる・翻訳する
- 直せたら自分を褒める🎉
- 直せなかったら戻す

ということです。

行き当たりばったりで遠回りに思えますが、これを**嫌にならない程度に繰り返すことで、少しずつお手本のレールから外れる**ことができます。
少しずつプログラミングの輪郭が鮮明になっていくはずです。

# 4. 検索してみる
これも当たり前かもしれませんが、分からない文法や専門用語が出てきたらとりあえず検索してみましょう。
ネット上には参考になる情報がたくさんあります。

検索するときには**知り得る限りの正しい専門用語を扱う**と、必要な情報に辿り着きやすくなるはずです。
エラーが発生したのであれば、エラー文をそのまま検索してみると手っ取り早いです。
例えば先ほどのエラーであれば、 `Kotlin Type mismatch` のような感じです。

学習を始めたばかりの段階では、その情報が正しいかどうかを判断することが難しいです。
したがってネット上の情報を扱うときには以下のような注意が必要です。

- いくつかの記事を読み比べる
- 公式以外の情報は、雰囲気を掴むために読む
- 最終的には公式ドキュメントで理解する
- できる限り新しい情報を参考にする[^2]

[^2]: 技術によってトレンドの変化の早さや廃れる早さが異なります。
学習を始めた段階ではその早さを判断することがそもそも難しいとは思いますが、新しいからと言って信頼して良いわけではないので、この注意に対しても注意が必要です😇

たくさんの情報があるからこそ、間違っている可能性もあります。
良くも悪くも、**公式以外の情報は食べ歩きする感覚で眺める**くらいがちょうど良いと思います。
その内容を丸っと理解しようとするのではなく、**次の情報（最終的には公式ドキュメント）に辿り着くために必要な専門用語を探す**ことが大切だと考えます。

# 5. 1次情報（公式ドキュメントなど）を読んでみる
先ほどから「公式」という言葉を使用してきましたが、「公式ってなんだよ！」と思う方もいるかもしれません。

ここで言う「公式」とは「**そのプログラミング技術を提供している存在**」や「**世間一般に広く認知されている存在**」のことです。
例えば Android アプリ開発においては、 [Google Developers](https://developer.android.com/) が提供しているドキュメントです。

実装したいことの大半は公式ドキュメントを読めば書いてあるとも言えますが、学習を始めた段階では読むのは難しい場合が多いです。

その理由として、

- 理解しておくべき前提知識が比較的多い
- 専門用語を専門用語で解説している
- 日本語の対応が遅れている場合もあり、英語を読む必要もある

…などがあります。

したがって、 [4. 検索してみる](https://qiita.com/Kaito-Dogi/items/e759d02b38c0822cd62e#4-%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B) で書いたように、**まずはとっつきやすい情報から眺めてみて、最終的に公式ドキュメントに辿り着くことができれば十分**だと思います。

ただ公式ドキュメントもエラーと同様に、**嫌にならない程度に目を通していけば、徐々に理解できる**ようになります。
最初から無理に理解しようとせず「読んでる自分かっけ〜！！」という気持ちで気楽に向き合いましょう😆

# 6. 文法書を読んでみる
続いては文法書です。

「このタイミング？！」と思う方もいるかもしれませんが、私としては文法書は、**プログラミングの雰囲気をなんとなく掴んだ状態で読むことで多くの気づきを得られる**と感じています。

Android の開発言語は Kotlin ですが、 私が読んだことのある Kotlin の文法書は『[Kotlinスタートブック](https://www.ric.co.jp/book/programming/detail/170)』と『[Kotlinイン・アクション](https://book.mynavi.jp/manatee/books/detail/id=86606)』です。
どちらの本も一度、そもそも序盤で理解できずに挫折してしまった苦い思い出があります。
ただ [1. 真似して動かす](https://qiita.com/Kaito-Dogi/items/e759d02b38c0822cd62e#1-%E7%9C%9F%E4%BC%BC%E3%81%97%E3%81%A6%E5%8B%95%E3%81%8B%E3%81%99) から [4. 検索してみる](https://qiita.com/Kaito-Dogi/items/e759d02b38c0822cd62e#4-%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%A6%E3%81%BF%E3%82%8B) を繰り返すうちに Android アプリプログラミングの雰囲気をなんとなく掴んでいき、ふと思い出して文法書を読み直すと、自然と理解できるようになったという成功体験もあります。

こうした経験やメンター活動を通じて、**人にはそれぞれそれを学ぶ適切なタイミングがある**ということを実感しました。

文法がなんとなく理解できてくると、コードを**より鮮明に**読めるようになります。
例えば先ほどのカウントアプリのコードを見直してみましょう。

```kotlin
var count: Int = 0

// 💡: インターフェースやラムダ式の観点
binding.button.setOnClickListener {
    count += 1
    // 💡: クラスやインスタンスの観点
    binding.textView.text = count.toString()
}
```

クラスやインスタンスが分かってくると、なぜ英単語と `.` （ピリオド）を繋げるのかが分かってきたり、インターフェースやラムダ式が分かってくると、 `setOnClickListener` そのものや、なぜこれに続いて `{ }` で処理を書けるのかが分かってきたりします。

文法の理解は [5. 1次情報（公式ドキュメントなど）を読んでみる](https://qiita.com/Kaito-Dogi/items/e759d02b38c0822cd62e#5-1%E6%AC%A1%E6%83%85%E5%A0%B1%E5%85%AC%E5%BC%8F%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E3%81%AA%E3%81%A9%E3%82%92%E8%AA%AD%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B) にも確実に役立ちます。

このように文法書を扱うときは、

- 適切なタイミングで**過度なストレスがかからない内容まで**読んでみる
- 時間を置いて読み直してみる

ことが大切だと思います。

これもエラーや公式ドキュメントと同様に、最初から全てを理解しようとせず、のんびり気楽に読み進めていきましょう。
**少し苦しいくらいの内容が適切な難易度**だと考えます。

# 7. コードを読んで見る
最後はコードを読んでみることです。
難易度が上がるため、ここでは軽く触れる程度に留めます🙏

まず、今まで触れてきた**コードを書くということはアウトプット**です。
したがって、コードに書くことに慣れたり、学んできたことを定着させるには適切だと考えますが、自分の書くコードに変化がなくなってきたり、自分が扱っている領域に留まって視野が狭くなったりすることもあります。

そこでコードを読むことで、コードを書くよりも広い視野でプログラミングに向き合い、書くというアクションに捉われずに学びや気づきを得ることができます。

「コードを読む」には少なくとも以下の２種類があると思います。

1. 公式の良質なコードを読む
1. コードレビューなどを通じて誰かが書いたコードを読む

### 7-1. 公式の良質なコードを読む
公式の良質なコードは、その時代のベストプラクティスを学んだり、ライブラリ・フレームワークといった便利な技術を扱うときに読むことになります。

日本語でドキュメントを読むのではなく、実際にコードを読んで動かしてはじめて扱えるようになるはずです。

### 7-2. コードレビューなどを通じて誰かが書いたコードを読む
誰かの書いたコードは、自分以外の誰かが書いたものもあれば、過去の自分が書いたものもあります。

自分が書くコードよりも良いコードに出会ったら、今の自分がただコードを書いているだけでは気づけなかった学びやヒントを得られるはずです。
また自分がより良いコードを書けた場合は、なぜそれがより良いのかを整理したり説明したりすることで、理解がより一層深まるはずです。

コードレビューに関しては、またどこかで文章にまとめようと思います😌

# まとめ
以上がプログラミング学習で「何が分からないか分からない」を解消するために試してきた7つのことでしたが、少しは役に立つヒントがありましたでしょうか？

今振り返ってみると、私自身たくさんの遠回りをしながらプログラミングを続けてきた気がします。
新しい概念や技術・用語を理解できなかったり、伸び悩んだり、次に何をすれば良いか分からなかったりと、さまざまな壁に直面してきました。
これから先もまだまだたくさんの壁にぶつかっては砕けると思いますが、より自由に柔軟にプログラミングを扱えるよう、気楽にやっていきます🚀

明日は Kenty による 『BTS の魅力について書いちゃうぞ』です！（なんだそりゃ😂）

BTS と言えば K-POP！
今年の紅白は [LE SSERAFIM](https://www.le-sserafim.jp/) と [TWICE](https://www.twicejapan.com/) と [IVE](https://ive-official.jp/) の出演が決まっていますね！！
めでたい！！！
ウンチェとツウィとガウルのパフォーマンスが楽しみです😍

体調に気をつけて、2022年の残りも駆け抜けましょう🏃‍♂️💨
それでは안녕〜👋