Webエンジニアが知るべき低レイヤーの技術とその学習方法

# 初めまして

[NewsPicks Advent Calendar 2018](https://qiita.com/advent-calendar/2018/newspicks)の 20日目を担当させていただきます、NewsPicks の @takugi です。

弊社 CTO 杉浦が2年程前に書いた [普通のやつらの下を行け！  NewsPicks CTOが新人エンジニアに伝えたい3つのこと](https://www.wantedly.com/companies/newspicks/post_articles/21591) という記事を読み、 **低レイヤーの技術を身につけるべき** という考えに共感しました。その後、目の前の仕事に関する技術のキャッチアップに時間を取られる日々が続いていましたが、今年の半ば頃から低レイヤーの技術を身につけることに少しずつ取り組み始めました。この記事においては、**Webエンジニアが知るべき低レイヤーの技術について** と **低レイヤーの技術の学び方について** 共有したいと思います。

# Webエンジニアが知るべき低レイヤーの技術について

## 低レイヤーの技術とは

ここで言う低レイヤーの技術とは言い換えると、 **コンピュータシステムの仕組み** と言い換えることもできると思います。例えば、高級言語で Hello World と書かれたコードがどのような処理をされて、画面に出力されているかを細かく理解できているかと言うことです。これを理解するためには、以下のような要素についてきちんと理解する必要があります。

* 高級言語
* コンパイラ
* VM(仮想化技術)
* アセンブラ
* 機械語
* OS
* CPU

## なぜ低レイヤーの技術を知る必要があるのか

皆さんはなぜWebエンジニアが低レイヤーの技術を知る必要があると思いますか？ 人それぞれいろいろな意見があると思いますが、僕としては以下のように考えております。

### 1. システム障害発生の時に素早く解決への当たりをつけるため

最近は、便利なフレームワークを使用することで、ほとんど内部の仕組みを意識しなくても実現したい機能やシステムを開発することができるようになりました。しかし、これらのフレームワークの内部でどのような仕組みで動いているのかを理解していないと、障害が発生した際に、何が原因なのかの検討を立てて、調査を進めることができません。

### 2. 技術的に競争力の高いサービスを作るため

低レイヤーの技術を理解していないと、CPUやメモリを効率よく利用するためのアーキテクチャを設計し、要件を満たす高速性の高いシステムを構築できません。低レイヤーの技術を理解して設計されたシステムを構築できないと、技術的に競争力の高いシステムを作ることが厳しくなり、ユーザーが求める最高のシステムを作ることができません。もし作れたとしても、それは誰でも作れる競争力の低いサービスとなってしまいます。

### 3. あらゆる技術のベースになっており、技術のキャッチアップが早くなるから

今が旬のフレームワークだけを完璧に覚えていたとしても、あと数年経つと、それが旬ではなくなってしまうかもしれません。コンピュータシステムがどのように動くか、OSの仕組みや実現できることなどの根源的な技術を理解しておくと良いと思います。どの言語やどのフレームワークを学ぶことになったとしても、実現するための命令方法が変わるだけで実現できることはほとんど変わらないので、ゼロから理解する必要がなくなり、キャッチアップするのが早くなると思います。

# 低レイヤーの技術のお勧め勉強方法について

## お勧め勉強手順
僕は言われたことを一度で理解できるほどに賢くありません。また、いきなり詳しい説明をされても、全体感のイメージが掴めていないと理解することができません。このような脳みそを持った僕がお勧めする勉強手順の概略が以下になります。

### 1. 低レイヤーの技術全体の概念を理解する

はじめに低レイヤーの技術の全体の概念を理解します。全体における部分の役割と部分毎の繋がりを理解することが重要だと思います。これを理解していない状態でいきなり、作り出してしまうと、どのような役割を果たす機能を作っているのかを見失ってしまい、何度も戻りながら実装をすることになってしまい、結果として理解するのが遅くなってしまいます。

### 2. 作って学ぶというコンセプトの本を通して、必要最小限な機能を実現するサービスを作る

作りながら学ぶ過程で、何度かつまづき、その原因を調査しながら、サービスを作りあげる事によって、概念レベルの理解から **OSやCPUなどがどのように実装されているのか、細かいやり取りがどのように行われているのかを理解することできる** 、また **知識を記憶に定着させることができる** という大きく2つの利点があると思います。

### 3. 興味を持った技術の詳細をさらに掘り下げる

2 の作りながら学ぶ過程で、さらに掘り下げて理解したいと思う興味のある部分が出てくると思いますので、その興味を持ったものの詳細を掘り下げると良いと思います。2 を行わず、仕組みの詳細を記載された本を読んで理解しようとすると、理解できない箇所が大半を占めることになり、やる気を継続することが難しいと思います。しかし、作りながら学ぶ過程で大事なポイントを理解しているので、難しい詳細な仕組みについても調べながら理解する力が十分に付いていると思います。 **急がば回れ** とう言葉がありますが、本当にその通りで順に学んでいくことが重要だと身をもって感じました。

## 参考書籍

## コンピュータシステムの低レイヤーの技術

### 1. 低レイヤーの技術全体の概念を理解する

* [プログラムはなぜ動くのか](https://www.amazon.co.jp/dp/4822283151)

この本では、自分が実行したプログラムによって、CPUやメモリがどのように動いて、ディスプレイに表示まで進むのかなどの基本的な仕組みについて、図を使用して、わかりやすく説明しています。初めて理解するときは、図を用いてより視覚的に記憶に残す方が僕は記憶に残りやすいので、このような本を一冊読んでおくと良いと思います。

### 2. 作って学ぶというコンセプトの本を通して、必要最小限な機能を実現するサービスを作る

* [コンピュータシステムの理論と実装 ―モダンなコンピュータの作り方](https://www.amazon.co.jp/dp/4873117127)

これはすごく読みごたえ、作りごたえがある本です。コンピュータシステムを構成する要素を論理回路から作成し、最後にはテトリスを作るところまでやりきります。これを通して、コンピュータシステムがどのような要素からできていて、それぞれがどのような責務を持って動いていて、どのように実装されているかを理解することができます。

### 3. 興味を持った技術の詳細をさらに掘り下げる

#### 高級言語がどのように作られているかに興味を持ったあなたに

* [まつもとゆきひろ 言語のしくみ](https://www.amazon.co.jp/dp/4822239179)

#### コンパイラの詳細な仕組みに興味を持ったあなたに

* [ふつうのコンパイラをつくろう](https://www.amazon.co.jp/dp/B06XZSH7Q9)
* [最新コンパイラ構成技法](https://www.amazon.co.jp/dp/4798114685)

#### OSの詳細な仕組みに興味を持ったあなたに

* [［試して理解］Linuxのしくみ ～実験と図解で学ぶOSとハードウェアの基礎知識](https://www.amazon.co.jp/dp/B079YJS1J1)
* [30日でできる! OS自作入門](https://www.amazon.co.jp/dp/B00IR1HYI0)
* [Linuxカーネル2.6解読室](https://www.amazon.co.jp/dp/4797338261)
* [詳解 Linuxカーネル 第3版](https://www.amazon.co.jp/dp/487311313X)

#### CPUの詳細な仕組みに興味を持ったあなたに

* [CPUの創りかた](https://www.amazon.co.jp/dp/4839909865)
* [自作エミュレータで学ぶx86アーキテクチャ](https://www.amazon.co.jp/dp/B0148FQNVC)
* [コンピュータの構成と設計 第5版 上・下電子合本版](https://www.amazon.co.jp/dp/B01M5FMGDL)
* [ヘネシー&パターソン コンピュータアーキテクチャ 定量的アプローチ第5版](https://www.amazon.co.jp/dp/4798126233)

# 最後に
僕もまだ **興味を持った技術の詳細をさらに掘り下げる** に記載してある参考書籍を全て読めている訳ではありません。これから継続的に読み進め、今後も学びを記事として共有したいと思います。この記事に共感頂けた方は、一緒に低レイヤーの技術の勉強を頑張りましょう！

NewsPicksは5年後、世界で最も影響力のある経済メディアになるという目標を実現するための仲間を募集しています。是非、他の [AdventCalendarの記事](https://qiita.com/advent-calendar/2018/newspicks) もご覧下さい。

21日目の担当は @hirohuntexp で、タイトルは [エンジニアとして自分に最適な学習法をみつけよう](https://note.mu/hirohunt/n/n3b29c91e37da) です。是非、ご覧ください。お楽しみに〜。