前提条件として、読者は高校の情報科目の検定教科書を学習し、高校数学の数学3、数学2B、数学1Aの検定教科書の全ての単元を学習済みであることを前提とします。
高校によっては、高校数学の「集合論」の単元や「命題」と「論理」の単元を省略する場合がありますが、本書では、集合論や命題・論理の学習を完了していることを前提として話を進めます。
高校数学の上記の単元を理解していない大人は、意外にも多くいます。不安を感じている人は、一般的な大学受験参考書である『チャート式数学』や『シグマベスト数学』などを使用して、集合論や命題・論理、順列・組み合わせなどの基本的な問題や練習問題をきちんと計算練習しておくことが重要です。
情報工学の学習にあたっては、大学レベルの教科書が望ましいと言えます。なぜなら、情報工学においては単なる暗記ではなく、理解が必要とされるからです。したがって、多少時間をかけてでも、理解に重点を置く必要があります。
工業高校レベルの情報系の教科書は、資格試験対策や羅列的な説明が多いため、初心者には向いていません。辞書的な用途や資格試験対策以外にはあまり活用することができません。
情報工学の学習においては、ハードウェア寄り、計算機寄りの内容から勉強を始めると理解しやすくなります。また、ソフトウェアの勉強においても、二進法などの計算原理を理解することが重要です。
ただし、離散数学の教科書をときどき併用することをお勧めします。離散数学は情報工学を学ぶ上で必須ではありませんが、計算練習などに役立つため、学習の途中で取り入れることが望ましいです。ただし、離散数学を最初に勉強することは難しいため、少し後回しにすることがおすすめです。
まず、電子工学のコーナーにある『論理回路』または『計算機システム』といったタイトルの本を立ち読みして、理解できそうであれば購入することをおすすめします。次に、工学部向けの『離散数学』の教科書を購入し、「記号論理」と「ブール代数」の単元を中心に計算練習を行うことが必要です。ただし、『束』や『対角線論法』などの難しい単元は理解できなくてもかまいません。
大学での離散数学の授業では、集合論や無限集合論を学ぶことがありますが、実務では無限集合論はほとんど使われません。ただし、『グラフ理論』といった一部の分野は数学的な未解決問題が多く、専門的な研究が必要です。
離散数学の勉強において、理工系学部生向けの教科書に書いてある程度のことが分かれば十分です。ただし、計算機アーキテクチャなどの科目では、文字だけ追って理解することが不十分な場合があるため、計算練習をしっかり行うことが大切です。
次に勉強するのは、離散数学や論理回路のような科目を学び、それらのシステム的な考え方を応用的な視点にもとづいて再編成した『コンピューターアーキテクチャ』と『オペレーティングシステム』です。また、『情報工学入門』や『コンピューター工学入門』のようなタイトルの教科書で、情報工学の全体像を勉強するのが良いでしょう。
『コンピューターアーキテクチャ』は、コンピューターのハードウェア的な部品の機能を説明する科目で、『オペレーティングシステム』は、Windows、macOS、UNIX、Linuxなどのオペレーティングシステムに共通する仕組みを扱います。通常、学習の順序としては『コンピューターアーキテクチャ』を先に学び、その後に『オペレーティングシステム』を学ぶのが簡単です。
1990年代には、現在の『論理回路』や『計算機システム』で習うような内容が、『コンピューターアーキテクチャ』の教科書の半分くらいで多く扱われていたため、ほぼ同じような科目であったのです。しかし、パソコンの発達により、『コンピューターアーキテクチャ』の教育内容が増え、論理回路の解説は少なくなっていきました。現在では、『論理回路』と『コンピューターアーキテクチャ』はほぼ別の科目になっています。
『オペレーティングシステム』の内容も1990年代以降大きく変化し、新しい技術やプログラミング言語にも対応するようになりました。したがって、これらの科目を学ぶ際には、事前に必要な知識を持っていることが重要であり、論理回路の学習がまだ終わっていない場合は、先に論理回路を勉強することをお勧めします。
必要に応じて、幅広く勉強することをお勧めします。情報技術分野は、急速に変化するため（「ドッグイヤー」と呼ばれるように、急速な成長を意味する）、個々の科目にすぐに深入りするよりも、最初に「コンピューター工学入門」というような全体像を把握できる書籍を読むことが良いでしょう。
IT技術を深く学びたい場合は、自分の仕事に必要な分野だけでなく、少しハード寄りの分野も学ぶことが効率的であると日本のIT技術者の間でよく言われています。ただし、即物的な知識が必要な場合を除きます。
例えば、セキュリティに興味がある場合、攻撃の手口には、オペレーティングシステムのバグを狙ったり、ハードの特性を悪用した攻撃手口もあります。そのため、セキュリティを学ぶ際には、セキュリティ技術の教科書だけでなく、オペレーティングシステム論やコンピューターアーキテクチャ論などの教科書も学ぶことが望ましいです。
ただし、セキュリティ技術の教科書を読んだことがない場合は、最初にセキュリティの教科書やネットワーク技術の教科書を読むことをお勧めします。一定レベルのセキュリティ技術の教科書をいくつか学んだ後は、1段階だけハード寄りのオペレーティングシステム論やコンピューターアーキテクチャ論も学ぶことをお勧めします。
ただし、セキュリティを学ぶ目的においては、材料工学などを学ぶ必要はありません。
プログラミングの勉強については、作りたいソフトウェアがない場合は、プログラミング技術を深く身につけることは難しいとされています。そのため、まだ作りたいソフトウェアがない場合は、初歩的なプログラムの練習にとどめて、他の分野を先に学ぶことが効率的であるかも知れません。
プログラミングは、暗記科目ではありません。
プログラミングにおいては、文法の細部まで一字一句覚える必要はありません。代わりに、どんな構文がどのような機能を持っているかを覚えるだけで十分です。プログラム言語ごとに構文の細部が異なるため、細部を覚える必要はありません。必要な場合には書籍やネットで調べましょう。
プログラミングは「覚えるもの」ではなく、「自分で作るもの」です。プログラム言語の文法は、機能を組み合わせるための道具に過ぎません。目的に応じて自分でプログラムを考え、機能を組み合わせます。通常、課題によって組み合わせ方は何通りもありますので、正解のコードも何通りも存在します。正解は必ずしも唯一のものではありません。
例えば、大学ロボットコンテストや鳥人間コンテストのように、各学校が異なる機体を出場させ、多様性があるのと同様です。課題の条件を厳密に定めても、実務では限定されないことがほとんどです。
検査が必要
プログラムの学習には、コンピュータのプログラム作成ソフトウェアに自分で作成したコードを入力し、作成したソフトを起動し、試すことが非常に重要です。これは、製造工程における検査に似ています。もしソフトに故障（バグ）があった場合、それはほとんど入力ミスに起因します。したがって、自分で故障箇所を見つけ、修正して、再度実行し、故障がなくなるまで修正を繰り返す必要があります。この修正プロセスを「デバッグ」と呼びます。
言い換えると、プログラムの学習には、設計課題に基づいてプログラムを設計し、実際に入力して作成し、検査し、故障があれば修正するという一連の工程が必要です。これは、何かを設計・製造するための自然な方法です。
プログラムの検査は、工業製品の検査と同様に重要です。工業製品の検査で故障がなく正常動作することを確認するように、プログラムの検査でも、自分でソフトを操作して正常に動作しているかどうかを確認する必要があります。
C言語プログラムを実行できるソフトウェアは、ネット上で無料で入手できます。
残念ながら、日本の理科系の大学教育では、設計・検査・修正の考え方があまり教えられていません。多くの場合、公式の暗記科目のような教育が行われ、設計科目も形骸化しています。また、座学の授業でも、実務から離れた複雑な計算問題が出題されることがあります。このような大学の教育は、プログラム学習の手本にならないため、注意が必要です。
理工系の大学において、プログラミング言語の授業では一般的に「C言語」が学ばれます。しかし、まず最初に、パソコンの使い方を習う授業（「情報リテラシー」「コンピューターリテラシー」などと呼ばれる）を受けることが一般的です。C言語の授業では、中学校や高校でも習った条件分岐のif文などのプログラミング機能を習得します。C言語には中学校や高校で習わなかったような高度な機能もありますが、理工系大学の情報工学科以外の科目ではそのような高度な機能は習得しません。
理工系大学の機械工学科などのプログラミング授業では、中学校の技術家庭科で習ったような条件分岐のためのif文や反復のためのfor文などの基本的なレベルまでしか習得しません。また、C言語よりも簡単だとされる「Fortran」などの授業をする場合も、2000〜2010年の頃の理工系大学では存在しました。しかし、BASICやCOBOLなどは大学教育で流行していた1990年代まで学ばれていましたが、その後急速に使用されなくなりました。
なお、理工系大学の機械工学科・電気電子工学科・土木工学科・建築学科では、「C++」言語は習得しません。「C言語」と「C++」言語は別のプログラミング言語であり、学校で使われるコンパイラに「Visual 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言語にはありません。
他の言語でも、西暦2000年以降に開発された多くの言語には、「クラス」や「オブジェクト」の機能があります。そのため、それらの言語を学ぶ際の参考にもなります。
C++の入門書を選ぶ際には、「やさしいC++」「わかるC++」「はじめてのC++」など、初心者向けのタイトルが付いた書籍を選ぶようにしましょう。