はじめに
私事ですが、プログラミングを小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. 易しさで選ぶ
これがかなり多いです。正直おすすめはできません。簡単なプログラミングを習得してその先に展開ができないからです。遊びでやったり暇つぶし程度にはなりますがプログラミングスキルとして定着するかどうかについては議論の余地があります。以下は個人的に初心者が学びやすい言語です。詳しい説明は言語ごとの特徴をご覧ください。
-
Python
年々需要が上がっている言語。初心者が多く学ぶ言語です。成果物(目に見えるアプリや機能)を制作するのが困難でだいたい飽きて終わります。 -
JavaScript
Webサイトの制作に使う言語。Webサイトは難しいですがJS単体ではかなり学びやすいです。挫折する人はあまりいませんが成果物を作りにくく、Webサイト制作にステップを踏んだ際に挫折する人がいます。 -
Java
自動運転から時計までなんにでも使われている言語。Androidアプリ
やDVDプレイヤー
に使われてることがおおく、目に見えて成果物を作れます。主軸の言語なので難しいですが応用が利きます。
1.3. 人気で選ぶ
人気がある言語であれば比較的需要もありますし、コミュニティも大きいです。非常に学びやすいと思います。ただ、新しいことをやりたかったり輝きたかったりする人は逆にやりにくい可能性はあります。
1.4. スキルで選ぶ
獲得できるスキルで選ぶ方法もあります。自分はこれでした。明確な目的や目標がなくプログラミングをガチでやりたい人にお勧めです。具体的に言うと、難しい言語を選ぶと後々楽ができます。例えばC
言語はかなり難しいですがプログラミング言語の根幹をなしていることが多いので学んでおけばかなり他の言語の習得が簡単になります。詳しい説明は言語ごとの特徴をご覧ください。
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というサービスのレートと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に自分は使いました。
#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言語と同様に成果物を作るのは困難です。競技プログラミングでよく使われている言語なので学んでおいて損はないです。
#include <iostream>
using namespace std;
int main() {
int i = 2020;
cout << "Hello, World " << i;
}
3.3. C#
>おススメ度:★★☆☆☆ レベル:簡単+ 種別:オブジェクト指向言語 イベント駆動指向型 おススメOS:Windows おススメ環境:Visual StudioJava
に対抗してマイクロソフトが出した言語です。言語にとらわれないフレームワーク(システム構造体)の「.NET Framework」と一緒に使うことが多いです。Java
と結構似てます。Windowsソフトの制作に使われ、個人的にはファイル関連のライブラリが使いやすく、Javaより癖がなくプログラミングできる気がしてます。イベント駆動指向(イベント(=きっかけ)を感知してプログラムを動かすこと)が強く画面のボタンとの関係性(このイベント時にこうなるということ)を頭に入れとかないと混乱してしまいます。また、Unity
で使うこともあります。
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
を使いましょう。
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
をお勧めします。
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
を書かなくてはならないのでわかりやすいです。
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
と同じような型推論がありますが明記することもできます。これからの普及に期待ですね。
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
を生まないという執着ぶりです。
// 省略
var i = 2020
println("Hello, World " + i)
// 省略
単体だとコマンドで実行することしかできないみたいで、アプリとして書かないといけないことがあるので省略させていただきました。Kotlin
と完全一致ですね。
3.8. Rust
おススメ度:★★★★☆
レベル:難しい++
種別:手続き型言語
おススメOS:Windows Mac
おススメ環境:Visual Studio
C
やC++
に変わる言語。二つの言語をしのぐほどの安全性をもって高速な実行が可能。正直、何に使うのかわかりません。他の言語で明確に意識しなくていい式と文の違いを理解するところから始まり、編集権限やその譲渡、他の言語にないスコープ(変数の利用可範囲)の仕様など...実に癖の強く難しい言語です。メモリの管理を常に考えなくてはいけないので単純にスキルが爆上がりします。
fn main() {
let mut i = 2020;
println!("Hello, World {}", i);
}
これぐらいなら問題はないんですけどね...
3.9. Fortran (FORTRAN)
おススメ度:★☆☆☆☆
レベル:難しい+
種別:手続き型言語
おススメOS:Windows Mac Linux
おススメ環境:gfortran(?)
世界初のプログラミング言語です。え?え?の連発です。現在使ってるソフトはないと思います。大学の研究制御システムなどで変えるお金と技術力がなくて使ってるところはあるかもしれません。また、ハード(パソコンなどの部品)にはC/C++
と一緒に使われているそうです。最古ということで学んではみましたが、学ぶ必要はないと思います。参考文献も少ないですからね。
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国家になってほしいと願うばかりです。この記事が役に立てたら幸いです。質問等がございましたらコメント等に書いてください。