プログラミング初めて4年たったので学ぶ言語の選び方をまとめてみた。

# はじめに
私事ですが、プログラミングを小6に初めてから4年経ちました。プライベートの時間をほとんどプログラミングとゲームとTwitterに費やしてきました。プログラミングを考えない日はないですし、1週間に1回はプログラミングをやってきました。(最近はモチベーションの低下とやりつくした感で週1回すら怪しいですが)どうやら僕はプログラミングをやってるときもプログラミング言語を学んでるときの方が楽しいと感じるようで、`C` `C++` `C#` `Java` `JavaScript` `Kotlin` `Swift` `Rust` `Fortran` `Python`といろんな言語を学んできました。初期段階で挫折や必要がないと感じた言語もかじってはいるのでかなり多くの言語を学んできたつもりです。プログラミングの需要が高くなりプログラミングの学び方は確立してきましたが、一方で言語を選ぶという段階で失敗している人をよく見かけます。そこで、ここでは**僕の独断と偏見で**言語の選び方と言語の特色をまとめたいと思います。

最後に...自分はこう考えています。

**「プログラミング言語は習得することが目的のものではなく何か物を作るときの道具でしかない。」**

いつかプログラミング言語の習得が目的になってしまい何をやっているかわからなくなる人がいます。言語なのですから言葉が「ものを伝える手段」であるのと同じように「道具」でしかないと僕は考えます。

# 1. 言語の選び方
## 1.1. 需要で選ぶ
学校での授業や社会に出てからプログラミングスキルの需要というのは少なからずあります。その需要に合わせて選ぶこともあります。授業では`Python`や`C`を扱うところが多いのではないでしょうか。自分の高校も2020年夏に`Python`を学ぶ情報集中講座というものをやるみたいです。企業での需要はランキングが出ているのでぜひ調べてみてください。

## 1.2. 易しさで選ぶ
これがかなり多いです。正直おすすめはできません。簡単なプログラミングを習得してその先に展開ができないからです。遊びでやったり暇つぶし程度にはなりますが**プログラミングスキル**として定着するかどうかについては議論の余地があります。以下は個人的に初心者が学びやすい言語です。詳しい説明は[言語ごとの特徴](https://qiita.com/drafts/67d61514ccf0871a4249/edit#3-言語ごとの特徴)をご覧ください。

1. `Python` 年々需要が上がっている言語。初心者が多く学ぶ言語です。成果物(目に見えるアプリや機能)を制作するのが困難でだいたい飽きて終わります。

2. `JavaScript` Webサイトの制作に使う言語。Webサイトは難しいですがJS単体ではかなり学びやすいです。挫折する人はあまりいませんが成果物を作りにくく、Webサイト制作にステップを踏んだ際に挫折する人がいます。

3. `Java` 自動運転から時計までなんにでも使われている言語。`Androidアプリ`や`DVDプレイヤー`に使われてることがおおく、目に見えて成果物を作れます。主軸の言語なので難しいですが応用が利きます。

## 1.3. 人気で選ぶ
人気がある言語であれば比較的需要もありますし、コミュニティも大きいです。非常に学びやすいと思います。ただ、新しいことをやりたかったり輝きたかったりする人は逆にやりにくい可能性はあります。

## 1.4. スキルで選ぶ
獲得できるスキルで選ぶ方法もあります。自分はこれでした。明確な目的や目標がなくプログラミングをガチでやりたい人にお勧めです。具体的に言うと、難しい言語を選ぶと後々楽ができます。例えば`C`言語はかなり難しいですがプログラミング言語の根幹をなしていることが多いので学んでおけばかなり他の言語の習得が簡単になります。詳しい説明は[言語ごとの特徴](https://qiita.com/drafts/67d61514ccf0871a4249/edit#3-言語ごとの特徴)をご覧ください。

## 1.5. やりたいことで選ぶ
基本的に言語の選び方はこれになります。自分もプログラミングを学びたいと相談されたときにまず、「何がしたいの？」と聞きます。何がしたいのかわからなければ言語は決められないのです。プログラミング言語の習得は目的ではなく道具なのですから。以下にやりたいことを実現するにはどの言語を学べばいいか記しておきます。

### 1.5.1. アプリを作りたい
`AndroidOS`の場合は`Java`または`Kotlin`
`iOS`の場合は`Swift`または`Object-C`

`iOS`の開発の場合は`MacOS`が必須になります。結構高いので財布と相談ですね。また、`AndroidOS`は2019年5月くらいまで`Java`が推奨だったのですが今では`Java`と完全に互換性を持つという`Kotlin`が推奨になっています。そして`Object-C`はほとんど使えません。

### 1.5.2. ソフトを作りたい
`Winodws`の場合は`C#`
`MacOS`の場合は`Swift`または`Object-C`

僕の場合、パソコンのアプリケーション(ソフトウェア)のことをソフト、スマホのアプリケーションのことをアプリと言ってます。上と同様に`Object-C`はほとんど使えません。

### 1.5.3. ゲームを作りたい
`C#`または`JavaScript`

2Dゲームであれば正直なんでもつくれますが(Excelでゲーム作ってました)、3Dとなれば`Unity`というソフトがほぼ必須だと思います。会社が作るようなゲームは無理でも簡単なゲームが作れます。使用言語は`C#`または`JavaScript`です。どちらでもいいのですが`Unityライブラリ`を使用するので`Unity`を動かしながら学ぶがいいと思います。たしか`C#`推奨のような気がする。

### 1.5.4. 競技プログラミングがしたい
`C++`または`Python`

与えられた問題に対してプログラミングで答えを出す競技プログラミングというものがあります。競技性が高く、プログラミングスキル以上に競プロ特有の頭の回転と少々の数学力が必要になります。プログラミングのスキルを図る道具としてなぜか定着しており、一部のプログラマは[AtCoder](https://atcoder.jp/?lang=ja)というサービスのレートと400ごとに変わる`色`で競い合っています。ちなみに自分は水色です。このレートやアルゴリズム検定の成績を見て採用する企業もあり、就活にも有効そうです。ほとんどの言語をサポートしていますが、速さなのが求められるので`C++`がよく使われます。なぜか最近、解説が`Python`になったり、同級生がこぞって`Python`で喧嘩売ってきたりしていますので実行速度が遅いといわれてきた`Python`でもいいのかもしれません。

### 1.5.4. (ビッグ)データ処理や機械学習をしたい
`Python`

最近かなりマイブームです。ビッグでなかろうとデータ処理、回帰分析、深層学習、ニューラルネットワーク、CNNなどには`Python`です。これ以外ない。むりろこのためだけの言語とさえ言えます。`Pandas`や`Numpy`といったデータ処理ライブラリや`Tensorflow`や`Keras`といった機械学習ライブラリなどが豊富でコミュニティも大きく情報収集が容易です。

### 1.5.5. いろいろしたい/最強になりたい
`C`または`Rust`

先に`C`をやったほうがいいですね。いろいろやった後、詰まったら`Rust`というかんじですかね。両方、**クソ難しいです**。メモリ管理が必要だったり手続き型言語ということだったりで「苦しんで覚えるC言語」(略:くるしー)という本が出てるほどです。コンピュータの`ビット`など細かいことを理解する必要があり、**完璧にしようとすると**かなり難しいです。ただ、`C`をマスターしてしまえば他の言語に触れたときに「あー！Cだと実装しないといけないけど必要ない！」となって全部楽になります。これは僕の体験なので本当です。さらに、`Rust`ではメモリ管理に変数のスコープ(有効期限)管理、変数権限管理が必要になり相当難しいです。

### 1.5.5. その他
ちょっと思いつかなかったです。何かあればコメントで教えてください！

# 2. 閑話休題
閑話休題ということで少し自分語りをしたいと思います。

自分は小6でプログラミングを始めました。受験後の暇つぶしというのもありますが、父親がSEなのであこがれたのかもしれません。とりあえず`C`言語をやってみろと言われて休日に教えてもらえるようになりました。それに飽き足らず、中学生になると平日にパソコンを付けて独学するようになりました。学習は軌道に乗って時々のエラーの解消にのみ父を呼ぶようになり、学ぶ面白さとエラーを解消するために何日も考えたり面白さに取りつかれ、いつの間にかアプリを作りたいと`Java`を学び、名前が似てるから`C++`や`C#`を学び...。父が出る幕はなくなっていきました。父はAndroidのSEだったのでAndroid全般について学習させてもらい、中2は日々Androidアプリを作っては自分で使ってました。中3初めにある学園祭では若干中3で学園祭Androidアプリを一人で作りました。(代々5人で作っていたそうです)直後にそのスキルを駆られ学校中からオファーが来ました。「サクラの開花予想研究」「ビジネスコンテストのビジネス案のデモ制作」「学園祭のシフトを統一するシステム」「ミニロケットの制御プログラム」などと実に多いです。2020年はCOVID-19によりいろいろなものがリモートになったおかげで学園祭のアプリとシフトは完全になくなりましたが、リモート環境の整備やサイトの制作などの仕事が舞い込んできました。


さて、高1の春に自分の成長を感じる出来事がありました。`C#`を書いてるつもりが`C++`を書いているなんてことがあったのです。一見するとただの勘違いですが、自然言語に言い換えるとわかると思います。

イタリア語しゃべってるはずがドイツ語をしゃべってて伝わらなかった。

言語の堺がなくなり、どんな言語でも書けるようになったということができます。本来は英語をしゃべるときに日本語からモードを切り替えるように頭の切り替えが必要ですがその切り替えが必要なくなったということなんです。それを意識してプログラミングをしてから「プログラミング言語」の本質は変わらないということに気づき、驚愕したわけです。僕が本当にプログラミング言語を「道具」として習得した証拠でした。

# 3. 言語ごとの特徴
自分が学んだことがある、かじったことがある言語を**独断と偏見**で解説します。**異論認めます**。

おススメ度：自分がどれほど学んでほしいと思うかを表せています。★1~★5。
レベル：難易度です。簡単<ふつう<難しいで評価してます。'+'や'-'は各難易度の間を3つに区切っています。
おススメOS：新しくパソコンを買う場合は参考にしてください。
おススメ環境：プログラミングするにあたって必要なソフトなどのことを「環境」といいます。参考にしてください。

各言語の説明のあとに「`Hello, World 2020`と画面に出力」するソースコードを載せときます。なんかの参考になると思います。
## 3.1. C言語
>おススメ度：★★★★★
レベル：難しい
種別：手続き型言語
おススメOS：Windows Mac Linux
おススメ環境：Visual Studio

ほとんどすべての言語に影響を与えた元祖てきな存在。この言語やっとけば上達は早くなります。ただ、マスターするにはとても難しいです。マスターしたい方は「苦しんで覚えるC言語」という本がおすすめです。成果物を作るのが難しく、スキルを実感できないのが欠点です。Linuxのカーネル(OSのコア)を構成してる言語で自作OSに自分は使いました。

```c:HelloWorld.c
#include <stdio.h>

int main() {
  int i = 2020;
  printf("Hello, World %d", i);
}
```

## 3.2. C++
>おススメ度：★★★☆☆
レベル：簡単++
種別：手続き型言語、オブジェクト指向言語
おススメOS：Windows Mac
おススメ環境：Visual Studio

C言語にオブジェクト指向をはじめとしたさまざまな機能を追加した言語。C言語で使われるライブラリに加えてC++特有のライブラリもあり、使いやすいイメージはありますがC言語と同様に成果物を作るのは困難です。競技プログラミングでよく使われている言語なので学んでおいて損はないです。

```c++:HelloWorld.cpp
#include <iostream>
using namespace std;

int main() {
  int i = 2020;
  cout << "Hello, World " << i;
}
```
<h2>3.3. C#</h2>
>おススメ度：★★☆☆☆
レベル：簡単+
種別：オブジェクト指向言語 イベント駆動指向型
おススメOS：Windows
おススメ環境：Visual Studio

`Java`に対抗してマイクロソフトが出した言語です。言語にとらわれないフレームワーク(システム構造体)の「.NET Framework」と一緒に使うことが多いです。`Java`と結構似てます。Windowsソフトの制作に使われ、個人的にはファイル関連のライブラリが使いやすく、Javaより癖がなくプログラミングできる気がしてます。イベント駆動指向(イベント(=きっかけ)を感知してプログラムを動かすこと)が強く画面のボタンとの関係性(このイベント時にこうなるということ)を頭に入れとかないと混乱してしまいます。また、`Unity`で使うこともあります。

```c#:HelloWorld.cs
using System;

namespace HelloWorld {
  class Program {
    static void Main(string[] args) {
      int i = 2020;
      Console.WriteLine("Hello, World " + i);
    }
  }
}
```
久しぶりすぎてあってるかわからない...

## 3.4. Java
>おススメ度：★★★★☆
レベル：ふつう+
種別：オブジェクト指向言語
おススメOS：Windows Mac
おススメ環境：Eclipse / Android Studio

世界中で使われてる言語。なんでも作れるイメージがあります。メインのプログラミング言語のなので一回は学んだほうがいいでしょう。癖はないですが、`継承`や`実装`といった強めのオブジェクト指向についていけないと成果物を作るのは難しいです。コミュニティもたぶんプログラミング界隈最大なのではないでしょうか？ただ、柔軟性はないです。環境は`Eclipse`を使うことが多いですが、Androidアプリを作るときは`Android Studio`や`Flutter`を使いましょう。

```java:HelloWorld.java
class HelloWorld {
  public static void(String[] args) {
    int i = 2020;
    System.out.println("Hello, World " + i);
  }
}
```
こうみるとC#とそっくりですね...
## 3.5. Python
初めに断りますが、**自分はアンチではありません**。


>おススメ度：★☆☆☆☆
レベル：簡単
種別：オブジェクト指向言語
おススメOS：Mac Linux Windows
おススメ環境：GoogleColaboratory / PyCharm / Jupyter Notebook / Python / Anaconda

近年人気がある言語です。もともとは対話型プログラミング言語といって命令をコマンドプロント(ターミナル、端末)で一行ずつ実行するような言語です。計算が得意なのでデータ処理や機械学習等に使われます。また、プログラムの文法がBASICという古代の言語に似ていたり、可読性が高まっていたり、他の言語に比べて短く記入できます。ここからは私見なのですが、Pythonをやってしまうとほかの言語が難しく思えてしまって簡単な反面、応用性はありません。プログラミングの楽しみは複雑なものを読み解くことにあると思うのです...なので最近の`Python`ブームに不機嫌だったりしますwそんな僕ですが、データサイエンスを学んでいるのでかなりお世話になってるのは事実です。型という概念が`type`というものになり型推論されます。

環境は比較的多く、コマンドでプログラミングする`Python`からネットで本格的なプログラミングができる`Google Colab`や`Jupyter Notebook`があります。WindowsOSでやるときはサイト以外に`Anaconda`があります。個人的には`Pycharm`をお勧めします。

```python:HelloWorld.py
i = 2020
print("Hello, World " + str(i))
```
たぶんこうですね。型推論(`int i`が`i`だけでok)はあるのに数字の自動文字結合(数字を文字とくっつけると文字になる)はないんですよね...
また、`{}`や`;`が要らない反面、インデント(字下げ)でソースコードを動かすのできれいなコードを書かなくてはなりません。

## 3.6. JavaScript
>おススメ度：★★☆☆☆
レベル：ふつう
種別：オブジェクト指向言語
おススメOS：Winodws Mac Linux
おススメ環境：なんでもいい / Google Apps Script

Javaとは別のものです。Javaの派生でもなんでもなく、成功したJavaの名前をかりて縁起をよくしただけです。単体で使うことは競技プログラミング意外ほとんどなく、だいたいWebサイトに使います。画面は`HTML`と`CSS`を使い、動きや処理の部分は`JS`を使います。それが原因か、無記名関数やラムダ式を多用しなければならず、きれいな記述を心掛けないと何が何だかほんの1分でわからなくなります。(経験済み)Webサイト以外では`Google Apps Script`で`GoogleAPI`(スプレッドシートやメール)を利用するときにも使います。**なにかアプリやソフト、成果物のわき役**として登場します。`JSON`(データ記法の一種)との相性が(そもそもJSONはJSのためのものだったりするので)非常によく、JSONの処理に僕は使ってます。また、Pythonと同様に型推論がありますが、`var`を書かなくてはならないのでわかりやすいです。

```javascript:HelloWorld.js
var i = 2020;
console.log("Hello, World " + i);
```
JS単品で使うことなんてないのでなんか新鮮です。

## 3.7. Kotlin
>おススメ度：★★★☆☆
レベル：難しい-
種別：オブジェクト指向言語
おススメOS：Winodws Mac
おススメ環境：Android Studio

`Android`アプリ制作用です。`Java`と非常に高い互換性を持ちます。`Java`で書いたソースコードと`Kotlin`のソースコードを混在させても普通に大丈夫です。それだけならいいのですが、`Java`と全く違う文法で書きやすくなっています。Androidを作っている`Google`と`Java`を作った`Sun`という会社を買収して今の所持者である`Oracle`との裁判の情勢が`Google`側の不利になったのか何なのか知りませんが、`Java`に変わる言語を作ったみたいです。2019年5月ごろに`Androidアプリ`の制作に`Kotlin`を推奨するようになりました。モダンな雰囲気で後述の`Swift`に似てる感じがします。`JS`と同じような型推論がありますが明記することもできます。これからの普及に期待ですね。

```kotlin:HelloWorld.kt
fun main(args: Arrary<String>) {
  var i = 2020
  println("Hello, World " + i)
}
```
`Java`を学んでから`Kotlin`に来た身としては感動でしかありません。

## 3.7. Swift
>おススメ度：★★★☆☆
レベル：難しい-
種別：オブジェクト指向言語
おススメOS：Mac
おススメ環境：Xcode

`iOS`アプリ、`Mac`ソフト用の言語です。`C`言語に毛をはやした`C++`みたいな`Object-C`を昔使っていたAppleですが、一気に`swift`になりました。Appleのアプリもソフトも作れます。個人的に`Kotlin`と雰囲気が似てる気がしなくもないのですがどうなんでしょう。「何もない」を表す`nul`(他の言語では`null`だったり`nan`だったり)に非常に厳しく、明記しない限り`nul`を生まないという執着ぶりです。

```swift:HelloWorld.swift
// 省略
var i = 2020
println("Hello, World " + i)
// 省略
```
単体だとコマンドで実行することしかできないみたいで、アプリとして書かないといけないことがあるので省略させていただきました。`Kotlin`と完全一致ですね。

## 3.8. Rust
>おススメ度：★★★★☆
レベル：難しい++
種別：手続き型言語
おススメOS：Windows Mac
おススメ環境：Visual Studio

`C`や`C++`に変わる言語。二つの言語をしのぐほどの安全性をもって高速な実行が可能。正直、何に使うのかわかりません。他の言語で明確に意識しなくていい式と文の違いを理解するところから始まり、編集権限やその譲渡、他の言語にないスコープ(変数の利用可範囲)の仕様など...実に癖の強く難しい言語です。メモリの管理を常に考えなくてはいけないので単純にスキルが爆上がりします。

```rust:HelloWorld.rs
fn main() {
  let mut i = 2020;
  println!("Hello, World {}", i);
}
```
これぐらいなら問題はないんですけどね...

## 3.9. Fortran (FORTRAN)
>おススメ度：★☆☆☆☆
レベル：難しい+
種別：手続き型言語
おススメOS：Windows Mac Linux
おススメ環境：gfortran(?)

世界初のプログラミング言語です。え？え？の連発です。現在使ってるソフトはないと思います。大学の研究制御システムなどで変えるお金と技術力がなくて使ってるところはあるかもしれません。また、ハード(パソコンなどの部品)には`C/C++`と一緒に使われているそうです。最古ということで学んではみましたが、学ぶ必要はないと思います。参考文献も少ないですからね。

```fortran:HelloWorld.f90
program test
  use,intrinsic :: iso_fortran_env
  implicit none
  character(4) :: str_year
  integer,parameter :: year = 2020
  write(str_year, '(I4)') year
  print *, "Hello, World "//trim(str_year)
end program test
```
合ってる...と思います

# さいごに
初心者に少しでも助けになればなと思ってこの記事を書きました。知ったかぶりなところやわかりにくいところ、自分語りが過ぎるところが多々あると思いますが、温かい目で見守っていただければなと思います。プログラミングに挫折したりする人が一人でも少なくなって、世界に負けないIT国家になってほしいと願うばかりです。この記事が役に立てたら幸いです。質問等がございましたらコメント等に書いてください。

Twitter→https://twitter.com/CyberHacnoshuke