3年間プログラミングをやってきた自分が勧めるプログラミングのロードマップ
自己紹介
はじめまして,私は現在大学三年で、電気・情報を専攻しております。最近は数学やシェーダーに興味が向いています。
ちゃんとプログラミング始めたい人のためのロードマップとなれば良いと思って作成しました。
自分のやってきたことを踏まえておすすめの勉強法を提示できたらと思います。
学び方の結論
pythonやる
オブジェクト指向について学ぶ
C#,Java,C++など静的型付け言語を学ぶ。ちなみにUnityでC#を学ぶとコードがすぐにゲームとして反映されるので理解しやすい。
デザインパターン(設計手法)を知る。
アルゴリズムの勉強。
興味のあるものを作る。知る。学ぶ。
======さらにより深くコンピューターを知る=======
7. 回路アーキテクチャ、アドレス、アセンブリ、OS、コンパイラ、C言語などの低レイヤー箇所を学ぶ。(特にアドレスを理解しておくのは重要)
8. 目標を設定して課題を洗い出してその課題を解決するための設計を自分で考える。
9. 数学をやる。
勉強法
基本的には”9割パクリ、1割オリジナル”の気概で物を作っていくべきだと思います。
具体的には、
既存のプロジェクトを改造、改変する
→その時改変するために「ここのコードはどういう意味だろう」と思いググる
→理解しちょっと改変を加えられる
→段々そのプロジェクトやその言語の全体の構造を掴んでくる。
→いつしか自分の思ったことを自分の力で設計して作れるようになっている。
みたいな感覚。
しかしいずれにせよ、基礎知識が整っていないと、「そもそもコードを実行させることすらできない。この構文の意味自体を知らないからコードが何を意味してるのか理解できない。」といった事象に見舞われるので ”9割パクリ、1割オリジナル” とは別に基礎の知識を体系的に習得する過程は必要だと考えています。
(どこまでを基礎の知識とするのかは個人の願望によるのですが)
そういうわけで、プログラミング始めたての時は図書館で本を借りたり、技術本を読むなど体系的に学ぶのが効率いいと思います。
おすすめのサイト
東大のpythonプログラミング講座.本当に0から始める人向け。これやればデータ処理系は基本的なことなんでもできます。
Pythonプログラミング VTuber サプー : Pythonの基礎から中級までをわかりやすく解説してるチャンネル。
ゲームが作りたい : 選択肢としてunity(C#)or Unreal Engine(C++)が主に挙げられます。おすすめはUnityです。
Unityのおすすめ本は以下の猫本です。これに従うだけで大体理解できる。
Unityの教科書 Unity 2021完全対応版 2D&3Dスマートフォンゲーム入門講座 (Entertainment&IDEA)
クラスの概念がよくわからん
以下の本がおすすめです。オブジェクト指向がよくわかります。
機械学習と深層学習
東大の松尾研は神です
Deep Learning基礎講座演習コンテンツ 公開ページ
GitHub - matsuolab-edu/dl4us
… 今はもう載せていないみたいですね。深層学習あたりの学習教材や本は大量にあるので適当に一冊買ってみるのがいいと思います。
ちなみに私が初めて買った深層学習関連の本は "ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装" でした。ただこの本や理論を説明するタイプの本なのでプログラミングをやりたい人向けではないのかも?
![](https://assets.st-note.com/img/1671471782228-R8jxGnf4ab.png?width=1200)
まあ知りたいだけなら上記のような本だし、実際なにか作ってみたいなら "Pytorchで学ぶ!深層学習~~" みたいな本は無限にあるのでその辺を買ってみるといいです。
Linuxコマンド
Windowsの人は、windows上でlinuxを動かせるwslというソフトを導入することを強くお勧めします。
なぜかというとwindowsとlinux(mac)のコマンドは大きく異なっており、ネットの世界ではエラー解決の時は基本linuxを前提に話しているからです。wslのインストールは簡単になっているのでサクッと入れましょう。
あ, あと開発環境はVSCodeがおすすめですよ。VSCode + wsl です。
初心者のためのLinux基礎
C++
コンパイルやmakefileのことがわかります。興味がある人向けではある。
江添亮のC++入門
蛇足: ここでちょっと寄り道。なぜコンピューターが動くのか、その原理と美しさを知ると面白いしなんだかんだかなり役に立ちます(急がば回れです)。そういった領域のことを低レイヤーと呼ぶのですが、無料で公開されてる良い資料らをここに置いておきます。
ネット(WEB)全体の知識
動画付きでネットの知識の全体観が知れる。見ていて楽しい
2021年のエンジニア新人研修の講義資料を公開しました - Cybozu Inside Out | サイボウズエンジニアのブログ
これも会社の研修資料。アプリ開発やGitの内容もあって良い。
ミクシィの21新卒技術研修の資料と動画を公開します!
AWSとかが詳しい感じ、研修資料系では1番難しい印象
株式会社リクルート エンジニアコース新人研修の内容を公開します!(2021年度版)
おまけ。プログラミングの世界の外観が見れます。
すべての開発者へ。すごいGitHubリポジトリ10選 - Qiita
Github学習教材
Github とはコードをゲームみたいにセーブできるサービスです。
誤解を恐れずに言えば、エンジニアがコードを無償で公開してる場でもあるのでかなり参考になります。(もちろんライセンスなどの制約はあります)
必見。
AWS
東大のAWS資料。かなり良い。
Docker
PCの中に小さなLinux環境を作るツール。環境が同じなので環境構築で詰まることがほぼなく、自分のPCと分離してるのでPC側に悪影響も出ない素晴らしいツール。イメージというプレハブを作って(すでに配布されてるイメージをとってくることも多い)、それからインスタンス化するようにコンテナというものを作る。なのでコンテナは複数同時に動かせてコンテナ同士が接続して連携もできるので(DockerComposeという機能)、拡張性にも富んでいる。
概要や利点は上記のAWS入門で見た方がわかりやすいと思う
いまさらだけどDockerに入門したので分かりやすくまとめてみた - Qiita
個人的な道程
ここで今まで自分のやってきたことをできるだけ書き残しておきます。
本は結構厳選したものを選んだつもりです。参考になれば。
Pythonやる。
教材はなんでもいい。Pythonだけ教材はネットにもyoutubeにも有名大学が無料で提供してたりと無限にある。
深層学習もいろんな本買って読んでます。
![](https://assets.st-note.com/img/1671474091808-o1QECAaUb9.png)
オブジェクト指向について学ぶ。
![](https://assets.st-note.com/img/1671472993938-WfOC9XDKPz.png)
Unity(C#)やる。
![](https://assets.st-note.com/img/1671473050332-4tmeYCfUFW.png)
![](https://assets.st-note.com/img/1671473032332-PHdmdpX0e8.png)
C++やる。
デザインパターンを学ぶ
本来はUnityの後にデザインパターンを学んだが、この本がC++で書かれておりC++を勉強したら理解の質が段違いに上がったので順序を変えている。個人的にお勧めしたい本
![](https://assets.st-note.com/img/1671473103311-bzgyy0jjd6.png)
自作OS&自作CPUに手を出す(低レイヤー系に手を出す)
自作OS入門はかなり実践的なC++の使い方が書かれているので、この本のおかげで上のデザインパターンの本の理解が段違いに上がったと言っても過言ではない。
![](https://assets.st-note.com/img/1671473125556-upYWcjhTJY.png)
![](https://assets.st-note.com/img/1671473142341-4FDJJVF3XV.png)
Rustやる。
この本は初学者を脱出したあたりで詰まりやすいポイントや具体的な開発方法が記載されており非常に良かった。
![](https://assets.st-note.com/img/1671473159117-bZ8q3YIJJD.png)
ソフトウェアアーキテクチャを学ぶ
Pythonで1、2枚のファイルを使って簡単な動くプログラムを作るだけならこんなことは起こらないが、ちょっとでも規模の大きめのものを作るとなると話は別です。Unityでもなんでも、いざでっかいプロジェクトを作り始めようとすると何から手をつければいいかわからなくなります。そんな疑念に対するアンサーとしてソフトウェアの設計書の作り方の概念を学べるのが以下の本です。
![](https://assets.st-note.com/img/1671473225385-wSWP8afNmY.png)
2. ドメイン駆動設計:アプリケーションの具体的な全体の作り方が見える本。
![](https://assets.st-note.com/img/1671473364919-rAffUjaGds.png)
データ構造とアルゴリズム(atcoder)を学ぶ、やる。
![](https://assets.st-note.com/img/1671473409928-IPmZSQPK6b.jpg)
![](https://assets.st-note.com/img/1671473416986-qySNgHQWo8.jpg)
Game Engine architecture
![](https://assets.st-note.com/img/1671473437269-wryCCbbkdJ.png?width=1200)
その他低レイヤーの本やアルゴリズムの本、コンピューターアーキテクチャの本も読んだ方がいいと思います。
![](https://assets.st-note.com/img/1673537108504-RWL9dCIHdY.jpg?width=1200)
ディジタル回路設計とコンピュータアーキテクチャ
![](https://assets.st-note.com/img/1671473482563-IOb321FmOx.jpg)
UnityのShader芸に憧れてShaderあたりの知識を調べる
現在、VRChatやUnity Shader, GLSL技術などをざっと学んでいます。
Shaderはピクセルを操る言語なので、数学の概念(写像、連続性、微積分、線形代数、群環体など)を学びながらです。楽しいです。
(数学というのは、たとえば、「別のパラメーター(事象)が変化しているのに、結果として何らかの表で確認したら同じように見える」という場合はその表の集計方法では情報が圧縮(全射)されているな…とかそういうのをもっと言語化できるようになりたいという願望です。)
自分で設計できるようになる
VRChat上での実用的なDNNの実装:
https://note.com/logilabo/n/n08d05b7ba581
2. 詳解 車載ネットワーク-CAN、CAN FD、LIN、CXPI、Ethernetの仕組みと設計のために-
前提条件から要求される要件の決め方。それに応じた設計の方法を具体的に知れるので勉強になりました。回路(ICレベル)の設計方法が主です。
![](https://assets.st-note.com/img/1671473647793-XfbLapQUfA.png)
最近は数学や量子力学なども勉強してます。
数学は圏論や位相空間といった演算体系の構築の仕方や、文脈をいかにして演算体系に挿入できるのか、などに興味があって学びました。
数理科学 2006年12月 SGCライブラリー52 理工系のための トポロジー・圏論・微分幾何 双対性の視点から
![](https://assets.st-note.com/img/1682948586289-8FenmrrXQV.jpg)
なっとくする量子力学
![](https://assets.st-note.com/img/1682948730568-wSjST3gRUs.jpg?width=1200)
なっとくする集合・位相
![](https://assets.st-note.com/img/1682949076862-ulqY8ADKGZ.jpg)
学校の授業
授業の中でも特にプログラミングやコンピューター領域に関連してそうな授業を以下に列挙しました。何かの参考になれば… 。
ディジタル信号処理
アナログ電子回路
通信工学
電磁波工学
形式言語とオートマトン
離散数学
情報論理学
制御工学
コンピュータアーキテクチャー
まとめ
なんでもいいので言語を学ぶ(本などの体系だったものがおすすめ)。おすすめはPython.
オブジェクト指向について知る。大体の言語はこれに基づいている
Linuxコマンド(スクリプト実行コマンドも含む、ターミナルコマンド)、Linuxを知る。+GitやDocker、VScodeの使い方もしるといい。
あとは興味のある分野をググって、勝手にやればいいと思う。(各分野においてその分野を得意としている言語があるので、調べてみるといいかも)
低レイヤー、組み込み:C, C++, Rust など
深層学習:Pythonなど
ゲーム開発:C++, C# など
WEB開発:JavaScript (TypeScript) など
IOS開発:Swift, Dart
android開発:Kotlin, Dart
バックエンド:Go, Rust , Ruby, Python, PHPなど
フロントエンド:HTML & CSS & JS
統計・データサイエンス:R , Pythonなど
数値解析 : MATLAB, Mathmatica など
自分語り
大学に入ってからパソコンを与えられたのでプログラミングを始めたのですが、興味がどんどん移行していくのでプログラミングに関してはこれといった専門性のないまま色々かじってきました。
「プログラミング自体が好きでガンガン実装したい」というよりは「新しいことを知ること自体が好き」な性格なのだと思います。なので実際これといった皆が認めるようなポートフォリオはまだ作れていませんし、コードはできるだけ書きたくないとすら思ってます。
あくまで表現・実現するための手段として"コードを書く"という手段を持てると, 自分の及ぼせる影響範囲・または自分の表現範囲が広がるからやってきたという認識が強いです。
あとは何かを作るときの設計の考え方を知れるというのもあります。
追記:
「コードはできるだけ書きたくないとすら思ってます。」と書きましたが、最近はこの理由が ”何をしたいか、正確に要件定義して形式に落とし込めていないから” であることに気づきました。
やることが明確ならば、コードがかける。ふわふわとしてる状態なら何を書けばいいかわからないままコードを眺めて一時間経つだけ。という構造になっていて、当時はそこに気が付かなかったのでしょう。
そういうわけで最近は形式的意味論や論理学や設計のための言語化,細分化のやり方を学んだりしています。(2023/08 現在)
最後に
プログラミングを始める動機ってなんなんですかね、そしてプログラミングが難しいって思ってやめてしまう理由ってなんだんですかね。そこを的確にわかっていないと、この記事を書いた意味がなくなるのですが…
その理由は一意ではないから、自分の轍を見せることと”知っていたらよかったな”というサイトを羅列することがまあ最適かなと思って書きました。
たとえば"ゲームが作りたい!"という人ならこんな記事にはたどり着かず、すぐUnityを始めるわけですよ。逆にいえばこんな記事を読んでくれるような人は明確なやりたいことがあるわけではないのではないか、そう思ってそれなら世界全体を見せること自体に大きな価値があるのではないかという思いの元書いてます。
少なくとも自分はやりたいことがあるわけではなかったので。あったのかもしれませんが、明確にはできてないので結局同じでしょう。でも、自分の中から出てきた好奇心によって勝手に学ぶことが最も価値のあることだと思うので、明確でなくても、むしろそっちの方が良いのではないかと思っています。(これも自分を肯定するための自己弁護でしかないのですが。)
見ていただきありがとうございました。