プログラミング言語をそこそこ分かるようになるための学習過程

## はじめに
私が実際にプログラミング言語を学ぶ際の過程をまとめてみました。
私はプログラミングを初めたときは最初にC言語を学び、その後にPythonを学びました。
その後JavaScript(TypeScript)を学びましたが、まだまだ知らない言語がたくさんあります。
このような人がどのように新しい言語を「そこそこ分かるまで」にどう学ぶのかをまとめてみました。

よく使う言語: Python, JavaScript(TypeScript)
そこそこ知ってる言語: C, Swift, Java, PHP, R
触ったことがある程度の言語: Elm, Flutter, Go, Rust, C++, Ruby

私はWebエンジニアなので、よく使う言語がWeb開発に使われる言語が多いですね..

0から学ぶというよりかは、既にプログラミングを学んでいる人が新しい言語を学ぶ際の過程かもしれないです💦

## 「そこそこ分かるようになる」の定義
私が思う「そこそこ分かるようになる」とは、以下のようなことです。
- その言語のif文やfor文などの基本的な文法を理解している
> 完全に覚えていなくても、調べながら書けるのであればOK
- その言語で簡単なプログラムを書ける
> 例えば、FizzBuzz問題が解ける、簡単なアプリが作れるなど
- その言語の文法を調べる際に、公式ドキュメントなどの記事を読んで理解できる
> 例えば、公式ドキュメントに書かれているクラスやメソッドの説明を読んで利用できる
- その言語のエラーメッセージを読んで、エラーの原因を特定して修正できる(文法エラーなど)
> 例えば、エラーメッセージを読んで、Stack Overflow[^stackoverflow]などで調べて修正できる
- その言語を取り巻くエコシステムをざっくり理解している
> 例えば、パッケージマネージャーやLintツールなど
- その言語で使える外部ライブラリやフレームワークをざっくり使える
> ライブラリの追加や使い方を調べて使える

## 今回新しく学ぶ言語の選定
定義が済んだので、実際に学び始める言語を選定します。
言語ごとに特性がありますので、その特性を活かして学びたい言語を選びます。
例えば、Web開発をしたいのであれば、「Web開発言語　シェア」などと調べて出てきたJavaScript, PHP, Python, Ruby等を学ぶのが良いでしょう。
就活をしているのなら、「求人数の多いプログラミング言語」と調べて求人数が多い言語を学ぶのが良いでしょう。
ゲーム開発であれば、ゲーム開発でよく使われる言語を調べて学ぶのが良いでしょう。
また、業務で使う言語を学ぶのも良いでしょう。

私の場合は、業務でWeb開発をしており、新たにRubyで書かれたアプリケーションを触ることになりました。
そのため、Rubyを学ぶことにしました。

## 「そこそこ分かるようになる」までの学習方法

### 予備知識を整える
兎にも角にも、その言語はどんなものなのかを知っておくことが重要です。
まず「プログラミング言語　Rubyとは」で検索してみます。

wikipediaを見ると、Rubyは以下のような特徴があることがわかります。
> Ruby（ルビー）は、まつもとゆきひろ（通称: Matz）により開発された、簡潔な文法が特徴的なオブジェクト指向スクリプト言語。
日本で開発されたプログラミング言語としては初めて国際電気標準会議（IEC）で国際規格に認証された事例となった。

:::note info
🦔 < なるほど...
:::

利用用途についても調べてみます。
> アプリケーションサイト・WebAPIの開発ができる・スクレイピングができる・スマホアプリ・機械学習

:::note info
🦔 < スマホアプリ..?とりあえず、シンプルな文法でWebアプリとかが作れるのか‼︎
:::

実際にどんなものが作られているかをみたい場合はawesome-⚪︎⚪︎で検索してみると良いです。

https://github.com/markets/awesome-ruby


### 簡単なプログラムが書けるようになる
#### 実行環境の整備
まずは、パソコンでRubyが動く環境を整えます。書き忘れていましたが、私はMacを使っているので全てMacでの話になります。
RubyはMacにはデフォルトで入っていることが多いですが、Macに直接Rubyをインストールせずに仮想環境[^env]を使ってRubyを使うことにします。

「仮想環境構築 Ruby」で検索したら、Progateの記事がヒットしました。良さそうですね。

https://prog-8.com/docs/ruby-env

これに従って、Rubyの仮想環境を構築をできますが、私は`asdf`を使ってRubyをインストールすることにしました。詳細については別の記事で書いています。

https://qiita.com/EveSquare/items/7d0d4c122f055aed63ae

:::note info
🦔 < Rubyを実行する環境が整ったぞ
:::

#### 基本的な文法を学ぶ
ここまできたら、Rubyの基本的な文法を学びます。
「Ruby 入門」と検索して有用なリソースがないか探してみます。
Try Rubyというサイトがあるのを見つけました。
これで学ぶことにします。詳細は以下の別記事で書いています。

https://qiita.com/EveSquare/items/89c9d73020f52fc10421

#### 簡単なプログラムを書いてみる✅
Try Rubyで学んだことを元に、簡単なプログラムを書いてみます。

<details><summary>簡単なプログラム Hello, World!</summary>

超ベーシックなプログラムでどの言語でもまず書くのが「Hello, World!」です。
手っ取り早く実行してみましょう。

```rb:hello.rb
puts 'Hello, World'
```

```shell
$ ruby hello.rb
```

</details>

<details><summary>簡単なプログラム FizzBuzz</summary>

まず、FizzBuzz問題を解いてみます。
FizzBuzz問題とは、以下のような問題です。
- 3で割り切れるときは「Fizz」を出力
- 5で割り切れるときは「Buzz」を出力
- 両方で割り切れるときは「FizzBuzz」を出力
- 1から100までの数字で実施

最終的な出力は以下のようになります。
```
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
...
```

四則演算とfor文、if文、print分を使って解くことができます。
実装例としては以下のようになります。

```ruby:fizzbuzz.rb
(1..100).each do |i|
  if (i % 3).zero? && (i % 5).zero?
    puts 'FizzBuzz'
  elsif (i % 3).zero? # 3の倍数のとき
    puts 'Fizz'
  elsif (i % 5).zero? # 5の倍数のとき
    puts 'Buzz'
  else # それ以外のとき
    puts i
  end
end
```

```shell
$ ruby fizzbuzz.rb
```

実際に実行して想定通りの出力がされるか確認してみましょう。

</details>

<details><summary>簡単なプログラム CLI Todoアプリ</summary>

CLIで動くTodoアプリを作ることで、クラスやファイル操作などを学ぶことができます。
簡易的に以下の機能を持つTodoアプリを作ってみます。
- `a タスク名`でタスクの追加
- `l`でタスクの一覧表示
- `d タスク番号`でタスクの削除
- `q`で終了

</details>

### 公式ドキュメントを読んで理解できるようになる✅
全部読む必要はないですが、基本的な文法やクラス、メソッドの説明を読んで理解できるようになると良いです。
便利な機能や簡素に記述できる機能を知ることができます。
例えば、Rubyの公式ドキュメントを読んでみると、`times`メソッドがあることがわかりました。

https://docs.ruby-lang.org/ja/latest/method/Integer/i/times.html

`times`メソッドは、指定された回数だけブロックを繰り返すメソッドです。
これを使うことで、以下のようなコードを簡素に書くことができます。

```ruby
# 3回Hello, Worldを出力
3.times do
  puts 'Hello, World'
end
```

「ruby docs[^docs]」等で検索すると、Rubyの公式ドキュメントが見つかります。

https://docs.ruby-lang.org/ja/latest/library/index.html


### エラーメッセージを読んで修正できるようになる✅

エラーメッセージを読んで、エラーの原因を特定して修正できるようになることが重要です。
先ほど書いたFizzBuzzの問題で、このようなコードを書いて実行してみるとします。

```ruby:fizzbuzz.rb
(1..100).each do |i|
  if (i % 3).zero? && (i % 5).zero
    puts 'FizzBuzz'
  elsif (i % 3).zero? # 3の倍数のとき
    puts 'Fizz'
  elsif (i % 5).zero? # 5の倍数のとき
    puts 'Buzz'
  else # それ以外のとき
    puts i
  end
end
```

するとこのようなエラーが出ます。
![スクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403148/5798e4c9-db1e-111e-5391-8cf1556935fd.png)

エラー文をちゃんと読むと`Did you mean?  zero?`と書かれていて該当箇所もしっかりと指摘されていますので、そこを確認して修正します。
エラーの原因は、`(i % 5).zero`の部分で、`?`が足りていなくて文法エラーになっていることがわかります。
`(i % 5).zero?`に修正して再度実行すると、正常に動作することが確認できます。
また、エラー文を読んだだけでは分からないことがしばしばあります。今回の例はエラー文を読んだだけで大体理解できましたが、分からなかった前提で「Ruby Did you mean?  zero?」と検索すると、このエラーについての情報が見つかります。
上から5番目くらいに以下の記事がヒットしました。

https://techracho.bpsinc.jp/hachi8833/2023_05_10/129166
>Ruby: 数値のゼロチェックには'== 0'よりも'zero?'メソッドを使おう（翻訳）....

ということで、`zero?`メソッドを使うべきだということがわかりました。

### エコシステムをざっくり理解する✅
Rubyにどんなパッケージマネージャーがあるか、どんな外部ライブラリがあるか、どんなフレームワークがあるかをざっくり理解します。
「Ruby パッケージマネージャー」で検索してみると、`bundler`というパッケージマネージャーがあることがわかりました。

https://qiita.com/daiti0113/items/45bb862625c898d3bc51

`bundler`を導入して、ライブラリの追加やバージョン管理ができることがわかりました。
`Gemfile`というファイルにライブラリの依存関係を書いて、`bundle install`でインストールできることがわかりました。

https://zenn.dev/yuuuuu/articles/59689369aec8f0

### 外部ライブラリやフレームワークをざっくり使えるようになる✅

Webサイトのスクレイピングを試してみたかったので、`selenium`というライブラリを使ってみました。
先ほどの`bundler`を使って、`Gemfile`に`selenium-webdriver`を追記して`selenium`インストールして、スクレイピングを試してみました。
試したことの詳細は以下の記事に書きました。

https://qiita.com/EveSquare/items/67c6a3be7116b5d44c34

## そこそこ分かるようになるまで
以上のような学習方法で、新しいプログラミング言語を学ぶことができます。
ここまで来れば、ある程度のプログラムを書くことができるようになると思います。
プログラミング言語を学ぶことで、他の言語の学習もスムーズになります。
実はプログラミング言語を学ぶ力というのは、検索力や読解力が重要になってきます。自力で調べて、自力で解決することで問題解決能力が身につきます。
また、問題の壁に当たったときに、萎縮して挫折せずに、その壁を乗り越えるために努力することが大切です。

## おわりに
様々なプログラミング言語に触れることで見えてくるものがあると思います。
新しい言語を学ぶことで、自分のプログラミングスキルが向上することは間違いありません。


[^stackoverflow]: Stack Overflowは、プログラミングに関する質問と回答のやり取りができるサイトです。エラーが出たときなどにエラー内容をGoogleで検索すると上位の方にヒットするサイトです。
[^env]: 仮想環境とは、自分のパソコンに他のOSやプログラムをインストールせずに、仮想的な環境を作ることです。これによりバージョンの管理や他のプログラムとの干渉を防ぐことができます。
[^docs]: ドキュメントのことです。英語でdocumentsなのでdocsと略すことがあります。公式ドキュメントは、その言語やライブラリの開発者が書いたドキュメントのことです。公式ドキュメントを読むことで、その言語やライブラリの使い方や仕様を知ることができます。