コンピュータサイエンスの基礎学習

##はじめに
未経験からモダンなWeb系自社開発企業に就職するための学習ロードマップとして、私はまずコンピュータサイエンスの基礎を学習した。
その際に、学習教材として
[『キタミ式イラストIT塾 基本情報技術者 令和03年』](https://www.amazon.co.jp/dp/B08PPJPZ4V/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
を選択した。
今後、コンピュータサイエンスの基礎を学習しようと考えている方やこの教材の記載内容を知りたい方の一助となればと考え幸いです。


##目次
<font color="gray"><ul>
  <li>最初にコンピュータサイエンスの基礎から着手した理由</li>
  <li>教材の選択理由</li>
  <li>各章のまとめ</li>
  <li>さいごに</li>
</ul></font>


##最初にコンピュータサイエンスの基礎から着手した理由
　まず、プログラミングを学ぶ上で、この分野を勉強すること自体は必須とは言えず、また直接的に役に立つわけではないかもしれない。しかし、モダンなWeb系自社開発企業に就職するために、ハイレベルなポートフォリオを作成すること、あるいは入社後においては必須であると言える。具体的には、n進数、論理演算、ビットとバイト、文字コード、そしてネットワークのような基礎知識は、IT業界では空気のように常識として扱われているというのも耳にしたことがあり、まずは土台となるこの分野から着手することした。


##教材の選択理由
　コンピュータサイエンス自体は非常に奥の深い分野なので、この教材だけで全てを理解を理解できるわけではない。しかし、基本情報技術者試験のカリキュラムはとてもバランスよくコンピュータサイエンス分野の必須知識を網羅しており、この書籍はイラストが多用されていて、難しい内容でも視覚的に理解することができるように工夫されているため、初学者には良いと考えた。実際、この分野は大学においてもカリキュラムに組み込まれており、忘れているテーマも多かったので良い復習にもなった。
(なお、Chapter18以降の章は開発とは全く関係ない章であるため、飛ばしても良い)


##各章のまとめ
　以下、赤で記したChapterに関してはエンジニアになる上で、非常に重要なテーマの説明が数多くなされており、要約することが難しかった。そのため、私自身としては学習ロードマップを先に進めたい関係で何周も熟読したり覚えてしまうというようなことは今はしないが、入社前にこれらのテーマについてはもう1度読み返し、必要であれば他の教材も参考にして学習したいと考えている。
※今後、隙間時間などに読んだりして、内容を要約したものを随時書き加えていく可能性あり

**【1. n進数】**
　「コンピュータといえば2進数」であることは周知のことであるが、実際に0と1だけで表記で常に数を表現していたら、いちいち桁数が嵩んで可読性も良くないので不便だよね、と言うのがここでのテーマである。そのため、ある程度まとまった区切りの数をひと桁で表すことができ、かつコンピュータと"相性が良い"n進数表記が必要となるのである。
例えば、IPアドレスは以下のように32ビット(2進数32桁)の数値で表される。
11000000|10101000|00000001|00000011
これを8ビットずつに区切って10進数で表すと
192.168.1.3
のように可読性が良くなる。
※一般に、コンピュータと相性が良いとされているのは8進数と16進数である


**【2. 2進数の計算と数値表現】**
　意外に知らなかった事実としては、コンピュータは"基本的に足し算しかできない"ということである。しかし、工夫することで基本的な算術演算をできるということが主にこの章で説明されている。また、この章では小数点を含む数の表し方(固定少数点数、浮動少数点数)や、誤差の扱い等が説明されている。


**【3. コンピュータの回路を知る】**
　コンピュータは、「AND」「OR」「NOT」に代表される真偽値を用いた演算(論理演算)をビットの演算に利用することで様々な処理が実現されている。また、コンピュータが論理演算をするためには、実際にそれを行う電子回路が必要である。すなわち、コンピュータは基本回路(AND回路、OR回路、NOT回路)のような論理回路の集合体であり、このような電子回路を複数組み合わせることで複雑な制御を実現している。
※基本回路3つのベン図を見ると分かる通り、この3つでは拾いきれない集合部分、すなわち、より複雑な条件を用いて出力を制御するために、NAND回路、NOR回路、EOR回路を用いる論理回路がある。
　さらに、この章では半加算機や全加算機、2の補数表現などが説明されている。


**【4. ディジタルデータの表し方】**
　ビット(b)はコンピュータのい扱う最小単位であるが、あれもこれもこの単位で表そうとすると、あまりも大きくなってしまう。そこでコンピュータ(メモリの記憶装置など)では、8ビットをひとまとめにしたバイト(B)という単位が主に用いられる。
　また、そもそもバイトという単位は「1文字を表すの事足りるひとまとまりのサイズ」といった理由が込められている。すなわち、「アルファベットそれぞれに数値を対応づけるには、256通りもあれば足りるでしょ」ということに他ならない。こうして、コンピュータは文字に数値を割り当てることで文字データを表現し、この割り当てられた数値を文字コードという。
　さらに、この章ではこれを拡張して、画像などのマルチメディアデータをディジタルデータに変換することで、数値で表すようにして扱う手法が説明されている。


<font color="red">**【5. CPU】**</font>
　コンピュータのハードウェアは大きく分けると、5つの装置で構成されている。具体的には、CPU(制御装置、演算装置)、記憶装置、入力装置、出力装置といった装置が連携して動いており、これらを総称して、コンピュータの5大装置と呼ぶ。
※記憶装置については主記憶装置と補助記憶装置に細分化される
　また、CPUの命令実行手順は以下に示す通りである。
コンピュータに命令を処理させるためのプログラムは、通常何らかの補助記憶装置に納められている
↓
CPUが直接やり取りをするのは主記憶装置のため、実行時にはプログラムをあらかじめ主記憶上に移しておく必要がある(これをプログラム内臓方式という)
↓
その後、CPUが１つずつ命令を取り出し、読み出して実行する
(これを逐次実行方式と言い、これらの特徴を持つコンピュータのことをノイマン型コンピュータと言う)
※ここで、CPUが命令を実行するために取り出した情報(命令)は、CPU内部のレジスタという主記憶装置に保持される。
　さらに、この章ではより詳細に命令の実行手順(命令の取り出しから実行まで)が説明されており、またCPUの性能指標や高速化技術についても説明されている。


<font color="red">**【6. メモリ】**</font>
　メモリには読み書き可で揮発性のRAMと、読み出し専用で不揮発性のROMがある。また、RAMは主記憶装置に使われるDRAMとキャッシュメモリに使われるSRAMの2種類に分かれる。
　さらに、記憶装置ごとにアクセスする速度を比較すると、CPUのレジスタ＞メモリ(主記憶装置)＞ハードディスクなどの磁気ディスク装置の順になる。この速度差には「超えられない壁」があり、これらの間の待ち時間によるロスを防ぐためにキャッシュといういう手法が取られ、この章で詳しく説明されている。


**【7. ハードディスクとその他の補助記憶装置】**
　この章では、ハードディスクとその他の補助記憶装置について説明されている。


**【8. その他のハードウェア】**
　この章では、その他のハードウェアについて説明されている。

<font color="red">**【9. 基本ソフトウェア】**</font>
　OSとアプリケーションの関係性は以下の通りである。
①まず、パソコンやスマホを使って画面を操作
↓
②OSがその操作を読み込み、アプリケーションソフトに指示を出す
↓
③その指示を受けたアプリケーションソフトがプログラムを実行する
↓
④アプリケーションソフトが実行した結果をOSに送る
↓
⑤その実行した結果をパソコンやスマホに表示する
　というように、記憶装置やキーボードやタッチディスプレイ等の機器からの入出力、入力されたデータを利用するプログラムへのデータの受け渡し、複数のプログラムを同時に実行できるように実行順や入出力の順番を制御などをOSにより実現されているのである。すなわち、OSは普段我々がコンピュータを使って当たり前だと思う機能を全て提供してくれている。

<font color="red">**【10. ファイル管理】**</font>

<font color="red">**【11. データベース】**</font>

<font color="red">**【12. ネットワーク】**</font>

<font color="red">**【13. セキュリティ】**</font>

<font color="red">**【14. システム開発】**</font>

<font color="red">**【15. システム周りの各種マネジメント】**</font>

<font color="red">**【16. プログラムの作り方】**</font>

<font color="red">**【17. システム構成と故障対策】**</font>

##さいごに
　赤で記したChapterに関して要約できず、この記事だけではコンピュータサイエンスについての外観、及び全てのテーマを理解することは難しいと思うが、この分野について学習したいと考えている方は是非この本を手に取って、自身で読み進めて欲しい。エンジニアになる上で必須の知識が数多く説明されていて、非常に勉強になった。
　なお、学習時間の目安は約9~10時間を想定すればよいと思われる。