概要
Webエンジニアとして実務経験は数年ありますが、今の自分はまだプログラマーとして初心者レベルだと思っています。
仕事はなんとかこなしていますが、一歩上にあがる必要を感じています。
そこで、どのような学習をすべきかを考え実践中なので共有したいと思いました。
なぜ自分を初心者レベルだと思うのか?
海外のコンピューター専門の大学(カリフォルニア工科大学、スタンフォード大学、MITなど)では、一学期でコンパイラを作成するとのことです。
ドラゴンブックやタイガーブックなどを教科書として使っていると小耳に挟みました。
それらの本を買って読んでみましたがかなり難しいと感じました。
しっかりコンピューターサイエンスを学んでいる学生さんはレベルがかなり高いと感じています。
一方そのころ、日本人である自分は英語から学ばないといけないという。。。
20代後半からコンピューターを学び始めたにわかの自分にとっては、この差を埋めるのはかなり至難だと思っています。
高度な設計もできないですし、オブジェクト指向でコードを書くこともできません。
これからはちゃんと設計ができ品質の良いコードをかける人が生き残ると勝手に予想しています。
使う側から作る側へいかないと厳しそう
今は先人たちや優秀な人が作ってくれたフレームワーク、ライブラリなどを「使う側」です。
誰かが作ってくれた便利なものを使わせてもらっている状態です。
業務では生産性が重視されるので、便利なフレームワークやライブラリなどを利用しますが、レベルの高い人材になるためには「作る側」に回らないといけないと思いました。
フレームワーク、ライブラリ、ツールなどを「作る側」になることがレベルアップへの最短の道だと考えています。
スキルアップするために行っている学習法
低レイヤー
まず基本から学習することにしました。
機械語やアセンブリ言語を学びました。
アセンブリ言語は簡単と言われる方が多い印象ですが、自分はCPUのレジスタやメモリの仕組みなども知識がなかったです。
そのためアセンブリ言語は全くと言っていいほど読めなかったです。
そこでCPUの仕組みやレジスタ、スタックなどに関する学習を行いました。
そうすることで、アセンブリ言語はだいたい読めるようになり、裏側でどのようにコードが実行されているのかがわかるようになってきました。
アルゴリズム
次に行ったのはアルゴリズムの学習です。
問題解決法であるアルゴリズムは知識として知っておくだけでも全然違うとベテランの方から教わりました。
最初に学んだのは「再帰処理」です。
アルゴリズムでは、いたるところに再帰処理が使われていて、これを理解しないと次へ進めないと思ったからです。
組み合わせ問題やコンパイラの基礎などをやりました。
「末尾再帰」や「繰り返し処理と再帰処理の違い」などを理解することができました。
数学
アルゴルズムを学んでいると嫌という程「数学」が出てきます。
時間計算量、行列、三角関数、対数、ネイピア数など、何かしら高度なトピックには数学がからんできます。
高校の授業を寝ていた自分としてはアルゴリズムの書籍を読んでも理解ができませんでした。
数学から学びなおす必要があることに気づきます。
せめて高校レベルの数学は理解していないと、データ構造、クヌース本などの良書も読めませんでした。
数学は現在、微分、積分、対数あたりを学んでいます。
数学も公式を使って問題を解けるというレベルではなく数学を理解しているレベルまで学ばないと理論を理解できないです。
先は長い。。。
デザインパターン、リファクタリング
最後はデザインパターンとリファクタリングですが、ここまでまだ至っていません。
これまでの学習とはまた別で行う必要があると感じています。
フレームワークのお作法に沿ってコードを書いていても、大規模でないとなかなか実践で使える機会はないように思えます。
ライブライリやツールなどを「作る側」になると頻繁に活用することになりそうですが、業務でも最新の技術を追うための学習が必要です。
業務に関連しない学習を行う余裕がないのですが、その状態が良いことだとは思っていません。
具体的には設計理論を学んだり、コードを抽象化する練習になりそうです。
本当にオブジェクト指向を理解したいなら、オブジェクト指向言語のコンパイラを簡単に作ってみるのが早いと感じていますが、なかなかハードルが高いです。
「チューリングマシンとは何か?を説明してくれ」と言われても説明できません。
今すぐに結果がでなくても、学習しておくことで長期的に効果が出てくるような基礎学習もやらないといけないなと思って学習中です。
言い訳せずに日々、地道に学習を積み重ねていくことが大事だと思いました。
上を目指そうとするなら遊んでる暇ないですね。。。