我、京大生ぞ

現役京大生の雑記。メインテーマは大学受験とプログラミングと英語と京大の日常

プログラミングの勉強に必要な分野を図にまとめてみた【プログラマー必見】


こんにちは、京大生ブロガーのゲーテ(@goethe_kyodai)です。


皆さん、こんな悩みを抱えていませんか?

  • 情報系の高校or大学に入る予定で予習したいが何をどの順番で勉強したらいいのかわからない

  • もっと速くてメモリ消費の少ないプログラムを書きたいけど何をどの順番で勉強したらいいかわからない
  • プログラマーになりたいけどプログラミング以外に何をどの順番で勉強すればいいのかわからない

  • プログラマーで上を目指したいけど何をどの順番で勉強すればいいのかわからない


そんな人達のためにプログラミングの勉強に必要な分野をツリーの図にまとめてみました。


自分がプログラミング関係を勉強する中で


「これを理解するためにはこの分野をわかってなきゃいけない、あっこの分野を理解するためにはあの分野も理解しなきゃいけない、あっあれもこれも....」


とどんどん辿っていったのをまとめました。


これを見れば一発で勉強すべき勉強がわかる代物です!プログラマーは必見です!


目次

 
 



ツリー図


f:id:a86223990:20180618024713j:plain


「Aの勉強にBが必要」という関係を「A←B」で表してます。


「なぜこういう順序になるのか」を矢印の番号ごとに説明します。

1 プログラミング←アルゴリズムとデータ構造


ありとあらゆる実装にアルゴリズムとデータ構造の知識が必須です。


プログラミング関連の全ての技術にアルゴリズムとデータ構造が使われてると言っても過言ではないでしょう。


だから、技術の理解にはアルゴリズムとデータ構造の知識が必須といえます。理解できてないものは応用もできません。


最近はライブラリが充実してるからアルゴリズムとデータ構造は自分で実装しなくてもいいという人もいます。


ですが全てのアルゴリズムとデータ構造のライブラリがあるわけではないし、速くメモリ消費の少ないプログラムを書くなら絶対にマスターしなければなりません。


2 プログラミング←コンピュータアーキテクチャ


プログラムを実行するのはコンピュータです。


なので速くメモリ消費の少ないプログラムを書きたいなら、プログラムがコンピュータのCPUやメモリでどう実行されるのかをちゃんと把握してなければなりません。


メモリやCPUなどコンピューターのハードウェアの設計と構成を扱うのが「コンピュータアーキテクチャ」です。

3 プログラミング←データベース


プログラミングでWebサービスを作る場合膨大なデータを捌くことになります。そのデータをどう管理するかについての知識、つまりデータベースの知識が必要です。

4 プログラミング←ネットワーク


Webプログラミングではネットワークを意識する必要があります。


クライアントからどういうルールでどこをどう経由してサーバーにアクセスするのか、逆にサーバーからクライアントまでどういうルールでどこを経由してデータを送信するのか、一通り知っていれば早くトラブル解決できることがあります。


また、HTTPやTCP/IPなどのプロトコル(約束事)の知識はエンジニアなら必須です。


技術には流行り廃りがありますが、ネットワークの基礎は何十年も変わってません。ある前提に技術が構築される、インフラのようなものなので今後も廃って行かないものです。


ネットワークの勉強が無駄になることはないでしょう。

5 プログラミング←アセンブリ言語


多くのプログラミング言語ではプログラムはアセンブリ言語に変えられてからマシン語に変換されます。プログラミングの動作の真の理解にはアセンブリ言語を読めるようになる必要があります。


プログラムの速度をこれ以上ないレベルまで上げるためにアセンブリ言語でプログラムを書くこともあるそうです。

6 アルゴリズムとデータ構造←コンピュータアーキテクチャ


データ構造は記憶装置(メモリ、HDD、SDDなど)へのデータの格納の仕方と言えます。


記憶装置それぞれの読み書き速度や信頼性(HDDは読み書きが遅い、レジスタやメモリは速いなど)を知っていると、それぞれの特性を利用して速くメモリ消費の少ないプログラムが書けます。

7 グラフ理論←アルゴリズムとデータ構造


グラフの情報をどうやって記憶装置に格納するか、キューやスタック、ハッシュや木などのデータ構造の知識が必要です。


また、グラフ上の最短経路を求めるのにダイクストラ法やベルマンフォード法のようなアルゴリズムの知識が要ります。
 




 

8 コンピュータアーキテクチャ←論理学


コンピュータは0と1のみを扱います。1を真、0を偽とした真偽値をマスターするために論理学を勉強しておくといいです。

9 コンピュータアーキテクチャ←電気電子回路


コンピュータのハードウェアは電子回路からできてます。ハードウェアを根本から理解したいなら、電子回路の性質やコンデンサーなどの電子部品の知識が必要です。


電気電子回路を学ぶならこの本がオススメです。大学生向けですが、高校の教科書のようにわかりやすいです。


10 データベース←アルゴリズムとデータ構造


Bツリーなどのデータ構造の知識があると、読み書き速度やデータが静的(頻繁に挿入や削除をしない)か動的(頻繁に挿入や削除をする)かなどの用途に合わせてデータベースシステムを構築できます。


あるデータ構造で格納したデータの効率のいい探索アルゴリズムを知る必要もあるでしょう。

11 ネットワーク←グラフ理論


ネットワークはグラフで表します。


ルーティング(データをネットワーク上のどこを経由するかを決める方法)にグラフ理論で扱うアルゴリズムが必要です。


また、ネットワーク上の2地点の最短距離や、あるネットワークの最小全域木を求める時に、ダイクストラ法やプリム法などのグラフ理論のアルゴリズムの知識が必要になっていくので、ネットワークを勉強するならまずグラフ理論を勉強しとくべきでしょう。

12 グラフ理論←線形代数


グラフ理論ではグラフを隣接行列で表現します。行列を掛けたり色々するので、線形代数の知識が必要になってきます。

13 ネットワーク←情報理論


ネットワークは離れたところで「情報」のやりとりを可能にするものです。


そもそも「情報」とは何か、送れる情報量の限界はあるのか、あったらどの程度なのか、などの疑問に答えてくれるのが情報理論です。


14 グラフ理論←離散数学


グラフは連続値ではなく飛び飛びの値(離散値)を扱います。まさにその離散値を扱う離散数学を勉強しておくとグラフ理論の理解の助けになります。

15 電気電子回路←電磁気学


電気電子回路では、「電気」「電子」のような得体の知れない謎のものを前提にしています。


その正体を探るのが電磁気学です。


ただし勉強するなら難しいので覚悟が必要です。周りの理系大学生で、電磁気学が大学の理系科目の中で一番難しくてヒイヒイ言いながらやってるって人が何人もいます。

とっても大事なまとめ


正直に言ってプログラミングの勉強をするのにこれらすべてを学ぶ必要はないです(笑)。ていうか多すぎて無理だと思います。


ですが、プログラミングを生業とするなら、アルゴリズムとデータ構造、コンピュータアーキテクチャ、データベース、ネットワークの勉強は必須です。


これらをざっくりでも理解して頭の片隅にあると、プログラミングのいろんな技術の理解がかなりスムーズにできるからです。


あと人工知能や機械学習が大事になってくるこれからの時代は、それらの基礎となる線形代数も必須になってくるかもしれません。


正直、線形代数の勉強は本当に面白くないですが(同級生や教授含め、面白いと言っている人見たことない)、応用範囲がゴビ砂漠のように広いので勉強しておいて損はないです。


アルゴリズムとデータ構造、コンピュータアーキテクチャ、データベース、ネットワークを完全に深く理解したい人だけ、アセンブリ言語、論理学、電気電子回路、グラフ理論、情報理論、電磁気学、離散数学、線形代数を勉強するといいでしょう。


自分で紹介しといてなんですが、論理学や電磁気学まで掘り下げるのはやり過ぎな気がしますが(笑)。