独学ガイド/理工学一般/情報工学への入門法

出典: フリー教科書『ウィキブックス(Wikibooks)』
ナビゲーションに移動 検索に移動

情報工学への入門法[編集]

前提[編集]

前提として、読者は、高校の「情報」教科の検定教科書を学習した上での学習とします。また、高校の数学3と数学2B、数学1Aの検定教科書の、すべての単元の学習を終えたことを前提とします。

高校によっては、高校数学で「集合論」の単元を飛ばしたり、「命題」と「論理」の単元を飛ばしたりする場合もあるが、しかし本書では、集合論も命題・論理も学習も終えたとして、話をすすめます。

高校数学の上記の単元を、理解してない大人は、意外と多い。不安のある人は、『チャート式数学』『シグマベスト数学』などの一般的な大学受験参考書でよいから、集合論や命題・論理、順列・組み合わせなどについて、基本問題・練習問題くらいは、きちんと計算練習をしておくこと。

方針[編集]

情報工学は、大学レベルの教科書で勉強する事。なぜなら、情報工学の勉強で、結果丸暗記は、ほぼ無意味。

情報工学の勉強では、たとえ少々の時間が掛かってもいいので、きちんと理解する事を目指す必要があります。

そのため、工業高校の教科書よりも、大学レベルの教科書のほうが望ましい。

工業高校レベルの情報系の教科書は、資格試験の対策なのだろうか、羅列的な説明が多く、初心者には無駄です。辞書的な使い方か、資格試験の対策以外には、工業高校レベルの情報系の教科書は、あまり使いみちがありません。

さて、情報工学の勉強では、なるべくハード寄りの内容から勉強を始めることで、理解しやすくなります。ソフトウェアの勉強をする場合にも、二進法などを用いた計算の原理を勉強することで、理解をしやすくなります。

なので、ハードウェア寄り、計算機寄りの勉強を、大学レベルの教科書でするのが、初心者は望ましい。

ただし、学習の間、離散数学(りさんすうがく)の教科書を、ときどき併用すること。

離散数学そのものは、知らなくても当分は情報工学を勉強できるのですが、しかし少なくとも離散数学の計算練習はしておいたほうはいいです。かといって、いきなり離散数学を勉強しようにも、意義が分からないので、少しだけ後回しでいいです。

まず、勉強する科目[編集]

まず、「論理回路」または「計算機システム」という科目を先に勉強するのが、良いでしょう。そのあと、「離散数学」(りさんすうがく)を勉強します。

  • 「論理回路」または「計算機システム」

まず、専門的な理工書を売ってる書店に行き、電子工学のコーナーに『論理回路』または『計算機システム』のようなタイトルという本があれば、それを立ち読みしてみて、分かりそうであったら買うのも良いでしょう。

  • 離散数学(りさんすうがく)

また、計算練習が必要ですので、工系学部生向けの『離散数学』とかの教科書を購入して、少なくとも「記号論理」と「ブール代数」の単元を計算練習してください。書店では、おそらく数学書のコーナーに、置いてあるでしょう。


離散数学の中には、難しい単元もあるので(「束」(そく)とか、対角線論法(たいかくせん ろんぽう)とか)、当分のあいだは、すべての単元は理解しきれなくても、かまいません。

あと、離散数学の教科書を買うなら、初学者は、日本人の書いた教科書を買いましょう。アメリカ人の「離散数学」教科書は、厚くても内容が浅かったり羅列的であったりして、不便です。「離散数学」の洋書の和訳本にも良書もありますが、初学者には見分けるのが困難ですので、初学者は手を出さないようにしましょう。お金の無駄です。

なお、大学では、離散数学の授業で、よく集合論について、無限集合論とかを教えたりしますが、しかしIT産業の実務では、私の知るかぎりは無限集合論を使いません。まあ、「離散」の意味を説明するのに、無限集合論も必要なのでしょう。あるいは、アメリカの大学の離散数学カリキュラムの猿マネかもしれません。

なお、離散数学の単元のひとつである『グラフ理論』は、数学的な未解決問題が大量にある分野であったり、あるいは、たとえ証明済みで解決している定理でも大難問であったりする定理もある分野なので、けっして『グラフ理論』に深入りしてはいけません。数学者に『グラフ理論』の本格的な研究は任せましょう。

離散数学の勉強を、どの程度深くするかの目安は、離散数学のどの単元も、理工系学部生向けの『離散数学』の教科書に書いてある程度のことが分かれば、それで充分です。IT産業の実務では、あまり、離散数学を使いません。

『論理回路』や以下に説明する『コンピューターアーキテクチャ』など、離散数学以外の科目の教科書では、計算練習まではしてくれません。なので、ややもすると、理解せずに文字を目で追っただけになりかねず、理解が不十分になる可能性があるので、念のために離散数学の科目によって計算練習をするだけだと思っておけば良いでしょう。


やや後回しにする科目[編集]

離散数学や論理回路などを勉強したら、次は、『コンピューターアーキテクチャ』と『オペレーティングシステム』という科目を、次に勉強するのが良いでしょう。

一見すると、科目が多そうに見えますが、すでに論理回路で習ったシステム的な考え方を、『コンピューターアーキテクチャ』も『オペレーティングシステム』も、応用的な視点にもとづいて再編成したような科目です。

また、「情報工学入門」とか「コンピューター工学入門」とかのタイトルの教科書で、情報工学の全体像を勉強するのが良いでしょう。

『コンピューターアーキテクチャ』『オペレーティングシステム』などのタイトルの本は、論理回路を知らない初学者が読んでも、あまり分かるようには、なっていません。なので、もし、まだ論理回路の学習が終わってない場合は、先に論理回路を勉強してください。


  • 『コンピューターアーキテクチャ』と『オペレーティングシステム』

さて、『コンピューターアーキテクチャ』とは、コンピューターの「メモリ」「アドレス」「CPU」「キャッシュ」などのようなハードウェア的な部品の、機能を説明する科目です。「CPUがメモリのアドレスにどうアクセスすることで、○○の機能を実現してる」のような仕組みを説明するような科目です。いっぽう、メモリそのものの、半導体素子についての構造は、『コンピューターアーキテクチャ』では説明していません。

『オペレーティングシステム』は文字通り、Windows・macOS・UNIXやLinuxなどのオペレーティングシステムに共通する仕組みを扱います。

学習の順序として、とくにコダワリがなければ、

先に『コンピューターアーキテクチャ』を学習してから、
その次に『オペレーティングシステム』を学習するのが、

簡単にキャッチアップできるようになるでしょう。

このように、情報系の学科での初学者の学習ノウハウでは、通常は、ハードウェアに近いほうから入門するのが、初学者には簡単です。

1990年代ごろは、今の『論理回路』『計算機システム』で習うような内容が、『コンピューターアーキテクチャ』の教科書の半分くらいで多く扱われていたりして、ほぼ同じような科目であったのです。今の「計算機システム」が、1990年代は『計算機アーキテクチャ』などといった科目名であったりしたのです。

しかし、その後、2000年代に入ってパソコンの発達により『コンピューターアーキテクチャ』の教育内容も増えていき、そのため、『コンピューターアーキテクチャ』教科書での論理回路の解説は少なくなっていったようで、2017年の現在では『論理回路』と『コンピューターアーキテクチャ』は、ほぼ別内容の科目になっています。

また、『オペレーティングシステム』の内容も、1990年代以降、時代にともない増大しています。

そして、このような歴史からも分かるように、けっして中古や図書館の古本ではなく、かならず近年に出版された新しい教科書で、『コンピューターアーキテクチャ』『オペレーティングシステム』を勉強してください。

基本的に情報工学では、古い本は使い物になりませんが、特に、この『コンピューターアーキテクチャ』と『オペレーティングシステム』の科目では、古い本は、まったく使い物になりません。


さて、オペレーティングシステムの仕事のひとつとして、CPUやメモリなどといったハードウェアの制御・管理があります。つまり、コンピューターアーキテクチャで習ったようなハードウェア部品を、オペレーティングシステムは、制御・管理しているのです。

結局、『コンピューターアーキテクチャ』も『オペレーティングシステム』も、同じハードウェアを、視点を変えて分析しただけです。ハードウェア側の視点でハードウェアのシステムを分析したのが『コンピューターアーキテクチャ』であり、ソフトウェア側の視点でハードウェアのシステムを分析したのが『オペレーティングシステム』です。

実際、両科目の教科書を読んでみると、『コンピューターアーキテクチャ』の教科書でもオペレーティングシステムについて言及していたり、同様に『オペレーティングシステム』の教科書でもメモリやCPUのシステムについて言及していたりします。

なお、この両科目(『コンピューターアーキテクチャ』と『オペレーティングシステム』)の特徴として、実際にパソコンを使用していないと、イメージのわきづらい部分があります。特に『オペレーティングシステム』のほうが、そういう特徴があります。

なので、論理回路よりも『コンピューターアーキテクチャ』を後回しにしろと紹介して、その次に『オペレーティングシステム』を勉強しろと言ったのです。

その後[編集]

必要に応じて、いろいろと勉強してください。

情報系の分野は、業界の変化が早いので(いわゆる「ドッグイヤー」dog year、イヌみたいに成長が早いの意味)、いきなり各科目に深入りするよりも、まずは「コンピューター工学入門」的なタイトルの書籍で全体像を把握したほうが良いでしょう。


なお、学習者は、深くIT技術を学びたい場合、自分の仕事にしたい分野よりも、1段階だけハード寄りの分野も、深めに学習するのが効率的であります、・・・などと、日本のIT技術者のあいだでは、よく言われているようです。(ただし、仕事などで即物的な知識が必要な場合を除く。)

例えば、セキュリティに興味がある場合なら、攻撃の手口には、オペレーティングシステムのバグを狙ったり、ハードの特性を悪用した攻撃手口もありますので、セキュリティを学ぶ際には、セキュリティ技術の教科書ばかりを学ぶよりも、できれば、オペレーティングシステム論やコンピューターアーキテクチャ論などの教科書も学ぶようにすべき、・・・という事です。

もちろん、まったくセキュリティ技術の教科書を今までに読んだことがないなら、まず先にセキュリティの教科書やネットワーク技術の教科書を読むのが、オススメでしょう。 ですが、ある程度、レベルの高いセキュリティ技術の教科書を何冊か学んだら、次は、1段階だけハード寄りのオペレーティングシステム論やコンピューターアーキテクチャ論なども学ぶようにすべき、・・・という事です。

ただし、いくらハード寄りといっても、セキュリティを学ぶ目的では、さすがに材料工学とかまで学ぶ必要は乏しい、・・・というような意味で「1段階だけハード寄り」という事です。


さて、プログラミングの勉強は、もし作りたいソフトがないと、あまり深くはプログラミング技術が身につきづらい、・・・とネットなどでは言われているようです。なので、もし、まだアナタに作りたいソフトがない場合、あまりプログラミングには深入りせず、初歩的なプログラムの練習までで満足しておいて、あとの時間は、他の分野を先に勉強するのが効率的かもしれません。

プログラミングの勉強[編集]

注意事項[編集]

プログラミングは、暗記科目ではないです。

プログラミングの構文については、けっして一字一句まで暗記する必要はありません。

プログラムの勉強で必要なのは、せいぜい、「どういう構文に、どんな機能があるか?」というくらいのことを、覚えておけばいいのです。

言語の種類によって構文の細部は変わるので、いちいち構文の細部を暗記するのは無駄です。


そのプログラム言語に、どういう機能があるのかさえ知っていればいいのです。あとは、必要になったときに、書籍やネットなどで調べます。


そしてプログラミングは、「覚えるもの」ではなく、機能を組み合わせて「自分で作るもの」です。

プログラム言語の文法は、単に、組み合わせの元となる機能を、提供しているだけに過ぎません。

そのプログラムに応じて達したい目的に応じて、自分でプログラムを考えるのです。


よほど課題の条件を指定しないかぎりは、機能の組み合わせ方は何通りもありますので、答え(正常に動作するプログラム)のコードもまた何通りもあります。正解は、けっして唯一ではありません。

よほど課題の条件を指定すれば、正解のコードが1通りに限定されるかもしれませんが、しかし、そのような限定は実務において無駄です。

たとえるなら、大学ロボットコンテストや鳥人間コンテストなどで、各学校が機体を出場させるので、全校で何通りもの機体が出場するのと同じです。

検査が必要

また、プログラムの勉強において重要なこととして、実際にパソコンのプログラム作成ソフトに、作成したプログラムのコードを入力してみて、作成したソフトを起動してみて、作成したソフトを試すことが、勉強に必要です。

たとえるなら工業製品の製造工程における検査のようなものです。

そして、作成したソフトに故障(いわゆる「バグ」)があれば、その原因はほぼあなたの入力ミスですので、あなたが自分で故障の箇所をみつけだし、自分で修正して、再度、作成したソフトを実行して、故障がないかどうかを確認します。

故障がなくなるまで、上記のような修正を繰り返し、つづけます。このように、ソフトの故障がなくすために修正することを「デバッグ」といいます。

これが、プログラムの勉強法に必要です。


要するに、

  1. 設計 課題にあわせてプログラムを設計し、実際に入力して作成します。
  2. 検査 作成したプログラムを実行し、故障のないことを確認します。
  3. 修正 故障があれば修正し、修正のため上記の工程をくりかえす。

という、何かを設計・製造するための当然の方法を行うだけです。


プログラムの勉強において、作成ソフトに入力して動作させて試すことは、たとえるなら工業製品の製造工程における検査のようなものです。工業製品の検査において、故障が無く正常動作することを確かめるように、プログラムの検査でも、そのプログラムが正常に動作してるかどうか、自分でソフトを操作してみて確認します。

検査のない工業製品は、使い物になりません。


C言語プログラムを実行できるソフトは、ネット上で無料で配布されています。


なお困ったことに、日本の理科系の大学教育では、このような、設計→検査→修正 の考えかたが、ロクに教えられてません。日本では、大学の理系学部でも、公式丸暗記の暗記科目のような教育が横行しています(いちおう、工学部などで設計をする科目はあるが、形骸化しています。座学に比べて設計科目の時間が大幅に不足しており、形骸化しています。また、座学の授業でも、実務から離れた、複雑な計算問題を出す授業を行っています。)。こういう大学の暗記教育の実態は、悪い手本ですので、けっしてプログラムの勉強の参考にしてはいけません。

まず、理系大学では、プログラミング言語をどう習うか[編集]

理工系の大学でのプログラミング言語の授業では、ほとんどの理工系大学では「C言語」という名のプログラミング言語を勉強するのが一般的です。

しかし、いきなりC言語を勉強することは少なく、その前に、パソコンの使い方を習う授業を受けます(その科目名は「情報リテラシー」「コンピューターリテラシー」などが多い)などをするのが普通です。

C言語の授業では、条件分岐のif文など、中学高校でも習ったような機能のプログラミングを習います。

なお、中学高校で習ってない高度な機能(メモリの制御などのための機能)も、C言語にありますが、しかし大学の情報工学科以外の(機械工学科などの)授業では、そのような高度な機能は、習いません。

理系の大学の機械工学科などのプログラミング授業で習う、プログラミングは、中学の技術家庭科でも習うような、条件分岐のためのif文や、反復のためのfor文などのようなレベルまでです。


なお、「Fortran」などの、C言語よりも簡単だろうと世間的に言われている授業をする場合も、2000〜2010年のころの理系大学では、ありました。

なお、2000〜2010年のころの理系大学では、「BASIC」(ベーシック)や「COBOL」(コボル)は勉強していないのが普通でしょう。BASICやCOBOLは、1990年ごろまでは大学教育で流行していたのですが、しかし、その後、急速にすたれました。


さて、注意すべき事として、多くの理工系大学の機械工学科・電気電子工学科・土木工学科・建築学科では、「C++」(シープラスプラス)言語は学ばないです、という事です。「C言語」と「C++」言語は、別のプログラミング言語です。学校で使っているコンパイラ(プログラム作成用のソフト)が「Visual C++」であったりしますが、Visual C++にはC言語の機能も付属しており、機械工学科などの授業ではC言語しか習わないのが一般です。


もし、C++を習ったとしても、C言語の授業でも習うことと同じ内容を、C++言語の授業でも習うのが一般的です。

C++のほうが、C言語よりも新しいので、C++のほうが機能が豊富です。しかし、情報工学科や電子情報工学科を除いて、C++言語は、習いません。つまり、機械工学科や電気工学科では、C++を習わないのが普通です。

独学では、どうすべきか?[編集]

どの言語を学ぶか[編集]

  • C言語

初学者は、「C言語」を学ぶのが、良いでしょう。なぜなら、「C言語」については、市販の入門書が充実しています。

また、情報工学の専門分野の教科書のいくつかが、「C言語」の知識を前提にして、教科書のなかで内容説明をしている場合があります。

本屋に行けば、もし、その本屋がプログラミング入門書をあつかっていれば、「C言語」の入門書が置いてあるのが普通なので、それを買って、読んで練習すれば、充分です。

C言語を学ぶ場合[編集]

「C言語」を学ぶなら、本屋に行けば、もし、その本屋がプログラミング入門書をあつかっていれば、「C言語」の入門書が置いてあるのが普通なので、それを買いましょう。

買う本を選ぶさい、かならず「入門 C言語」「やさしいC言語」「わかるC言語」「はじめてのC言語」のように、初学者むきのタイトルを宣言している本を選びましょう。

それ以外の本は、すでに初心者向けの入門書を買った人が、さらに知識を深めるための専門書であり、けっして初心者向けではないです。

たとえば、「C言語完全マニュアル」みたいなタイトルの本は、すでに「C言語入門」とかを読んだ人で、さらに仕事でC言語を使う人が、細かい知識を確認するための書籍なので、その書籍の記述が羅列的であり、まったく初心者向けには噛み砕いてくれないので、なので初心者が読んでも理解できないです。

※ 書店では、プログラミング言語の初心者向けの書籍と、専門家向けの書籍が、同じ棚(たな)にあったりして、すぐ隣りに置いてあったりするので、気をつけましょう。


  • 大学教授と「入門 ◯◯」

著者が大学教授であり、プログラミング解説書のタイトルに「入門 ◯◯」とある本は、もしかしたら初心者むけでない場合があります。

どういう事かというと、大学でいう「入門」とは、けっして「初心者むけ」という意味とはかぎらず、「その学問を教える教師や会社上司のような職業の人が、学生や部下の新人に基礎を教えるさいに、教師役が確認するために学ぶこと」という意味がある場合もあるからです。

特に、著者が大学教員の場合に、このような書籍である傾向があります。これはこれで、プログラマー業界のためには必要な書籍ですが、しかし、けっして、初心者むけではなく、上級者むけの本です。

こまったことに、書店では、そういう上級者むけの本が、「はじめての◯◯」とか「やさしい◯◯」とかの近くに、並んでいます。

C言語や、後述する「C++」は、大学でも習うことが多いプログラミング言語なので、そういう本が、書店には多いのです。


ただし、著者が大学教員のプログラミング言語の書籍には、すでに他の著者の入門書を買ったあとなら、2冊目に読む本としてなら、内容が充実しています。プログラミング言語の解説書には、新しい分野である事もあって、質のひくい書籍も市場に混ざっていることも多いですが、しかし大学教員の著作する書籍ならば、平均的な質は、確保されています。


C言語の勉強方法[編集]

読んで、じっさいにパソコンで動作させてみて、書籍前半の内容を練習すれば、充分です。

理系の大学の機械工学科や電気工学科などのプログラミング授業で習うのは、中学の技術家庭科でも習うような、条件分岐のためのif文や、反復のためのfor文などです。


なので、「C言語」を『ポインタ』機能まで読んで、ひととおり練習したら、さっさと「C++」の書籍を購入して、C++の勉強に入りましょう。

独学では、『ポインタ』機能は、理解できなくても、かまいません。世間の書籍には、ポインタについての説明の下手くそな本も多いです。


また、『ポインタ』をつかったメモリ管理の機能(calloc関数など)については、かなり高度な機能であり初学者は使いこなせません。一般の入門書でも、メモリ管理については書いていません。理系の大学でも、機械工学科などでは、メモリ管理については習いません。

ステップアップにはC++を学ぶのが一般的[編集]

さて、「C言語」を『ポインタ』機能の手前まで、ひととおり練習したら、さっさと「C++」の書籍を購入して、C++の勉強に入りましょう。

理系の大学のC++の授業では(もっとも、機械工学科ではC++を習わないのが一般的ですが)、「クラス」とか「オブジェクト」などの機能を学ぶのが、一般的です。この「クラス」とか「オブジェクト」の機能は、C言語にはありません。

ほかの言語でも、西暦2000年以降につくられたような言語の多くには、「クラス」や「オブジェクト」の機能があるので、それらの言語をまなぶ際の参考にもなります。

C++の入門書を買う本を選ぶ際にも、かならず「やさしいC++」「わかるC++」「はじめてのC++」のように、初学者むきのタイトルを宣言している本を選びましょう。