【初心者にやさしい】CS(コンピューターサイエンス)基礎の基礎の学習：コンピューターサイエンス概要

# CS(コンピューターサイエンス)基礎の基礎
現在、CS基礎の基礎を一から学んでいるので、その学習成果のアウトプットに、、、

## 今回は「コンピューターサイエンス概要」

### 1. コンピューターサイエンスの本質
　コンピューターサイエンスの本質は「問題解決」にあります。
![CSの本質　図解.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/57c5e013-81f9-a5d1-5c7f-c4448f9b5a8d.png)
　解決したい問題を「Input」し、解決して「Output」する。
　そうして、世の中の「できないこと」、「面倒臭いこと」を少なくしていくこと。
　それがコンピューターサイエンスの使命であると思いました。

### 2. コンピューターと人間、プログラミング
　人間は「数字」や「文字」、「画像」、「動画」、「記号」などあらゆる情報を利用して問題解決をしていますが、
コンピューターはどのような種類の情報であれ、全て「0」と「1」の２つの数字の組み合わせでのみ表現しています。
![人間の言語をコンピュータ言語に変換.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/885dc124-e44e-2e25-8cdf-7fc495137967.png)
　つまり、コンピューターを動かすためには、人間の言葉をコンピューター用の言葉に変換しなければなりません。
　そのために使用するのが「プログラミング」です。

### 3. コンピューターの表現 
　　では、コンピューターは「0」と「1」の２種類の組み合わせでしか表現できないにも関わらず、どのようにして人間が理解できる形で情報を画面上に表示しているのでしょうか。具体的に見てみましょう。

####　3-1. 最も基本的な表現「true」 or 「false」 
　コンピューターは「0」と「1」の組み合わせで表現します。その最も基本的な形が、「はい」or「いいえ」などに代表されるように「真偽を表現する」というものです。「はい」と「いいえ」を表現したい場合は、「はい」を「1」、「いいえ」を「0」と設定しておくことで表現できるようになります。
　「真偽の表現」は何も「はい」と「いいえ」のみではなく、2択のものであれば沢山のことを表現できます。以下に例を示します。

　●「アンケートに回答した」→「1」、「アンケートに回答していない」→「0」
　●「銀行に預金した」→「1」、「銀行に預金していない」→「０」
　●「チェックボックスにチェックを入れた」→「1」、「チェックを入れていない」→「０」
　●「右の商品」→「1」、「左の商品」→「０」
　●「上の階」→「1」、「下の階」→「０」


#### 3-2. 「整数」の表現
　「0」を数字の「0」として扱い、「1」を数字の「1」として扱えば、簡単に数字を表現できるようになります。
　しかし、この場合、「２以降の数字」はどのように表現するのでしょうか。
　この時に、「bit」と「byte」という言葉は重要になります。
![bitについて.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/92fd2742-4c3f-9dd0-1e85-ab7e567c9fbd.png)
![bit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/29d88ece-9134-6590-824c-69dc3462f691.png)
　基本となる「0」と「1」それぞれを「bit」と呼び、それらの組み合わせを増やしていく、つまりbit数を増やしていくことで「2」以降の大きな数字も表現していけるようになります。
　このように「0」と「1」の組み合わせを変えることで私たちが普段使っている整数との対応を示した図が以下です。
　　　　　　　　　　　　　　　　![2進数と10進数対応表.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/2b70585c-6d81-fea6-fc09-a970e914c7ad.jpeg)

このように「bit数」を増やしていき、「8bit」までくると、それは「1byte」という値に変身します。
これが普段私たちがよく目にする「ギガバイト」や「メガバイト」の元になります。

#### 3-3. 文字
　「整数(少数も表すことができますがこの記事では割愛)」を表現することができるのならば、「文字」も表現できるはずです。
　文字を表現する場合は、「数字の並び」と「一つ一つの文字」を対応させた表が世界的に定められているので、それを利用して文字を表現しています。この対応表を「文字コード」と呼びます。
　「ASCII」という文字コードが昔から有名ですが、これは英語圏の言葉にしか対応しておらず、今ではあらゆる言語や記号まで対応した「UNICODE」というものが広く使用されています。
　プログラミングでよく使用する「UTF-8]もこのUNICODEの一種です。

#### 3-4. 画像
　では、画像はどのように表現するのでしょうか。
　　　　　　　　　　　　　　![ピクセル画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/38f79142-9704-6b32-e32a-754f3fbb7d4c.png)
　例えば、上の画像を見てみると、微妙に色の違う四角いものが集まって一つの画像を表現していることが見て取れます。つまり、画像はこのような小さな四角の集まりで出来ているということが分かります。
　この小さな四角を「ピクセル」と呼びます。このピクセル一つ一つの色合いを微妙に変えることで画像として成り立たせているのです。
　この微妙な色の違いは全て「RGBカラー」と呼ばれる「赤」と「緑」と「青」の組み合わせでのみ表現されており、この「赤」、「緑」、「青」それぞれの色合いを調整するために、数字や文字と同じように「0」と「1」を組み合わせて「色コード」と対応させているのです。
　先ほど「bit」数を増やすことで表現できる数も増えると言いましたが、画像もその通りで、一つのピクセルの「bit数」を増やし、ピクセル自体の数も増やすことで、より鮮明で緻密な画像表現が可能になります。

#### 3-5. 動画
　では、動画はどうでしょう。
　動画の場合は、「パラパラ漫画」を参考にすると良いでしょう。
![パラパラ漫画.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/bfd3cc40-27b2-917f-8a4e-ca71c91c17f8.png)

　パラパラ漫画は一つ一つの静止画を微妙に形を変えて連続で見せ、動いているかのように錯覚させる技術を使って出来ていますね。
　これと同じように、それぞれのピクセルの色合いを急激に変化させることで動いているかのように錯覚させることで、動画を表現しているのです。

#### 3-6. 音楽
　では、音楽は？
　音楽は数字を音程や音の長さに割り当てて表現しているようです。

### 4. アルゴリズム
　コンピューターが情報をどのように表現するのかについては分かりましたが、それはあくまで「OutPut」の部分です。
問題を解決するためには、その手法を組み立てなくてはなりません。
　問題解決のための方法を論理立てて組んだものを「アルゴリズム」と言います。
![CSの本質　図解.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2375287/199fe1c7-914c-27da-def3-52dd161bddd0.png)
　アルゴリズムは上の図のブラックボックスの部分に当たります。
　内容は使う人に見えている必要はありませんが、プログラマーはきちんとアルゴリズムを組んでおく必要があります。

### 4-1. アルゴリズムを学べる教材
　２つピックアップしてみました。どちらもこれから試してみる段階ですが、視覚的に理解ができそうなので楽しみです。
　
　①Scratch
　https://scratch.mit.edu/

　②アルゴリズム図鑑
　https://apps.apple.com/jp/app/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E5%9B%B3%E9%91%91/id1047532631

### 5. 学び
　今回、最も学びになったのは、「問題解決のための手法」が「正しいかどうか」よりも、「それはより良い方法なのか」ということの方が重要だということです。たとえ正しい方法だとしても、その方法を使う人にとって面倒な方法であれば意味がありません。問題解決のためにアルゴリズムを組んでプログラミングする側として、ユーザーの視点を考えた「より良い解決策」というものを追求していくことの大切さを学びました。
　これからエンジニアとして働いていく身ですが、「それは良い方法なのか」と常に問題意識を持って活動したいです。