[小学生向け]プログラミングをするにあたって

#1.プログラミングって何だろう?
「プログラミング」って何ですか？
ずばり、言います。
やりたい事をちゃちゃっと解決する手段です。

##プログラミングのイメージ
なんとなく、こんなイメージ。かな？
PCの前で、カタカタと入力している感じ？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723966/fa16b189-eb38-06b8-627e-f94e5406c8f8.png)

がっつりコード書いてて、全然、ちゃちゃっとじゃないですね。
そうです、全然ちゃちゃっとじゃないんです。

##プログラミングとは
裏で、一行一行、ノロノロと、地味に、ちょっとづつ作ったものの集まりなんです。
で、動かす時が、派手。一瞬で終わる。
という作業のことです。

プログラムにはこんな格言があります。
「楽をするためならどんな苦労もいとわない。」

例えるなら、3時間かかる作業を、3秒で終わらせるために、3日かけてツールを作る、みたいな感じ。
例えるなら、3時間かかるベルマーク切り抜き作業を、3秒で終わらせるために、3日かけてロボットを開発する、みたいな。
※(さすがにロボットを3日で開発するのは、無理か。。。)

さらに、作ったロボットを、みんなに配ると、すごく助かるはず。これがプログラミングの目的です。
**結論 : 苦しんで作って、ちゃちゃっと実行。それでみんなが助かるものを作る。それがプログラミングの目的です**

#2.何が作れるかを知る。
とはいえ、プログラミングで何でもできるかというとそんなことはありません。
出来ることと、出来ないことがあって、出来ることの中でも簡単にできることと、簡単ではないことがあります。
なので、まず、何ができるのかを紹介しましょう。
最近は、垣根を超える事例も増えていますが、ざっくりとはWeb系/システム系,アプリ系,組込み系になると思います。

##2.1Web系/システム系
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723966/afeb5d83-d2f9-4289-09a7-9ad7c124a0ee.png)
ざっくり言うと、ホームページを作るプログラムのことです。
ホームページの事をWebって言い方します。なのでWeb系ですね。
システム系も含めました。銀行のATMとか、電気料金の管理システムとかのことなんですが、一昔前は、汎用系と呼んでました。
Web系とシステム系は、以前は開発内容も必要スキルも全然違う技術が必要でしたが、最近は、Webの技術で開発することが多くなっています。

##2.2アプリ系
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723966/fb12ccf2-1443-c36f-79b2-f603e60e104a.png)
PC(スマホも)にインストールして動かすソフトの事です。
WORDやEXCEL、PCゲームの事ですが、スマホゲームを含まれます。
アプリ固有の知識が必要になったりします。ゲームであれば、入力と画面表示を同時にするためのマルチスレッドとか。
製図ソフトであれば、行列計算とか。

##2.3組込み系
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723966/fb7dbe45-e66c-5cec-8162-55ed96a360de.png)
わかりやすいところでは、家電製品ですかね。
家電製品は、全部、組込み系です。あとは、自動車とか、ロボットとか、飛行機とか、ドローンとか。
電池や、コンセントを繋いで動くほぼ全てが、組込み系になります。
基本的には、CPUが貧弱とか、搭載メモリが少ないとかの制約があり、難しいとされています。
でも、"ものづくり"って言ったら、これですよね。
ちなみに、組込み系エンジニアに出会うのは稀なようです。レアキャラですね。

##2.4その他
もちろん上記分類に入らないものもあります。
最近、AIが人気ですが、それもプログラムで実現します。

**結論 : 作れるのは、Web系/システム系、アプリ系、組込み系の3つ。(もっとあるよと怒られそうだけど)**

#3.何を作りたいかを考える。
さて、出揃ったところで、何を作りたいかを考えます。

ラジコン作りたい。ロボット作りたい。ゲーム作りたい。カーナビ作りたい。
いろいろあると思います。

これを考えることは、重要です。
なぜなら、数あるプログラム言語の中から、どれを学ぶかに直結するからです。

とはいえ、難易度の問題もあり決めるのは容易ではないと思います。
なので、3つに絞りました。決めてしまいましょう。

1. ホームぺージを作りたい。
2. ゲームを作りたい。
3. ラジコンを作りたい。

|No|作りたいもの|　何系か|学ぶ言語|
|--|:------------------|-|-|
|1|ホームぺージを作りたい|Web系|HTTP/CSS、JavaScript、他(React.jsとかFirebaseとか)|
|2|ゲームを作りたい|アプリ系|Android : Java、iPhone : Swift、PC : C/C++。|
|3|ラジコンを作りたい|組込み系|C/C++。|

##3.1 ホームぺージを作りたい
学ぶ環境として、windowsPC、macPCのどちらでもいいと思います。
本屋さんで、JavaScriptと、HTTP/CSSの関連本を買って、実際に練習するのがよいと思います。
気を付けないといけないのは、プログラミングをするのが前提ですので、Webデザインの本を買ってしまわないようにすることです。
Web系には棲み分けがあって、Webデザインは、デザイナー、Webプログラムは、プログラマーとの不文律があります。
もちろん、デザインもしたいということでしたら、全く問題ありません。
やり始めたら、クライアント/サーバという言葉に絶対、遭遇します。
クライアントです。まずは、クライアントを理解しましょう。サーバは少し敷居が高くなります。

##3.2 ゲームを作りたい
学ぶ環境として、windowsPCと、Android端末を準備して、Androidアプリの開発を準備しましょう。
Androidアプリでは、kotlinという言語を推してきますが、まずは、Javaを選択しましょう。
kotlinは、Javaを理解すると習熟が早いのと、Androidアプリ以外での使い道がありません。
対してJavaは、Web系のサーバサイドプログラマとしても使えるスキルです。将来性からJavaがいいです。

また、iPhone端末を持っている場合、iPhoneアプリを作りたくなるかもしれません。でも、やめておいた方が無難です。理由は、iPhoneアプリの開発は高くつくからです。

|||高くつく理由|Androidがいい理由|
|-|:-|-|-|
|1|PC|・macPCが必須です。そして、macPCは高いです。|・Androidは、windowsPC/macPC/linuxPCのいずれでも開発できます。<br/>・PCが必要な事に変わりがありませんが、安くて高性能なマシンを選ぶ選択肢があります。<br/>・メモリ増設などの拡張も容易です。|
|2|開発環境|・無料ですが、個人情報を求められます。<br/>開発環境(Xcode)|・無料です。個人情報不要です。<br/>開発環境(Android Studio)|
|3|アプリの公開|・コストが高いです(1万円/年)。毎年払い続けなければいけません。<br/>※シュミレータで動かすだけなら、無料みたいです。<br/>・公開には審査が必要です。結構、はじかれます。|・無料です。<br/>・審査もなく、即公開できます。<br/>※さすがに、公開時には、個人情報が必要です。|
|4|学習コスト|学習コスト高です。<br/>情報が少なめで、知りたい事がなかなか解決しません。|学習コストは小さくはないです。<br/>Androidは情報が多めなので、学習はしやすいです。|
|5|言語|Swiftという言語です。<br/>新しい言語だけに、綺麗なコードが書きやすいです。|KotlinとJavaの2択です。Javaを選びましょう。<br/>Javaを選んでれば、Kotlinの理解も早いです。|
|6|将来性|厳しいです。<br/>iPhoneアプリ以外では使えません。スキル獲得の効果が限定的です。|あります。<br/>Javaを選べば、Web系Javaのスキル獲得もできてます。<br/>なので、google社が潰れても、スキルが無駄になりません。<br/>Kotlinを選んだ場合は、iPhone同様にスキル獲得の効果が限定的です。|

##3.3 ラジコンを作りたい
最初の学びなら、やめときましょう。技術レベルが段違いです、更にお金がかかります。開発マシンであるPCの他に、ハードが必要です。
でも、ロボット作りたいですよね。ラジコン作りたいですよね。ワクワクしますね。
だったら、作りましょう。苦しむのわかっているけど、作りましょう。
"ハードには、500円のラズパイを使って安くしよう"、とか"コントローラをswitchのにすれば安上がり"とかアイディアが浮かんで、自由度が高くて、考えるとワクワクします。
でも先に、"3.2 ゲームを作りたい"から始めるといいかもです。
その後だと、だいぶ理解が進んだ状態ですので、理解が早くなります。

一応、学ぶ環境としては、windowsPCで、学ぶ言語は、C/C++です。
C/C++はtop of プログラム言語(僕の勝手な思い込みですが)ですので、何から学んでも、最後はC/C++を極めたいところです。

**結論 : 作りたいものを、作りたいように、作れるようになると、楽しいよ。**

#最後に
いろいろと、概念的なことをまとめましたが、
プログラミングを学ぶ上で一番大切な事は、"トライ＆エラーを恐れないことを学ぶこと"です。
プログラミングに関しては、失敗のコストはゼロです。(人件費かかるけど、電気代かかるけど)
失敗しましょう。それが自分の技術力になります。

"技術力は、バットノウハウの蓄積で証明される"と僕が言っています。

P.S.
プログラミングは、Androidアプリの開発(Javaで)から始めた方が、コストが安く済みそうな気がします。
(Javaはオブジェクト指向だし、VMの概念はC#でも活きるし。)