これからプログラミングを学ぶ人に伝えたいこと

# はじめに

プログラミングの初心者や、これからプログラミングを学ぶ人達に役に立ちそうな情報をまとめてみました。
内容には私の推測や感覚によるものも多いので、あくまで一意見として読んで頂ければと思います。

# プログラミングには向き不向きがある

いきなり出鼻を挫くようですが、まずプログラミングには向き不向きがあります。
私が色々な人を見てきた限り、**プログラミングの上達スピードにはかなり個人差がありました。**
そして当然ですが、上達の遅い人ほどプログラミングを辞めていく傾向が強いです。

しかし、上達スピードが遅い人でも、学習すればプログラミング技術は上達していきます。

特に科学的裏付けはありませんが、私はプログラミング力は、「地頭の良さ」「学習時間」「学習効率」に比例して、概ね以下のようになるのではないかと予想しています。

```
プログラミング力 ＝ 地頭の良さ × 学習時間 × 学習効率
```
ちなみに、ここで言う「学習」は本や教材を読むだけでなく、プログラムを書いたり読んだりする、実践的な経験も含みます。

この予想が正しいとすると、当たり前の話かもしれませんが、地頭が良く、長時間の学習が苦にならず、効率のいい学習方法を好む性格の人がプログラミングに向いていて、その逆が向いていないということになります。

# 最初にどのプログラミング言語を学ぶべきか

プログラミング **「言語」** という名前から、あるプログラミング言語と別のプログラミング言語は、日本語と英語くらい違うものと思われがちですが、そんなことはありません。

私の主観ですが、最近のメジャーなプログラミング言語であれば、**異なる言語であっても、アメリカ英語とイギリス英語くらいの違いしかない**イメージです。

例えば、アメリカ英語ができる人がイギリスに行った場合、色々な違いはあると思いますが、基本的には通じると思います。
同じように、あるプログラミング言語ができる人が別の言語をやった場合も、色々な違いはあると思いますが、基本的には通じると思います。

そのため、どのプログラミング言語を学んでも無駄になることはなく、**最初に学ぶべき言語というのはありません。**

ただし、言語ごとに得意分野があるので、やりたいことや作りたいものがある場合は、それが得意な言語から始めるのがオススメです。また、初心者にあまりオススメおすすめしない言語というのもあるので、それらについては後述します。

# 目的別のおすすめ言語

以下に目的別のおすすめ言語を紹介します。

### スマホアプリを作りたい

iOSなら`Swift`、Androidなら`Kotlin`を使います。
この２つの言語はよく似ているので、片方を覚えればもう片方の言語に移るのも楽です。
AndroidはJavaでもできますが、Swiftへの移りやすさなどを考えると、Kotlinの方がお勧めです。

### Windowsのソフトを作りたい

`C#`がお勧めです。
ゲームを作る場合は、Unitiyを合わせて使うケースが多いです。
C++でもできますが、C#の方がより初心者向けです。

### Macのソフトを作りたい

`Swift`がお勧めです。
Macアプリを作る標準の言語です。

### WEBサービスを作りたい

WEBサービスを作れる言語はたくさんありますが、一番簡単に作れるのは`Ruby`、`PHP`あたりかと思います。
これは言語そのものの特徴というより、WEBサービスの制作に役立つツールがあったり、情報が多かったして作りやすいというのが理由です。

また、WEBサービスを作る場合、プログラミング言語ではありませんが、別途`HTML`と`CSS`も覚える必要があります。

### UIに凝ったWEBサービスを作りたい
凝った動きをするWEBサイトを作る場合、`JavaScript`か`TypeScript`が必要になります。
最近流行りのVue.jsやReactなどを使う場合は、これらの言語を使うことになります。

### AIを作りたい
`Python`がお勧めです。
PythonはAI開発によく使われ、AI開発用のライブラリが豊富です。
また、AI開発関連の情報も、Python前提のものが多いと思います。

### 手っ取り早く稼ぎたい

`Java`か`Python`がお勧めです。
プログラミングの求人は、2022年現在、国内ではJavaが一番多く、海外ではたぶんPythonが一番多いです。
また、JavaもPythonも幅広い分野で使われるので、食いっぱぐれづらい言語かと思います。

# 最初にやるにはあまりオススメしない言語

絶対ダメというわけではないですが、最初にやるにはあまりオススメしないプログラミング言語もいくつかあります。

### C、Perl
どちらもメジャーな言語ではありますが、古い言語のため、後発のプログラミング言語と比べると機能不足です。
なので、ここから始めると、他の言語に移るときのハードルがやや高くなると思います。

### C++、Rust
やや難易度が高めなので、何かの目的のために必要というのでなければ、あえて最初に選ばなくても良いかなと思います。
ただ、これらの言語とC言語は、他の言語よりも速いプログラムが書くことができ、OSや機械制御など一部の分野では避けられないこともあります。

### Visual Basic
もしVisual Basic .NETから始めるなら、C#を選ぶ方が、将来性も需要も、他の言語への移りやすさもあって良いと思います。
簡単に動かせるので、プログラミングを始めるきっかけとして、Excel VBAから始めたり、VB Scriptから始める、というのはアリかと思います。

### Objective-C
昔はiOSのアプリの制作に使われていましたが、今ではSwiftに取って代わられオワコンです。

# プログラミング言語の習得にかかる時間

最初のプログラミング言語が、一人前レベル（何を持って一人前なのかは色々意見があると思いますが）に使えるようになるまでの時間は、**人によってピンキリです**。

早い人なら２ヶ月で製品レベルのプログラムを書けるようになりますし、遅い人なら２年経っても基本的なことがおぼつかなかったりします。

上にも書きましたが、私はプログラミング力は「地頭の良さ」「学習時間」「学習効率」に比例するのではないかと予想しています。

```
プログラミング力 ＝ 地頭の良さ × 学習時間 × 学習効率
```

この仮定が正しいとすると、プログラミング力は各要素の掛け算で決まるので、大きな差がつくのもうなずけます。

さらに言えば、上記の **「学習時間」はプログラミングを学び初めた時点で、既に人によって大きく異なっている** と思います。
なぜなら、プログラミングには数学などで身に付く論理的思考力や、国語などで身に付く読解力や記述力が必要になるので、それらの力を鍛えてきた人ほど、学習を始めた時点で先に進んでいることになります。

# プログラミング言語はいくつ習得すればいいのか

長くプログラマーを続ければ、自然と複数の言語を使うことが多いですが、**最初は１つの言語をきっちり習得することが大事です。**

上にも書きましたが、最近のプログラミング言語はどれも似ているので、何でもいいので１つプログラミング言語を習得すれば、２つ目のプログラミング言語の習得はぐっと楽になります。
１つ目の言語を習得する労力を１００とすると、２つ目の言語を習得する労力は１０くらい、３つ目以降の言語を習得する労力は１くらいになる印象です。

いくつかの言語をしっかり習得すると、初めてやる言語でも、新しい概念や新しい機能は出てこなくなり、ただ少し書き方が違うだけ、というふうになっていきます。
そこまでプログラミングに慣れてしまえば、あまり特殊な言語でなければ、**初めての言語でも、20分くらい勉強すればなんとなく書けるようになります。**

# プログラミングの学び方

プログラミングを勉強する方法は以下のように色々あります。

- 本を読む
- ネットの教材をやる
- スクールに行く
- 知人に教えてもらう

これらのどれでも学習はできると思いますが、一つ伝えておきたいのは、**プログラミングの学習には知識と実践の両方が必要**ということです。

なので、本や教材を読むだけではダメで、コードを書いて動かすことが必要ですし、逆になぜそうなるかを理解せず、写経のようにコードを書き続けても上達はしません。

そのため、コードを書いて動かすことと、その仕組みを理解するということをバランスよくやっていく必要があります。
最近は体系だって知識を学べる教材と、実践としてコードを書く課題の両方を、安く提供する以下のようなサービスもあります。

- [Progate](https://prog-8.com/)
- [Paizaラーニング](https://paiza.jp/guide/works)

これらのサービスは月千円程度なので、学習のとっかかりとして、まずはこういうものから初めてみてはどうでしょうか。

## プログラミング初心者が読むべき本はあるか？

**ありません（笑）** 少なくとも私は知りません。

世の中には評価の高いプログラミングの技術書がいくつかありますが、そういったものはある程度プログラミングを身につけてからでないと、ちゃんと理解できないと思います。

もちろん「○○入門」とか「はじめての○○」みたいな、初心者向けの本を読んでも構いませんが、そういった本を読むのが好きでないなら、別に読まなくていいので、代わりにネットの教材をやりましょう。

# プログラミングのスクールってどうなの？

あまり詳しくありませんが、以下の理由でスクールについて私はネガティブなイメージがあります。

### 講師のレベルが低い？
偏見かもしれませんが、スクールの講師はプログラマーとしてレベルが低い人が多いのではないかと考えています。

理由は、スクールの講師の求人情報を見ると、プログラマーやSEより給与が安いからです。
実力のあるエンジニアならもっと稼げる仕事があるので、給与の安い講師にはならないんじゃないかと思うのです。

### 教材も先生もネットにある
「体系だった教材」と「質問できる先生」というのがスクールの大きな意義であるように思いますが、それらはスクールに行かなくてもネットにあります。
教材なら[Udemy](https://www.udemy.com/)、[Progate](https://prog-8.com/)、[Paizaラーニング](https://paiza.jp/guide/works)のようなサービスで安く提供されていますし、質問したいなら[teratail](https://teratail.com/)や[StackOverflow](https://ja.stackoverflow.com/)のようなコミュニティでできます。

### 自力で解決する力がつかない
プロのプログラマーになれば、基本的には誰かが教えてくれることなどありません。
分からないことは自分で調べる必要があるし、問題が起これば自分で解決する必要があります。

長い目で見ると、プログラマーにとっては**プログラミングの知識より、知らないことを自力で解決する力の方が重要**だと思います。
そして、自力で解決する力は、スクールで受け身で勉強するより、独学でやった方が身につくはずです。

# 初心者に質問は難しい

ネットで質問できるからスクールはいらない的なことを書きましたが、実は初心者にとって、質問することはそう簡単ではありません。

**多くの初心者は、知識のなさから、漠然とした質問や、どこかズレた質問をしてしまいます。**
そして、多くの回答者は、そのような質問に上手に答えることはできません。
そのため、初心者が質問したとき、ストレートに欲しい回答を得られないことも多いです。

また、ネットで質問する場合、回答者には色んな人がいますので、質問に対して辛辣なコメントを返す人も珍しくありません。辛辣なコメントを返されると、最初は凹んでしまうものですが、ネットで質問を続けていくには、回答者の悪感情を真に受けず、受け流していく必要があります。

また、例え辛辣なコメントを受けても、感情的にならず回答者の意図を考えると、何らかのヒントを得られる場合が多いです。


# プログラミングの独学で役立ったもの・こと

私は独学でプログラミングを身につけたのですが、その時学習に役立ったと思うことを、参考として書き出してみます。

### Google
たぶん、**私のプログラミング知識の99%はググって身につけたもの**だと思います。
Googleはプログラミング学習において一番役立つツールです。どんな本や教材より役に立つし、どんな先生より役に立ちます。

私の場合、気軽に質問できる人がいなったので、分からないことは基本ググったのですが、それにより自力で調べる姿勢がついたので、結果としては質問できる人がいなくて逆に良かった、と思っています。

### 他人のコードを読んで修正すること

いくらGoogleが役立つとはいえ、存在すら知らないものはググることができません。
そこで役立つのが、他人が書いたコードを読むことです。

経験が浅いうちは、他人のコードを読むと、必ず自分の知らないことが出てきます。
**他人のコードは言わば、出会いの場です。**

他人のコードで出会った知らないことを調べることで、プログラミングの知識を増やすことができます。
また、読むだけでなく、他人のコードを修正することで、より理解を深めることができます。

### ネットのコミュニティ

ときにはググっても分からないこともあり、そういう時はネットの掲示板（２ちゃんねる）に質問していました。
ただ、当時２ちゃんねるはたくさん人がいて返信がすぐ来たのですが、今はあまり人がいなさそうなので、質問するなら[teratail](https://teratail.com/)とか[StackOverflow](https://ja.stackoverflow.com/)とかの方が良さそうです。

また、ネットのコミュニティは下手な質問をするとバカにされますが、そこはどうしようもないので諦めが必要です（笑）

### プログラムを作って動かすこと

初心者の頃は、疑問に思ったことを確認するため、よく小さな実験用プログラムを作って動かしていました。
（というか、今でもやりますが）

自作のコードを動かすと、より自分で作ったという実感が得られるので、モチベーションを高める上でも有効です。
簡単なものでいいので、自分で考えたコードをどんどん動かしてみるのがお勧めです。

# プログラミングにはWindowsかMacどちらが良いか？

Windows用のソフトを作りたいならWindows、MacかiOS用のソフトを作りたいならMacが必要ですが、それ以外なら、どちらでも構いません。

ちなみに、Macに仮想環境でWindowsをインストールして、一台でMacとWindows両方を使えるようにすることもできますが、あまりお勧めしません（私は一時期それをやっていましたが止めました）
両方やりたい場合は、素直にWindowsとMacで別々のPCを用意する方がお勧めです。

# プログラミングの学習においてつまづきがちなところ

以下は、初心者がプログラミングの学習においてつまづきがちなところです。

- 参照（ポインター）
- マルチスレッド
- 再帰処理
- オブジェクト指向

これらはいずれも、**説明を読んだだけで理解できるものではありません**。
なので、説明を読んで理解できなくても、最初はあまり気にする必要はありません。

ではどうやって理解すればいいかというと、まずは実際のコーディングでたくさん使って、こういう風に使うんだなというパターンに慣れる必要があります。
十分に使い慣れてきた後に、改めて詳細な説明を読むことで、ちゃんとした理解ができるようになると思います。

# プログラミングの学習は永遠に続く

プログラミングの学習は、**どこかで終わりがあるものではなく、基本的に永遠に続くもの**です。

まず、プログラミングに関わる技術は無数にあるため、全てを網羅することは不可能です。
そのため、一般的な技術を習得した後も、新たな課題やプロジェクトに応じて、つど新たな学習が必要になります。

また、仮に既存の技術を全て習得できたとしても、新しい技術がどんどん生まれていくので、それを学ぶ必要が出てきます。

プログラミング言語は改善や改良という形で絶えず機能が追加されていくので、日本語などの自然言語より、はるかに速いスピードで進化していきます。
そして、プログラマーは進化を続けるプログラミング言語を学習し続ける必要があります。


# プログラミングに英語は必要か

最近は機械翻訳の精度も上がり、英語力は必須ではないですが、英語ができると色々良いことがあります。
英語を覚えるメリットをいくつか挙げてみます。

### 英語が分かるとプログラミングが楽になる
プログラミングの変数名や関数名は、英語で書くのが全世界の習慣になっています。
なのでコードを書くときは、たいてい英語で名前を考えなければいけませんし、コードを読むときは英語の名前を読む必要があります。

また、プログラミングでは**英語のエラーメッセージを読まなければならない**ことが頻繁にあります。

### 英語の方が情報が多い

個人の記事も含めて、ネット上のプログラミングに関する資料は、英語で書かれているものが多いです。
[こちらのWiki](https://ja.wikipedia.org/wiki/%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%8D%E3%83%83%E3%83%88%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E8%A8%80%E8%AA%9E%E3%81%AE%E4%BD%BF%E7%94%A8)によると、**インターネット上の記事の63.4%は英語で、日本語は1.9%** しかありません。

そのため、分からないことを調べるとき、日本語より英語で調べる方が効率が良く、そもそも英語の情報しかない場合も多々あります。

### 宣伝
ちなみに私はiOS向けの英単語帳アプリを出しているので、興味があればご覧ください。

https://apps.apple.com/jp/app/id1633552796

# プログラミングに数学は必要か

たいていのプログラムは数学が分からなくても作れます。
そういう意味で、数学は英語ほど役に立ちません。

しかし、**数学の知識がないと絶対に作れないプログラムもあります。**
例えば、アクションゲームを作るなら、三角関数や行列など、高校レベルの数学が必要ですし、もっと専門的な科学計算が必要なソフトウェアもあるにはあります。

英語は幅広く役に立つけど、必須ではない。
数学は幅広く役には立たないけど、一部のプログラムを作る場合に必須。
という感じでしょうか。

# プログラマーの仕事内容は何か？

お客さんの依頼を受けてソフトウェアを作る流れを、超簡単に説明すると、たいがい以下のような流れになります。

1. お客さんのやりたいことを聞く
2. やりたいことを実現するためのソフトを考える
3. ソフトを実装するための設計を作る
4. 設計を元にプログラムを書く
5. 動かしてテストをする

一般的にはこの中の4がプログラマーの仕事、1〜3がシステムエンジニアの仕事とされることが多いように思いますが、私は多くのケースで **プログラマーとシステムエンジニアの仕事を分離することは難しく、プログラマーは上記の全てに関与する必要がある、** と考えています。

まあこれには色々考え方がありますし、プロジェクトの性質や規模にもよりますが、基本的には、私は上に書いた１〜５全部がプログラマーの仕事だと考えています。

# プログラマーの仕事はAIに奪われるのか？

近年はAIが絵を描いたり、文章を書いたり、分かりやすい力を発揮してきましたが、まだプログラマーの職を奪うようなAIはありません。

では、将来的にどうかというと、未来のことは分かりません。
ただ、プログラマーはたくさんある職種の中で、AIが取って代わるのが難しい仕事だと思います。

仮にプログラマーの仕事が「設計を元にコードを書く」だけであれば、そのうちAIが取って代わることができそうですが、上に書いたように、「お客さんのやりたいことを聞く」というところからできるAIというと、近い将来では実現しないのではないかと思います。

もしAIがそれらのプロセスを全てできるようになれば、多分その時は今ある仕事は全部AIに取って代わられて、**人間は何も仕事をしなくてもいい世界**になってるんじゃないかと思います。
それがユートピアなのか、ディストピアなのか、いつか見てみたいですが、生きてるうちには無理かなー、となんとなく思っています。

# プログラマーはどれくらい稼げるのか？

プログラマーの収入はピンキリです。
[こちらのサイト](https://xn--pckua2a7gp15o89zb.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%AE%E5%B9%B4%E5%8F%8E%E3%83%BB%E6%99%82%E7%B5%A6)によると、正社員プログラマーの平均年収は**428万円**とのことですが、これにはたぶん残業代が入っていないので、実際はもっと高いと思います。

収入について一つ重要なのは、**同じ実力でも状況によって収入は全然変わる**、ということです。
当然実力が高いほど高収入の仕事を得やすいですが、実力が高いのに低収入の人もいますし、実力が低いのに高収入の人もいます。

例えば日本なら、会社員からフリーランスになるだけで収入は倍以上になりますし、シリコンバレーなら新人プログラマーでも年収1000万円稼げるそうです。

以下に私の経験と推測から、色々なケースでの推定年収を表にしてみました。
（ただし、全く裏付けはありませんし、ここから外れるケースもあるのであくまで参考程度に）

| レベル | 雇用形態 | 場所 | 会社 | 残業  | 推定年収 |
| ----- | ------ | ---- | --- | ---- | ---- |
| 新人 | 正社員 | 日本の地方 | 中小企業 | なし | 300万円 |
| 3年目 | 正社員 | 日本の地方 | 中小企業 | 月40時間 | 500万円 |
| 中堅 | 正社員 | 東京 | 大企業 | 月20時間 | 700万円 |
| 中堅 | フリーランス | 東京 | 中小企業 | 月20時間 | 1,000万円 |
| 熟練 | フリーランス | 東京 | 大企業 | 月40時間 | 1,500万円 |
| 熟練 | 正社員 | シリコンバレー | 大企業 | 月40時間 | 3,000万円 |